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) {
|
||||
assert(Ordering != AtomicOrdering::NotAtomic &&
|
||||
"atomicrmw instructions can only be atomic.");
|
||||
assert(Ordering != AtomicOrdering::Unordered &&
|
||||
"atomicrmw instructions cannot be unordered.");
|
||||
setSubclassData<AtomicOrderingField>(Ordering);
|
||||
}
|
||||
|
||||
|
|
|
@ -515,9 +515,14 @@ void AtomicExpand::expandAtomicStore(StoreInst *SI) {
|
|||
// It is the responsibility of the target to only signal expansion via
|
||||
// shouldExpandAtomicRMW in cases where this is required and possible.
|
||||
IRBuilder<> Builder(SI);
|
||||
AtomicOrdering Ordering = SI->getOrdering();
|
||||
assert(Ordering != AtomicOrdering::NotAtomic);
|
||||
AtomicOrdering RMWOrdering = Ordering == AtomicOrdering::Unordered
|
||||
? AtomicOrdering::Monotonic
|
||||
: Ordering;
|
||||
AtomicRMWInst *AI = Builder.CreateAtomicRMW(
|
||||
AtomicRMWInst::Xchg, SI->getPointerOperand(), SI->getValueOperand(),
|
||||
SI->getAlign(), SI->getOrdering());
|
||||
SI->getAlign(), RMWOrdering);
|
||||
SI->eraseFromParent();
|
||||
|
||||
// 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,
|
||||
Align Alignment, AtomicOrdering Ordering,
|
||||
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<1>() = Val;
|
||||
setOperation(Operation);
|
||||
|
|
Loading…
Reference in New Issue