diff --git a/llvm/lib/Transforms/Utils/FlattenCFG.cpp b/llvm/lib/Transforms/Utils/FlattenCFG.cpp --- a/llvm/lib/Transforms/Utils/FlattenCFG.cpp +++ b/llvm/lib/Transforms/Utils/FlattenCFG.cpp @@ -67,7 +67,7 @@ /// Before: /// ...... /// %cmp10 = fcmp une float %tmp1, %tmp2 -/// br i1 %cmp1, label %if.then, label %lor.rhs +/// br i1 %cmp10, label %if.then, label %lor.rhs /// /// lor.rhs: /// ...... @@ -453,6 +453,16 @@ PBI->replaceUsesOfWith(CC, NC); Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt); + // Handle PHI node to replace its predecessors to FirstEntryBlock. + for (BasicBlock *Succ : successors(PBI)) { + for (PHINode &Phi : Succ->phis()) { + for (unsigned i = 0, e = Phi.getNumIncomingValues(); i != e; ++i) { + if (Phi.getIncomingBlock(i) == SecondEntryBlock) + Phi.setIncomingBlock(i, FirstEntryBlock); + } + } + } + // Remove IfTrue1 if (IfTrue1 != FirstEntryBlock) { IfTrue1->dropAllReferences(); diff --git a/llvm/test/Transforms/Util/flattencfg.ll b/llvm/test/Transforms/Util/flattencfg.ll --- a/llvm/test/Transforms/Util/flattencfg.ll +++ b/llvm/test/Transforms/Util/flattencfg.ll @@ -54,3 +54,33 @@ br i1 %1, label %bb4, label %bb3 } +; CHECK-LABEL: @test_not_crash3 +; CHECK-NEXT: entry: +; CHECK-NEXT: %a_eq_0 = icmp eq i32 %a, 0 +; CHECK-NEXT: %a_eq_1 = icmp eq i32 %a, 1 +; CHECK-NEXT: [[COND:%[a-z0-9]+]] = or i1 %a_eq_0, %a_eq_1 +; CHECK-NEXT: br i1 [[COND]], label %bb2, label %bb3 +; CHECK: bb2: +; CHECK-NEXT: br label %bb3 +; CHECK: bb3: +; CHECK-NEXT: %check_badref = phi i32 [ 17, %entry ], [ 11, %bb2 ] +; CHECK-NEXT: ret void +define void @test_not_crash3(i32 %a) #0 { +entry: + %a_eq_0 = icmp eq i32 %a, 0 + br i1 %a_eq_0, label %bb0, label %bb1 + +bb0: ; preds = %entry + br label %bb1 + +bb1: ; preds = %bb0, %entry + %a_eq_1 = icmp eq i32 %a, 1 + br i1 %a_eq_1, label %bb2, label %bb3 + +bb2: ; preds = %bb1 + br label %bb3 + +bb3: ; preds = %bb2, %bb1 + %check_badref = phi i32 [ 17, %bb1 ], [ 11, %bb2 ] + ret void +}