diff options
author | Eli Friedman <efriedma@codeaurora.org> | 2018-12-20 23:39:54 +0000 |
---|---|---|
committer | Eli Friedman <efriedma@codeaurora.org> | 2018-12-20 23:39:54 +0000 |
commit | b1bbd5dca3d5ee3c6155232a2d506bb804b1461b (patch) | |
tree | 5090297413d2bbbc8d09af96967ffe08598ed511 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 4c7f5d5c5aeeb4336da0f044ab543d76971068f4 (diff) | |
download | bcm5719-llvm-b1bbd5dca3d5ee3c6155232a2d506bb804b1461b.tar.gz bcm5719-llvm-b1bbd5dca3d5ee3c6155232a2d506bb804b1461b.zip |
[ARM] Complete the Thumb1 shift+and->shift+shift transforms.
This saves materializing the immediate. The additional forms are less
common (they don't usually show up for bitfield insert/extract), but
they're still relevant.
I had to add a new target hook to prevent DAGCombine from reversing the
transform. That isn't the only possible way to solve the conflict, but
it seems straightforward enough.
Differential Revision: https://reviews.llvm.org/D55630
llvm-svn: 349857
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a027d2906c8..272630e32dd 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6518,7 +6518,8 @@ SDValue DAGCombiner::visitSHL(SDNode *N) { // (and (srl x, (sub c1, c2), MASK) // Only fold this if the inner shift has no other uses -- if it does, folding // this will increase the total number of instructions. - if (N1C && N0.getOpcode() == ISD::SRL && N0.hasOneUse()) { + if (N1C && N0.getOpcode() == ISD::SRL && N0.hasOneUse() && + TLI.shouldFoldShiftPairToMask(N, Level)) { if (ConstantSDNode *N0C1 = isConstOrConstSplat(N0.getOperand(1))) { uint64_t c1 = N0C1->getZExtValue(); if (c1 < OpSizeInBits) { |