mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:50:30 +00:00
[InstCombine] Fix incorrect rule from rL236202
The rule for SMIN introduced in rL236202 doesn't work as advertised: the check for Pred == ICmpInst::ICMP_SGT was missing. llvm-svn: 264996
This commit is contained in:
parent
2fe82474a4
commit
3059b3a92d
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user