[llvm] 32dc14f - [X86] LowerFunnelShift - use supportedVectorShiftWithBaseAmnt to check for supported scalar shifts
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 23 13:14:25 PST 2022
Author: Simon Pilgrim
Date: 2022-01-23T21:13:58Z
New Revision: 32dc14f876c4b196dccb5b8db56510e401fa91ab
URL: https://github.com/llvm/llvm-project/commit/32dc14f876c4b196dccb5b8db56510e401fa91ab
DIFF: https://github.com/llvm/llvm-project/commit/32dc14f876c4b196dccb5b8db56510e401fa91ab.diff
LOG: [X86] LowerFunnelShift - use supportedVectorShiftWithBaseAmnt to check for supported scalar shifts
Allows us to reuse the ISD shift opcode instead of a mixture of ISD/X86ISD variants
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 17079116a6ae1..b3672abfef957 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -29832,6 +29832,7 @@ static SDValue LowerFunnelShift(SDValue Op, const X86Subtarget &Subtarget,
SDValue AmtMask = DAG.getConstant(EltSizeInBits - 1, DL, VT);
SDValue AmtMod = DAG.getNode(ISD::AND, DL, VT, Amt, AmtMask);
+ unsigned ShiftOpc = IsFSHR ? ISD::SRL : ISD::SHL;
unsigned NumElts = VT.getVectorNumElements();
MVT ExtSVT = MVT::getIntegerVT(2 * EltSizeInBits);
MVT ExtVT = MVT::getVectorVT(ExtSVT, NumElts / 2);
@@ -29848,20 +29849,19 @@ static SDValue LowerFunnelShift(SDValue Op, const X86Subtarget &Subtarget,
}
// Attempt to fold scalar shift as unpack(y,x) << zext(splat(z))
- if (SDValue ScalarAmt = DAG.getSplatValue(AmtMod)) {
- unsigned ShiftX86Opc = IsFSHR ? X86ISD::VSRLI : X86ISD::VSHLI;
- SDValue Lo = DAG.getBitcast(ExtVT, getUnpackl(DAG, DL, VT, Op1, Op0));
- SDValue Hi = DAG.getBitcast(ExtVT, getUnpackh(DAG, DL, VT, Op1, Op0));
- ScalarAmt = DAG.getZExtOrTrunc(ScalarAmt, DL, MVT::i32);
- Lo = getTargetVShiftNode(ShiftX86Opc, DL, ExtVT, Lo, ScalarAmt, Subtarget,
- DAG);
- Hi = getTargetVShiftNode(ShiftX86Opc, DL, ExtVT, Hi, ScalarAmt, Subtarget,
- DAG);
- return getPack(DAG, Subtarget, DL, VT, Lo, Hi, !IsFSHR);
+ if (supportedVectorShiftWithBaseAmnt(ExtVT, Subtarget, ShiftOpc)) {
+ if (SDValue ScalarAmt = DAG.getSplatValue(AmtMod)) {
+ SDValue Lo = DAG.getBitcast(ExtVT, getUnpackl(DAG, DL, VT, Op1, Op0));
+ SDValue Hi = DAG.getBitcast(ExtVT, getUnpackh(DAG, DL, VT, Op1, Op0));
+ ScalarAmt = DAG.getZExtOrTrunc(ScalarAmt, DL, MVT::i32);
+ Lo = getTargetVShiftNode(ShiftOpc, DL, ExtVT, Lo, ScalarAmt, Subtarget,
+ DAG);
+ Hi = getTargetVShiftNode(ShiftOpc, DL, ExtVT, Hi, ScalarAmt, Subtarget,
+ DAG);
+ return getPack(DAG, Subtarget, DL, VT, Lo, Hi, !IsFSHR);
+ }
}
- unsigned ShiftOpc = IsFSHR ? ISD::SRL : ISD::SHL;
-
MVT WideSVT = MVT::getIntegerVT(
std::min<unsigned>(EltSizeInBits * 2, Subtarget.hasBWI() ? 16 : 32));
MVT WideVT = MVT::getVectorVT(WideSVT, NumElts);
More information about the llvm-commits
mailing list