[PATCH] D28485: [ValueTracking] recognize a 'not' of an assumed condition as false
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 9 15:00:14 PST 2017
Hi Daniel -
[Not sure if you meant to only reply to me; I can reply to the list with
the same message if that's ok with you.]
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.
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/69de25f5/attachment.html>
More information about the llvm-commits
mailing list