diff options
author | John Brawn <john.brawn@arm.com> | 2015-08-21 10:48:17 +0000 |
---|---|---|
committer | John Brawn <john.brawn@arm.com> | 2015-08-21 10:48:17 +0000 |
commit | eab960c46f3d71cc3c6614be7e538c727996fcaa (patch) | |
tree | 0223869aaff0e26b642094fee8aa2350f76c260d /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 2ecb118a1df230715162c9a77b02eeec8fa7d791 (diff) | |
download | bcm5719-llvm-eab960c46f3d71cc3c6614be7e538c727996fcaa.tar.gz bcm5719-llvm-eab960c46f3d71cc3c6614be7e538c727996fcaa.zip |
[DAGCombiner] Fold together mul and shl when both are by a constant
This is intended to improve code generation for GEPs, as the index value is
shifted by the element size and in GEPs of multi-dimensional arrays the index
of higher dimensions is multiplied by the lower dimension size.
Differential Revision: http://reviews.llvm.org/D12197
llvm-svn: 245689
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index d58c33a499d..53d07b385e3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4455,6 +4455,14 @@ SDValue DAGCombiner::visitSHL(SDNode *N) { return DAG.getNode(ISD::ADD, SDLoc(N), VT, Shl0, Shl1); } + // fold (shl (mul x, c1), c2) -> (mul x, c1 << c2) + if (N1C && N0.getOpcode() == ISD::MUL && N0.getNode()->hasOneUse()) { + if (ConstantSDNode *N0C1 = isConstOrConstSplat(N0.getOperand(1))) { + SDValue Folded = DAG.FoldConstantArithmetic(ISD::SHL, SDLoc(N1), VT, N0C1, N1C); + return DAG.getNode(ISD::MUL, SDLoc(N), VT, N0.getOperand(0), Folded); + } + } + if (N1C && !N1C->isOpaque()) if (SDValue NewSHL = visitShiftByConstant(N, N1C)) return NewSHL; |