diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-12-13 15:23:09 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-12-13 15:23:09 +0000 |
| commit | ba91ff4a8634172416c936712d0705b7eeb59bc8 (patch) | |
| tree | 828e393cddfe61a6cace71363deec992d3158966 /llvm/lib | |
| parent | f5f3bef0355969d04858af15b415d0b1d96b1017 (diff) | |
| download | bcm5719-llvm-ba91ff4a8634172416c936712d0705b7eeb59bc8.tar.gz bcm5719-llvm-ba91ff4a8634172416c936712d0705b7eeb59bc8.zip | |
[X86][SSE] Fix modulo rotation amounts for v8i16/v16i16/v4i32 (PR38243)
llvm-svn: 349047
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index da7796518d0..ac482336881 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -24881,8 +24881,6 @@ static SDValue LowerRotate(SDValue Op, const X86Subtarget &Subtarget, return SignBitSelect(VT, Amt, M, R); } - // TODO: We need explicit modulo rotation amounts for everything from here on. - bool ConstantAmt = ISD::isBuildVectorOfConstantSDNodes(Amt.getNode()); bool LegalVarShifts = SupportedVectorVarShift(VT, Subtarget, ISD::SHL) && SupportedVectorVarShift(VT, Subtarget, ISD::SRL); @@ -24891,6 +24889,7 @@ static SDValue LowerRotate(SDValue Op, const X86Subtarget &Subtarget, // Best to fallback for all supported variable shifts. // AVX2 - best to fallback for non-constants as well. // TODO - legalizers should be able to handle this. + // TODO - We need explicit modulo rotation amounts. if (LegalVarShifts || (Subtarget.hasAVX2() && !ConstantAmt) || DAG.isSplatValue(Amt)) { SDValue AmtR = DAG.getConstant(EltSizeInBits, DL, VT); @@ -24900,6 +24899,10 @@ static SDValue LowerRotate(SDValue Op, const X86Subtarget &Subtarget, return DAG.getNode(ISD::OR, DL, VT, SHL, SRL); } + // ISD::ROT* uses modulo rotate amounts. + Amt = DAG.getNode(ISD::AND, DL, VT, Amt, + DAG.getConstant(EltSizeInBits - 1, DL, VT)); + // As with shifts, convert the rotation amount to a multiplication factor. SDValue Scale = convertShiftLeftToScale(Amt, DL, Subtarget, DAG); assert(Scale && "Failed to convert ROTL amount to scale"); |

