https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/134837
Partially fixes #134480 >From 396afdeaffef9955f8adeca3060024ccfafbd05b Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Tue, 8 Apr 2025 17:21:43 +0700 Subject: [PATCH] Attributor: Propagate align to atomicrmw instructions Partially fixes #134480 --- .../Transforms/IPO/AttributorAttributes.cpp | 20 ++++++++++++++----- .../Transforms/Attributor/align-atomic.ll | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index a477c90bb4f45..717ba7f688548 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -5283,7 +5283,7 @@ struct AAAlignImpl : AAAlign { /// See AbstractAttribute::manifest(...). ChangeStatus manifest(Attributor &A) override { - ChangeStatus LoadStoreChanged = ChangeStatus::UNCHANGED; + ChangeStatus InstrChanged = ChangeStatus::UNCHANGED; // Check for users that allow alignment annotations. Value &AssociatedValue = getAssociatedValue(); @@ -5297,7 +5297,7 @@ struct AAAlignImpl : AAAlign { STATS_DECLTRACK(AAAlign, Store, "Number of times alignment added to a store"); SI->setAlignment(getAssumedAlign()); - LoadStoreChanged = ChangeStatus::CHANGED; + InstrChanged = ChangeStatus::CHANGED; } } else if (auto *LI = dyn_cast<LoadInst>(U.getUser())) { if (LI->getPointerOperand() == &AssociatedValue) @@ -5305,8 +5305,18 @@ struct AAAlignImpl : AAAlign { LI->setAlignment(getAssumedAlign()); STATS_DECLTRACK(AAAlign, Load, "Number of times alignment added to a load"); - LoadStoreChanged = ChangeStatus::CHANGED; + InstrChanged = ChangeStatus::CHANGED; } + } else if (auto *RMW = dyn_cast<AtomicRMWInst>(U.getUser())) { + if (RMW->getPointerOperand() == &AssociatedValue) { + if (RMW->getAlign() < getAssumedAlign()) { + STATS_DECLTRACK(AAAlign, AtomicRMW, + "Number of times alignment added to atomicrmw"); + + RMW->setAlignment(getAssumedAlign()); + InstrChanged = ChangeStatus::CHANGED; + } + } } } @@ -5315,8 +5325,8 @@ struct AAAlignImpl : AAAlign { Align InheritAlign = getAssociatedValue().getPointerAlignment(A.getDataLayout()); if (InheritAlign >= getAssumedAlign()) - return LoadStoreChanged; - return Changed | LoadStoreChanged; + return InstrChanged; + return Changed | InstrChanged; } // TODO: Provide a helper to determine the implied ABI alignment and check in diff --git a/llvm/test/Transforms/Attributor/align-atomic.ll b/llvm/test/Transforms/Attributor/align-atomic.ll index 764ed7419a079..0931c14685a87 100644 --- a/llvm/test/Transforms/Attributor/align-atomic.ll +++ b/llvm/test/Transforms/Attributor/align-atomic.ll @@ -16,7 +16,7 @@ define i32 @atomicrmw_add_no_op(ptr align 4 %ptr, i32 %val) { define i32 @atomicrmw_add_propagate(ptr align 8 %ptr, i32 %val) { ; CHECK-LABEL: define i32 @atomicrmw_add_propagate( ; CHECK-SAME: ptr nofree noundef nonnull align 8 captures(none) dereferenceable(4) [[PTR:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[RESULT:%.*]] = atomicrmw add ptr [[PTR]], i32 [[VAL]] seq_cst, align 2 +; CHECK-NEXT: [[RESULT:%.*]] = atomicrmw add ptr [[PTR]], i32 [[VAL]] seq_cst, align 8 ; CHECK-NEXT: ret i32 [[RESULT]] ; %result = atomicrmw add ptr %ptr, i32 %val seq_cst, align 2 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits