<div dir="ltr">This transform was broken for unsigned comparisons.  I disabled it in r204948, which should fix the problem.  See the commit message for the counterexample.</div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Mar 27, 2014 at 4:16 AM, Erik Verbruggen <span dir="ltr"><<a href="mailto:erikjv@me.com" target="_blank">erikjv@me.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: erikjv<br>
Date: Thu Mar 27 06:16:05 2014<br>
New Revision: 204912<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=204912&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=204912&view=rev</a><br>
Log:<br>
InstCombine: merge constants in both operands of icmp.<br>
<br>
Transform:<br>
    icmp X+Cst2, Cst<br>
into:<br>
    icmp X, Cst-Cst2<br>
when Cst-Cst2 does not overflow, and the add has nsw.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/README.txt<br>
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp<br>
    llvm/trunk/test/Transforms/InstCombine/icmp.ll<br>
<br>
Modified: llvm/trunk/lib/Target/README.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/README.txt?rev=204912&r1=204911&r2=204912&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/README.txt?rev=204912&r1=204911&r2=204912&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/README.txt (original)<br>
+++ llvm/trunk/lib/Target/README.txt Thu Mar 27 06:16:05 2014<br>
@@ -930,18 +930,6 @@ optimized with "clang -emit-llvm-bc | op<br>
<br>
 //===---------------------------------------------------------------------===//<br>
<br>
-int g(int x) { return (x - 10) < 0; }<br>
-Should combine to "x <= 9" (the sub has nsw).  Currently not<br>
-optimized with "clang -emit-llvm-bc | opt -std-compile-opts".<br>
-<br>
-//===---------------------------------------------------------------------===//<br>
-<br>
-int g(int x) { return (x + 10) < 0; }<br>
-Should combine to "x < -10" (the add has nsw).  Currently not<br>
-optimized with "clang -emit-llvm-bc | opt -std-compile-opts".<br>
-<br>
-//===---------------------------------------------------------------------===//<br>
-<br>
 int f(int i, int j) { return i < j + 1; }<br>
 int g(int i, int j) { return j > i - 1; }<br>
 Should combine to "i <= j" (the add/sub has nsw).  Currently not<br>
<br>
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=204912&r1=204911&r2=204912&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=204912&r1=204911&r2=204912&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Thu Mar 27 06:16:05 2014<br>
@@ -3008,6 +3008,19 @@ Instruction *InstCombiner::visitICmpInst<br>
     // icmp X, X+Cst<br>
     if (match(Op1, m_Add(m_Value(X), m_ConstantInt(Cst))) && Op0 == X)<br>
       return FoldICmpAddOpCst(I, X, Cst, I.getSwappedPredicate());<br>
+<br>
+    ConstantInt *Cst2;<br>
+    if (match(Op1, m_ConstantInt(Cst)) &&<br>
+        match(Op0, m_Add(m_Value(X), m_ConstantInt(Cst2))) &&<br>
+        cast<BinaryOperator>(Op0)->hasNoSignedWrap()) {<br>
+      // icmp X+Cst2, Cst --> icmp X, Cst-Cst2<br>
+      // iff Cst-Cst2 does not overflow<br>
+      bool Overflow;<br>
+      APInt NewCst = Cst->getValue().ssub_ov(Cst2->getValue(), Overflow);<br>
+      if (!Overflow)<br>
+        return new ICmpInst(I.getPredicate(), X,<br>
+                            ConstantInt::get(Cst->getType(), NewCst));<br>
+    }<br>
   }<br>
   return Changed ? &I : 0;<br>
 }<br>
<br>
Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=204912&r1=204911&r2=204912&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=204912&r1=204911&r2=204912&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)<br>
+++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Thu Mar 27 06:16:05 2014<br>
@@ -1356,3 +1356,56 @@ define i1 @icmp_ashr_ashr_ne(i32 %a, i32<br>
  %z = icmp ne i32 %x, %y<br>
  ret i1 %z<br>
 }<br>
+<br>
+; CHECK-LABEL: icmp_add_const_const1<br>
+; CHECK: %cmp = icmp slt i32 %x, -10<br>
+; CHECK-NOT: %add = add nsw i32 %x, 10<br>
+define i32 @icmp_add_const_const1(i32 %x) nounwind ssp uwtable {<br>
+entry:<br>
+  %add = add nsw i32 %x, 10<br>
+  %cmp = icmp slt i32 %add, 0<br>
+  %conv = zext i1 %cmp to i32<br>
+  ret i32 %conv<br>
+}<br>
+<br>
+; CHECK-LABEL: icmp_add_const_const2<br>
+; CHECK: %cmp = icmp slt i32 %x, -10<br>
+; CHECK-NOT: %add = add nsw i32 %x, 10<br>
+define i32 @icmp_add_const_const2(i32 %x) nounwind ssp uwtable {<br>
+entry:<br>
+  %add = add nsw i32 10, %x<br>
+  %cmp = icmp sgt i32 0, %add<br>
+  %conv = zext i1 %cmp to i32<br>
+  ret i32 %conv<br>
+}<br>
+<br>
+; CHECK-LABEL: icmp_add_const_const3<br>
+; CHECK: %cmp = icmp slt i32 %x, 20<br>
+; CHECK-NOT: %sub = add nsw i32 %x, -10<br>
+define i32 @icmp_add_const_const3(i32 %x) nounwind ssp uwtable {<br>
+entry:<br>
+  %add = add nsw i32 -10, %x<br>
+  %cmp = icmp sgt i32 10, %add<br>
+  %conv = zext i1 %cmp to i32<br>
+  ret i32 %conv<br>
+}<br>
+<br>
+; CHECK-LABEL: icmp_add_const_intmin<br>
+; CHECK: %cmp = icmp ne i32 %x, 2147483638<br>
+define i32 @icmp_add_const_intmin(i32 %x) nounwind ssp uwtable {<br>
+entry:<br>
+  %add = add nsw i32 %x, 10<br>
+  %cmp = icmp sgt i32 %add, -2147483648<br>
+  %conv = zext i1 %cmp to i32<br>
+  ret i32 %conv<br>
+}<br>
+<br>
+; CHECK-LABEL: icmp_add_const_intmax<br>
+; CHECK: %cmp = icmp ne i32 %x, 2147483637<br>
+define i32 @icmp_add_const_intmax(i32 %x) nounwind ssp uwtable {<br>
+entry:<br>
+  %add = add nsw i32 %x, 10<br>
+  %cmp = icmp slt i32 %add, 2147483647<br>
+  %conv = zext i1 %cmp to i32<br>
+  ret i32 %conv<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>