Index: lib/Transforms/InstCombine/InstCombineCompares.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCompares.cpp +++ lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3950,7 +3950,7 @@ assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!"); if (isChainSelectCmpBranch(SI) && Icmp->getPredicate() == ICmpInst::ICMP_EQ) { BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1); - // The check for the unique predecessor is not the best that can be + // The check for the single predecessor is not the best that can be // done. But it protects efficiently against cases like when SI's // home block has two successors, Succ and Succ1, and Succ1 predecessor // of Succ. Then SI can't be replaced by SIOpd because the use that gets @@ -3958,8 +3958,10 @@ // guarantees that the path all uses of SI (outside SI's parent) are on // is disjoint from all other paths out of SI. But that information // is more expensive to compute, and the trade-off here is in favor - // of compile-time. - if (Succ->getUniquePredecessor() && dominatesAllUses(SI, Icmp, Succ)) { + // of compile-time. It should also be noticed that we check for a single + // predecessor and not only uniqueness. This to handle the situation when + // Succ and Succ1 points to the same basic block. + if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) { NumSel++; SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent()); return true; Index: test/Transforms/InstCombine/select-cmp-br.ll =================================================================== --- test/Transforms/InstCombine/select-cmp-br.ll +++ test/Transforms/InstCombine/select-cmp-br.ll @@ -153,3 +153,25 @@ ; CHECK: or ; CHECK-NOT: select } + +; Negative test. Must not trigger the select-cmp-br combine because the result +; of the select is used in both flows following the br (the special case where +; the conditional branch has the same target for both flows). +define i32 @test6(i32, i1) { +entry: + %2 = select i1 %1, i32 %0, i32 0 + %3 = icmp eq i32 %2, 0 + br i1 %3, label %4, label %4 + +;