diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-09-16 22:04:10 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-09-16 22:04:10 +0000 |
commit | aa84f050fcac97a66813fe446296c8f796e755f7 (patch) | |
tree | 748d41963cd33f4c9626148c494b067db72af445 /llvm/lib/CodeGen/SafeStackColoring.cpp | |
parent | 318582f9f9ce8c24cf78d229fa2f3c958f2980a2 (diff) | |
download | bcm5719-llvm-aa84f050fcac97a66813fe446296c8f796e755f7.tar.gz bcm5719-llvm-aa84f050fcac97a66813fe446296c8f796e755f7.zip |
[safestack] Fix assertion failure in stack coloring.
This is a fix for PR30318.
Clang may generate IR where an alloca is already live when entering a
BB with lifetime.start. In this case, conservatively extend the
alloca lifetime all the way back to the block entry.
llvm-svn: 281784
Diffstat (limited to 'llvm/lib/CodeGen/SafeStackColoring.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SafeStackColoring.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SafeStackColoring.cpp b/llvm/lib/CodeGen/SafeStackColoring.cpp index 795eb8d2719..7fbeaddb38e 100644 --- a/llvm/lib/CodeGen/SafeStackColoring.cpp +++ b/llvm/lib/CodeGen/SafeStackColoring.cpp @@ -214,10 +214,12 @@ void StackColoring::calculateLiveIntervals() { unsigned AllocaNo = It.second.AllocaNo; if (IsStart) { - assert(!Started.test(AllocaNo)); - Started.set(AllocaNo); - Ended.reset(AllocaNo); - Start[AllocaNo] = InstNo; + assert(!Started.test(AllocaNo) || Start[AllocaNo] == BBStart); + if (!Started.test(AllocaNo)) { + Started.set(AllocaNo); + Ended.reset(AllocaNo); + Start[AllocaNo] = InstNo; + } } else { assert(!Ended.test(AllocaNo)); if (Started.test(AllocaNo)) { |