Skip to content

Commit 24539f1

Browse files
committed
Add Alignment argument to IRBuilder CreateAtomicRMW and CreateAtomicCmpXchg.
And then push those change throughout LLVM. Keep the old signature in Clang's CGBuilder for now -- that will be updated in a follow-on patch (D97224). The MLIR LLVM-IR dialect is not updated to support the new alignment attribute, but preserves its existing behavior. Differential Revision: https://reviews.llvm.org/D97223
1 parent 52c781f commit 24539f1

File tree

10 files changed

+132
-85
lines changed

10 files changed

+132
-85
lines changed

clang/lib/CodeGen/CGBuilder.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,28 @@ class CGBuilderTy : public CGBuilderBaseTy {
132132
return CreateAlignedStore(getInt1(Value), Addr, CharUnits::One());
133133
}
134134

135+
// Temporarily use old signature; clang will be updated to an Address overload
136+
// in a subsequent patch.
137+
llvm::AtomicCmpXchgInst *
138+
CreateAtomicCmpXchg(llvm::Value *Ptr, llvm::Value *Cmp, llvm::Value *New,
139+
llvm::AtomicOrdering SuccessOrdering,
140+
llvm::AtomicOrdering FailureOrdering,
141+
llvm::SyncScope::ID SSID = llvm::SyncScope::System) {
142+
return CGBuilderBaseTy::CreateAtomicCmpXchg(
143+
Ptr, Cmp, New, llvm::MaybeAlign(), SuccessOrdering, FailureOrdering,
144+
SSID);
145+
}
146+
147+
// Temporarily use old signature; clang will be updated to an Address overload
148+
// in a subsequent patch.
149+
llvm::AtomicRMWInst *
150+
CreateAtomicRMW(llvm::AtomicRMWInst::BinOp Op, llvm::Value *Ptr,
151+
llvm::Value *Val, llvm::AtomicOrdering Ordering,
152+
llvm::SyncScope::ID SSID = llvm::SyncScope::System) {
153+
return CGBuilderBaseTy::CreateAtomicRMW(Op, Ptr, Val, llvm::MaybeAlign(),
154+
Ordering, SSID);
155+
}
156+
135157
using CGBuilderBaseTy::CreateBitCast;
136158
Address CreateBitCast(Address Addr, llvm::Type *Ty,
137159
const llvm::Twine &Name = "") {

llvm/include/llvm/CodeGen/AtomicExpandUtils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class Value;
2222
/// (the builder, %addr, %loaded, %new_val, ordering,
2323
/// /* OUT */ %success, /* OUT */ %new_loaded)
2424
using CreateCmpXchgInstFun =
25-
function_ref<void(IRBuilder<> &, Value *, Value *, Value *, AtomicOrdering,
26-
Value *&, Value *&)>;
25+
function_ref<void(IRBuilder<> &, Value *, Value *, Value *, Align,
26+
AtomicOrdering, Value *&, Value *&)>;
2727

2828
/// Expand an atomic RMW instruction into a loop utilizing
2929
/// cmpxchg. You'll want to make sure your target machine likes cmpxchg

llvm/include/llvm/IR/IRBuilder.h

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,21 +1704,30 @@ class IRBuilderBase {
17041704
return Insert(new FenceInst(Context, Ordering, SSID), Name);
17051705
}
17061706

1707-
AtomicCmpXchgInst *CreateAtomicCmpXchg(
1708-
Value *Ptr, Value *Cmp, Value *New, AtomicOrdering SuccessOrdering,
1709-
AtomicOrdering FailureOrdering, SyncScope::ID SSID = SyncScope::System) {
1710-
const DataLayout &DL = BB->getModule()->getDataLayout();
1711-
Align Alignment(DL.getTypeStoreSize(New->getType()));
1712-
return Insert(new AtomicCmpXchgInst(
1713-
Ptr, Cmp, New, Alignment, SuccessOrdering, FailureOrdering, SSID));
1707+
AtomicCmpXchgInst *
1708+
CreateAtomicCmpXchg(Value *Ptr, Value *Cmp, Value *New, MaybeAlign Align,
1709+
AtomicOrdering SuccessOrdering,
1710+
AtomicOrdering FailureOrdering,
1711+
SyncScope::ID SSID = SyncScope::System) {
1712+
if (!Align) {
1713+
const DataLayout &DL = BB->getModule()->getDataLayout();
1714+
Align = llvm::Align(DL.getTypeStoreSize(New->getType()));
1715+
}
1716+
1717+
return Insert(new AtomicCmpXchgInst(Ptr, Cmp, New, *Align, SuccessOrdering,
1718+
FailureOrdering, SSID));
17141719
}
17151720

1716-
AtomicRMWInst *CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val,
1721+
AtomicRMWInst *CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr,
1722+
Value *Val, MaybeAlign Align,
17171723
AtomicOrdering Ordering,
17181724
SyncScope::ID SSID = SyncScope::System) {
1719-
const DataLayout &DL = BB->getModule()->getDataLayout();
1720-
Align Alignment(DL.getTypeStoreSize(Val->getType()));
1721-
return Insert(new AtomicRMWInst(Op, Ptr, Val, Alignment, Ordering, SSID));
1725+
if (!Align) {
1726+
const DataLayout &DL = BB->getModule()->getDataLayout();
1727+
Align = llvm::Align(DL.getTypeStoreSize(Val->getType()));
1728+
}
1729+
1730+
return Insert(new AtomicRMWInst(Op, Ptr, Val, *Align, Ordering, SSID));
17221731
}
17231732

17241733
Value *CreateGEP(Value *Ptr, ArrayRef<Value *> IdxList,

0 commit comments

Comments
 (0)