This should be a win of every arch
authorAndrew Lenharth <andrewl@lenharth.org>
Sun, 2 Apr 2006 21:42:45 +0000 (21:42 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Sun, 2 Apr 2006 21:42:45 +0000 (21:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27364 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index f0003f0d6cd33d825d43df82be1f48492b9a4852..6bb4ea23a529cc046defc14989cc06963e06e76d 100644 (file)
@@ -818,7 +818,32 @@ SDOperand DAGCombiner::visitMUL(SDNode *N) {
                             DAG.getConstant(Log2_64(-N1C->getSignExtended()),
                                             TLI.getShiftAmountTy())));
   }
-  
+
+  //These two might be better as:
+  // mul x, ((1 << c) + cn) -> (x << c) + (x * cn)
+  // where TargetInfo tells us cn is a cheap constant to multiply by
+
+  // fold (mul x, (1 << c) + 1) -> (x << c) + x
+  //FIXME: there should be a target hint to allow other constants based on 
+  //       expense of mul
+  if (N1C && isPowerOf2_64(N1C->getSignExtended() - 1)) {
+    return DAG.getNode(ISD::ADD, VT, 
+                      DAG.getNode(ISD::SHL, VT, N0,
+                          DAG.getConstant(Log2_64(N1C->getSignExtended() - 1),
+                                                  TLI.getShiftAmountTy())),
+                      N0);
+  }
+  // fold (mul x, (1 << c) - 1) -> (x << c) - x
+  //FIXME: there should be a target hint to allow other constants based on 
+  //       the expense of mul
+  if (N1C && isPowerOf2_64(N1C->getSignExtended() + 1)) {
+    return DAG.getNode(ISD::SUB, VT, 
+                      DAG.getNode(ISD::SHL, VT, N0,
+                          DAG.getConstant(Log2_64(N1C->getSignExtended() + 1),
+                                          TLI.getShiftAmountTy())),
+                      N0);
+  }
+
   // (mul (shl X, c1), c2) -> (mul X, c2 << c1)
   if (N1C && N0.getOpcode() == ISD::SHL && 
       isa<ConstantSDNode>(N0.getOperand(1))) {