diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 0f44b8f69b789..f05afd0587461 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -7345,6 +7345,10 @@ bool CodeGenPrepare::splitBranchCondition(Function &F, bool &ModifiedDT) { if (Br1->getMetadata(LLVMContext::MD_unpredictable)) continue; + // The merging of mostly empty BB can cause a degenerate branch. + if (TBB == FBB) + continue; + unsigned Opc; Value *Cond1, *Cond2; if (match(LogicOp, m_And(m_OneUse(m_Value(Cond1)), diff --git a/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll b/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll new file mode 100644 index 0000000000000..18e3ef7afbd14 --- /dev/null +++ b/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll @@ -0,0 +1,18 @@ +; RUN: llc -fast-isel=true -O1 -mtriple=x86_64-unkown-linux-gnu -start-before=codegenprepare -stop-after=codegenprepare -o - < %s | FileCheck %s + +; CHECK-LABEL: @foo +define void @foo() { +top: +; CHECK: br label %L34 + br label %L34 + +L34: ; preds = %L34, %L34, %top + %.sroa.075.0 = phi i64 [ undef, %top ], [ undef, %L34 ], [ undef, %L34 ] + %0 = icmp sgt i8 undef, -1 + %cond5896 = icmp eq i8 0, 2 + %cond58 = and i1 %cond5896, %0 +; During codegenprepare such degenerate branches can occur and should not +; lead to crashes. +; CHECK: br label %L34 + br i1 %cond58, label %L34, label %L34 +}