<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 9, 2017 at 3:00 PM, Sanjay Patel <span dir="ltr"><<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi Daniel -<br><br></div>[Not sure if you meant to only reply to me;</div></blockquote><div><br></div><div>Nope, just hit the wrong button :)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"> I can reply to the list with the same message if that's ok with you.]<br><div><br></div></div></blockquote><div>Go for it.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div></div><div>I don't think we handle the cases you're thinking of in any pass:<br></div><div><br>define i1 @deduce_icmp_from_assume(i8 %a, i8 %b) {<br>  %eqcond = icmp eq i8 %a, %b<br>  call void @llvm.assume(i1 %eqcond)<br>  %ltcond = icmp slt i8 %a, %b<br>  ret i1 %ltcond<br>}<br><br></div><div>'opt -O2' has no effect on this example.<br></div><div><br></div></div></blockquote><div>Sigh.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 9, 2017 at 3:43 PM, Daniel Berlin <span dir="ltr"><<a href="mailto:dberlin@dberlin.org" target="_blank">dberlin@dberlin.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Do we already handle that  > and < of an assumed equality is false?<div><br></div><div>IE a == b ==true  -> a < b == false</div><div><div>a == b ==true  -> a > b == false</div></div><div><br></div><div>and the inverses?<br><br></div><div>a < b == true -> a == b ==false</div><div>a < b == true -> a != b == true</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_-8534835118720059248h5">On Mon, Jan 9, 2017 at 2:37 PM, Sanjay Patel via Phabricator via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-8534835118720059248h5">spatel created this revision.<br>
spatel added reviewers: efriedma, majnemer, hfinkel.<br>
spatel added a subscriber: llvm-commits.<br>
Herald added a subscriber: mcrosier.<br>
<br>
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.<br>
<br>
This is the reason I didn't have the canonical xor-form of 'not' in the test case for <a href="https://reviews.llvm.org/D28337" rel="noreferrer" target="_blank">https://reviews.llvm.org/D2833<wbr>7</a> - it doesn't work without this change.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D28485" rel="noreferrer" target="_blank">https://reviews.llvm.org/D2848<wbr>5</a><br>
<br>
Files:<br>
  lib/Analysis/ValueTracking.cpp<br>
  test/Transforms/InstCombine/as<wbr>sume.ll<br>
<br>
<br>
Index: test/Transforms/InstCombine/as<wbr>sume.ll<br>
==============================<wbr>==============================<wbr>=======<br>
--- test/Transforms/InstCombine/as<wbr>sume.ll<br>
+++ test/Transforms/InstCombine/as<wbr>sume.ll<br>
@@ -176,13 +176,13 @@<br>
   ret i32 %lnot.ext<br>
 }<br>
<br>
-; FIXME: If the 'not' of a condition is known true, then the condition must be false.<br>
+; If the 'not' of a condition is known true, then the condition must be false.<br>
<br>
 define i1 @assume_not(i1 %cond) {<br>
 ; CHECK-LABEL: @assume_not(<br>
 ; CHECK-NEXT:    [[NOTCOND:%.*]] = xor i1 [[COND:%.*]], true<br>
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[NOTCOND]])<br>
-; CHECK-NEXT:    ret i1 [[COND]]<br>
+; CHECK-NEXT:    ret i1 false<br>
 ;<br>
   %notcond = xor i1 %cond, true<br>
   call void @llvm.assume(i1 %notcond)<br>
Index: lib/Analysis/ValueTracking.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- lib/Analysis/ValueTracking.cpp<br>
+++ lib/Analysis/ValueTracking.cpp<br>
@@ -544,10 +544,11 @@<br>
<br>
     Value *Arg = I->getArgOperand(0);<br>
<br>
-    if (Arg == V && isValidAssumeForContext(I, Q.CxtI, Q.DT)) {<br>
+    if ((Arg == V || match(Arg, m_Not(m_Specific(V)))) &&<br>
+        isValidAssumeForContext(I, Q.CxtI, Q.DT)) {<br>
       assert(BitWidth == 1 && "assume operand is not i1?");<br>
-      KnownZero.clearAllBits();<br>
-      KnownOne.setAllBits();<br>
+      KnownZero = Arg == V ? 0 : -1;<br>
+      KnownOne = Arg == V ? -1 : 0;<br>
       return;<br>
     }<br>
<br>
<br>
<br>
<br></div></div>______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>