[SimplifyCFG] Don't use-after-free an SSA value

SimplifyTerminatorOnSelect didn't consider the possibility that the
condition might be related to one of PHI nodes.

This fixes PR25267.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250922 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer
2015-10-21 18:22:24 +00:00
parent 7d30a2ed8b
commit 9f1da8432d
2 changed files with 26 additions and 1 deletions
+2 -1
View File
@@ -2571,7 +2571,8 @@ static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond,
else if (Succ == KeepEdge2)
KeepEdge2 = nullptr;
else
Succ->removePredecessor(OldTerm->getParent());
Succ->removePredecessor(OldTerm->getParent(),
/*DontDeleteUselessPHIs=*/true);
}
IRBuilder<> Builder(OldTerm);
+24
View File
@@ -0,0 +1,24 @@
; RUN: opt < %s -simplifycfg -S | FileCheck %s
define void @f() {
entry:
br label %for.cond
for.cond:
%phi = phi i1 [ false, %entry ], [ true, %for.body ]
%select = select i1 %phi, i32 1, i32 2
br label %for.body
for.body:
switch i32 %select, label %for.cond [
i32 1, label %return
i32 2, label %for.body
]
return:
ret void
}
; CHECK-LABEL: define void @f(
; CHECK: br label %[[LABEL:.*]]
; CHECK: br label %[[LABEL]]