<div dir="ltr"><div>Thanks for letting me know.<br><br>I think I see the problem - I forgot to make sure the source operand types of each compare match<br><br></div>I'll confirm if you send the failure that you have.<br> </div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 21, 2018 at 2:41 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.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">This changes causes assertions when compiling safe_numerics_unittest.cpp in Chromium with MSan:<div><a href="https://ci.chromium.org/buildbot/chromium.clang/ToTLinuxMSan/1945" target="_blank">https://ci.chromium.org/<wbr>buildbot/chromium.clang/<wbr>ToTLinuxMSan/1945</a><br></div><div><br></div><div><span style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">I have reverted this change in r328145.</span> I will send you pre-processed source offline that reproduces the problem.</div></div><div class="HOEnZb"><div class="h5"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 21, 2018 at 10:20 AM Sanjay Patel via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spatel<br>
Date: Wed Mar 21 10:17:13 2018<br>
New Revision: 328119<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=328119&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=328119&view=rev</a><br>
Log:<br>
[InstCombine] add folds for xor-of-icmp signbit tests (PR36682)<br>
<br>
This is part of solving:<br>
<a href="https://bugs.llvm.org/show_bug.cgi?id=36682" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=36682</a><br>
<br>
There's also a leftover improvement from the long-ago-closed:<br>
<a href="https://bugs.llvm.org/show_bug.cgi?id=5438" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=5438</a><br>
<br>
<a href="https://rise4fun.com/Alive/dC1" rel="noreferrer" target="_blank">https://rise4fun.com/Alive/dC1</a><br>
<br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp<br>
    llvm/trunk/test/Transforms/<wbr>InstCombine/compare-signs.ll<br>
    llvm/trunk/test/Transforms/<wbr>InstCombine/xor-icmps.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=328119&r1=328118&r2=328119&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/InstCombine/<wbr>InstCombineAndOrXor.cpp?rev=<wbr>328119&r1=328118&r2=328119&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>InstCombine/<wbr>InstCombineAndOrXor.cpp Wed Mar 21 10:17:13 2018<br>
@@ -2363,6 +2363,36 @@ Value *InstCombiner::foldXorOfICmps(<wbr>ICmp<br>
     }<br>
   }<br>
<br>
+  // TODO: This can be generalized to compares of non-signbits using<br>
+  // decomposeBitTestICmp(). It could be enhanced more by using (something like)<br>
+  // foldLogOpOfMaskedICmps().<br>
+  ICmpInst::Predicate PredL = LHS->getPredicate();<br>
+  ICmpInst::Predicate PredR = RHS->getPredicate();<br>
+  Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);<br>
+  Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);<br>
+  if ((LHS->hasOneUse() || RHS->hasOneUse()) && PredL == PredR) {<br>
+    // (X > -1) ^ (Y > -1) --> (X ^ Y) < 0<br>
+    // (X <  0) ^ (Y <  0) --> (X ^ Y) < 0<br>
+    if ((match(LHS1, m_AllOnes()) && match(RHS1, m_AllOnes()) &&<br>
+         PredL == CmpInst::ICMP_SGT) ||<br>
+        (match(LHS1, m_Zero()) && match(RHS1, m_Zero()) &&<br>
+         PredL == CmpInst::ICMP_SLT)) {<br>
+      Value *Zero = ConstantInt::getNullValue(<wbr>LHS0->getType());<br>
+      return Builder.CreateICmpSLT(Builder.<wbr>CreateXor(LHS0, RHS0), Zero);<br>
+    }<br>
+  }<br>
+  if ((LHS->hasOneUse() || RHS->hasOneUse())) {<br>
+    // (X > -1) ^ (Y <  0) --> (X ^ Y) > -1<br>
+    // (X <  0) ^ (Y > -1) --> (X ^ Y) > -1<br>
+    if ((match(LHS1, m_AllOnes()) && match(RHS1, m_Zero()) &&<br>
+         PredL == CmpInst::ICMP_SGT && PredR == CmpInst::ICMP_SLT) ||<br>
+        (match(LHS1, m_Zero()) && match(RHS1, m_AllOnes()) &&<br>
+         PredL == CmpInst::ICMP_SLT && PredR == CmpInst::ICMP_SGT)) {<br>
+      Value *MinusOne = ConstantInt::getAllOnesValue(<wbr>LHS0->getType());<br>
+      return Builder.CreateICmpSGT(Builder.<wbr>CreateXor(LHS0, RHS0), MinusOne);<br>
+    }<br>
+  }<br>
+<br>
   // Instead of trying to imitate the folds for and/or, decompose this 'xor'<br>
   // into those logic ops. That is, try to turn this into an and-of-icmps<br>
   // because we have many folds for that pattern.<br>
