[clang] [llvm] [mlir] [AMDGPU] Add the support for 45-bit buffer resource (PR #159702)
Krzysztof Drewniak via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 19 11:21:17 PDT 2025
================
@@ -11602,29 +11602,48 @@ SDValue SITargetLowering::lowerPointerAsRsrcIntrin(SDNode *Op,
SDValue NumRecords = Op->getOperand(3);
SDValue Flags = Op->getOperand(4);
- auto [LowHalf, HighHalf] = DAG.SplitScalar(Pointer, Loc, MVT::i32, MVT::i32);
- SDValue Mask = DAG.getConstant(0x0000ffff, Loc, MVT::i32);
- SDValue Masked = DAG.getNode(ISD::AND, Loc, MVT::i32, HighHalf, Mask);
- std::optional<uint32_t> ConstStride = std::nullopt;
- if (auto *ConstNode = dyn_cast<ConstantSDNode>(Stride))
- ConstStride = ConstNode->getZExtValue();
-
- SDValue NewHighHalf = Masked;
- if (!ConstStride || *ConstStride != 0) {
- SDValue ShiftedStride;
- if (ConstStride) {
- ShiftedStride = DAG.getConstant(*ConstStride << 16, Loc, MVT::i32);
- } else {
- SDValue ExtStride = DAG.getAnyExtOrTrunc(Stride, Loc, MVT::i32);
- ShiftedStride =
- DAG.getNode(ISD::SHL, Loc, MVT::i32, ExtStride,
- DAG.getShiftAmountConstant(16, MVT::i32, Loc));
- }
- NewHighHalf = DAG.getNode(ISD::OR, Loc, MVT::i32, Masked, ShiftedStride);
+ SDValue Rsrc;
+
+ if (Subtarget->has45BitNumRecordsBufferResource()) {
+ // Build the lower 64-bit value, which has a 57-bit base and the lower 7-bit
+ // num_records.
+ SDValue ExtPointer = DAG.getAnyExtOrTrunc(Pointer, Loc, MVT::i64);
+ SDValue NumRecordsLHS =
+ DAG.getNode(ISD::SHL, Loc, MVT::i64, NumRecords,
+ DAG.getShiftAmountConstant(57, MVT::i32, Loc));
+ SDValue LowHalf =
+ DAG.getNode(ISD::OR, Loc, MVT::i64, ExtPointer, NumRecordsLHS);
+
+ // Build the higher 64-bit value, which has the higher 38-bit num_records,
+ // 6-bit zero (omit), 14-bit stride and 6-bit zero (omit).
----------------
krzysz00 wrote:
```suggestion
// 6-bit zero (omit), 16-bit stride + modifier and 6-bit zero (omit).
```
https://github.com/llvm/llvm-project/pull/159702
More information about the llvm-commits
mailing list