[llvm-commits] [llvm] r147753 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineAndOrXor.cpp test/Transforms/InstCombine/sign-test-and-or.ll

Benjamin Kramer benny.kra at googlemail.com
Sun Jan 8 13:12:51 PST 2012


Author: d0k
Date: Sun Jan  8 15:12:51 2012
New Revision: 147753

URL: http://llvm.org/viewvc/llvm-project?rev=147753&view=rev
Log:
Tweak my last commit to be less conservative about uses.

We still save an instruction when just the "and" part is replaced.
Also change the code to match comments more closely.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
    llvm/trunk/test/Transforms/InstCombine/sign-test-and-or.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=147753&r1=147752&r2=147753&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp Sun Jan  8 15:12:51 2012
@@ -745,18 +745,17 @@
   }
 
   // (X & C) == 0 & X > -1  ->  (X & (C | SignBit)) == 0
-  if (LHS->hasOneUse() && RHS->hasOneUse() &&
-      ((LHSCC == ICmpInst::ICMP_EQ && LHSCst->isZero() &&
-        RHSCC == ICmpInst::ICMP_SGT && RHSCst->isAllOnesValue()) ||
-       (RHSCC == ICmpInst::ICMP_EQ && RHSCst->isZero() &&
-        LHSCC == ICmpInst::ICMP_SGT && LHSCst->isAllOnesValue()))) {
-    BinaryOperator *BO =
-      dyn_cast<BinaryOperator>(LHSCC == ICmpInst::ICMP_EQ ? Val : Val2);
-    ConstantInt *AndCst;
-    if (BO && match(BO, m_OneUse(m_And(m_Value(), m_ConstantInt(AndCst))))) {
-      APInt New = AndCst->getValue() | APInt::getSignBit(AndCst->getBitWidth());
-      BO->setOperand(1, ConstantInt::get(AndCst->getContext(), New));
-      return BO == Val ? LHS : RHS;
+  if ((LHSCC == ICmpInst::ICMP_EQ  && LHSCst->isZero() &&
+       RHSCC == ICmpInst::ICMP_SGT && RHSCst->isAllOnesValue()) ||
+      (RHSCC == ICmpInst::ICMP_EQ  && RHSCst->isZero() &&
+       LHSCC == ICmpInst::ICMP_SGT && LHSCst->isAllOnesValue())) {
+    ICmpInst *I = LHSCC == ICmpInst::ICMP_EQ ? LHS : RHS;
+    Value *X; ConstantInt *C;
+    if (I->hasOneUse() &&
+        match(I->getOperand(0), m_OneUse(m_And(m_Value(X), m_ConstantInt(C))))){
+      APInt New = C->getValue() | APInt::getSignBit(C->getBitWidth());
+      return Builder->CreateICmpEQ(Builder->CreateAnd(X, Builder->getInt(New)),
+                                   I->getOperand(1));
     }
   }
   
@@ -1458,19 +1457,18 @@
     }
   }
 
