<div dir="ltr">For reference, this was reverted at r316164.<br><br>On Thu, Oct 19, 2017 at 9:07 AM, Gainullin, Artur <span dir="ltr"><<a href="mailto:artur.gainullin@intel.com" target="_blank">artur.gainullin@intel.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Sorry,<br>
I hurried up with this fix.  It seems  to be more tricky.<br>
Let's I revert this commit and prepare new patch for review.<br>
<span class="gmail-"><br>
Best regards,<br>
Artur Gainullin<br>
<br>
<br>
-----Original Message-----<br>
</span><span class="gmail-">From: Gainullin, Artur<br>
Sent: Thursday, October 19, 2017 4:51 PM<br>
To: 'Mikael Holmén' <<a href="mailto:mikael.holmen@ericsson.com">mikael.holmen@ericsson.com</a>>; Bozhenov, Nikolai <<a href="mailto:nikolai.bozhenov@intel.com">nikolai.bozhenov@intel.com</a>>; <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>; Sanjay Patel <<a href="mailto:spatel@rotateright.com">spatel@rotateright.com</a>><br>
Subject: RE: [llvm] r315992 - Improve clamp recognition in ValueTracking.<br>
<br>
Hi Mikael,<br>
thank you very much for this analysis.<br>
<br>
Sanjay, I have two options:<br>
1. Before my patch matchMinMax was matching patterns only with canonical predicate.<br>
That is why the easy way to fix the problem found by Mikael is:<br>
<br>
diff --git a/lib/Analysis/ValueTracking.<wbr>cpp b/lib/Analysis/ValueTracking.<wbr>cpp index 4f5d69d77aa..d9ced4da7e9 100644<br>
--- a/lib/Analysis/ValueTracking.<wbr>cpp<br>
+++ b/lib/Analysis/ValueTracking.<wbr>cpp<br>
@@ -4085,6 +4085,9 @@ static SelectPatternResult matchMinMax(CmpInst::Predicate Pred,<br>
                                        Value *&LHS, Value *&RHS) {<br>
</span><span class="gmail-">   assert(!ICmpInst::isEquality(<wbr>Pred) && "Expected not equality predicate only!");<br>
<br>
</span><span class="gmail-">+  if (!isCanonicalPredicate(Pred))<br>
+    return false;<br>
</span><span class="gmail-">+<br>
   // First, check if select has inverse order of what we will check below:<br>
</span><span class="gmail-">   if (CmpRHS == FalseVal) {<br>
     std::swap(TrueVal, FalseVal);<br>
<br>
2. We can revert this commit, I will prepare new one and upload it for review.<br>
<br>
How do you think, which option is better?<br>
<br>
Best regards,<br>
Artur Gainullin<br>
<br>
-----Original Message-----<br>
From: Mikael Holmén [mailto:<a href="mailto:mikael.holmen@ericsson.com">mikael.holmen@<wbr>ericsson.com</a>]<br>
Sent: Thursday, October 19, 2017 2:30 PM<br>
To: Bozhenov, Nikolai <<a href="mailto:nikolai.bozhenov@intel.com">nikolai.bozhenov@intel.com</a>>; <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>; Gainullin, Artur <<a href="mailto:artur.gainullin@intel.com">artur.gainullin@intel.com</a>>; Sanjay Patel <<a href="mailto:spatel@rotateright.com">spatel@rotateright.com</a>><br>
</span><div><div class="gmail-h5">Subject: Re: [llvm] r315992 - Improve clamp recognition in ValueTracking.<br>
<br>
Hi Artur, Nikolai, Sanjay,<br>
<br>
I think this patch miscompiles the following example:<br>
<br>
If I do<br>
<br>
llc -O0 -march=nvptx -o - foo.ll<br>
<br>
on<br>
<br>
@sur1 = global i16 1234<br>
<br>
define i16 @main() {<br>
   %_tmp21.i = icmp sle i16 0, 0<br>
   %_tmp22.i = select i1 %_tmp21.i, i16 0, i16 32767<br>
   store i16 %_tmp22.i, i16* @sur1<br>
   ret i16 0<br>
}<br>
<br>
I get<br>
<br>
         mov.u32         %r1, sur1;<br>
         cvta.global.u32         %r2, %r1;<br>
         mov.u16         %rs1, 32767;<br>
         st.u16  [%r2], %rs1;<br>
         mov.u32         %r3, 0;<br>
         st.param.b32    [func_retval0+0], %r3;<br>
         ret;<br>
<br>
with the patch.<br>
<br>
Without it I get<br>
<br>
         mov.u32         %r1, sur1;<br>
         cvta.global.u32         %r2, %r1;<br>
         mov.u16         %rs1, 0;<br>
         st.u16  [%r2], %rs1;<br>
         mov.u32         %r3, 0;<br>
         st.param.b32    [func_retval0+0], %r3;<br>
         ret;<br>
<br>
Notice the 32767 vs 0 difference.<br>
<br>
I'm not very good at nvptx, but if looking at the -debug printouts from ISel we see<br>
<br>
Initial selection DAG: BB#0 'main:'<br>
SelectionDAG has 13 nodes:<br>
   t4: i16 = Constant<0><br>
   t5: ch = setle<br>
   t6: i1 = Constant<-1><br>
         t0: ch = EntryToken<br>
         t3: i32 = llvm.nvvm.ptr.global.to.gen TargetConstant:i32<3309>,<br>
GlobalAddress:i32<i16 addrspace(1)* @sur1> 0<br>
       t10: ch = store<ST2[%cvta]> t0, Constant:i16<32767>, t3, undef:i32<br>
     t11: ch = NVPTXISD::StoreRetval<ST4[<<wbr>unknown>](align=1)> t10, Constant:i32<0>, Constant:i32<0><br>
   t12: ch = NVPTXISD::RET_FLAG t11<br>
<br>
with the patch and<br>
<br>
Initial selection DAG: BB#0 'main:'<br>
SelectionDAG has 13 nodes:<br>
   t5: ch = setle<br>
   t6: i1 = Constant<-1><br>
   t7: i16 = Constant<32767><br>
         t0: ch = EntryToken<br>
         t3: i32 = llvm.nvvm.ptr.global.to.gen TargetConstant:i32<3309>,<br>
GlobalAddress:i32<i16 addrspace(1)* @sur1> 0<br>
       t10: ch = store<ST2[%cvta]> t0, Constant:i16<0>, t3, undef:i32<br>
     t11: ch = NVPTXISD::StoreRetval<ST4[<<wbr>unknown>](align=1)> t10, Constant:i32<0>, Constant:i32<0><br>
   t12: ch = NVPTXISD::RET_FLAG t11<br>
<br>
without. Here it's pretty clear that the patch has done something wrong, deciding we should always store 32767 to @sur1 instead of the expected 0.<br>
<br>
It seems to be this code in matchMinMax that triggers:<br>
<br>
   // An unsigned min/max can be written with a signed compare.<br>
   const APInt *C2;<br>
   if ((CmpLHS == TrueVal && match(FalseVal, m_APInt(C2))) ||<br>
       (CmpLHS == FalseVal && match(TrueVal, m_APInt(C2)))) {<br>
     // Is the sign bit set?<br>
     // (X <s 0) ? X : MAXVAL ==> (X >u MAXVAL) ? X : MAXVAL ==> UMAX<br>
     // (X <s 0) ? MAXVAL : X ==> (X >u MAXVAL) ? MAXVAL : X ==> UMIN<br>
     if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE) && *C1 == 0 &&<br>
         C2->isMaxSignedValue())<br>
       return {CmpLHS == TrueVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};<br>
<br>
where "Pred == CmpInst::ICMP_SLE" was added in the patch...<br>
<br>
Originally found this on my out-of-tree target where the resulting code really did the wrong thing noticed at runtime, and then I've reduced and reproduced on nvptx.<br>
<br>
Regards,<br>
Mikael<br>
<br>
On 10/17/2017 01:50 PM, Nikolai Bozhenov via llvm-commits wrote:<br>
> Author: n.bozhenov<br>
> Date: Tue Oct 17 04:50:48 2017<br>
> New Revision: 315992<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=315992&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=315992&view=rev</a><br>
> Log:<br>
> Improve clamp recognition in ValueTracking.<br>
><br>
> Summary:<br>
> ValueTracking was recognizing not all variations of clamp. Swapping of<br>
> true value and false value of select was added to fix this problem.<br>
> This change breaks the canonical form of cmp inside the matchMinMax<br>
> function, that is why additional checks for compare predicates is<br>
> needed. Added corresponding test cases.<br>
><br>
> Reviewers: spatel<br>
><br>
> Subscribers: llvm-commits<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D38531" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D38531</a><br>
><br>
> Patch by: Artur Gainullin <<a href="mailto:artur.gainullin@intel.com">artur.gainullin@intel.com</a>><br>
><br>
> Modified:<br>
>      llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp<br>
>      llvm/trunk/test/Transforms/<wbr>InstCombine/minmax-fold.ll<br>
><br>
> Modified: llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTrack" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/ValueTrack</a><br>
> ing.cpp?rev=315992&r1=315991&<wbr>r2=315992&view=diff<br>
> ==============================<wbr>==============================<wbr>==========<br>
> ========<br>
> --- llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp (original)<br>
> +++ llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp Tue Oct 17 04:50:48 2017<br>
> @@ -4083,6 +4083,14 @@ static SelectPatternResult matchMinMax(C<br>
>                                          Value *CmpLHS, Value *CmpRHS,<br>
>                                          Value *TrueVal, Value *FalseVal,<br>
>                                          Value *&LHS, Value *&RHS) {<br>
> +  assert(!ICmpInst::isEquality(<wbr>Pred) && "Expected not equality<br>
</div></div>> + predicate only!");<br>
<div><div class="gmail-h5">> +<br>
> +  // First, check if select has inverse order of what we will check below:<br>
> +  if (CmpRHS == FalseVal) {<br>
> +    std::swap(TrueVal, FalseVal);<br>
> +    Pred = CmpInst::getInversePredicate(<wbr>Pred);<br>
> +  }<br>
> +<br>
>     // Assume success. If there's no match, callers should not use these anyway.<br>
>     LHS = TrueVal;<br>
>     RHS = FalseVal;<br>
> @@ -4095,26 +4103,30 @@ static SelectPatternResult matchMinMax(C<br>
><br>
>       // (X <s C1) ? C1 : SMIN(X, C2) ==> SMAX(SMIN(X, C2), C1)<br>
>       if (match(FalseVal, m_SMin(m_Specific(CmpLHS), m_APInt(C2))) &&<br>
> -        C1->slt(*C2) && Pred == CmpInst::ICMP_SLT)<br>
> +        C1->slt(*C2) &&<br>
> +        (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE))<br>
>         return {SPF_SMAX, SPNB_NA, false};<br>
><br>
>       // (X >s C1) ? C1 : SMAX(X, C2) ==> SMIN(SMAX(X, C2), C1)<br>
>       if (match(FalseVal, m_SMax(m_Specific(CmpLHS), m_APInt(C2))) &&<br>
> -        C1->sgt(*C2) && Pred == CmpInst::ICMP_SGT)<br>
> +        C1->sgt(*C2) &&<br>
> +        (Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE))<br>
>         return {SPF_SMIN, SPNB_NA, false};<br>
><br>
>       // (X <u C1) ? C1 : UMIN(X, C2) ==> UMAX(UMIN(X, C2), C1)<br>
>       if (match(FalseVal, m_UMin(m_Specific(CmpLHS), m_APInt(C2))) &&<br>
> -        C1->ult(*C2) && Pred == CmpInst::ICMP_ULT)<br>
> +        C1->ult(*C2) &&<br>
> +        (Pred == CmpInst::ICMP_ULT || Pred == CmpInst::ICMP_ULE))<br>
>         return {SPF_UMAX, SPNB_NA, false};<br>
><br>
>       // (X >u C1) ? C1 : UMAX(X, C2) ==> UMIN(UMAX(X, C2), C1)<br>
>       if (match(FalseVal, m_UMax(m_Specific(CmpLHS), m_APInt(C2))) &&<br>
> -        C1->ugt(*C2) && Pred == CmpInst::ICMP_UGT)<br>
> +        C1->ugt(*C2) &&<br>
> +        (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_UGE))<br>
>         return {SPF_UMIN, SPNB_NA, false};<br>
>     }<br>
><br>
> -  if (Pred != CmpInst::ICMP_SGT && Pred != CmpInst::ICMP_SLT)<br>
> +  if (!CmpInst::isSigned(Pred))<br>
>       return {SPF_UNKNOWN, SPNB_NA, false};<br>
><br>
>     // Z = X -nsw Y<br>
> @@ -4122,14 +4134,18 @@ static SelectPatternResult matchMinMax(C<br>
>     // (X <s Y) ? 0 : Z ==> (Z <s 0) ? 0 : Z ==> SMAX(Z, 0)<br>
>     if (match(TrueVal, m_Zero()) &&<br>
>         match(FalseVal, m_NSWSub(m_Specific(CmpLHS), m_Specific(CmpRHS))))<br>
> -    return {Pred == CmpInst::ICMP_SGT ? SPF_SMIN : SPF_SMAX, SPNB_NA, false};<br>
> +    return {(Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE) ? SPF_SMIN<br>
> +                                                                     : SPF_SMAX,<br>
> +            SPNB_NA, false};<br>
><br>
>     // Z = X -nsw Y<br>
>     // (X >s Y) ? Z : 0 ==> (Z >s 0) ? Z : 0 ==> SMAX(Z, 0)<br>
>     // (X <s Y) ? Z : 0 ==> (Z <s 0) ? Z : 0 ==> SMIN(Z, 0)<br>
>     if (match(FalseVal, m_Zero()) &&<br>
>         match(TrueVal, m_NSWSub(m_Specific(CmpLHS), m_Specific(CmpRHS))))<br>
> -    return {Pred == CmpInst::ICMP_SGT ? SPF_SMAX : SPF_SMIN, SPNB_NA, false};<br>
> +    return {(Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE) ? SPF_SMAX<br>
> +                                                                     : SPF_SMIN,<br>
> +            SPNB_NA, false};<br>
><br>
>     if (!match(CmpRHS, m_APInt(C1)))<br>
>       return {SPF_UNKNOWN, SPNB_NA, false}; @@ -4141,14 +4157,15 @@<br>
> static SelectPatternResult matchMinMax(C<br>
>       // Is the sign bit set?<br>
>       // (X <s 0) ? X : MAXVAL ==> (X >u MAXVAL) ? X : MAXVAL ==> UMAX<br>
>       // (X <s 0) ? MAXVAL : X ==> (X >u MAXVAL) ? MAXVAL : X ==> UMIN<br>
> -    if (Pred == CmpInst::ICMP_SLT && *C1 == 0 && C2->isMaxSignedValue())<br>
> +    if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE) && *C1 == 0 &&<br>
> +        C2->isMaxSignedValue())<br>
>         return {CmpLHS == TrueVal ? SPF_UMAX : SPF_UMIN, SPNB_NA,<br>
> false};<br>
><br>
>       // Is the sign bit clear?<br>
>       // (X >s -1) ? MINVAL : X ==> (X <u MINVAL) ? MINVAL : X ==> UMAX<br>
>       // (X >s -1) ? X : MINVAL ==> (X <u MINVAL) ? X : MINVAL ==> UMIN<br>
> -    if (Pred == CmpInst::ICMP_SGT && C1->isAllOnesValue() &&<br>
> -        C2->isMinSignedValue())<br>
> +    if ((Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE) &&<br>
> +        C1->isAllOnesValue() && C2->isMinSignedValue())<br>
>         return {CmpLHS == FalseVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};<br>
>     }<br>
><br>
> @@ -4157,13 +4174,17 @@ static SelectPatternResult matchMinMax(C<br>
>     // (X <s C) ? ~X : ~C ==> (~X >s ~C) ? ~X : ~C ==> SMAX(~X, ~C)<br>
>     if (match(TrueVal, m_Not(m_Specific(CmpLHS))) &&<br>
>         match(FalseVal, m_APInt(C2)) && ~(*C1) == *C2)<br>
> -    return {Pred == CmpInst::ICMP_SGT ? SPF_SMIN : SPF_SMAX, SPNB_NA, false};<br>
> +    return {(Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE) ? SPF_SMIN<br>
> +                                                                     : SPF_SMAX,<br>
> +            SPNB_NA, false};<br>
><br>
>     // (X >s C) ? ~C : ~X ==> (~X <s ~C) ? ~C : ~X ==> SMAX(~C, ~X)<br>
>     // (X <s C) ? ~C : ~X ==> (~X >s ~C) ? ~C : ~X ==> SMIN(~C, ~X)<br>
>     if (match(FalseVal, m_Not(m_Specific(CmpLHS))) &&<br>
>         match(TrueVal, m_APInt(C2)) && ~(*C1) == *C2)<br>
> -    return {Pred == CmpInst::ICMP_SGT ? SPF_SMAX : SPF_SMIN, SPNB_NA, false};<br>
> +    return {(Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE) ? SPF_SMAX<br>
> +                                                                     : SPF_SMIN,<br>
> +            SPNB_NA, false};<br>
><br>
>     return {SPF_UNKNOWN, SPNB_NA, false};<br>
>   }<br>
><br>
> Modified: llvm/trunk/test/Transforms/<wbr>InstCombine/minmax-fold.ll<br>
> URL:<br>
> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCom" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/InstCom</a><br>
> bine/minmax-fold.ll?rev=<wbr>315992&r1=315991&r2=315992&<wbr>view=diff<br>
> ==============================<wbr>==============================<wbr>==========<br>
> ========<br>
> --- llvm/trunk/test/Transforms/<wbr>InstCombine/minmax-fold.ll (original)<br>
> +++ llvm/trunk/test/Transforms/<wbr>InstCombine/minmax-fold.ll Tue Oct 17<br>
</div></div>> +++ 04:50:48 2017<br>
<div class="gmail-HOEnZb"><div class="gmail-h5">> @@ -404,8 +404,8 @@ define i32 @clamp_signed3(i32 %x) {<br>
>   ; CHECK-LABEL: @clamp_signed3(<br>
>   ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[X:%.*]], 255<br>
>   ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 255<br>
> -; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[X]], 15<br>
> -; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP1]], i32 [[MIN]], i32 15<br>
> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 [[MIN]], 15<br>
> +; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP1]], i32 [[MIN]], i32 15<br>
>   ; CHECK-NEXT:    ret i32 [[R]]<br>
>   ;<br>
>     %cmp2 = icmp slt i32 %x, 255<br>
> @@ -421,8 +421,8 @@ define i32 @clamp_signed4(i32 %x) {<br>
>   ; CHECK-LABEL: @clamp_signed4(<br>
>   ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], 15<br>
>   ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 15<br>
> -; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[X]], 255<br>
> -; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP1]], i32 [[MAX]], i32 255<br>
> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[MAX]], 255<br>
> +; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP1]], i32 [[MAX]], i32 255<br>
>   ; CHECK-NEXT:    ret i32 [[R]]<br>
>   ;<br>
>     %cmp2 = icmp sgt i32 %x, 15<br>
> @@ -472,8 +472,8 @@ define i32 @clamp_unsigned3(i32 %x) {<br>
>   ; CHECK-LABEL: @clamp_unsigned3(<br>
>   ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[X:%.*]], 255<br>
>   ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 255<br>
> -; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i32 [[X]], 15<br>
> -; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP1]], i32 [[MIN]], i32 15<br>
> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i32 [[MIN]], 15<br>
> +; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP1]], i32 [[MIN]], i32 15<br>
>   ; CHECK-NEXT:    ret i32 [[R]]<br>
>   ;<br>
>     %cmp2 = icmp ult i32 %x, 255<br>
> @@ -489,8 +489,8 @@ define i32 @clamp_unsigned4(i32 %x) {<br>
>   ; CHECK-LABEL: @clamp_unsigned4(<br>
>   ; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[X:%.*]], 15<br>
>   ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 15<br>
> -; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X]], 255<br>
> -; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP1]], i32 [[MAX]], i32 255<br>
> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[MAX]], 255<br>
> +; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP1]], i32 [[MAX]], i32 255<br>
>   ; CHECK-NEXT:    ret i32 [[R]]<br>
>   ;<br>
>     %cmp2 = icmp ugt i32 %x, 15<br>
> @@ -523,8 +523,8 @@ define i32 @clamp_check_for_no_infinite_<br>
>   ; CHECK-LABEL: @clamp_check_for_no_infinite_<wbr>loop2(<br>
>   ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[I:%.*]], -255<br>
>   ; CHECK-NEXT:    [[SEL1:%.*]] = select i1 [[CMP1]], i32 [[I]], i32 -255<br>
> -; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[I]], 0<br>
> -; CHECK-NEXT:    [[RES:%.*]] = select i1 [[CMP2]], i32 [[SEL1]], i32 0<br>
> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[SEL1]], 0<br>
> +; CHECK-NEXT:    [[RES:%.*]] = select i1 [[TMP1]], i32 [[SEL1]], i32 0<br>
>   ; CHECK-NEXT:    ret i32 [[RES]]<br>
>   ;<br>
>     %cmp1 = icmp sgt i32 %i, -255<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
><br>
</div></div></blockquote></div><br></div></div>