[llvm] Attributor: Propagate align to atomicrmw instructions (PR #134837)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 8 08:08:31 PDT 2025
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/134837
>From 6fa8d75ec58c6b34b11f7734f4a5b833e8d1ed18 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at 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
More information about the llvm-commits
mailing list