diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index f016041b522..2010858139a 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4138,7 +4138,8 @@ static SelectPatternResult matchMinMax(CmpInst::Predicate Pred,      // Is the sign bit set?      // (X <s 0) ? X : MAXVAL ==> (X >u MAXVAL) ? X : MAXVAL ==> UMAX      // (X <s 0) ? MAXVAL : X ==> (X >u MAXVAL) ? MAXVAL : X ==> UMIN -    if (Pred == CmpInst::ICMP_SLT && *C1 == 0 && C2->isMaxSignedValue()) +    if (Pred == CmpInst::ICMP_SLT && C1->isNullValue() && +        C2->isMaxSignedValue())        return {CmpLHS == TrueVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};      // Is the sign bit clear? @@ -4270,13 +4271,15 @@ static SelectPatternResult matchSelectPattern(CmpInst::Predicate Pred,        // ABS(X) ==> (X >s 0) ? X : -X and (X >s -1) ? X : -X        // NABS(X) ==> (X >s 0) ? -X : X and (X >s -1) ? -X : X -      if (Pred == ICmpInst::ICMP_SGT && (*C1 == 0 || C1->isAllOnesValue())) { +      if (Pred == ICmpInst::ICMP_SGT && +          (C1->isNullValue() || C1->isAllOnesValue())) {          return {(CmpLHS == TrueVal) ? SPF_ABS : SPF_NABS, SPNB_NA, false};        }        // ABS(X) ==> (X <s 0) ? -X : X and (X <s 1) ? -X : X        // NABS(X) ==> (X <s 0) ? X : -X and (X <s 1) ? X : -X -      if (Pred == ICmpInst::ICMP_SLT && (*C1 == 0 || *C1 == 1)) { +      if (Pred == ICmpInst::ICMP_SLT && +          (C1->isNullValue() || C1->isOneValue())) {          return {(CmpLHS == FalseVal) ? SPF_ABS : SPF_NABS, SPNB_NA, false};        }      }  | 

