[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
================
@@ -5905,33 +5905,42 @@ bool AMDGPULegalizerInfo::legalizePointerAsRsrcIntrin(
Register Flags = MI.getOperand(5).getReg();
LLT S32 = LLT::scalar(32);
+ LLT S64 = LLT::scalar(64);
B.setInsertPt(B.getMBB(), ++B.getInsertPt());
- auto Unmerge = B.buildUnmerge(S32, Pointer);
- Register LowHalf = Unmerge.getReg(0);
- Register HighHalf = Unmerge.getReg(1);
-
- auto AndMask = B.buildConstant(S32, 0x0000ffff);
- auto Masked = B.buildAnd(S32, HighHalf, AndMask);
-
- MachineInstrBuilder NewHighHalf = Masked;
- std::optional<ValueAndVReg> StrideConst =
- getIConstantVRegValWithLookThrough(Stride, MRI);
- if (!StrideConst || !StrideConst->Value.isZero()) {
- MachineInstrBuilder ShiftedStride;
- if (StrideConst) {
- uint32_t StrideVal = StrideConst->Value.getZExtValue();
- uint32_t ShiftedStrideVal = StrideVal << 16;
- ShiftedStride = B.buildConstant(S32, ShiftedStrideVal);
- } else {
- auto ExtStride = B.buildAnyExt(S32, Stride);
- auto ShiftConst = B.buildConstant(S32, 16);
- ShiftedStride = B.buildShl(S32, ExtStride, ShiftConst);
- }
- NewHighHalf = B.buildOr(S32, Masked, ShiftedStride);
+
+ if (ST.has45BitNumRecordsBufferResource()) {
+ // Build the lower 64-bit value, which has a 57-bit base and the lower 7-bit
+ // num_records.
+ LLT PtrIntTy = LLT::scalar(MRI.getType(Pointer).getSizeInBits());
+ auto PointerInt = B.buildPtrToInt(PtrIntTy, Pointer);
+ auto ExtPointer = B.buildAnyExtOrTrunc(S64, PointerInt);
+ auto NumRecordsLHS = B.buildShl(S64, NumRecords, B.buildConstant(S32, 57));
+ Register LowHalf = B.buildOr(S64, ExtPointer, NumRecordsLHS).getReg(0);
+
+ // 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).
+ auto NumRecordsRHS = B.buildLShr(S64, NumRecords, B.buildConstant(S32, 7));
+ auto ExtStride = B.buildAnyExt(S64, Stride);
+ auto ShiftedStride = B.buildShl(S64, ExtStride, B.buildConstant(S32, 44));
+ Register HighHalf = B.buildOr(S64, NumRecordsRHS, ShiftedStride).getReg(0);
----------------
krzysz00 wrote:
Same note re flags
https://github.com/llvm/llvm-project/pull/159702
More information about the llvm-commits
mailing list