forked from OSchip/llvm-project
[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. llvm-svn: 250922
This commit is contained in:
parent
9d7ccdee0f
commit
dc3b67b4ca
|
@ -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);
|
||||
|
|
|
@ -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]]
|
Loading…
Reference in New Issue