diff options
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 3 | ||||
-rw-r--r-- | llvm/test/Transforms/SimplifyCFG/PR25267.ll | 24 |
2 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index e98f3349eff..e435537c3a7 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -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); diff --git a/llvm/test/Transforms/SimplifyCFG/PR25267.ll b/llvm/test/Transforms/SimplifyCFG/PR25267.ll new file mode 100644 index 00000000000..a13d45a0f27 --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/PR25267.ll @@ -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]] |