[llvm] [AMDGPU] Make getDWordFromOffset robust against exotic types (PR #70153)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 24 19:20:56 PDT 2023
================
@@ -11230,26 +11230,41 @@ static bool hasNon16BitAccesses(uint64_t PermMask, SDValue &Op,
static SDValue getDWordFromOffset(SelectionDAG &DAG, SDLoc SL, SDValue Src,
unsigned DWordOffset) {
SDValue Ret;
- if (Src.getValueSizeInBits() <= 32)
+
+ auto ValueSize = Src.getValueSizeInBits().getFixedValue();
+
+ if (ValueSize <= 32)
return DAG.getBitcastedAnyExtOrTrunc(Src, SL, MVT::i32);
- if (Src.getValueSizeInBits() >= 256) {
- assert(!(Src.getValueSizeInBits() % 32));
- Ret = DAG.getBitcast(
- MVT::getVectorVT(MVT::i32, Src.getValueSizeInBits() / 32), Src);
+ if (!(ValueSize % 32)) {
+ Ret = DAG.getBitcast(MVT::getVectorVT(MVT::i32, ValueSize / 32), Src);
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, Ret,
DAG.getConstant(DWordOffset, SL, MVT::i32));
}
- Ret = DAG.getBitcastedAnyExtOrTrunc(
- Src, SL, MVT::getIntegerVT(Src.getValueSizeInBits()));
- if (DWordOffset) {
- auto Shifted = DAG.getNode(ISD::SRL, SL, Ret.getValueType(), Ret,
- DAG.getConstant(DWordOffset * 32, SL, MVT::i32));
- return DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, Shifted);
- }
+ // ByteProvider must be at least 8 bits
+ assert(!(ValueSize % 8));
+
+ auto BaseSize = ValueSize % 16 ? 8 : 16;
+ auto NumElements = ValueSize / BaseSize;
+ auto Trunc32Elements = (BaseSize * NumElements) / 32;
+ auto NormalizedTrunc = Trunc32Elements * 32 / BaseSize;
+ auto NumElementsIn32 = 32 / BaseSize;
+ auto NumAvailElements = DWordOffset < Trunc32Elements
+ ? NumElementsIn32
+ : NumElements - NormalizedTrunc;
- return DAG.getBitcastedAnyExtOrTrunc(Ret, SL, MVT::i32);
+ SmallVector<SDValue, 4> VecSrcs;
+ for (int i = 0; i < (int)NumAvailElements; i++) {
----------------
arsenm wrote:
This is DAG.ExtractVectorElements
https://github.com/llvm/llvm-project/pull/70153
More information about the llvm-commits
mailing list