================
@@ -738,56 +753,75 @@ static void emitAtomicExprWithDynamicMemOrder(
[&](mlir::OpBuilder &, mlir::Location loc, mlir::OperationState &) {
mlir::Block *switchBlock = builder.getBlock();
- auto emitMemOrderCase = [&](llvm::ArrayRef<cir::MemOrder> caseOrders,
- cir::MemOrder actualOrder) {
- if (caseOrders.empty())
+ auto emitMemOrderCase = [&](llvm::ArrayRef<cir::MemOrder> caseOrders) {
+ // Checking there are same effective memory order for each case.
+ for (int i = 1, e = caseOrders.size(); i < e; i++)
+ assert((getEffectiveAtomicMemOrder(caseOrders[i - 1], isStore,
+ isLoad, isFence) ==
+ getEffectiveAtomicMemOrder(caseOrders[i], isStore, isLoad,
+ isFence)) &&
+ "Effective memory order must be same!");
+ // Emit case label and atomic opeartion if neccessary.
+ if (caseOrders.empty()) {
emitMemOrderDefaultCaseLabel(builder, loc);
- else
+ // There is no good way to report an unsupported memory order at
+ // runtime, hence the fallback to memory_order_relaxed.
+ if (!isFence)
+ emitAtomicOp(cir::MemOrder::Relaxed);
+ } else if (auto actualOrder = getEffectiveAtomicMemOrder(
----------------
Lancern wrote:
```suggestion
} else if (std::optional<cir::MemOrder> actualOrder =
getEffectiveAtomicMemOrder(
```
https://github.com/llvm/llvm-project/pull/172455
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits