================
@@ -10705,33 +10707,58 @@ SDValue SITargetLowering::lowerImage(SDValue Op,
                            NumVDataDwords, IsAtomicPacked16Bit, DL);
 }
 
-SDValue SITargetLowering::lowerSBuffer(EVT VT, SDLoc DL, SDValue Rsrc,
+SDValue SITargetLowering::lowerSBuffer(EVT VT, EVT MemVT, SDLoc DL,
+                                       SDValue Chain, SDValue Rsrc,
                                        SDValue Offset, SDValue CachePolicy,
-                                       SelectionDAG &DAG) const {
+                                       SelectionDAG &DAG,
+                                       MachineMemOperand *MMO) const {
   MachineFunction &MF = DAG.getMachineFunction();
+  bool HasChainResult = MMO != nullptr;
 
-  const DataLayout &DataLayout = DAG.getDataLayout();
-  Align Alignment =
-      DataLayout.getABITypeAlign(VT.getTypeForEVT(*DAG.getContext()));
+  if (!MMO) {
+    const DataLayout &DataLayout = DAG.getDataLayout();
+    Align Alignment =
+        DataLayout.getABITypeAlign(MemVT.getTypeForEVT(*DAG.getContext()));
 
-  MachineMemOperand *MMO = MF.getMachineMemOperand(
-      MachinePointerInfo(),
-      MachineMemOperand::MOLoad | MachineMemOperand::MODereferenceable |
-          MachineMemOperand::MOInvariant,
-      VT.getStoreSize(), Alignment);
+    MMO = MF.getMachineMemOperand(MachinePointerInfo(),
+                                  MachineMemOperand::MOLoad |
+                                      MachineMemOperand::MODereferenceable |
+                                      MachineMemOperand::MOInvariant,
+                                  MemVT.getStoreSize(), Alignment);
+  }
 
   if (!Offset->isDivergent()) {
-    SDValue Ops[] = {Rsrc, Offset, CachePolicy};
+    SDValue Ops[] = {Chain, Rsrc, Offset, CachePolicy};
+
+    // Lower llvm.amdgcn.*s.buffer.load.(i8, u8) intrinsics. First, generate
+    // s_buffer_load_u8 for signed and unsigned load instructions. Next, DAG
+    // combiner tries to merge the s_buffer_load_u8 with a sext instruction
+    // (performSignExtendInRegCombine()) and it replaces s_buffer_load_u8 with
+    // s_buffer_load_i8.
+    if (MemVT == MVT::i8 && Subtarget->hasScalarSubwordLoads()) {
+      SDValue BufferLoad = DAG.getMemIntrinsicNode(
+          AMDGPUISD::SBUFFER_LOAD_UBYTE, DL,
+          DAG.getVTList(MVT::i32, MVT::Other), Ops, MemVT, MMO);
+      SDValue LoadVal = DAG.getAnyExtOrTrunc(
+          DAG.getNode(ISD::TRUNCATE, DL, MemVT, BufferLoad), DL, VT);
+      if (HasChainResult)
+        return DAG.getMergeValues({LoadVal, BufferLoad.getValue(1)}, DL);
+      return LoadVal;
+    }
 
     // Lower llvm.amdgcn.s.buffer.load.{i16, u16} intrinsics. Initially, the
     // s_buffer_load_u16 instruction is emitted for both signed and unsigned
     // loads. Later, DAG combiner tries to combine s_buffer_load_u16 with sext
     // and generates s_buffer_load_i16 (performSignExtendInRegCombine).
-    if (VT == MVT::i16 && Subtarget->hasScalarSubwordLoads()) {
-      SDValue BufferLoad =
-          DAG.getMemIntrinsicNode(AMDGPUISD::SBUFFER_LOAD_USHORT, DL,
-                                  DAG.getVTList(MVT::i32), Ops, VT, MMO);
-      return DAG.getNode(ISD::TRUNCATE, DL, VT, BufferLoad);
+    if (MemVT == MVT::i16 && Subtarget->hasScalarSubwordLoads()) {
+      SDValue BufferLoad = DAG.getMemIntrinsicNode(
+          AMDGPUISD::SBUFFER_LOAD_USHORT, DL,
+          DAG.getVTList(MVT::i32, MVT::Other), Ops, MemVT, MMO);
+      SDValue LoadVal = DAG.getAnyExtOrTrunc(
+          DAG.getNode(ISD::TRUNCATE, DL, MemVT, BufferLoad), DL, VT);
+      if (HasChainResult)
+        return DAG.getMergeValues({LoadVal, BufferLoad.getValue(1)}, DL);
+      return LoadVal;
----------------
slinder1 wrote:

This seems unrelated to the broader change? A patch could handle `i8` here 
separately, right?

It could be factored out with the existing `MVT::i16` handling?

```suggestion
    // Lower llvm.amdgcn.*s.buffer.load.{i,u}* intrinsics. First, generate
    // s_buffer_load_u* for signed and unsigned load instructions. Next, DAG
    // combiner tries to merge the s_buffer_load_u* with a sext instruction
    // (performSignExtendInRegCombine()) and it replaces s_buffer_load_u* with
    // s_buffer_load_i*.
    auto HandleScalarSubwordLoads = [VT, MemVT, DL, &DAG, MMO, &Ops](unsigned 
Opcode) {
      SDValue BufferLoad = DAG.getMemIntrinsicNode(
          Opcode, DL,
          DAG.getVTList(MVT::i32, MVT::Other), Ops, MemVT, MMO);
      SDValue LoadVal = DAG.getAnyExtOrTrunc(
          DAG.getNode(ISD::TRUNCATE, DL, MemVT, BufferLoad), DL, VT);
      if (HasChainResult)
        return DAG.getMergeValues({LoadVal, BufferLoad.getValue(1)}, DL);
      return LoadVal;
    }

    if (Subtarget->hasScalarSubwordLoads()) {
      if (MemVT == MVT::i8)
        return HandleScalarSubwordLoads(AMDGPUISD::SBUFFER_LOAD_UBYTE);
      if (MemVT == MVT::i16)
        return HandleScalarSubwordLoads(AMDGPUISD::SBUFFER_LOAD_USHORT);
    }
```

https://github.com/llvm/llvm-project/pull/209243
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to