================
@@ -709,25 +709,40 @@ static void emitAtomicOp(CIRGenFunction &cgf, AtomicExpr
*expr, Address dest,
cgf.cgm.errorNYI(expr->getSourceRange(), "emitAtomicOp: dynamic sync scope");
}
-static bool isMemOrderValid(uint64_t order, bool isStore, bool isLoad) {
- if (!cir::isValidCIRAtomicOrderingCABI(order))
- return false;
- auto memOrder = static_cast<cir::MemOrder>(order);
- if (isStore)
- return memOrder != cir::MemOrder::Consume &&
- memOrder != cir::MemOrder::Acquire &&
- memOrder != cir::MemOrder::AcquireRelease;
- if (isLoad)
- return memOrder != cir::MemOrder::Release &&
- memOrder != cir::MemOrder::AcquireRelease;
- return true;
+static std::optional<cir::MemOrder>
+getEffectiveAtomicMemOrder(cir::MemOrder oriOrder, bool isStore, bool isLoad,
+ bool isFence) {
+ // Some memory orders are not supported by partial atomic operation:
+ // {memory_order_releaxed} is not valid for fence operations.
+ // {memory_order_consume, memory_order_acquire} are not valid for write-only
+ // operations.
+ // {memory_order_release} is not valid for read-only operations.
+ // {memory_order_acq_rel} is only valid for read-write operations.
+ if (isStore) {
+ if (oriOrder == cir::MemOrder::Consume ||
+ oriOrder == cir::MemOrder::Acquire ||
+ oriOrder == cir::MemOrder::AcquireRelease)
+ return std::nullopt;
+ } else if (isLoad) {
+ if (oriOrder == cir::MemOrder::Release ||
+ oriOrder == cir::MemOrder::AcquireRelease)
+ return std::nullopt;
+ } else if (isFence) {
+ if (oriOrder == cir::MemOrder::Relaxed)
+ return std::nullopt;
+ }
+ // memory_order_consume is not implemented, it is always treated like
+ // memory_order_acquire
+ if (oriOrder == cir::MemOrder::Consume)
+ return cir::MemOrder::Acquire;
+ return oriOrder;
}
static void emitAtomicExprWithDynamicMemOrder(
- CIRGenFunction &cgf, mlir::Value order, AtomicExpr *e, Address dest,
- Address ptr, Address val1, Address val2, Expr *isWeakExpr,
- Expr *orderFailExpr, uint64_t size, bool isStore, bool isLoad,
- const std::optional<Expr::EvalResult> &scopeConst, mlir::Value scopeValue)
{
+ CIRGenFunction &cgf, mlir::Value order, bool isStore, bool isLoad,
+ bool isFence, llvm::function_ref<void(cir::MemOrder)> emitAtomicOp) {
----------------
Luhaocong wrote:
done, address all comment
https://github.com/llvm/llvm-project/pull/172455
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits