[llvm] 6f3efd8 - [X86] combineTruncatedArithmetic - move more of fold inside combinei64TruncSrlConstant
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue May 27 02:51:40 PDT 2025
Author: Simon Pilgrim
Date: 2025-05-27T10:51:33+01:00
New Revision: 6f3efd80ab20d5ab4ac375da0d84d5999adbfcb9
URL: https://github.com/llvm/llvm-project/commit/6f3efd80ab20d5ab4ac375da0d84d5999adbfcb9
DIFF: https://github.com/llvm/llvm-project/commit/6f3efd80ab20d5ab4ac375da0d84d5999adbfcb9.diff
LOG: [X86] combineTruncatedArithmetic - move more of fold inside combinei64TruncSrlConstant
Let combinei64TruncSrlConstant decide when the fold is invalid instead of splitting so many of the conditions with combineTruncatedArithmetic
NOTE: We can probably relax the i32 truncation constraint to <= i32, perform the SRL as i32 and then truncate further.
Noticed while triaging #141496
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 9c340c605c110..6126f568aa1e1 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -54214,14 +54214,23 @@ static SDValue combineLRINT_LLRINT(SDNode *N, SelectionDAG &DAG,
// cases.
static SDValue combinei64TruncSrlConstant(SDValue N, EVT VT, SelectionDAG &DAG,
const SDLoc &DL) {
+ assert(N.getOpcode() == ISD::SRL && "Unknown shift opcode");
+ std::optional<uint64_t> ValidSrlConst = DAG.getValidShiftAmount(N);
+ if (!ValidSrlConst)
+ return SDValue();
+ uint64_t SrlConstVal = *ValidSrlConst;
SDValue Op = N.getOperand(0);
- APInt OpConst = Op.getConstantOperandAPInt(1);
- APInt SrlConst = N.getConstantOperandAPInt(1);
- uint64_t SrlConstVal = SrlConst.getZExtValue();
unsigned Opcode = Op.getOpcode();
+ assert(VT == MVT::i32 && Op.getValueType() == MVT::i64 &&
+ "Illegal truncation types");
+
+ if ((Opcode != ISD::ADD && Opcode != ISD::OR && Opcode != ISD::XOR) ||
+ !isa<ConstantSDNode>(Op.getOperand(1)))
+ return SDValue();
+ const APInt &OpConst = Op.getConstantOperandAPInt(1);
- if (SrlConst.ule(32) ||
+ if (SrlConstVal <= 32 ||
(Opcode == ISD::ADD && OpConst.countr_zero() < SrlConstVal))
return SDValue();
@@ -54229,7 +54238,7 @@ static SDValue combinei64TruncSrlConstant(SDValue N, EVT VT, SelectionDAG &DAG,
DAG.getNode(ISD::SRL, DL, MVT::i64, Op.getOperand(0), N.getOperand(1));
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, VT, OpLhsSrl);
- APInt NewOpConstVal = OpConst.lshr(SrlConst).trunc(VT.getSizeInBits());
+ APInt NewOpConstVal = OpConst.lshr(SrlConstVal).trunc(VT.getSizeInBits());
SDValue NewOpConst = DAG.getConstant(NewOpConstVal, DL, VT);
SDValue NewOpNode = DAG.getNode(Opcode, DL, VT, Trunc, NewOpConst);
@@ -54285,20 +54294,8 @@ static SDValue combineTruncatedArithmetic(SDNode *N, SelectionDAG &DAG,
if (!Src.hasOneUse())
return SDValue();
- if (VT == MVT::i32 && SrcVT == MVT::i64 && SrcOpcode == ISD::SRL &&
- isa<ConstantSDNode>(Src.getOperand(1))) {
-
- unsigned SrcOpOpcode = Src.getOperand(0).getOpcode();
- if ((SrcOpOpcode != ISD::ADD && SrcOpOpcode != ISD::OR &&
- SrcOpOpcode != ISD::XOR) ||
- !isa<ConstantSDNode>(Src.getOperand(0).getOperand(1)))
- return SDValue();
-
- if (SDValue R = combinei64TruncSrlConstant(Src, VT, DAG, DL))
- return R;
-
- return SDValue();
- }
+ if (VT == MVT::i32 && SrcVT == MVT::i64 && SrcOpcode == ISD::SRL)
+ return combinei64TruncSrlConstant(Src, VT, DAG, DL);
if (!VT.isVector())
return SDValue();
More information about the llvm-commits
mailing list