[llvm-commits] [llvm] r50882 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/not.ll test/Transforms/InstCombine/sub.ll

Chris Lattner sabre at nondot.org
Thu May 8 22:19:28 PDT 2008


Author: lattner
Date: Fri May  9 00:19:28 2008
New Revision: 50882

URL: http://llvm.org/viewvc/llvm-project?rev=50882&view=rev
Log:
Implement PR2298.  This transforms:
   ~x < ~y --> y < x
   -x == -y --> x == y


Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
    llvm/trunk/test/Transforms/InstCombine/not.ll
    llvm/trunk/test/Transforms/InstCombine/sub.ll

Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=50882&r1=50881&r2=50882&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Fri May  9 00:19:28 2008
@@ -5658,8 +5658,21 @@
         return R;
   }
   
+  // ~x < ~y --> y < x
+  { Value *A, *B;
+    if (match(Op0, m_Not(m_Value(A))) &&
+        match(Op1, m_Not(m_Value(B))))
+      return new ICmpInst(I.getPredicate(), B, A);
+  }
+  
   if (I.isEquality()) {
     Value *A, *B, *C, *D;
+    
+    // -x == -y --> x == y
+    if (match(Op0, m_Neg(m_Value(A))) &&
+        match(Op1, m_Neg(m_Value(B))))
+      return new ICmpInst(I.getPredicate(), A, B);
+    
     if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
       if (A == Op1 || B == Op1) {    // (A^B) == A  ->  B == 0
         Value *OtherVal = A == Op1 ? B : A;

Modified: llvm/trunk/test/Transforms/InstCombine/not.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/not.ll?rev=50882&r1=50881&r2=50882&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/not.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/not.ll Fri May  9 00:19:28 2008
@@ -42,3 +42,13 @@
         ret i32 %d
 }
 
+; PR2298
+define i8 @test6(i32 %a, i32 %b) zeroext nounwind  {
+entry:
+	%tmp1not = xor i32 %a, -1		; <i32> [#uses=1]
+	%tmp2not = xor i32 %b, -1		; <i32> [#uses=1]
+	%tmp3 = icmp slt i32 %tmp1not, %tmp2not		; <i1> [#uses=1]
+	%retval67 = zext i1 %tmp3 to i8		; <i8> [#uses=1]
+	ret i8 %retval67
+}
+

Modified: llvm/trunk/test/Transforms/InstCombine/sub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sub.ll?rev=50882&r1=50881&r2=50882&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/sub.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/sub.ll Fri May  9 00:19:28 2008
@@ -134,3 +134,13 @@
 	%tmp.4 = icmp ne i32 %tmp.2, %g		; <i1> [#uses=1]
 	ret i1 %tmp.4
 }
+
+; PR2298
+define i8 @test22(i32 %a, i32 %b) zeroext nounwind  {
+	%tmp2 = sub i32 0, %a		; <i32> [#uses=1]
+	%tmp4 = sub i32 0, %b		; <i32> [#uses=1]
+	%tmp5 = icmp eq i32 %tmp2, %tmp4		; <i1> [#uses=1]
+	%retval89 = zext i1 %tmp5 to i8		; <i8> [#uses=1]
+	ret i8 %retval89
+}
+





More information about the llvm-commits mailing list