diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-11-12 22:00:00 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-11-12 22:00:00 +0000 |
commit | ceab2329b64dedee972d620d3e8bd68e02e6c6e4 (patch) | |
tree | 1d0fefea9bc9814fdbe9258a8af1bb01705084da /llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | |
parent | d482b01a62ab2ddafefe7b217d664f597dbddaf2 (diff) | |
download | bcm5719-llvm-ceab2329b64dedee972d620d3e8bd68e02e6c6e4.tar.gz bcm5719-llvm-ceab2329b64dedee972d620d3e8bd68e02e6c6e4.zip |
[InstCombine] refactor code for matching shift amount of a rotate; NFC
As shown in existing test cases and with:
https://bugs.llvm.org/show_bug.cgi?id=39624
...we're missing at least 2 more patterns for rotate narrowing.
llvm-svn: 346711
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 9fa27d89911..d976cb11910 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -514,22 +514,27 @@ Instruction *InstCombiner::narrowRotate(TruncInst &Trunc) { if (ShiftOpcode0 == ShiftOpcode1) return nullptr; - // The shift amounts must add up to the narrow bit width. - Value *ShAmt; - bool SubIsOnLHS; + // Match the shift amount operands for a rotate pattern. This always matches + // a subtraction on the R operand. + auto matchShiftAmount = [](Value *L, Value *R, unsigned Width) -> Value * { + // The shift amounts may add up to the narrow bit width: + // (shl ShVal, L) | (lshr ShVal, Width - L) + if (match(R, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(L))))) + return L; + + return nullptr; + }; + Type *DestTy = Trunc.getType(); unsigned NarrowWidth = DestTy->getScalarSizeInBits(); - if (match(ShAmt0, - m_OneUse(m_Sub(m_SpecificInt(NarrowWidth), m_Specific(ShAmt1))))) { - ShAmt = ShAmt1; + Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth); + bool SubIsOnLHS = false; + if (!ShAmt) { + ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth); SubIsOnLHS = true; - } else if (match(ShAmt1, m_OneUse(m_Sub(m_SpecificInt(NarrowWidth), - m_Specific(ShAmt0))))) { - ShAmt = ShAmt0; - SubIsOnLHS = false; - } else { - return nullptr; } + if (!ShAmt) + return nullptr; // The shifted value must have high zeros in the wide type. Typically, this // will be a zext, but it could also be the result of an 'and' or 'shift'. |