Add a select_cc optimization for recognizing abs(int). This speeds up an
authorNate Begeman <natebegeman@mac.com>
Thu, 11 Aug 2005 02:18:13 +0000 (02:18 +0000)
committerNate Begeman <natebegeman@mac.com>
Thu, 11 Aug 2005 02:18:13 +0000 (02:18 +0000)
integer MPEG encoding loop by a factor of two.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22758 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index e331c4a60bdf6234ae32df3a8a541709d0aca442..12482efd7087a88f9d8f827930b89c81a863393a 100644 (file)
@@ -1495,6 +1495,22 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
         return getNode(ISD::AND, AType, Shift, N3);
       }
     }
+    
+    // Check to see if this is an integer abs. select_cc setl[te] X, 0, -X, X ->
+    // Y = sra (X, size(X)-1); xor (add (X, Y), Y)
+    if (N2C && N2C->isNullValue() && (CC == ISD::SETLT || CC == ISD::SETLE) &&
+        N1 == N4 && N3.getOpcode() == ISD::SUB && N1 == N3.getOperand(1)) {
+      if (ConstantSDNode *SubC = dyn_cast<ConstantSDNode>(N3.getOperand(0))) {
+        MVT::ValueType XType = N1.getValueType();
+        if (SubC->isNullValue() && MVT::isInteger(XType)) {
+          SDOperand Shift = getNode(ISD::SRA, XType, N1,
+                                    getConstant(MVT::getSizeInBits(XType)-1,
+                                                TLI.getShiftAmountTy()));
+          return getNode(ISD::XOR, XType, getNode(ISD::ADD, XType, N1, Shift), 
+                         Shift);
+        }
+      }
+    }
   }
         
   std::vector<SDOperand> Ops;