diff --git a/llvm/lib/Transforms/Utils/FlattenCFG.cpp b/llvm/lib/Transforms/Utils/FlattenCFG.cpp index ddd3f597ae0191..89823ed1c831ac 100644 --- a/llvm/lib/Transforms/Utils/FlattenCFG.cpp +++ b/llvm/lib/Transforms/Utils/FlattenCFG.cpp @@ -431,6 +431,9 @@ bool FlattenCFGOpt::MergeIfRegion(BasicBlock *BB, IRBuilder<> &Builder) { return false; BasicBlock *FirstEntryBlock = CInst1->getParent(); + // Don't die trying to process degenerate/unreachable code. + if (FirstEntryBlock == SecondEntryBlock) + return false; // Either then-path or else-path should be empty. bool InvertCond2 = false; diff --git a/llvm/test/Transforms/Util/flattencfg.ll b/llvm/test/Transforms/Util/flattencfg.ll index e94e0cdc939df0..3e598ee7c9cbc1 100644 --- a/llvm/test/Transforms/Util/flattencfg.ll +++ b/llvm/test/Transforms/Util/flattencfg.ll @@ -216,3 +216,20 @@ if.else.y: exit: ret void } + +; This would crash. + +declare i1 @llvm.smax.i1(i1, i1) #0 + +; CHECK-LABEL: @PR56875 +define void @PR56875(i1 %val_i1_5) { +entry_1: + ret void + +bb_2: ; preds = %bb_4 + br label %bb_4 + +bb_4: ; preds = %bb_4, %bb_2 + %val_i1_46 = call i1 @llvm.smax.i1(i1 %val_i1_5, i1 %val_i1_5) + br i1 %val_i1_46, label %bb_4, label %bb_2 +}