<br>
Modified: llvm/trunk/test/Transforms/<wbr>InstCombine/compare-signs.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/compare-signs.ll?rev=328119&r1=328118&r2=328119&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/InstCombine/<wbr>compare-signs.ll?rev=328119&<wbr>r1=328118&r2=328119&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/<wbr>InstCombine/compare-signs.ll (original)<br>
+++ llvm/trunk/test/Transforms/<wbr>InstCombine/compare-signs.ll Wed Mar 21 10:17:13 2018<br>
@@ -1,15 +1,14 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
 ; RUN: opt -instcombine -S < %s | FileCheck %s<br>
+<br>
 ; PR5438<br>
<br>
-; TODO: This should also optimize down.<br>
 define i32 @test1(i32 %a, i32 %b) nounwind readnone {<br>
 ; CHECK-LABEL: @test1(<br>
-; CHECK-NEXT:    [[T0:%.*]] = icmp sgt i32 [[A:%.*]], -1<br>
-; CHECK-NEXT:    [[T1:%.*]] = icmp slt i32 [[B:%.*]], 0<br>
-; CHECK-NEXT:    [[T2:%.*]] = xor i1 [[T1]], [[T0]]<br>
-; CHECK-NEXT:    [[T3:%.*]] = zext i1 [[T2]] to i32<br>
-; CHECK-NEXT:    ret i32 [[T3]]<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = xor i32 [[B:%.*]], [[A:%.*]]<br>
+; CHECK-NEXT:    [[DOTLOBIT:%.*]] = lshr i32 [[TMP1]], 31<br>
+; CHECK-NEXT:    [[DOTLOBIT_NOT:%.*]] = xor i32 [[DOTLOBIT]], 1<br>
+; CHECK-NEXT:    ret i32 [[DOTLOBIT_NOT]]<br>
 ;<br>
   %t0 = icmp sgt i32 %a, -1<br>
   %t1 = icmp slt i32 %b, 0<br>
@@ -36,7 +35,7 @@ define i32 @test2(i32 %a, i32 %b) nounwi<br>
<br>
 define i32 @test3(i32 %a, i32 %b) nounwind readnone {<br>
 ; CHECK-LABEL: @test3(<br>
-; CHECK-NEXT:    [[T2_UNSHIFTED:%.*]] = xor i32 %a, %b<br>
+; CHECK-NEXT:    [[T2_UNSHIFTED:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]<br>
 ; CHECK-NEXT:    [[T2_UNSHIFTED_LOBIT:%.*]] = lshr i32 [[T2_UNSHIFTED]], 31<br>
 ; CHECK-NEXT:    [[T2_UNSHIFTED_LOBIT_NOT:%.*]] = xor i32 [[T2_UNSHIFTED_LOBIT]], 1<br>
 ; CHECK-NEXT:    ret i32 [[T2_UNSHIFTED_LOBIT_NOT]]<br>
@@ -68,7 +67,7 @@ define <2 x i32> @test3vec(<2 x i32> %a,<br>
 ; is one, not zero.<br>
 define i32 @test3i(i32 %a, i32 %b) nounwind readnone {<br>
 ; CHECK-LABEL: @test3i(<br>
-; CHECK-NEXT:    [[T01:%.*]] = xor i32 %a, %b<br>
+; CHECK-NEXT:    [[T01:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = lshr i32 [[T01]], 31<br>
 ; CHECK-NEXT:    [[T4:%.*]] = xor i32 [[TMP1]], 1<br>
 ; CHECK-NEXT:    ret i32 [[T4]]<br>
@@ -84,7 +83,7 @@ define i32 @test3i(i32 %a, i32 %b) nounw<br>
<br>
 define i1 @test4a(i32 %a) {<br>
 ; CHECK-LABEL: @test4a(<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 %a, 1<br>
+; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 [[A:%.*]], 1<br>
 ; CHECK-NEXT:    ret i1 [[C]]<br>
 ;<br>
   %l = ashr i32 %a, 31<br>
@@ -97,7 +96,7 @@ define i1 @test4a(i32 %a) {<br>
<br>
 define <2 x i1> @test4a_vec(<2 x i32> %a) {<br>
 ; CHECK-LABEL: @test4a_vec(<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp slt <2 x i32> %a, <i32 1, i32 1><br>
+; CHECK-NEXT:    [[C:%.*]] = icmp slt <2 x i32> [[A:%.*]], <i32 1, i32 1><br>
 ; CHECK-NEXT:    ret <2 x i1> [[C]]<br>
 ;<br>
   %l = ashr <2 x i32> %a, <i32 31, i32 31><br>
@@ -110,7 +109,7 @@ define <2 x i1> @test4a_vec(<2 x i32> %a<br>
<br>
 define i1 @test4b(i64 %a) {<br>
 ; CHECK-LABEL: @test4b(<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp slt i64 %a, 1<br>
+; CHECK-NEXT:    [[C:%.*]] = icmp slt i64 [[A:%.*]], 1<br>
 ; CHECK-NEXT:    ret i1 [[C]]<br>
 ;<br>
   %l = ashr i64 %a, 63<br>
@@ -123,7 +122,7 @@ define i1 @test4b(i64 %a) {<br>
<br>
 define i1 @test4c(i64 %a) {<br>
 ; CHECK-LABEL: @test4c(<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp slt i64 %a, 1<br>
+; CHECK-NEXT:    [[C:%.*]] = icmp slt i64 [[A:%.*]], 1<br>
 ; CHECK-NEXT:    ret i1 [[C]]<br>
 ;<br>
   %l = ashr i64 %a, 63<br>
@@ -137,7 +136,7 @@ define i1 @test4c(i64 %a) {<br>
<br>
 define <2 x i1> @test4c_vec(<2 x i64> %a) {<br>
 ; CHECK-LABEL: @test4c_vec(<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp slt <2 x i64> %a, <i64 1, i64 1><br>
+; CHECK-NEXT:    [[C:%.*]] = icmp slt <2 x i64> [[A:%.*]], <i64 1, i64 1><br>
 ; CHECK-NEXT:    ret <2 x i1> [[C]]<br>
 ;<br>
   %l = ashr <2 x i64> %a, <i64 63, i64 63><br>
<br>
Modified: llvm/trunk/test/Transforms/<wbr>InstCombine/xor-icmps.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/xor-icmps.ll?rev=328119&r1=328118&r2=328119&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/InstCombine/xor-<wbr>icmps.ll?rev=328119&r1=328118&<wbr>r2=328119&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/<wbr>InstCombine/xor-icmps.ll (original)<br>
+++ llvm/trunk/test/Transforms/<wbr>InstCombine/xor-icmps.ll Wed Mar 21 10:17:13 2018<br>
@@ -42,10 +42,9 @@ define i1 @eq_ne_zero(i4 %x, i4 %y) {<br>
<br>
 define i1 @slt_zero(i4 %x, i4 %y) {<br>
 ; CHECK-LABEL: @slt_zero(<br>
-; CHECK-NEXT:    [[I0:%.*]] = icmp slt i4 [[X:%.*]], 0<br>
-; CHECK-NEXT:    [[I1:%.*]] = icmp slt i4 [[Y:%.*]], 0<br>
-; CHECK-NEXT:    [[R:%.*]] = xor i1 [[I0]], [[I1]]<br>
-; CHECK-NEXT:    ret i1 [[R]]<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i4 [[TMP1]], 0<br>
+; CHECK-NEXT:    ret i1 [[TMP2]]<br>
 ;<br>
   %i0 = icmp slt i4 %x, 0<br>
   %i1 = icmp slt i4 %y, 0<br>
@@ -68,10 +67,9 @@ define i1 @sgt_zero(i4 %x, i4 %y) {<br>
<br>
 define i1 @sgt_minus1(i4 %x, i4 %y) {<br>
 ; CHECK-LABEL: @sgt_minus1(<br>
-; CHECK-NEXT:    [[I0:%.*]] = icmp sgt i4 [[X:%.*]], -1<br>
-; CHECK-NEXT:    [[I1:%.*]] = icmp sgt i4 [[Y:%.*]], -1<br>
-; CHECK-NEXT:    [[R:%.*]] = xor i1 [[I0]], [[I1]]<br>
-; CHECK-NEXT:    ret i1 [[R]]<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i4 [[TMP1]], 0<br>
+; CHECK-NEXT:    ret i1 [[TMP2]]<br>
 ;<br>
   %i0 = icmp sgt i4 %x, -1<br>
   %i1 = icmp sgt i4 %y, -1<br>
@@ -81,10 +79,9 @@ define i1 @sgt_minus1(i4 %x, i4 %y) {<br>
<br>
 define i1 @slt_zero_sgt_minus1(i4 %x, i4 %y) {<br>
 ; CHECK-LABEL: @slt_zero_sgt_minus1(<br>
-; CHECK-NEXT:    [[I0:%.*]] = icmp slt i4 [[X:%.*]], 0<br>
-; CHECK-NEXT:    [[I1:%.*]] = icmp sgt i4 [[Y:%.*]], -1<br>
-; CHECK-NEXT:    [[R:%.*]] = xor i1 [[I0]], [[I1]]<br>
-; CHECK-NEXT:    ret i1 [[R]]<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = xor i4 [[X:%.*]], [[Y:%.*]]<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i4 [[TMP1]], -1<br>
+; CHECK-NEXT:    ret i1 [[TMP2]]<br>
 ;<br>
   %i0 = icmp slt i4 %x, 0<br>
   %i1 = icmp sgt i4 %y, -1<br>
@@ -94,10 +91,9 @@ define i1 @slt_zero_sgt_minus1(i4 %x, i4<br>
<br>
 define <2 x i1> @sgt_minus1_slt_zero_sgt(<2 x i4> %x, <2 x i4> %y) {<br>
 ; CHECK-LABEL: @sgt_minus1_slt_zero_sgt(<br>
-; CHECK-NEXT:    [[I1:%.*]] = icmp sgt <2 x i4> [[X:%.*]], <i4 -1, i4 -1><br>
-; CHECK-NEXT:    [[I0:%.*]] = icmp slt <2 x i4> [[Y:%.*]], zeroinitializer<br>
-; CHECK-NEXT:    [[R:%.*]] = xor <2 x i1> [[I0]], [[I1]]<br>
-; CHECK-NEXT:    ret <2 x i1> [[R]]<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = xor <2 x i4> [[Y:%.*]], [[X:%.*]]<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt <2 x i4> [[TMP1]], <i4 -1, i4 -1><br>
+; CHECK-NEXT:    ret <2 x i1> [[TMP2]]<br>
 ;<br>
   %i1 = icmp sgt <2 x i4> %x, <i4 -1, i4 -1><br>
   %i0 = icmp slt <2 x i4> %y, zeroinitializer<br>
<br>
<br>
______________________________<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>
</blockquote></div>
</div></div></blockquote></div><br></div>