Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.139 -> 1.140 --- Log message: This should be a win of every arch --- Diffs of the changes: (+26 -1) DAGCombiner.cpp | 27 ++++++++++++++++++++++++++- 1 files changed, 26 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.139 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.140 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.139 Sun Apr 2 00:11:11 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Sun Apr 2 16:42:45 2006 @@ -818,7 +818,32 @@ 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))) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits