From 4d3d6e41cb347572b69cd84705218786a01a7b4e Mon Sep 17 00:00:00 2001 From: shore <372660931@qq.com> Date: Fri, 7 Nov 2025 17:52:32 +0800 Subject: [PATCH 1/5] Apply alignment attr for make.buffer.rsrc --- llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp | 5 ++- .../Transforms/IPO/AttributorAttributes.cpp | 38 +++++++++++++++++-- llvm/test/CodeGen/AMDGPU/attr-amdgpu-align.ll | 26 +++++++++++++ .../Attributor/AMDGPU/tag-invariant-loads.ll | 4 +- 4 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 llvm/test/CodeGen/AMDGPU/attr-amdgpu-align.ll diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp index 56ab040706a13..70f2fbae08ada 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp @@ -1603,7 +1603,7 @@ static bool runImpl(Module &M, AnalysisGetter &AG, TargetMachine &TM, &AAAMDGPUMinAGPRAlloc::ID, &AACallEdges::ID, &AAPointerInfo::ID, &AAPotentialConstantValues::ID, &AAUnderlyingObjects::ID, &AANoAliasAddrSpace::ID, &AAAddressSpace::ID, &AAIndirectCallInfo::ID, - &AAAMDGPUClusterDims::ID}); + &AAAMDGPUClusterDims::ID, &AAAlign::ID}); AttributorConfig AC(CGUpdater); AC.IsClosedWorldModule = Options.IsClosedWorld; @@ -1657,6 +1657,9 @@ static bool runImpl(Module &M, AnalysisGetter &AG, TargetMachine &TM, Ptr = RMW->getPointerOperand(); else if (auto *CmpX = dyn_cast(&I)) Ptr = CmpX->getPointerOperand(); + else if (const IntrinsicInst *II = dyn_cast(&I)) + if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) + A.getOrCreateAAFor(IRPosition::value(*II)); if (Ptr) { A.getOrCreateAAFor(IRPosition::value(*Ptr)); diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index a6ac7610a2c7a..37ff282343889 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -5279,6 +5279,12 @@ struct AAAlignImpl : AAAlign { /// See AbstractAttribute::initialize(...). void initialize(Attributor &A) override { + // For make.buffer.rsrc, the alignment strictly equals to the base's + // alignment + if (Instruction *I = dyn_cast(&getAssociatedValue())) + if (const IntrinsicInst *II = dyn_cast(I)) + if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) + return; SmallVector Attrs; A.getAttrs(getIRPosition(), {Attribute::Alignment}, Attrs); for (const Attribute &Attr : Attrs) @@ -5300,10 +5306,19 @@ struct AAAlignImpl : AAAlign { if (isa(AssociatedValue)) return ChangeStatus::UNCHANGED; + // For use of amdgcn.make.buffer.rsrc, the alignment equals to + // min(base, load/store) + bool IsMakeBufferRsrc = false; + if (Instruction *I = dyn_cast(&getAssociatedValue())) + if (const IntrinsicInst *II = dyn_cast(I)) + if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) + IsMakeBufferRsrc = true; for (const Use &U : AssociatedValue.uses()) { if (auto *SI = dyn_cast(U.getUser())) { if (SI->getPointerOperand() == &AssociatedValue) - if (SI->getAlign() < getAssumedAlign()) { + if (IsMakeBufferRsrc) { + SI->setAlignment(std::min(SI->getAlign(), getAssumedAlign())); + } else if (SI->getAlign() < getAssumedAlign()) { STATS_DECLTRACK(AAAlign, Store, "Number of times alignment added to a store"); SI->setAlignment(getAssumedAlign()); @@ -5311,14 +5326,18 @@ struct AAAlignImpl : AAAlign { } } else if (auto *LI = dyn_cast(U.getUser())) { if (LI->getPointerOperand() == &AssociatedValue) - if (LI->getAlign() < getAssumedAlign()) { + if (IsMakeBufferRsrc) { + LI->setAlignment(std::min(LI->getAlign(), getAssumedAlign())); + } else if (LI->getAlign() < getAssumedAlign()) { LI->setAlignment(getAssumedAlign()); STATS_DECLTRACK(AAAlign, Load, "Number of times alignment added to a load"); InstrChanged = ChangeStatus::CHANGED; } } else if (auto *RMW = dyn_cast(U.getUser())) { - if (RMW->getPointerOperand() == &AssociatedValue) { + if (IsMakeBufferRsrc) { + RMW->setAlignment(std::min(RMW->getAlign(), getAssumedAlign())); + } else if (RMW->getPointerOperand() == &AssociatedValue) { if (RMW->getAlign() < getAssumedAlign()) { STATS_DECLTRACK(AAAlign, AtomicRMW, "Number of times alignment added to atomicrmw"); @@ -5328,7 +5347,9 @@ struct AAAlignImpl : AAAlign { } } } else if (auto *CAS = dyn_cast(U.getUser())) { - if (CAS->getPointerOperand() == &AssociatedValue) { + if (IsMakeBufferRsrc) { + CAS->setAlignment(std::min(CAS->getAlign(), getAssumedAlign())); + } else if (CAS->getPointerOperand() == &AssociatedValue) { if (CAS->getAlign() < getAssumedAlign()) { STATS_DECLTRACK(AAAlign, AtomicCmpXchg, "Number of times alignment added to cmpxchg"); @@ -5554,6 +5575,15 @@ struct AAAlignCallSiteReturned final std::min(this->getAssumedAlign(), Alignment).value()); break; } + case Intrinsic::amdgcn_make_buffer_rsrc: { + const auto *AlignAA = + A.getAAFor(*this, IRPosition::value(*(II->getOperand(0))), + DepClassTy::REQUIRED); + if (AlignAA && AlignAA->isValidState()) + return clampStateAndIndicateChange( + this->getState(), AlignAA->getAssumedAlign().value()); + break; + } default: break; } diff --git a/llvm/test/CodeGen/AMDGPU/attr-amdgpu-align.ll b/llvm/test/CodeGen/AMDGPU/attr-amdgpu-align.ll new file mode 100644 index 0000000000000..8d2bfab09460b --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/attr-amdgpu-align.ll @@ -0,0 +1,26 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=amdgpu-attributor %s -o - | FileCheck %s + +define float @load_gt_base(ptr align 4 %p) { +; CHECK-LABEL: define float @load_gt_base( +; CHECK-SAME: ptr align 4 [[P:%.*]]) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: [[PTR:%.*]] = call align 4 ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p0(ptr align 4 [[P]], i16 0, i64 0, i32 0) +; CHECK-NEXT: [[LOADED:%.*]] = load float, ptr addrspace(7) [[PTR]], align 4 +; CHECK-NEXT: ret float [[LOADED]] +; + %ptr = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p0(ptr %p, i16 0, i64 0, i32 0) + %loaded = load float, ptr addrspace(7) %ptr, align 8 + ret float %loaded +} + +define float @load_lt_base(ptr align 8 %p) { +; CHECK-LABEL: define float @load_lt_base( +; CHECK-SAME: ptr align 8 [[P:%.*]]) #[[ATTR0]] { +; CHECK-NEXT: [[PTR:%.*]] = call align 8 ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p0(ptr align 8 [[P]], i16 0, i64 0, i32 0) +; CHECK-NEXT: [[LOADED:%.*]] = load float, ptr addrspace(7) [[PTR]], align 4 +; CHECK-NEXT: ret float [[LOADED]] +; + %ptr = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p0(ptr %p, i16 0, i64 0, i32 0) + %loaded = load float, ptr addrspace(7) %ptr, align 4 + ret float %loaded +} diff --git a/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll b/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll index 1ab607465dbbb..34bbfa8974747 100644 --- a/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll +++ b/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll @@ -306,7 +306,7 @@ define amdgpu_kernel void @test_call_untouched_ptr() { define amdgpu_kernel void @test_make_buffer(ptr addrspace(1) %ptr) { ; AMDGCN-LABEL: define amdgpu_kernel void @test_make_buffer( ; AMDGCN-SAME: ptr addrspace(1) nofree readonly captures(none) [[PTR:%.*]]) #[[ATTR2]] { -; AMDGCN-NEXT: [[RSRC:%.*]] = call align 4 ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11:[0-9]+]] +; AMDGCN-NEXT: [[RSRC:%.*]] = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11:[0-9]+]] ; AMDGCN-NEXT: [[VAL:%.*]] = load i32, ptr addrspace(7) [[RSRC]], align 4 ; AMDGCN-NEXT: call void @clobber(i32 [[VAL]]) #[[ATTR7]] ; AMDGCN-NEXT: ret void @@ -321,7 +321,7 @@ define amdgpu_kernel void @test_make_buffer(ptr addrspace(1) %ptr) { define amdgpu_kernel void @test_make_buffer_noalias(ptr addrspace(1) noalias %ptr) { ; AMDGCN-LABEL: define amdgpu_kernel void @test_make_buffer_noalias( ; AMDGCN-SAME: ptr addrspace(1) noalias nofree readonly captures(none) [[PTR:%.*]]) #[[ATTR2]] { -; AMDGCN-NEXT: [[RSRC:%.*]] = call align 4 ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11]] +; AMDGCN-NEXT: [[RSRC:%.*]] = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11]] ; AMDGCN-NEXT: [[VAL:%.*]] = load i32, ptr addrspace(7) [[RSRC]], align 4, !invariant.load [[META0]] ; AMDGCN-NEXT: call void @clobber(i32 [[VAL]]) #[[ATTR7]] ; AMDGCN-NEXT: ret void From 505426b437c069721f7b626da33924ca12e0d62e Mon Sep 17 00:00:00 2001 From: shore <372660931@qq.com> Date: Mon, 10 Nov 2025 10:03:26 +0800 Subject: [PATCH 2/5] fix format error --- llvm/lib/Transforms/IPO/AttributorAttributes.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index 37ff282343889..ddcf0a4030331 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -5315,7 +5315,7 @@ struct AAAlignImpl : AAAlign { IsMakeBufferRsrc = true; for (const Use &U : AssociatedValue.uses()) { if (auto *SI = dyn_cast(U.getUser())) { - if (SI->getPointerOperand() == &AssociatedValue) + if (SI->getPointerOperand() == &AssociatedValue) { if (IsMakeBufferRsrc) { SI->setAlignment(std::min(SI->getAlign(), getAssumedAlign())); } else if (SI->getAlign() < getAssumedAlign()) { @@ -5324,8 +5324,9 @@ struct AAAlignImpl : AAAlign { SI->setAlignment(getAssumedAlign()); InstrChanged = ChangeStatus::CHANGED; } + } } else if (auto *LI = dyn_cast(U.getUser())) { - if (LI->getPointerOperand() == &AssociatedValue) + if (LI->getPointerOperand() == &AssociatedValue) { if (IsMakeBufferRsrc) { LI->setAlignment(std::min(LI->getAlign(), getAssumedAlign())); } else if (LI->getAlign() < getAssumedAlign()) { @@ -5334,6 +5335,7 @@ struct AAAlignImpl : AAAlign { "Number of times alignment added to a load"); InstrChanged = ChangeStatus::CHANGED; } + } } else if (auto *RMW = dyn_cast(U.getUser())) { if (IsMakeBufferRsrc) { RMW->setAlignment(std::min(RMW->getAlign(), getAssumedAlign())); From 7be66a09467e6b6342e832db91f597f0d4c03271 Mon Sep 17 00:00:00 2001 From: shore <372660931@qq.com> Date: Mon, 10 Nov 2025 13:39:58 +0800 Subject: [PATCH 3/5] Addr 0 should have max alignment --- clang/test/CodeGenOpenCL/builtins-amdgcn-make-buffer-rsrc.cl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/CodeGenOpenCL/builtins-amdgcn-make-buffer-rsrc.cl b/clang/test/CodeGenOpenCL/builtins-amdgcn-make-buffer-rsrc.cl index 4b5232c0010aa..1c327b2fcc981 100644 --- a/clang/test/CodeGenOpenCL/builtins-amdgcn-make-buffer-rsrc.cl +++ b/clang/test/CodeGenOpenCL/builtins-amdgcn-make-buffer-rsrc.cl @@ -83,7 +83,7 @@ __amdgpu_buffer_rsrc_t test_amdgcn_make_buffer_rsrc_p1_flags_constant(global voi // CHECK-LABEL: @test_amdgcn_make_buffer_p0_nullptr( // CHECK-NEXT: entry: // CHECK-NEXT: [[CONV:%.*]] = sext i32 [[NUM:%.*]] to i64 -// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0(ptr null, i16 [[STRIDE:%.*]], i64 [[CONV]], i32 [[FLAGS:%.*]]) +// CHECK-NEXT: [[TMP0:%.*]] = tail call align 4294967296 ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p0(ptr null, i16 [[STRIDE:%.*]], i64 [[CONV]], i32 [[FLAGS:%.*]]) // CHECK-NEXT: ret ptr addrspace(8) [[TMP0]] // __amdgpu_buffer_rsrc_t test_amdgcn_make_buffer_p0_nullptr(short stride, int num, int flags) { @@ -93,7 +93,7 @@ __amdgpu_buffer_rsrc_t test_amdgcn_make_buffer_p0_nullptr(short stride, int num, // CHECK-LABEL: @test_amdgcn_make_buffer_p1_nullptr( // CHECK-NEXT: entry: // CHECK-NEXT: [[CONV:%.*]] = sext i32 [[NUM:%.*]] to i64 -// CHECK-NEXT: [[TMP0:%.*]] = tail call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p1(ptr addrspace(1) null, i16 [[STRIDE:%.*]], i64 [[CONV]], i32 [[FLAGS:%.*]]) +// CHECK-NEXT: [[TMP0:%.*]] = tail call align 4294967296 ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p1(ptr addrspace(1) null, i16 [[STRIDE:%.*]], i64 [[CONV]], i32 [[FLAGS:%.*]]) // CHECK-NEXT: ret ptr addrspace(8) [[TMP0]] // __amdgpu_buffer_rsrc_t test_amdgcn_make_buffer_p1_nullptr(short stride, int num, int flags) { From 5efe07b63f5be666cf6ea4290427e339c3a2f833 Mon Sep 17 00:00:00 2001 From: shore <372660931@qq.com> Date: Tue, 11 Nov 2025 16:10:33 +0800 Subject: [PATCH 4/5] Move to amd specific attribute --- llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp | 117 +++++++++++++++++- .../Transforms/IPO/AttributorAttributes.cpp | 44 +------ 2 files changed, 121 insertions(+), 40 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp index 70f2fbae08ada..07f1b120dc4f2 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp @@ -1584,6 +1584,117 @@ AAAMDGPUClusterDims::createForPosition(const IRPosition &IRP, Attributor &A) { llvm_unreachable("AAAMDGPUClusterDims is only valid for function position"); } +struct AAAMDGPUMakeBufferRsrcAlign + : public IRAttribute< + Attribute::Alignment, + StateWrapper, + AbstractAttribute>, + AAAMDGPUMakeBufferRsrcAlign> { + using Base = IRAttribute< + Attribute::Alignment, + StateWrapper, + AbstractAttribute>, + AAAMDGPUMakeBufferRsrcAlign>; + + AAAMDGPUMakeBufferRsrcAlign(const IRPosition &IRP, Attributor &A) + : Base(IRP) {} + + void initialize(Attributor &A) override {} + + ChangeStatus updateImpl(Attributor &A) override { + Instruction *I = getIRPosition().getCtxI(); + const auto *AlignAA = A.getAAFor( + *this, IRPosition::value(*(I->getOperand(0))), DepClassTy::REQUIRED); + if (AlignAA) + return clampStateAndIndicateChange( + this->getState(), AlignAA->getAssumedAlign().value()); + + return indicatePessimisticFixpoint(); + } + + /// Create an abstract attribute view for the position \p IRP. + static AAAMDGPUMakeBufferRsrcAlign &createForPosition(const IRPosition &IRP, + Attributor &A) { + if (IRP.getPositionKind() == IRPosition::IRP_CALL_SITE_RETURNED) + if (Instruction *I = dyn_cast(&IRP.getAssociatedValue())) + if (const IntrinsicInst *II = dyn_cast(I)) + if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) + return *new (A.Allocator) AAAMDGPUMakeBufferRsrcAlign(IRP, A); + llvm_unreachable("AAAMDGPUMakeBufferRsrcAlign is only valid for call site " + "return position on make.buffer.rsrc intrinsic"); + } + + // Manifest users + ChangeStatus manifest(Attributor &A) override { + ChangeStatus Changed = ChangeStatus::UNCHANGED; + + // Check for users that allow alignment annotations. + Value &AssociatedValue = getAssociatedValue(); + if (isa(AssociatedValue)) + return ChangeStatus::UNCHANGED; + + for (const Use &U : AssociatedValue.uses()) { + if (auto *SI = dyn_cast(U.getUser())) { + if (SI->getPointerOperand() == &AssociatedValue) { + if (SI->getAlign() > getAssumedAlign()) { + SI->setAlignment(getAssumedAlign()); + Changed = ChangeStatus::CHANGED; + } + } + } else if (auto *LI = dyn_cast(U.getUser())) { + if (LI->getPointerOperand() == &AssociatedValue) { + if (LI->getAlign() > getAssumedAlign()) { + LI->setAlignment(getAssumedAlign()); + Changed = ChangeStatus::CHANGED; + } + } + } else if (auto *RMW = dyn_cast(U.getUser())) { + if (RMW->getAlign() > getAssumedAlign()) { + RMW->setAlignment(getAssumedAlign()); + Changed = ChangeStatus::CHANGED; + } + } else if (auto *CAS = dyn_cast(U.getUser())) { + if (CAS->getAlign() > getAssumedAlign()) { + CAS->setAlignment(getAssumedAlign()); + Changed = ChangeStatus::CHANGED; + } + } + } + + // Manifest intrinsic it self + Changed |= Base::manifest(A); + + return Changed; + } + + StringRef getName() const override { return "AAAMDGPUMakeBufferRsrcAlign"; } + + const std::string getAsStr(Attributor *) const override { + std::string Buffer = "AAAMDGPUMakeBufferRsrcAlign["; + raw_string_ostream OS(Buffer); + OS << getState().getKnown() << ',' << getState().getAssumed() << ']'; + return OS.str(); + } + + const char *getIdAddr() const override { return &ID; } + + void trackStatistics() const override {} + + Align getAssumedAlign() const { return Align(getAssumed()); } + + void getDeducedAttributes(Attributor &A, LLVMContext &Ctx, + SmallVectorImpl &Attrs) const override { + if (getAssumedAlign() > 1) + Attrs.emplace_back( + Attribute::getWithAlignment(Ctx, Align(getAssumedAlign()))); + } + + /// Unique ID (due to the unique address) + static const char ID; +}; + +const char AAAMDGPUMakeBufferRsrcAlign::ID = 0; + static bool runImpl(Module &M, AnalysisGetter &AG, TargetMachine &TM, AMDGPUAttributorOptions Options, ThinOrFullLTOPhase LTOPhase) { @@ -1603,7 +1714,8 @@ static bool runImpl(Module &M, AnalysisGetter &AG, TargetMachine &TM, &AAAMDGPUMinAGPRAlloc::ID, &AACallEdges::ID, &AAPointerInfo::ID, &AAPotentialConstantValues::ID, &AAUnderlyingObjects::ID, &AANoAliasAddrSpace::ID, &AAAddressSpace::ID, &AAIndirectCallInfo::ID, - &AAAMDGPUClusterDims::ID, &AAAlign::ID}); + &AAAMDGPUClusterDims::ID, &AAAlign::ID, + &AAAMDGPUMakeBufferRsrcAlign::ID}); AttributorConfig AC(CGUpdater); AC.IsClosedWorldModule = Options.IsClosedWorld; @@ -1659,7 +1771,8 @@ static bool runImpl(Module &M, AnalysisGetter &AG, TargetMachine &TM, Ptr = CmpX->getPointerOperand(); else if (const IntrinsicInst *II = dyn_cast(&I)) if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) - A.getOrCreateAAFor(IRPosition::value(*II)); + A.getOrCreateAAFor( + IRPosition::value(*II)); if (Ptr) { A.getOrCreateAAFor(IRPosition::value(*Ptr)); diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index ddcf0a4030331..a6ac7610a2c7a 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -5279,12 +5279,6 @@ struct AAAlignImpl : AAAlign { /// See AbstractAttribute::initialize(...). void initialize(Attributor &A) override { - // For make.buffer.rsrc, the alignment strictly equals to the base's - // alignment - if (Instruction *I = dyn_cast(&getAssociatedValue())) - if (const IntrinsicInst *II = dyn_cast(I)) - if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) - return; SmallVector Attrs; A.getAttrs(getIRPosition(), {Attribute::Alignment}, Attrs); for (const Attribute &Attr : Attrs) @@ -5306,40 +5300,25 @@ struct AAAlignImpl : AAAlign { if (isa(AssociatedValue)) return ChangeStatus::UNCHANGED; - // For use of amdgcn.make.buffer.rsrc, the alignment equals to - // min(base, load/store) - bool IsMakeBufferRsrc = false; - if (Instruction *I = dyn_cast(&getAssociatedValue())) - if (const IntrinsicInst *II = dyn_cast(I)) - if (II->getIntrinsicID() == Intrinsic::amdgcn_make_buffer_rsrc) - IsMakeBufferRsrc = true; for (const Use &U : AssociatedValue.uses()) { if (auto *SI = dyn_cast(U.getUser())) { - if (SI->getPointerOperand() == &AssociatedValue) { - if (IsMakeBufferRsrc) { - SI->setAlignment(std::min(SI->getAlign(), getAssumedAlign())); - } else if (SI->getAlign() < getAssumedAlign()) { + if (SI->getPointerOperand() == &AssociatedValue) + if (SI->getAlign() < getAssumedAlign()) { STATS_DECLTRACK(AAAlign, Store, "Number of times alignment added to a store"); SI->setAlignment(getAssumedAlign()); InstrChanged = ChangeStatus::CHANGED; } - } } else if (auto *LI = dyn_cast(U.getUser())) { - if (LI->getPointerOperand() == &AssociatedValue) { - if (IsMakeBufferRsrc) { - LI->setAlignment(std::min(LI->getAlign(), getAssumedAlign())); - } else if (LI->getAlign() < getAssumedAlign()) { + if (LI->getPointerOperand() == &AssociatedValue) + if (LI->getAlign() < getAssumedAlign()) { LI->setAlignment(getAssumedAlign()); STATS_DECLTRACK(AAAlign, Load, "Number of times alignment added to a load"); InstrChanged = ChangeStatus::CHANGED; } - } } else if (auto *RMW = dyn_cast(U.getUser())) { - if (IsMakeBufferRsrc) { - RMW->setAlignment(std::min(RMW->getAlign(), getAssumedAlign())); - } else if (RMW->getPointerOperand() == &AssociatedValue) { + if (RMW->getPointerOperand() == &AssociatedValue) { if (RMW->getAlign() < getAssumedAlign()) { STATS_DECLTRACK(AAAlign, AtomicRMW, "Number of times alignment added to atomicrmw"); @@ -5349,9 +5328,7 @@ struct AAAlignImpl : AAAlign { } } } else if (auto *CAS = dyn_cast(U.getUser())) { - if (IsMakeBufferRsrc) { - CAS->setAlignment(std::min(CAS->getAlign(), getAssumedAlign())); - } else if (CAS->getPointerOperand() == &AssociatedValue) { + if (CAS->getPointerOperand() == &AssociatedValue) { if (CAS->getAlign() < getAssumedAlign()) { STATS_DECLTRACK(AAAlign, AtomicCmpXchg, "Number of times alignment added to cmpxchg"); @@ -5577,15 +5554,6 @@ struct AAAlignCallSiteReturned final std::min(this->getAssumedAlign(), Alignment).value()); break; } - case Intrinsic::amdgcn_make_buffer_rsrc: { - const auto *AlignAA = - A.getAAFor(*this, IRPosition::value(*(II->getOperand(0))), - DepClassTy::REQUIRED); - if (AlignAA && AlignAA->isValidState()) - return clampStateAndIndicateChange( - this->getState(), AlignAA->getAssumedAlign().value()); - break; - } default: break; } From 9d0464574f7b8458884f0d9ec0d9461df394aa1b Mon Sep 17 00:00:00 2001 From: shore <372660931@qq.com> Date: Tue, 11 Nov 2025 19:16:40 +0800 Subject: [PATCH 5/5] fix failed test --- llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll b/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll index 34bbfa8974747..1ab607465dbbb 100644 --- a/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll +++ b/llvm/test/Transforms/Attributor/AMDGPU/tag-invariant-loads.ll @@ -306,7 +306,7 @@ define amdgpu_kernel void @test_call_untouched_ptr() { define amdgpu_kernel void @test_make_buffer(ptr addrspace(1) %ptr) { ; AMDGCN-LABEL: define amdgpu_kernel void @test_make_buffer( ; AMDGCN-SAME: ptr addrspace(1) nofree readonly captures(none) [[PTR:%.*]]) #[[ATTR2]] { -; AMDGCN-NEXT: [[RSRC:%.*]] = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11:[0-9]+]] +; AMDGCN-NEXT: [[RSRC:%.*]] = call align 4 ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11:[0-9]+]] ; AMDGCN-NEXT: [[VAL:%.*]] = load i32, ptr addrspace(7) [[RSRC]], align 4 ; AMDGCN-NEXT: call void @clobber(i32 [[VAL]]) #[[ATTR7]] ; AMDGCN-NEXT: ret void @@ -321,7 +321,7 @@ define amdgpu_kernel void @test_make_buffer(ptr addrspace(1) %ptr) { define amdgpu_kernel void @test_make_buffer_noalias(ptr addrspace(1) noalias %ptr) { ; AMDGCN-LABEL: define amdgpu_kernel void @test_make_buffer_noalias( ; AMDGCN-SAME: ptr addrspace(1) noalias nofree readonly captures(none) [[PTR:%.*]]) #[[ATTR2]] { -; AMDGCN-NEXT: [[RSRC:%.*]] = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11]] +; AMDGCN-NEXT: [[RSRC:%.*]] = call align 4 ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) [[PTR]], i16 noundef 0, i64 noundef 0, i32 noundef 0) #[[ATTR11]] ; AMDGCN-NEXT: [[VAL:%.*]] = load i32, ptr addrspace(7) [[RSRC]], align 4, !invariant.load [[META0]] ; AMDGCN-NEXT: call void @clobber(i32 [[VAL]]) #[[ATTR7]] ; AMDGCN-NEXT: ret void