diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -7204,6 +7204,11 @@ if (Br1->getMetadata(LLVMContext::MD_unpredictable)) continue; + // The merging of mostly empty BB can cause a degenerate branch + if (TBB == FBB) + LLVM_DEBUG(dbgs() << "Don't split degenerate branch\n"; BB.dump()); + 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 --- /dev/null +++ b/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll @@ -0,0 +1,15 @@ +; RUN: llc -fast-isel=true -O1 -mtriple=x86_64-unkown-linux-gnu -start-before=codegenprepare -stop-after=codegenprepare < %s + +define void @foo() { +top: + 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 occure and should not + ; lead to crashes. + br i1 %cond58, label %L34, label %L34 +}