[llvm-commits] [llvm] r45250 - /llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Chris Lattner sabre at nondot.org
Wed Dec 19 17:56:58 PST 2007


Author: lattner
Date: Wed Dec 19 19:56:58 2007
New Revision: 45250

URL: http://llvm.org/viewvc/llvm-project?rev=45250&view=rev
Log:
simplify this code with the new m_Zero() pattern.  Make sure the select only
has a single use, and generalize it to not require N to be a constant.


Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

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

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Wed Dec 19 19:56:58 2007
@@ -2109,8 +2109,7 @@
   }
 
   // add (cast *A to intptrtype) B -> 
-  //   cast (GEP (cast *A to sbyte*) B) -> 
-  //     intptrtype
+  //   cast (GEP (cast *A to sbyte*) B)  -->  intptrtype
   {
     CastInst *CI = dyn_cast<CastInst>(LHS);
     Value *Other = RHS;
@@ -2131,8 +2130,7 @@
     }
   }
   
-  // add (select X 0 (sub n A)) A ->
-  //  select X A n
+  // add (select X 0 (sub n A)) A  -->  select X A n
   {
     SelectInst *SI = dyn_cast<SelectInst>(LHS);
     Value *Other = RHS;
@@ -2140,25 +2138,19 @@
       SI = dyn_cast<SelectInst>(RHS);
       Other = LHS;
     }
-    if (SI) {
+    if (SI && SI->hasOneUse()) {
       Value *TV = SI->getTrueValue();
       Value *FV = SI->getFalseValue();
-      Value *A;
+      Value *A, *N;
 
       // Can we fold the add into the argument of the select?
       // We check both true and false select arguments for a matching subtract.
-      ConstantInt *C1, *C2;
-      if (match(FV, m_ConstantInt(C1)) && C1->getValue() == 0 &&
-          match(TV, m_Sub(m_ConstantInt(C2), m_Value(A))) &&
-          A == Other) {
-        // We managed to fold the add into the true select value.
-        return new SelectInst(SI->getCondition(), C2, A);
-      } else if (match(TV, m_ConstantInt(C1)) && C1->getValue() == 0 && 
-                 match(FV, m_Sub(m_ConstantInt(C2), m_Value(A))) &&
-                 A == Other) {
-        // We managed to fold the add into the false select value.
-        return new SelectInst(SI->getCondition(), A, C2);
-      }
+      if (match(FV, m_Zero()) && match(TV, m_Sub(m_Value(N), m_Value(A))) &&
+          A == Other)  // Fold the add into the true select value.
+        return new SelectInst(SI->getCondition(), N, A);
+      if (match(TV, m_Zero()) && match(FV, m_Sub(m_Value(N), m_Value(A))) && 
+          A == Other)  // Fold the add into the false select value.
+        return new SelectInst(SI->getCondition(), A, N);
     }
   }
 





More information about the llvm-commits mailing list