diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-03-01 03:44:24 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-03-01 03:44:24 +0000 |
| commit | 324871ef1af9d44d16212cb5eaac38ee3bbf66c6 (patch) | |
| tree | 19a85044c087aa86073e896074cc0be6a985f066 /llvm/lib/CodeGen/SelectionDAG | |
| parent | e8ddd8a72f22e23cc1dc5fcb80a3e98c292bab1e (diff) | |
| download | bcm5719-llvm-324871ef1af9d44d16212cb5eaac38ee3bbf66c6.tar.gz bcm5719-llvm-324871ef1af9d44d16212cb5eaac38ee3bbf66c6.zip | |
Pull shifts by a constant through multiplies (a form of reassociation),
implementing Regression/CodeGen/X86/mul-shift-reassoc.ll
llvm-svn: 26440
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 5607e719d5a..ee8d22cb07e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -726,6 +726,33 @@ SDOperand DAGCombiner::visitMUL(SDNode *N) { DAG.getConstant(Log2_64(-N1C->getSignExtended()), TLI.getShiftAmountTy()))); } + + // (mul (shl X, c1), c2) -> (mul X, c2 << c1) + if (N1C && N0.getOpcode() == ISD::SHL && + isa<ConstantSDNode>(N0.getOperand(1))) { + SDOperand C3 = DAG.getNode(ISD::SHL, VT, N1, N0.getOperand(1)); + return DAG.getNode(ISD::MUL, VT, N0.getOperand(0), C3); + } + + // Change (mul (shl X, C), Y) -> (shl (mul X, Y), C) when the shift has one + // use. + { + SDOperand Sh(0,0), Y(0,0); + // Check for both (mul (shl X, C), Y) and (mul Y, (shl X, C)). + if (N0.getOpcode() == ISD::SHL && isa<ConstantSDNode>(N0.getOperand(1)) && + N0.Val->hasOneUse()) { + Sh = N0; Y = N1; + } else if (N1.getOpcode() == ISD::SHL && + isa<ConstantSDNode>(N1.getOperand(1)) && N1.Val->hasOneUse()) { + Sh = N1; Y = N0; + } + if (Sh.Val) { + SDOperand Mul = DAG.getNode(ISD::MUL, VT, Sh.getOperand(0), Y); + return DAG.getNode(ISD::SHL, VT, Mul, Sh.getOperand(1)); + } + } + + // reassociate mul SDOperand RMUL = ReassociateOps(ISD::MUL, N0, N1); if (RMUL.Val != 0) |

