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,18 @@ PBI->replaceUsesOfWith(CC, NC); Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt); + // Handle PHI node to replace its predecessors to FirstEntryBlock. + for (unsigned int i = 0; i < PBI->getNumSuccessors(); ++i) { + BasicBlock *Successor = PBI->getSuccessor(i); + PHINode *SomePHI = dyn_cast(Successor->begin()); + if (SomePHI) { + for (unsigned int j = 0; j < SomePHI->getNumIncomingValues(); ++j) { + if (SomePHI->getIncomingBlock(j) == SecondEntryBlock) + SomePHI->setIncomingBlock(j, 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 +}