forked from OSchip/llvm-project
[IRBuilder] Add assert for AtomicRMW ordering
Add assert for AtomicRMW: Ordering != AtomicOrdering::Unordered (https://github.com/llvm/llvm-project/blob/main/llvm/lib/IR/Verifier.cpp#L3944) and adjust expandAtomicStore accordingly. Test plan: 1/ ninja check-llvm check-clang check-lld 2/ Bootstrapped LLVM/Clang pass tests Differential revision: https://reviews.llvm.org/D130457
This commit is contained in:
parent
83882606db
commit
1e636f2676
|
@ -848,6 +848,8 @@ public:
|
||||||
void setOrdering(AtomicOrdering Ordering) {
|
void setOrdering(AtomicOrdering Ordering) {
|
||||||
assert(Ordering != AtomicOrdering::NotAtomic &&
|
assert(Ordering != AtomicOrdering::NotAtomic &&
|
||||||
"atomicrmw instructions can only be atomic.");
|
"atomicrmw instructions can only be atomic.");
|
||||||
|
assert(Ordering != AtomicOrdering::Unordered &&
|
||||||
|
"atomicrmw instructions cannot be unordered.");
|
||||||
setSubclassData<AtomicOrderingField>(Ordering);
|
setSubclassData<AtomicOrderingField>(Ordering);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -515,9 +515,14 @@ void AtomicExpand::expandAtomicStore(StoreInst *SI) {
|
||||||
// It is the responsibility of the target to only signal expansion via
|
// It is the responsibility of the target to only signal expansion via
|
||||||
// shouldExpandAtomicRMW in cases where this is required and possible.
|
// shouldExpandAtomicRMW in cases where this is required and possible.
|
||||||
IRBuilder<> Builder(SI);
|
IRBuilder<> Builder(SI);
|
||||||
|
AtomicOrdering Ordering = SI->getOrdering();
|
||||||
|
assert(Ordering != AtomicOrdering::NotAtomic);
|
||||||
|
AtomicOrdering RMWOrdering = Ordering == AtomicOrdering::Unordered
|
||||||
|
? AtomicOrdering::Monotonic
|
||||||
|
: Ordering;
|
||||||
AtomicRMWInst *AI = Builder.CreateAtomicRMW(
|
AtomicRMWInst *AI = Builder.CreateAtomicRMW(
|
||||||
AtomicRMWInst::Xchg, SI->getPointerOperand(), SI->getValueOperand(),
|
AtomicRMWInst::Xchg, SI->getPointerOperand(), SI->getValueOperand(),
|
||||||
SI->getAlign(), SI->getOrdering());
|
SI->getAlign(), RMWOrdering);
|
||||||
SI->eraseFromParent();
|
SI->eraseFromParent();
|
||||||
|
|
||||||
// Now we have an appropriate swap instruction, lower it as usual.
|
// Now we have an appropriate swap instruction, lower it as usual.
|
||||||
|
|
|
@ -1627,6 +1627,10 @@ AtomicCmpXchgInst::AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal,
|
||||||
void AtomicRMWInst::Init(BinOp Operation, Value *Ptr, Value *Val,
|
void AtomicRMWInst::Init(BinOp Operation, Value *Ptr, Value *Val,
|
||||||
Align Alignment, AtomicOrdering Ordering,
|
Align Alignment, AtomicOrdering Ordering,
|
||||||
SyncScope::ID SSID) {
|
SyncScope::ID SSID) {
|
||||||
|
assert(Ordering != AtomicOrdering::NotAtomic &&
|
||||||
|
"atomicrmw instructions can only be atomic.");
|
||||||
|
assert(Ordering != AtomicOrdering::Unordered &&
|
||||||
|
"atomicrmw instructions cannot be unordered.");
|
||||||
Op<0>() = Ptr;
|
Op<0>() = Ptr;
|
||||||
Op<1>() = Val;
|
Op<1>() = Val;
|
||||||
setOperation(Operation);
|
setOperation(Operation);
|
||||||
|
|
Loading…
Reference in New Issue