[llvm] Revert "[AMDGPU]: Allow combining into v_dot4" (PR #66158)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 12 16:54:30 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-amdgpu
            
<details>
<summary>Changes</summary>
This reverts commit 7fda1b74be4a173031192d8516869e87e6b7582d.
--

Patch is 256.27 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/66158.diff

4 Files Affected:

- (modified) llvm/lib/Target/AMDGPU/SIISelLowering.cpp (+2-315) 
- (modified) llvm/test/CodeGen/AMDGPU/idot2.ll (+12-11) 
- (modified) llvm/test/CodeGen/AMDGPU/idot4s.ll (+123-2149) 
- (modified) llvm/test/CodeGen/AMDGPU/idot4u.ll (+255-2602) 


<pre>
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 85c9ed489e926ce..e6f9898c99689a4 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -12375,193 +12375,6 @@ SDValue SITargetLowering::tryFoldToMad64_32(SDNode *N,
   return Accum;
 }
 
-// Collect the ultimate src of each of the mul24 node&#x27;s operands, and confirm
-// each operand is 8 bytes.
-static std::optional&lt;ByteProvider&lt;SDValue&gt;&gt;
-handleMulOperand(const SDValue &amp;MulOperand) {
-  auto Byte0 = calculateByteProvider(MulOperand, 0, 0);
-  if (!Byte0 || Byte0-&gt;isConstantZero()) {
-    return std::nullopt;
-  }
-  auto Byte1 = calculateByteProvider(MulOperand, 1, 0);
-  if (Byte1 &amp;&amp; !Byte1-&gt;isConstantZero()) {
-    return std::nullopt;
-  }
-  return Byte0;
-}
-
-static unsigned addPermMasks(unsigned First, unsigned Second) {
-  unsigned FirstCs = First &amp; 0x0c0c0c0c;
-  unsigned SecondCs = Second &amp; 0x0c0c0c0c;
-  unsigned FirstNoCs = First &amp; ~0x0c0c0c0c;
-  unsigned SecondNoCs = Second &amp; ~0x0c0c0c0c;
-
-  assert(FirstCs &amp; 0xFF | SecondCs &amp; 0xFF);
-  assert(FirstCs &amp; 0xFF00 | SecondCs &amp; 0xFF00);
-  assert(FirstCs &amp; 0xFF0000 | SecondCs &amp; 0xFF0000);
-  assert(FirstCs &amp; 0xFF000000 | SecondCs &amp; 0xFF000000);
-
-  return (FirstNoCs | SecondNoCs) | (FirstCs &amp; SecondCs);
-}
-
-static void placeSources(ByteProvider&lt;SDValue&gt; &amp;Src0,
-                         ByteProvider&lt;SDValue&gt; &amp;Src1,
-                         SmallVectorImpl&lt;std::pair&lt;SDValue, unsigned&gt;&gt; &amp;Src0s,
-                         SmallVectorImpl&lt;std::pair&lt;SDValue, unsigned&gt;&gt; &amp;Src1s,
-                         int Step) {
-
-  assert(Src0.Src.has_value() &amp;&amp; Src1.Src.has_value());
-  // Src0s and Src1s are empty, just place arbitrarily
-  if (Step == 0) {
-    Src0s.push_back({*Src0.Src, (Src0.SrcOffset &lt;&lt; 24) + 0x0c0c0c});
-    Src1s.push_back({*Src1.Src, (Src1.SrcOffset &lt;&lt; 24) + 0x0c0c0c});
-    return;
-  }
-
-  for (int BPI = 0; BPI &lt; 2; BPI++) {
-    std::pair&lt;ByteProvider&lt;SDValue&gt;, ByteProvider&lt;SDValue&gt;&gt; BPP = {Src0, Src1};
-    if (BPI == 1) {
-      BPP = {Src1, Src0};
-    }
-    unsigned ZeroMask = 0x0c0c0c0c;
-    unsigned FMask = 0xFF &lt;&lt; (8 * (3 - Step));
-
-    unsigned FirstMask =
-        BPP.first.SrcOffset &lt;&lt; (8 * (3 - Step)) | (ZeroMask &amp; ~FMask);
-    unsigned SecondMask =
-        BPP.second.SrcOffset &lt;&lt; (8 * (3 - Step)) | (ZeroMask &amp; ~FMask);
-    // Attempt to find Src vector which contains our SDValue, if so, add our
-    // perm mask to the existing one. If we are unable to find a match for the
-    // first SDValue, attempt to find match for the second.
-    int FirstGroup = -1;
-    for (int I = 0; I &lt; 2; I++) {
-      SmallVectorImpl&lt;std::pair&lt;SDValue, unsigned&gt;&gt; &amp;Srcs =
-          I == 0 ? Src0s : Src1s;
-      auto MatchesFirst = [&amp;BPP](std::pair&lt;SDValue, unsigned&gt; IterElt) {
-        return IterElt.first == *BPP.first.Src;
-      };
-
-      auto Match = std::find_if(Srcs.begin(), Srcs.end(), MatchesFirst);
-      if (Match != Srcs.end()) {
-        Match-&gt;second = addPermMasks(FirstMask, Match-&gt;second);
-        FirstGroup = I;
-        break;
-      }
-    }
-    if (FirstGroup != -1) {
-      SmallVectorImpl&lt;std::pair&lt;SDValue, unsigned&gt;&gt; &amp;Srcs =
-          FirstGroup == 1 ? Src0s : Src1s;
-      auto MatchesSecond = [&amp;BPP](std::pair&lt;SDValue, unsigned&gt; IterElt) {
-        return IterElt.first == *BPP.second.Src;
-      };
-      auto Match = std::find_if(Srcs.begin(), Srcs.end(), MatchesSecond);
-      if (Match != Srcs.end()) {
-        Match-&gt;second = addPermMasks(SecondMask, Match-&gt;second);
-      } else
-        Srcs.push_back({*BPP.second.Src, SecondMask});
-      return;
-    }
-  }
-
-  // If we have made it here, then we could not find a match in Src0s or Src1s
-  // for either Src0 or Src1, so just place them arbitrarily.
-
-  unsigned ZeroMask = 0x0c0c0c0c;
-  unsigned FMask = 0xFF &lt;&lt; (8 * (3 - Step));
-
-  Src0s.push_back(
-      {*Src0.Src, (Src0.SrcOffset &lt;&lt; (8 * (3 - Step)) | (ZeroMask &amp; ~FMask))});
-  Src1s.push_back(
-      {*Src1.Src, (Src1.SrcOffset &lt;&lt; (8 * (3 - Step)) | (ZeroMask &amp; ~FMask))});
-
-  return;
-}
-
-static SDValue
-resolveSources(SelectionDAG &amp;DAG, SDLoc SL,
-               SmallVectorImpl&lt;std::pair&lt;SDValue, unsigned&gt;&gt; &amp;Srcs,
-               bool IsSigned, bool IsAny) {
-
-  // If we just have one source, just permute it accordingly.
-  if (Srcs.size() == 1) {
-    auto Elt = Srcs.begin();
-    auto EltVal = DAG.getBitcastedAnyExtOrTrunc(Elt-&gt;first, SL, MVT::i32);
-
-    // v_perm will produce the original value
-    if (Elt-&gt;second == 0x3020100)
-      return EltVal;
-
-    return DAG.getNode(AMDGPUISD::PERM, SL, MVT::i32, EltVal, EltVal,
-                       DAG.getConstant(Elt-&gt;second, SL, MVT::i32));
-  }
-
-  auto FirstElt = Srcs.begin();
-  auto SecondElt = std::next(FirstElt);
-
-  SmallVector&lt;SDValue, 2&gt; Perms;
-
-  // If we have multiple sources in the chain, combine them via perms (using
-  // calculated perm mask) and Ors.
-  while (true) {
-    auto FirstMask = FirstElt-&gt;second;
-    auto SecondMask = SecondElt-&gt;second;
-
-    unsigned FirstCs = FirstMask &amp; 0x0c0c0c0c;
-    unsigned FirstPlusFour = FirstMask | 0x04040404;
-    // 0x0c + 0x04 = 0x10, so anding with 0x0F will produced 0x00 for any
-    // original 0x0C
-    FirstMask = (FirstPlusFour &amp; 0x0F0F0F0F) | FirstCs;
-
-    auto PermMask = addPermMasks(FirstMask, SecondMask);
-    auto FirstVal =
-        DAG.getBitcastedAnyExtOrTrunc(FirstElt-&gt;first, SL, MVT::i32);
-    auto SecondVal =
-        DAG.getBitcastedAnyExtOrTrunc(SecondElt-&gt;first, SL, MVT::i32);
-
-    Perms.push_back(DAG.getNode(AMDGPUISD::PERM, SL, MVT::i32, FirstVal,
-                                SecondVal,
-                                DAG.getConstant(PermMask, SL, MVT::i32)));
-
-    FirstElt = std::next(SecondElt);
-    if (FirstElt == Srcs.end())
-      break;
-
-    SecondElt = std::next(FirstElt);
-    // If we only have a FirstElt, then just combine that into the cumulative
-    // source node
-    if (SecondElt == Srcs.end()) {
-      auto EltVal =
-          DAG.getBitcastedAnyExtOrTrunc(FirstElt-&gt;first, SL, MVT::i32);
-
-      Perms.push_back(
-          DAG.getNode(AMDGPUISD::PERM, SL, MVT::i32, EltVal, EltVal,
-                      DAG.getConstant(FirstElt-&gt;second, SL, MVT::i32)));
-      break;
-    }
-  }
-
-  assert(Perms.size() == 1 || Perms.size() == 2);
-  return Perms.size() == 2
-             ? DAG.getNode(ISD::OR, SL, MVT::i32, Perms[0], Perms[1])
-             : Perms[0];
-}
-
-static void fixMasks(SmallVectorImpl&lt;std::pair&lt;SDValue, unsigned&gt;&gt; &amp;Srcs,
-                     unsigned ChainLength) {
-  for (auto &amp;[EntryVal, EntryMask] : Srcs) {
-    EntryMask = EntryMask &gt;&gt; ((4 - ChainLength) * 8);
-    auto ZeroMask = ChainLength == 2 ? 0x0c0c0000 : 0x0c000000;
-    EntryMask += ZeroMask;
-  }
-}
-
-static bool isMul(const SDValue Op) {
-  auto Opcode = Op.getOpcode();
-
-  return (Opcode == ISD::MUL || Opcode == AMDGPUISD::MUL_U24 ||
-          Opcode == AMDGPUISD::MUL_I24);
-}
-
 SDValue SITargetLowering::performAddCombine(SDNode *N,
                                             DAGCombinerInfo &amp;DCI) const {
   SelectionDAG &amp;DAG = DCI.DAG;
@@ -12575,140 +12388,14 @@ SDValue SITargetLowering::performAddCombine(SDNode *N,
       if (SDValue Folded = tryFoldToMad64_32(N, DCI))
         return Folded;
     }
+
+    return SDValue();
   }
 
   if (SDValue V = reassociateScalarOps(N, DAG)) {
     return V;
   }
 
-  if ((isMul(LHS) || isMul(RHS)) &amp;&amp; Subtarget-&gt;hasDot7Insts() &amp;&amp;
-      (Subtarget-&gt;hasDot1Insts() || Subtarget-&gt;hasDot8Insts())) {
-    SDValue TempNode(N, 0);
-    auto MulIdx = isMul(LHS) ? 0 : 1;
-
-    auto MulOpcode = TempNode.getOperand(MulIdx).getOpcode();
-    bool IsSigned =
-        MulOpcode == AMDGPUISD::MUL_I24 ||
-        (MulOpcode == ISD::MUL &amp;&amp;
-         TempNode-&gt;getOperand(MulIdx)-&gt;getFlags().hasNoSignedWrap() &amp;&amp;
-         !TempNode-&gt;getOperand(MulIdx)-&gt;getFlags().hasNoUnsignedWrap());
-    SmallVector&lt;std::pair&lt;SDValue, unsigned&gt;, 4&gt; Src0s;
-    SmallVector&lt;std::pair&lt;SDValue, unsigned&gt;, 4&gt; Src1s;
-    SmallVector&lt;SDValue, 4&gt; Src2s;
-
-    // Match the v_dot4 tree, while collecting src nodes.
-    int ChainLength = 0;
-    for (int I = 0; I &lt; 4; I++) {
-      auto MulIdx = isMul(LHS) ? 0 : isMul(RHS) ? 1 : -1;
-      if (MulIdx == -1)
-        break;
-      auto IterIsSigned =
-          MulOpcode == AMDGPUISD::MUL_I24 ||
-          (MulOpcode == ISD::MUL &amp;&amp;
-           TempNode-&gt;getOperand(MulIdx)-&gt;getFlags().hasNoSignedWrap() &amp;&amp;
-           !TempNode-&gt;getOperand(MulIdx)-&gt;getFlags().hasNoUnsignedWrap());
-      if (IterIsSigned != IsSigned) {
-        break;
-      }
-      auto Src0 = handleMulOperand(TempNode-&gt;getOperand(MulIdx)-&gt;getOperand(0));
-      if (!Src0)
-        break;
-      auto Src1 = handleMulOperand(TempNode-&gt;getOperand(MulIdx)-&gt;getOperand(1));
-      if (!Src1)
-        break;
-      placeSources(*Src0, *Src1, Src0s, Src1s, I);
-      auto AddIdx = 1 - MulIdx;
-      // Allow the special case where add (add (mul24, 0), mul24) became -&gt;
-      // add (mul24, mul24)
-      if (I == 2 &amp;&amp; isMul(TempNode-&gt;getOperand(AddIdx))) {
-        Src2s.push_back(TempNode-&gt;getOperand(AddIdx));
-        auto Src0 =
-            handleMulOperand(TempNode-&gt;getOperand(AddIdx)-&gt;getOperand(0));
-        if (!Src0)
-          break;
-        auto Src1 =
-            handleMulOperand(TempNode-&gt;getOperand(AddIdx)-&gt;getOperand(1));
-        if (!Src1)
-          break;
-        placeSources(*Src0, *Src1, Src0s, Src1s, I + 1);
-        Src2s.push_back(DAG.getConstant(0, SL, MVT::i32));
-        ChainLength = I + 2;
-        break;
-      }
-
-      TempNode = TempNode-&gt;getOperand(AddIdx);
-      Src2s.push_back(TempNode);
-      ChainLength = I + 1;
-      if (TempNode-&gt;getNumOperands() &lt; 2)
-        break;
-      LHS = TempNode-&gt;getOperand(0);
-      RHS = TempNode-&gt;getOperand(1);
-    }
-
-    if (ChainLength &lt; 2)
-      return SDValue();
-
-    // Masks were constructed with assumption that we would find a chain of
-    // length 4. If not, then we need to 0 out the MSB bits (via perm mask of
-    // 0x0c) so they do not affect dot calculation.
-    if (ChainLength &lt; 4) {
-      fixMasks(Src0s, ChainLength);
-      fixMasks(Src1s, ChainLength);
-    }
-
-    SDValue Src0, Src1;
-
-    // If we are just using a single source for both, and have permuted the
-    // bytes consistently, we can just use the sources without permuting
-    // (commutation)
-    bool UseOriginalSrc = false;
-    if (ChainLength == 4 &amp;&amp; Src0s.size() == 1 &amp;&amp; Src1s.size() == 1 &amp;&amp;
-        Src0s.begin()-&gt;second == Src1s.begin()-&gt;second &amp;&amp;
-        Src0s.begin()-&gt;first.getValueSizeInBits() == 32 &amp;&amp;
-        Src1s.begin()-&gt;first.getValueSizeInBits() == 32) {
-      SmallVector&lt;unsigned, 4&gt; SrcBytes;
-      auto Src0Mask = Src0s.begin()-&gt;second;
-      SrcBytes.push_back(Src0Mask &amp; 0xFF000000);
-      bool UniqueEntries = true;
-      for (auto I = 1; I &lt; 4; I++) {
-        auto NextByte = Src0Mask &amp; (0xFF &lt;&lt; ((3 - I) * 8));
-
-        if (is_contained(SrcBytes, NextByte)) {
-          UniqueEntries = false;
-          break;
-        }
-        SrcBytes.push_back(NextByte);
-      }
-
-      if (UniqueEntries) {
-        UseOriginalSrc = true;
-        // Must be 32 bits to enter above conditional
-        assert(Src0s.begin()-&gt;first.getValueSizeInBits() == 32);
-        assert(Src1s.begin()-&gt;first.getValueSizeInBits() == 32);
-        Src0 = DAG.getBitcast(MVT::getIntegerVT(32), Src0s.begin()-&gt;first);
-        Src1 = DAG.getBitcast(MVT::getIntegerVT(32), Src1s.begin()-&gt;first);
-      }
-    }
-
-    if (!UseOriginalSrc) {
-      Src0 = resolveSources(DAG, SL, Src0s, false, true);
-      Src1 = resolveSources(DAG, SL, Src1s, false, true);
-    }
-
-    SDValue Src2 =
-        DAG.getExtOrTrunc(IsSigned, Src2s[ChainLength - 1], SL, MVT::i32);
-
-    SDValue IID = DAG.getTargetConstant(IsSigned ? Intrinsic::amdgcn_sdot4
-                                                 : Intrinsic::amdgcn_udot4,
-                                        SL, MVT::i64);
-
-    assert(!VT.isVector());
-    auto Dot = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, SL, MVT::i32, IID, Src0,
-                           Src1, Src2, DAG.getTargetConstant(0, SL, MVT::i1));
-
-    return DAG.getExtOrTrunc(IsSigned, Dot, SL, VT);
-  }
-
   if (VT != MVT::i32 || !DCI.isAfterLegalizeDAG())
     return SDValue();
 
