Skip to content

Commit

Permalink
[InstCombine] Fix incorrect rule from rL236202
Browse files Browse the repository at this point in the history
The rule for SMIN introduced in rL236202 doesn't work as advertised: the
check for Pred == ICmpInst::ICMP_SGT was missing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@264996 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
sanjoy committed Mar 31, 2016
1 parent 2b00aae commit 0d31c7f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
18 changes: 18 additions & 0 deletions test/Transforms/InstCombine/select.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 0d31c7f

Please sign in to comment.