Skip to content

Commit 35e98b3

Browse files
Replace isAtomic field with MemoryOrder enum in Load (#8170)
Supplement to #8169. We're adding a MemoryOrder field in Loads (as well as other memory accesses) to support relaxed atomics in #8165. Only touching loads here to get feedback before handling the remaining memory operations.
1 parent 201149c commit 35e98b3

19 files changed

+53
-27
lines changed

src/binaryen-c.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2633,12 +2633,14 @@ void BinaryenMemoryGrowSetDelta(BinaryenExpressionRef expr,
26332633
bool BinaryenLoadIsAtomic(BinaryenExpressionRef expr) {
26342634
auto* expression = (Expression*)expr;
26352635
assert(expression->is<Load>());
2636-
return static_cast<Load*>(expression)->isAtomic;
2636+
return static_cast<Load*>(expression)->isAtomic();
26372637
}
2638+
26382639
void BinaryenLoadSetAtomic(BinaryenExpressionRef expr, bool isAtomic) {
26392640
auto* expression = (Expression*)expr;
26402641
assert(expression->is<Load>());
2641-
static_cast<Load*>(expression)->isAtomic = isAtomic != 0;
2642+
static_cast<Load*>(expression)->order =
2643+
isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
26422644
}
26432645
bool BinaryenLoadIsSigned(BinaryenExpressionRef expr) {
26442646
auto* expression = (Expression*)expr;

src/ir/cost.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
101101
CostType visitGlobalGet(GlobalGet* curr) { return 1; }
102102
CostType visitGlobalSet(GlobalSet* curr) { return 2 + visit(curr->value); }
103103
CostType visitLoad(Load* curr) {
104-
return 1 + visit(curr->ptr) + AtomicCost * curr->isAtomic;
104+
return 1 + visit(curr->ptr) + AtomicCost * curr->isAtomic();
105105
}
106106
CostType visitStore(Store* curr) {
107107
return 2 + visit(curr->ptr) + visit(curr->value) +

src/ir/effects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ class EffectAnalyzer {
598598
}
599599
void visitLoad(Load* curr) {
600600
parent.readsMemory = true;
601-
parent.isAtomic |= curr->isAtomic;
601+
parent.isAtomic |= curr->isAtomic();
602602
parent.implicitTrap = true;
603603
}
604604
void visitStore(Store* curr) {

src/ir/load-utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ inline bool isSignRelevant(Load* load) {
3333
}
3434

3535
// check if a load can be signed (which some opts want to do)
36-
inline bool canBeSigned(Load* load) { return !load->isAtomic; }
36+
inline bool canBeSigned(Load* load) { return !load->isAtomic(); }
3737

3838
} // namespace wasm::LoadUtils
3939

src/ir/properties.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ inline MemoryOrder getMemoryOrder(Expression* curr) {
502502
return set->order;
503503
}
504504
if (auto* load = curr->dynCast<Load>()) {
505-
return load->isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
505+
return load->order;
506506
}
507507
if (auto* store = curr->dynCast<Store>()) {
508508
return store->isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;

src/passes/I64ToI32Lowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
414414
if (curr->type != Type::i64) {
415415
return;
416416
}
417-
assert(!curr->isAtomic && "64-bit atomic load not implemented");
417+
assert(!curr->isAtomic() && "64-bit atomic load not implemented");
418418
TempVar lowBits = getTemp();
419419
TempVar highBits = getTemp();
420420
TempVar ptrTemp = getTemp();

src/passes/OptimizeInstructions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ struct OptimizeInstructions
10491049
// extend operation.
10501050
bool willBeSigned = curr->op == ExtendSInt32 && load->bytes == 4;
10511051
if (!(curr->op == ExtendUInt32 && load->bytes <= 2 && load->signed_) &&
1052-
!(willBeSigned && load->isAtomic)) {
1052+
!(willBeSigned && load->isAtomic())) {
10531053
if (willBeSigned) {
10541054
load->signed_ = true;
10551055
}
@@ -1092,7 +1092,7 @@ struct OptimizeInstructions
10921092
// i32.reinterpret_f32(f32.load(x)) => i32.load(x)
10931093
// i64.reinterpret_f64(f64.load(x)) => i64.load(x)
10941094
if (auto* load = curr->value->dynCast<Load>()) {
1095-
if (!load->isAtomic && load->bytes == curr->type.getByteSize()) {
1095+
if (!load->isAtomic() && load->bytes == curr->type.getByteSize()) {
10961096
load->type = curr->type;
10971097
return replaceCurrent(load);
10981098
}

src/passes/PickLoadSigns.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ struct PickLoadSigns : public WalkerPass<ExpressionStackWalker<PickLoadSigns>> {
120120
continue;
121121
}
122122
// Atomic operations are always unsigned, never signed.
123-
if (load->isAtomic) {
123+
if (load->isAtomic()) {
124124
continue;
125125
}
126126
// we can pick the optimal one. our hope is to remove 2 items per

src/passes/Print.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ struct PrintExpressionContents
549549
}
550550
void visitLoad(Load* curr) {
551551
prepareColor(o) << forceConcrete(curr->type, curr->align);
552-
if (curr->isAtomic) {
552+
if (curr->isAtomic()) {
553553
o << ".atomic";
554554
}
555555
o << ".load";

src/passes/SafeHeap.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static Name getLoadName(Load* curr) {
4343
if (LoadUtils::isSignRelevant(curr) && !curr->signed_) {
4444
ret += "U_";
4545
}
46-
if (curr->isAtomic) {
46+
if (curr->isAtomic()) {
4747
ret += "A";
4848
} else {
4949
ret += std::to_string(curr->align);
@@ -233,7 +233,8 @@ struct SafeHeap : public Pass {
233233
continue;
234234
}
235235
for (auto isAtomic : {true, false}) {
236-
load.isAtomic = isAtomic;
236+
load.order =
237+
isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
237238
if (isAtomic &&
238239
!isPossibleAtomicOperation(
239240
align, bytes, module->memories[0]->shared, type)) {
@@ -321,7 +322,7 @@ struct SafeHeap : public Pass {
321322
*load = style; // basically the same as the template we are given!
322323
load->ptr = builder.makeLocalGet(2, addressType);
323324
Expression* last = load;
324-
if (load->isAtomic && load->signed_) {
325+
if (load->isAtomic() && load->signed_) {
325326
// atomic loads cannot be signed, manually sign it
326327
last = Bits::makeSignExt(load, load->bytes, *module);
327328
load->signed_ = false;

0 commit comments

Comments
 (0)