-  // (X & C) != 0 & X < 0  ->  (X & (C | SignBit)) != 0
-  if (LHS->hasOneUse() && RHS->hasOneUse() &&
-      ((LHSCC == ICmpInst::ICMP_NE && LHSCst->isZero() &&
-        RHSCC == ICmpInst::ICMP_SLT && RHSCst->isZero()) ||
-       (RHSCC == ICmpInst::ICMP_NE && RHSCst->isZero() &&
-        LHSCC == ICmpInst::ICMP_SLT && LHSCst->isZero()))) {
-    BinaryOperator *BO =
-      dyn_cast<BinaryOperator>(LHSCC == ICmpInst::ICMP_NE ? Val : Val2);
-    ConstantInt *AndCst;
-    if (BO && match(BO, m_OneUse(m_And(m_Value(), m_ConstantInt(AndCst))))) {
-      APInt New = AndCst->getValue() | APInt::getSignBit(AndCst->getBitWidth());
-      BO->setOperand(1, ConstantInt::get(AndCst->getContext(), New));
-      return BO == Val ? LHS : RHS;
+  // (X & C) != 0 | X < 0  ->  (X & (C | SignBit)) != 0
+  if ((LHSCC == ICmpInst::ICMP_NE  && LHSCst->isZero() &&
+       RHSCC == ICmpInst::ICMP_SLT && RHSCst->isZero()) ||
+      (RHSCC == ICmpInst::ICMP_NE  && RHSCst->isZero() &&
+       LHSCC == ICmpInst::ICMP_SLT && LHSCst->isZero())) {
+    ICmpInst *I = LHSCC == ICmpInst::ICMP_NE ? LHS : RHS;
+    Value *X; ConstantInt *C;
+    if (I->hasOneUse() &&
+        match(I->getOperand(0), m_OneUse(m_And(m_Value(X), m_ConstantInt(C))))){
+      APInt New = C->getValue() | APInt::getSignBit(C->getBitWidth());
+      return Builder->CreateICmpNE(Builder->CreateAnd(X, Builder->getInt(New)),
+                                   I->getOperand(1));
     }
   }
 

Modified: llvm/trunk/test/Transforms/InstCombine/sign-test-and-or.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sign-test-and-or.ll?rev=147753&r1=147752&r2=147753&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/sign-test-and-or.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/sign-test-and-or.ll Sun Jan  8 15:12:51 2012
@@ -86,9 +86,9 @@
   br i1 %or.cond, label %if.then, label %if.end
 
 ; CHECK: @test5
-; CHECK-NEXT: %and = and i32 %a, -2013265920
-; CHECK-NEXT: %1 = icmp eq i32 %and, 0
-; CHECK-NEXT: br i1 %1, label %if.then, label %if.end
+; CHECK-NEXT: %1 = and i32 %a, -2013265920
+; CHECK-NEXT: %2 = icmp eq i32 %1, 0
+; CHECK-NEXT: br i1 %2, label %if.then, label %if.end
 
 if.then:
   tail call void @foo() nounwind
@@ -106,9 +106,9 @@
   br i1 %or.cond, label %if.then, label %if.end
 
 ; CHECK: @test6
-; CHECK-NEXT: %and = and i32 %a, -2013265920
-; CHECK-NEXT: %1 = icmp eq i32 %and, 0
-; CHECK-NEXT: br i1 %1, label %if.then, label %if.end
+; CHECK-NEXT: %1 = and i32 %a, -2013265920
+; CHECK-NEXT: %2 = icmp eq i32 %1, 0
+; CHECK-NEXT: br i1 %2, label %if.then, label %if.end
 
 if.then:
   tail call void @foo() nounwind
@@ -126,9 +126,9 @@
   br i1 %or.cond, label %if.then, label %if.end
 
 ; CHECK: @test7
-; CHECK-NEXT: %and = and i32 %a, -2013265920
-; CHECK-NEXT: %1 = icmp eq i32 %and, 0
-; CHECK-NEXT: br i1 %1, label %if.end, label %if.the
+; CHECK-NEXT: %1 = and i32 %a, -2013265920
+; CHECK-NEXT: %2 = icmp eq i32 %1, 0
+; CHECK-NEXT: br i1 %2, label %if.end, label %if.the
 
 if.then:
   tail call void @foo() nounwind
@@ -146,9 +146,9 @@
   br i1 %or.cond, label %if.then, label %if.end
 
 ; CHECK: @test8
-; CHECK-NEXT: %and = and i32 %a, -2013265920
-; CHECK-NEXT: %1 = icmp eq i32 %and, 0
-; CHECK-NEXT: br i1 %1, label %if.end, label %if.the
+; CHECK-NEXT: %1 = and i32 %a, -2013265920
+; CHECK-NEXT: %2 = icmp eq i32 %1, 0
+; CHECK-NEXT: br i1 %2, label %if.end, label %if.the
 
 if.then:
   tail call void @foo() nounwind





More information about the llvm-commits mailing list