<br><br><div class="gmail_quote">On Wed, Nov 30, 2011 at 7:58 PM, Pete Cooper <span dir="ltr"><<a href="mailto:peter_cooper@apple.com">peter_cooper@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Author: pete<br>
Date: Wed Nov 30 21:58:40 2011<br>
New Revision: 145563<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=145563&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=145563&view=rev</a><br>
Log:<br>
Added instcombine pattern to spot comparing -val or val against 0.<br>
(val != 0) == (-val != 0) so "abs(val) != 0" becomes "val != 0"<br>
<br>
Fixes <rdar://problem/10482509><br>
<br>
Added:<br>
    llvm/trunk/test/Transforms/InstCombine/compare-abs-nonzero.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp<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=145563&r1=145562&r2=145563&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=145563&r1=145562&r2=145563&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Wed Nov 30 21:58:40 2011<br>
@@ -1795,6 +1795,20 @@<br>
   if (Value *V = SimplifyICmpInst(I.getPredicate(), Op0, Op1, TD))<br>
     return ReplaceInstUsesWith(I, V);<br>
<br>
+  // comparing -val or val with non-zero is the same as just comparing val<br>
+  // ie, (val != 0) == (-val != 0)<br>
+  if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero()))<br>
+  {<br>
+    Value *Cond, *SubSrc, *SelectFalse;<br>
+    if (match(Op0, m_Select(m_Value(Cond), m_Sub(m_Zero(), m_Value(SubSrc)),<br>
+                            m_Value(SelectFalse)))) {<br>
+      if (SubSrc == SelectFalse) {<br>
+        return CmpInst::Create(Instruction::ICmp, I.getPredicate(),<br>
+                               SubSrc, Op1);<br>
+      }<br>
+    }<br>
+  }<br>
+<br>
   Type *Ty = Op0->getType();<br>
<br>
   // icmp's with boolean values can always be turned into bitwise operations<br>
<br>
Added: llvm/trunk/test/Transforms/InstCombine/compare-abs-nonzero.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/compare-abs-nonzero.ll?rev=145563&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/compare-abs-nonzero.ll?rev=145563&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/test/Transforms/InstCombine/compare-abs-nonzero.ll (added)<br>
+++ llvm/trunk/test/Transforms/InstCombine/compare-abs-nonzero.ll Wed Nov 30 21:58:40 2011<br>
@@ -0,0 +1,10 @@<br>
+; RUN: opt < %s -instcombine -S | grep -v {select}<br></blockquote><div><br></div><div>Please always use FileCheck on new tests...</div><div><br></div><div>That said, is there not an existing test this could be added to rather than creating a whole new test file which is very narrow?</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
+<br>
+define zeroext i1 @cmpabs(i64 %val) nounwind uwtable readnone ssp {<br>
+entry:<br>
+  %sub = sub nsw i64 0, %val<br>
+  %cmp = icmp slt i64 %val, 0<br>
+  %sub.val = select i1 %cmp, i64 %sub, i64 %val<br>
+  %tobool = icmp ne i64 %sub.val, 0<br>
+  ret i1 %tobool<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>