diff options
author | Andrew Lenharth <andrewl@lenharth.org> | 2006-04-02 21:42:45 +0000 |
---|---|---|
committer | Andrew Lenharth <andrewl@lenharth.org> | 2006-04-02 21:42:45 +0000 |
commit | 50a0d426e85b4e27766a99279d2e61f622525f94 (patch) | |
tree | 12c1688c1c3d4bf2343d1e07b96e456ef9d93acb | |
parent | ccd9f98bcb639a65146a5a969dae103017b81ab6 (diff) |
This should be a win of every arch
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27364 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index f0003f0d6c..6bb4ea23a5 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -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))) { |