diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index ac9fc01c20c..c2df3a5b243 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -4222,9 +4222,13 @@ static Instruction *MatchSelectFromAndOr(Value *A, Value *B, // Handle "cond ? -1 : 0". if (C1->isAllOnesValue() && C2->isZero()) { // ((cond?-1:0)&C) | (B&(cond?0:-1)) -> cond ? C : B. + if (match(D, SELECT_MATCH(Cond2, 0, -1)) && Cond2 == Cond) + return SelectInst::Create(Cond, C, B); if (match(D, m_Not(SELECT_MATCH(Cond2, -1, 0))) && Cond2 == Cond) return SelectInst::Create(Cond, C, B); // ((cond?-1:0)&C) | ((cond?0:-1)&D) -> cond ? C : D. + if (match(B, SELECT_MATCH(Cond2, 0, -1)) && Cond2 == Cond) + return SelectInst::Create(Cond, C, D); if (match(B, m_Not(SELECT_MATCH(Cond2, -1, 0))) && Cond2 == Cond) return SelectInst::Create(Cond, C, D); } diff --git a/test/Transforms/InstCombine/logical-select.ll b/test/Transforms/InstCombine/logical-select.ll index ffdaa914545..3bb2d348b38 100644 --- a/test/Transforms/InstCombine/logical-select.ll +++ b/test/Transforms/InstCombine/logical-select.ll @@ -1,5 +1,5 @@ ; RUN: llvm-as < %s | opt -instcombine | llvm-dis > %t -; RUN: grep select %t | count 4 +; RUN: grep select %t | count 5 ; RUN: not grep and %t ; RUN: not grep or %t @@ -31,6 +31,17 @@ entry: %3 = or i32 %1, %2 ret i32 %3 } +define i32 @poo(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { +entry: + %0 = icmp slt i32 %a, %b + %iftmp.0.0 = select i1 %0, i32 -1, i32 0 + %1 = and i32 %iftmp.0.0, %c + %iftmp = select i1 %0, i32 0, i32 -1 + %2 = and i32 %iftmp, %d + %3 = or i32 %1, %2 + ret i32 %3 +} + define i32 @par(i32 %a, i32 %b, i32 %c, i32 %d) nounwind { entry: %0 = icmp slt i32 %a, %b