1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00

[SafeStack] Handle unreachable code with safe stack coloring.

Instead of asserting that the function doesn't have any unreachable
code, just ignore it for the purpose of computing liveness.

Differential Revision: https://reviews.llvm.org/D51070

llvm-svn: 340456
This commit is contained in:
Eli Friedman 2018-08-22 21:38:57 +00:00
parent bd27c2c168
commit d02128f555
2 changed files with 26 additions and 1 deletions

View File

@ -172,7 +172,9 @@ void StackColoring::calculateLocalLiveness() {
BitVector LocalLiveIn;
for (auto *PredBB : predecessors(BB)) {
LivenessMap::const_iterator I = BlockLiveness.find(PredBB);
assert(I != BlockLiveness.end() && "Predecessor not found");
// If a predecessor is unreachable, ignore it.
if (I == BlockLiveness.end())
continue;
LocalLiveIn |= I->second.LiveOut;
}

View File

@ -0,0 +1,23 @@
; RUN: opt -safe-stack -safe-stack-coloring -S -mtriple=aarch64-linux-android < %s -o - | FileCheck %s
define void @foo() nounwind uwtable safestack {
entry:
; CHECK: %[[TP:.*]] = call i8* @llvm.thread.pointer()
; CHECK: %[[SPA0:.*]] = getelementptr i8, i8* %[[TP]], i32 72
; CHECK: %[[SPA:.*]] = bitcast i8* %[[SPA0]] to i8**
; CHECK: %[[USP:.*]] = load i8*, i8** %[[SPA]]
; CHECK: %[[USST:.*]] = getelementptr i8, i8* %[[USP]], i32 -16
; CHECK: store i8* %[[USST]], i8** %[[SPA]]
%a = alloca i8, align 8
br label %ret
ret:
ret void
dead:
call void @Capture(i8* %a)
br label %ret
}
declare void @Capture(i8*)