[llvm] dfa2ad1 - [X86] getTargetVShiftNode - remove shift-by-constant handling.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 21 05:17:17 PST 2021
Author: Simon Pilgrim
Date: 2021-12-21T13:16:48Z
New Revision: dfa2ad1ad858a44d7d73de1b042fbe78256b74f7
URL: https://github.com/llvm/llvm-project/commit/dfa2ad1ad858a44d7d73de1b042fbe78256b74f7
DIFF: https://github.com/llvm/llvm-project/commit/dfa2ad1ad858a44d7d73de1b042fbe78256b74f7.diff
LOG: [X86] getTargetVShiftNode - remove shift-by-constant handling.
Move shift-by-constant handling and move it into its only user (VSHIFT intrinsics lowering).
This is some prep-work for getTargetVShiftNode to no longer take a scalar shift amount - we're introducing temporary ISD::EXTRACT_VECTOR_ELT nodes via SelectionDAG::getSplatValue to accommodate this which can cause various issues, including unnecessary scalarization and xmm->gpr->xmm transfers, and causes problems for 32-bit codegen if we fail to remove an (illegal) i64 scalar extracted from a (legal) vXi64 vector.
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 004d9887c2aa..3c83beeb0ce5 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -25625,6 +25625,7 @@ static SDValue getTargetVShiftByConstNode(unsigned Opc, const SDLoc &dl, MVT VT,
/// Handle vector element shifts where the shift amount may or may not be a
/// constant. Takes immediate version of shift as input.
+/// TODO: Replace with vector + (splat) idx to avoid extract_element nodes.
static SDValue getTargetVShiftNode(unsigned Opc, const SDLoc &dl, MVT VT,
SDValue SrcOp, SDValue ShAmt,
const X86Subtarget &Subtarget,
@@ -25632,11 +25633,6 @@ static SDValue getTargetVShiftNode(unsigned Opc, const SDLoc &dl, MVT VT,
MVT SVT = ShAmt.getSimpleValueType();
assert((SVT == MVT::i32 || SVT == MVT::i64) && "Unexpected value type!");
- // Catch shift-by-constant.
- if (ConstantSDNode *CShAmt = dyn_cast<ConstantSDNode>(ShAmt))
- return getTargetVShiftByConstNode(Opc, dl, VT, SrcOp,
- CShAmt->getZExtValue(), DAG);
-
// Change opcode to non-immediate version.
Opc = getTargetVShiftUniformOpcode(Opc, true);
@@ -26368,10 +26364,19 @@ SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
return DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32,
DAG.getBitcast(MVT::i16, Ins));
}
- case VSHIFT:
+ case VSHIFT: {
+ SDValue SrcOp = Op.getOperand(1);
+ SDValue ShAmt = Op.getOperand(2);
+
+ // Catch shift-by-constant.
+ if (auto *CShAmt = dyn_cast<ConstantSDNode>(ShAmt))
+ return getTargetVShiftByConstNode(IntrData->Opc0, dl,
+ Op.getSimpleValueType(), SrcOp,
+ CShAmt->getZExtValue(), DAG);
+
return getTargetVShiftNode(IntrData->Opc0, dl, Op.getSimpleValueType(),
- Op.getOperand(1), Op.getOperand(2), Subtarget,
- DAG);
+ SrcOp, ShAmt, Subtarget, DAG);
+ }
case COMPRESS_EXPAND_IN_REG: {
SDValue Mask = Op.getOperand(3);
SDValue DataToCompress = Op.getOperand(1);
More information about the llvm-commits
mailing list