This makes McCat/12-IOtest go 8x faster or so
authorAndrew Lenharth <andrewl@lenharth.org>
Sun, 2 Apr 2006 21:08:39 +0000 (21:08 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Sun, 2 Apr 2006 21:08:39 +0000 (21:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27363 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Alpha/AlphaISelLowering.cpp

index 3eb38e645164e6b9b5bce74727b54526f818a17b..b1111a6a826fee57ebbeac62f2c32a826d0b612f 100644 (file)
@@ -585,10 +585,22 @@ SDOperand AlphaTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
                       DAG.getNode(AlphaISD::GlobalBaseReg, MVT::i64));
   }
 
-  case ISD::SDIV:
-  case ISD::UDIV:
   case ISD::UREM:
   case ISD::SREM:
+    //Expand only on constant case
+    if (Op.getOperand(1).getOpcode() == ISD::Constant) {
+      MVT::ValueType VT = Op.Val->getValueType(0);
+      unsigned Opc = Op.Val->getOpcode() == ISD::UREM ? ISD::UDIV : ISD::SDIV;
+      SDOperand Tmp1 = Op.Val->getOpcode() == ISD::UREM ?
+       BuildUDIVSequence(Op, &DAG) :
+       BuildSDIVSequence(Op, &DAG);
+      Tmp1 = DAG.getNode(ISD::MUL, VT, Tmp1, Op.getOperand(1));
+      Tmp1 = DAG.getNode(ISD::SUB, VT, Op.getOperand(0), Tmp1);
+      return Tmp1;
+    }
+    //fall through
+  case ISD::SDIV:
+  case ISD::UDIV:
     if (MVT::isInteger(Op.getValueType())) {
       const char* opstr = 0;
       switch(Op.getOpcode()) {