[PATCH] D28485: [ValueTracking] recognize a 'not' of an assumed condition as false

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 9 15:00:51 PST 2017


On Mon, Jan 9, 2017 at 3:00 PM, Sanjay Patel <spatel at rotateright.com> wrote:

> Hi Daniel -
>
> [Not sure if you meant to only reply to me;
>

Nope, just hit the wrong button :)


> I can reply to the list with the same message if that's ok with you.]
>
> Go for it.


> I don't think we handle the cases you're thinking of in any pass:
>
> define i1 @deduce_icmp_from_assume(i8 %a, i8 %b) {
>   %eqcond = icmp eq i8 %a, %b
>   call void @llvm.assume(i1 %eqcond)
>   %ltcond = icmp slt i8 %a, %b
>   ret i1 %ltcond
> }
>
> 'opt -O2' has no effect on this example.
>
> Sigh.


>
> On Mon, Jan 9, 2017 at 3:43 PM, Daniel Berlin <dberlin at dberlin.org> wrote:
>
>> Do we already handle that  > and < of an assumed equality is false?
>>
>> IE a == b ==true  -> a < b == false
>> a == b ==true  -> a > b == false
>>
>> and the inverses?
>>
>> a < b == true -> a == b ==false
>> a < b == true -> a != b == true
>>
>>
>> On Mon, Jan 9, 2017 at 2:37 PM, Sanjay Patel via Phabricator via
>> llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>
>>> spatel created this revision.
>>> spatel added reviewers: efriedma, majnemer, hfinkel.
>>> spatel added a subscriber: llvm-commits.
>>> Herald added a subscriber: mcrosier.
>>>
>>> I think this is a logical extension of the current checks in
>>> computeKnownBitsFromAssume(). Ie, it has negligible cost for the added
>>> functionality. But let me know if we need to re-think the whole approach.
>>>
>>> This is the reason I didn't have the canonical xor-form of 'not' in the
>>> test case for https://reviews.llvm.org/D28337 - it doesn't work without
>>> this change.
>>>
>>>
>>> https://reviews.llvm.org/D28485
>>>
>>> Files:
>>>   lib/Analysis/ValueTracking.cpp
>>>   test/Transforms/InstCombine/assume.ll
>>>
>>>
>>> Index: test/Transforms/InstCombine/assume.ll
>>> ===================================================================
>>> --- test/Transforms/InstCombine/assume.ll
>>> +++ test/Transforms/InstCombine/assume.ll
>>> @@ -176,13 +176,13 @@
>>>    ret i32 %lnot.ext
>>>  }
>>>
>>> -; FIXME: If the 'not' of a condition is known true, then the condition
>>> must be false.
>>> +; If the 'not' of a condition is known true, then the condition must be
>>> false.
>>>
>>>  define i1 @assume_not(i1 %cond) {
>>>  ; CHECK-LABEL: @assume_not(
>>>  ; CHECK-NEXT:    [[NOTCOND:%.*]] = xor i1 [[COND:%.*]], true
>>>  ; CHECK-NEXT:    call void @llvm.assume(i1 [[NOTCOND]])
>>> -; CHECK-NEXT:    ret i1 [[COND]]
>>> +; CHECK-NEXT:    ret i1 false
>>>  ;
>>>    %notcond = xor i1 %cond, true
>>>    call void @llvm.assume(i1 %notcond)
>>> Index: lib/Analysis/ValueTracking.cpp
>>> ===================================================================
>>> --- lib/Analysis/ValueTracking.cpp
>>> +++ lib/Analysis/ValueTracking.cpp
>>> @@ -544,10 +544,11 @@
>>>
>>>      Value *Arg = I->getArgOperand(0);
>>>
>>> -    if (Arg == V && isValidAssumeForContext(I, Q.CxtI, Q.DT)) {
>>> +    if ((Arg == V || match(Arg, m_Not(m_Specific(V)))) &&
>>> +        isValidAssumeForContext(I, Q.CxtI, Q.DT)) {
>>>        assert(BitWidth == 1 && "assume operand is not i1?");
>>> -      KnownZero.clearAllBits();
>>> -      KnownOne.setAllBits();
>>> +      KnownZero = Arg == V ? 0 : -1;
>>> +      KnownOne = Arg == V ? -1 : 0;
>>>        return;
>>>      }
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> 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/20170109/58c16a7a/attachment.html>


More information about the llvm-commits mailing list