[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