[llvm] r299851 - [InstCombine] fix matching of or-of-icmps constants (PR32524)

Akira Hatanaka via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 11 08:50:53 PDT 2017


I'm not sure which commit is the culprit yet, but this bot started failing
too:

http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/14734/

On Tue, Apr 11, 2017 at 8:39 AM, Sanjay Patel via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Thank you for letting me know. I am curious to know how to debug this.
>
> On Tue, Apr 11, 2017 at 8:36 AM, NAKAMURA Takumi <geek4civic at gmail.com>
> wrote:
>
>> Seems it causes miscompilation (or revealing a bug) in AMDGPUCodeGen, in
>> stage 2.
>> Investigating.
>>
>> http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/14928
>>
>> On Tue, Apr 11, 2017 at 2:08 AM Sanjay Patel via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: spatel
>>> Date: Mon Apr 10 11:55:57 2017
>>> New Revision: 299851
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=299851&view=rev
>>> Log:
>>> [InstCombine] fix matching of or-of-icmps constants (PR32524)
>>>
>>> Also, make the same change in and-of-icmps and remove a hack for
>>> detecting that case.
>>>
>>> Finally, add some FIXME comments because the code duplication here is
>>> awful.
>>>
>>> This should fix the remaining IR problem noted in:
>>> https://bugs.llvm.org/show_bug.cgi?id=32524
>>>
>>>
>>> Modified:
>>>     llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
>>>     llvm/trunk/test/Transforms/InstCombine/or.ll
>>>
>>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transform
>>> s/InstCombine/InstCombineAndOrXor.cpp?rev=299851&r1=299850&
>>> r2=299851&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
>>> (original)
>>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp Mon
>>> Apr 10 11:55:57 2017
>>> @@ -807,6 +807,7 @@ Value *InstCombiner::FoldAndOfICmps(ICmp
>>>      }
>>>    }
>>>
>>> +  // FIXME: The code below is duplicated in FoldOrOfICmps.
>>>    // From here on, we only handle:
>>>    //    (icmp1 A, C1) & (icmp2 A, C2) --> something simpler.
>>>    if (Val != Val2)
>>> @@ -825,11 +826,14 @@ Value *InstCombiner::FoldAndOfICmps(ICmp
>>>
>>>    // Ensure that the larger constant is on the RHS.
>>>    bool ShouldSwap;
>>> -  if (CmpInst::isSigned(PredL) ||
>>> -      (ICmpInst::isEquality(PredL) && CmpInst::isSigned(PredR)))
>>> -    ShouldSwap = LHSC->getValue().sgt(RHSC->getValue());
>>> -  else
>>> +  if (CmpInst::isUnsigned(PredL) || CmpInst::isUnsigned(PredR)) {
>>> +    // We have an unsigned compare (possibly with an equality compare),
>>> so treat
>>> +    // the constants as unsigned.
>>>      ShouldSwap = LHSC->getValue().ugt(RHSC->getValue());
>>> +  } else {
>>> +    // Equality transforms treat the constants as signed.
>>> +    ShouldSwap = LHSC->getValue().sgt(RHSC->getValue());
>>> +  }
>>>
>>>    if (ShouldSwap) {
>>>      std::swap(LHS, RHS);
>>> @@ -877,10 +881,6 @@ Value *InstCombiner::FoldAndOfICmps(ICmp
>>>      case ICmpInst::ICMP_SGT: // (X != 13 & X s> 15) -> X s> 15
>>>        return RHS;
>>>      case ICmpInst::ICMP_NE:
>>> -      // Special case to get the ordering right when the values wrap
>>> around
>>> -      // zero.
>>> -      if (LHSC->getValue() == 0 && RHSC->getValue().isAllOnesValue())
>>> -        std::swap(LHSC, RHSC);
>>>        if (LHSC == SubOne(RHSC)) { // (X != 13 & X != 14) -> X-13 >u 1
>>>          Constant *AddC = ConstantExpr::getNeg(LHSC);
>>>          Value *Add = Builder->CreateAdd(Val, AddC, Val->getName() +
>>> ".off");
>>> @@ -1727,6 +1727,7 @@ Value *InstCombiner::FoldOrOfICmps(ICmpI
>>>          return Builder->CreateICmpULE(Val, LHSC);
>>>    }
>>>
>>> +  // FIXME: The code below is duplicated in FoldAndOfICmps.
>>>    // From here on, we only handle:
>>>    //    (icmp1 A, C1) | (icmp2 A, C2) --> something simpler.
>>>    if (Val != Val2)
>>> @@ -1745,11 +1746,14 @@ Value *InstCombiner::FoldOrOfICmps(ICmpI
>>>
>>>    // Ensure that the larger constant is on the RHS.
>>>    bool ShouldSwap;
>>> -  if (CmpInst::isSigned(PredL) ||
>>> -      (ICmpInst::isEquality(PredL) && CmpInst::isSigned(PredR)))
>>> -    ShouldSwap = LHSC->getValue().sgt(RHSC->getValue());
>>> -  else
>>> +  if (CmpInst::isUnsigned(PredL) || CmpInst::isUnsigned(PredR)) {
>>> +    // We have an unsigned compare (possibly with an equality compare),
>>> so treat
>>> +    // the constants as unsigned.
>>>      ShouldSwap = LHSC->getValue().ugt(RHSC->getValue());
>>> +  } else {
>>> +    // Equality transforms treat the constants as signed.
>>> +    ShouldSwap = LHSC->getValue().sgt(RHSC->getValue());
>>> +  }
>>>
>>>    if (ShouldSwap) {
>>>      std::swap(LHS, RHS);
>>>
>>> Modified: llvm/trunk/test/Transforms/InstCombine/or.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transfor
>>> ms/InstCombine/or.ll?rev=299851&r1=299850&r2=299851&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/test/Transforms/InstCombine/or.ll (original)
>>> +++ llvm/trunk/test/Transforms/InstCombine/or.ll Mon Apr 10 11:55:57
>>> 2017
>>> @@ -223,10 +223,9 @@ define i1 @test19(i32 %A) {
>>>
>>>  define i1 @or_icmps_eq_diff1(i32 %x) {
>>>  ; CHECK-LABEL: @or_icmps_eq_diff1(
>>> -; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 %x, -1
>>> -; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i32 %x, 0
>>> -; CHECK-NEXT:    [[LOGIC:%.*]] = or i1 [[CMP1]], [[CMP2]]
>>> -; CHECK-NEXT:    ret i1 [[LOGIC]]
>>> +; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 %x, 1
>>> +; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], 2
>>> +; CHECK-NEXT:    ret i1 [[TMP1]]
>>>  ;
>>>    %cmp1 = icmp eq i32 %x, -1
>>>    %cmp2 = icmp eq i32 %x, 0
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170411/14b5ff25/attachment.html>


More information about the llvm-commits mailing list