diff options
author | Craig Topper <craig.topper@intel.com> | 2018-11-28 18:03:38 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-11-28 18:03:38 +0000 |
commit | f3b6f583e253d781116e28e6ab86e5aa02eb5078 (patch) | |
tree | b4a2559d6c2145a1077db246406788dee21a7e01 /llvm/lib | |
parent | 9a494eacba0e037a213cf18216eb4afbf37410d8 (diff) | |
download | bcm5719-llvm-f3b6f583e253d781116e28e6ab86e5aa02eb5078.tar.gz bcm5719-llvm-f3b6f583e253d781116e28e6ab86e5aa02eb5078.zip |
[X86] Add a combine for back to back VSRAI instructions
Expansion of SIGN_EXTEND_INREG can create a VSRAI instruction. If there is already a VSRAI after it, we should combine them into a larger VSRAI
Differential Revision: https://reviews.llvm.org/D54959
llvm-svn: 347784
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c33394f439d..8e487a08376 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -35465,6 +35465,17 @@ static SDValue combineVectorShiftImm(SDNode *N, SelectionDAG &DAG, return N00; } + // Fold (VSRAI (VSRAI X, C1), C2) --> (VSRAI X, (C1 + C2)) with (C1 + C2) + // clamped to (NumBitsPerElt - 1). + if (Opcode == X86ISD::VSRAI && N0.getOpcode() == X86ISD::VSRAI) { + unsigned ShiftVal2 = cast<ConstantSDNode>(N0.getOperand(1))->getZExtValue(); + unsigned NewShiftVal = ShiftVal + ShiftVal2; + if (NewShiftVal >= NumBitsPerElt) + NewShiftVal = NumBitsPerElt - 1; + return DAG.getNode(X86ISD::VSRAI, SDLoc(N), VT, N0.getOperand(0), + DAG.getConstant(NewShiftVal, SDLoc(N), MVT::i8)); + } + // We can decode 'whole byte' logical bit shifts as shuffles. if (LogicalShift && (ShiftVal % 8) == 0) { SDValue Op(N, 0); |