diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 3 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/select.ll | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index e464ae7d69e..802bc117495 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3552,7 +3552,8 @@ static SelectPatternResult matchSelectPattern(CmpInst::Predicate Pred, // Y >s C ? ~Y : ~C == ~Y <s ~C ? ~Y : ~C = SMIN(~Y, ~C) if (const auto *C2 = dyn_cast<ConstantInt>(FalseVal)) { - if (C1->getType() == C2->getType() && ~C1->getValue() == C2->getValue() && + if (Pred == ICmpInst::ICMP_SGT && C1->getType() == C2->getType() && + ~C1->getValue() == C2->getValue() && (match(TrueVal, m_Not(m_Specific(CmpLHS))) || match(CmpLHS, m_Not(m_Specific(TrueVal))))) { LHS = TrueVal; diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll index 7df3ba01998..876999b95dc 100644 --- a/llvm/test/Transforms/InstCombine/select.ll +++ b/llvm/test/Transforms/InstCombine/select.ll @@ -1589,3 +1589,21 @@ define i32 @PR23757(i32 %x) { %sel = select i1 %cmp, i32 -2147483648, i32 %add ret i32 %sel } + + +define i32 @PR27137(i32 %a) { +; CHECK-LABEL: @PR27137( +; CHECK-NEXT: %not_a = xor i32 %a, -1 +; CHECK-NEXT: %c0 = icmp slt i32 %a, 0 +; CHECK-NEXT: %s0 = select i1 %c0, i32 %not_a, i32 -1 +; CHECK-NEXT: %c1 = icmp sgt i32 %s0, -1 +; CHECK-NEXT: %s1 = select i1 %c1, i32 %s0, i32 -1 +; CHECK-NEXT: ret i32 %s1 + + %not_a = xor i32 %a, -1 + %c0 = icmp slt i32 %a, 0 + %s0 = select i1 %c0, i32 %not_a, i32 -1 + %c1 = icmp sgt i32 %s0, -1 + %s1 = select i1 %c1, i32 %s0, i32 -1 + ret i32 %s1 +} |