@@ -61,22 +61,28 @@ static RValue emitBuiltinBitOp(CIRGenFunction &cgf, const CallExpr *e,
6161static mlir::Value makeAtomicFenceValue (CIRGenFunction &cgf,
6262 const CallExpr *expr,
6363 cir::SyncScopeKind syncScope) {
64- auto &builder = cgf.getBuilder ();
64+ CIRGenBuilderTy &builder = cgf.getBuilder ();
6565 mlir::Value orderingVal = cgf.emitScalarExpr (expr->getArg (0 ));
6666
6767 auto constOrdering = orderingVal.getDefiningOp <cir::ConstantOp>();
68- if (!constOrdering)
69- llvm_unreachable (" NYI: variable ordering not supported" );
70-
71- if (auto constOrderingAttr = constOrdering.getValueAttr <cir::IntAttr>()) {
72- cir::MemOrder ordering =
73- static_cast <cir::MemOrder>(constOrderingAttr.getUInt ());
7468
75- cir::AtomicFence::create (
76- builder, cgf.getLoc (expr->getSourceRange ()), ordering,
77- cir::SyncScopeKindAttr::get (&cgf.getMLIRContext (), syncScope));
69+ if (!constOrdering) {
70+ // TODO(cir): Emit code to switch on `orderingVal`,
71+ // and creating the fence op for valid values.
72+ cgf.cgm .errorNYI (" Variable atomic fence ordering" );
73+ return {};
7874 }
7975
76+ auto constOrderingAttr = constOrdering.getValueAttr <cir::IntAttr>();
77+ assert (constOrderingAttr && " Expected integer constant for ordering" );
78+
79+ auto ordering =
80+ static_cast <cir::MemOrder>(constOrderingAttr.getUInt ());
81+
82+ cir::AtomicFence::create (
83+ builder, cgf.getLoc (expr->getSourceRange ()), ordering,
84+ cir::SyncScopeKindAttr::get (&cgf.getMLIRContext (), syncScope));
85+
8086 return {};
8187}
8288
0 commit comments