diff --git a/llvm/test/CodeGen/AMDGPU/idot2.ll b/llvm/test/CodeGen/AMDGPU/idot2.ll
index 56f72ac9d9e8c6d..ccde5efce08dc8e 100644
--- a/llvm/test/CodeGen/AMDGPU/idot2.ll
+++ b/llvm/test/CodeGen/AMDGPU/idot2.ll
@@ -2823,18 +2823,18 @@ define amdgpu_kernel void @notsdot2_sext8(ptr addrspace(1) %src1,
 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
 ; GFX9-DL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
-; GFX9-DL-NEXT:    s_mov_b32 s1, 0xc0c0001
 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
 ; GFX9-DL-NEXT:    global_load_ushort v1, v0, s[4:5]
 ; GFX9-DL-NEXT:    global_load_ushort v2, v0, s[6:7]
 ; GFX9-DL-NEXT:    s_load_dword s0, s[2:3], 0x0
 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
-; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
-; GFX9-DL-NEXT:    v_perm_b32 v1, v1, v1, s1
 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-DL-NEXT:    v_perm_b32 v2, v2, v2, s1
+; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
+; GFX9-DL-NEXT:    v_lshrrev_b16_e32 v1, 8, v1
+; GFX9-DL-NEXT:    v_lshrrev_b16_e32 v2, 8, v2
+; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX9-DL-NEXT:    v_dot4_i32_i8 v1, v2, v1, s0
+; GFX9-DL-NEXT:    v_add3_u32 v1, v1, s0, v3
 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[2:3]
 ; GFX9-DL-NEXT:    s_endpgm
 ;
@@ -2843,20 +2843,21 @@ define amdgpu_kernel void @notsdot2_sext8(ptr addrspace(1) %src1,
 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
-; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
 ; GFX10-DL-NEXT:    s_clause 0x1
 ; GFX10-DL-NEXT:    global_load_ushort v1, v0, s[4:5]
 ; GFX10-DL-NEXT:    global_load_ushort v2, v0, s[6:7]
 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
-; GFX10-DL-NEXT:    v_perm_b32 v0, v1, v1, 0xc0c0001
+; GFX10-DL-NEXT:    v_lshrrev_b16 v0, 8, v1
 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-DL-NEXT:    v_perm_b32 v1, v2, v2, 0xc0c0001
+; GFX10-DL-NEXT:    v_lshrrev_b16 v3, 8, v2
+; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
+; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
+; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v0, sext(v3), sext(v0) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s2
-; GFX10-DL-NEXT:    v_dot4c_i32_i8_e32 v2, v1, v0
-; GFX10-DL-NEXT:    global_store_dword v3, v2, s[0:1]
+; GFX10-DL-NEXT:    v_add3_u32 v0, v0, s2, v1
+; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
 ; GFX10-DL-NEXT:    s_endpgm
                                           ptr addrspace(1) %src2,
                                           ptr addrspace(1) nocapture %dst) {
diff --git a/llvm/test/CodeGen/AMDGPU/idot4s.ll b/llvm/test/CodeGen/AMDGPU/idot4s.ll
index 7edd24f12982ebd..ea22aaee761c8dd 100644
--- a/llvm/test/CodeGen/AMDGPU/idot4s.ll
+++ b/llvm/test/CodeGen/AMDGPU/idot4s.ll
@@ -5,7 +5,6 @@
 ; RUN: llc -mtriple=amdgcn -mcpu=gfx906 -verify-machineinstrs &lt; %s | FileCheck -check-prefixes=GFX9-DL %s
 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1011 -verify-machineinstrs &lt; %s | FileCheck -check-prefixes=GFX10-DL %s
 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1012 -verify-machineinstrs &lt; %s | FileCheck -check-prefixes=GFX10-DL %s
-; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -verify-machineinstrs &lt; %s | FileCheck -check-prefixes=GFX11-DL %s
 
 define amdgpu_kernel void @idot4_acc32(ptr addrspace(1) %src1,
 ; GFX7-LABEL: idot4_acc32:
@@ -118,36 +117,16 @@ define amdgpu_kernel void @idot4_acc32(ptr addrspace(1) %src1,
 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x34
-; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
 ; GFX10-DL-NEXT:    s_clause 0x1
 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX10-DL-NEXT:    v_mov_b32_e32 v0, 0
 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
-; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX10-DL-NEXT:    v_mov_b32_e32 v0, s2
-; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-DL-NEXT:    v_dot4c_i32_i8_e32 v0, v1, v2
-; GFX10-DL-NEXT:    global_store_dword v3, v0, s[0:1]
+; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
+; GFX10-DL-NEXT:    v_dot4_i32_i8 v1, v1, v2, s2
+; GFX10-DL-NEXT:    global_store_dword v0, v1, s[0:1]
 ; GFX10-DL-NEXT:    s_endpgm
-;
-; GFX11-DL-LABEL: idot4_acc32:
-; GFX11-DL:       ; %bb.0: ; %entry
-; GFX11-DL-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
-; GFX11-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX11-DL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
-; GFX11-DL-NEXT:    v_mov_b32_e32 v2, 0
-; GFX11-DL-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX11-DL-NEXT:    s_clause 0x1
-; GFX11-DL-NEXT:    global_load_b32 v1, v0, s[4:5]
-; GFX11-DL-NEXT:    global_load_b32 v0, v0, s[6:7]
-; GFX11-DL-NEXT:    s_load_b32 s2, s[0:1], 0x0
-; GFX11-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
-; GFX11-DL-NEXT:    v_dot4_i32_iu8 v0, v1, v0, s2
-; GFX11-DL-NEXT:    global_store_b32 v2, v0, s[0:1]
-; GFX11-DL-NEXT:    s_nop 0
-; GFX11-DL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
-; GFX11-DL-NEXT:    s_endpgm
                                        ptr addrspace(1) %src2,
                                        ptr addrspace(1) nocapture %dst) {
 entry:
@@ -190,6 +169,8 @@ entry:
   ret void
 }
 
+; TODO: Currently, vector elements{0 and 3} get zero_extended from i16 to i32 which should
+; be sign_extended directly to i32; prevents the pattern recognizer to recognize this pattern.
 define amdgpu_kernel void @idot4_acc16(ptr addrspace(1) %src1,
 ; GFX7-LABEL: idot4_acc16:
 ; GFX7:       ; %bb.0: ; %entry
@@ -313,14 +294,33 @@ define amdgpu_kernel void @idot4_acc16(ptr addrspace(1) %src1,
 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
 ; GFX9-DL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
-; GFX9-DL-NEXT:    v_mov_b32_e32 v1, 0
 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
-; GFX9-DL-NEXT:    global_load_dword v2, v0, s[4:5]
-; GFX9-DL-NEXT:    global_load_dword v3, v0, s[6:7]
-; GFX9-DL-NEXT:    global_load_sshort v4, v1, s[2:3]
+; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
+; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
+; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
+; GFX9-DL-NEXT:    global_load_ushort v3, v0, s[2:3]
+; GFX9-DL-NEXT:    s_waitcnt vmcnt(2)
+; GFX9-DL-NEXT:    v_bfe_i32 v6, v1, 0, 8
+; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
+; GFX9-DL-NEXT:    v_bfe_i32 v7, v2, 0, 8
+; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v8, 8, v1
+; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v9, 8, v2
+; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v4, 16, v1
+; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v5...
<truncated>
</pre>
</details>


https://github.com/llvm/llvm-project/pull/66158


More information about the llvm-commits mailing list