Index: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -2002,6 +2002,15 @@ return &BI; } + // If the condition is irrelevant, remove the use so that other + // transforms on the condition become more effective. + if (BI.isConditional() && + BI.getSuccessor(0) == BI.getSuccessor(1) && + !isa(BI.getCondition())) { + BI.setCondition(UndefValue::get(BI.getCondition()->getType())); + return &BI; + } + // Canonicalize fcmp_one -> fcmp_oeq FCmpInst::Predicate FPred; Value *Y; if (match(&BI, m_Br(m_FCmp(FPred, m_Value(X), m_Value(Y)), Index: llvm/trunk/test/Transforms/InstCombine/branch.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/branch.ll +++ llvm/trunk/test/Transforms/InstCombine/branch.ll @@ -0,0 +1,16 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +define i32 @test(i32 %x) { +; CHECK-LABEL: @test +entry: +; CHECK-NOT: icmp +; CHECK: br i1 undef, + %cmp = icmp ult i32 %x, 7 + br i1 %cmp, label %merge, label %merge +merge: +; CHECK-LABEL: merge: +; CHECK: ret i32 %x + ret i32 %x +} + +