diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index fcc7585cf81a5..e39bc31c3eafa 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -5493,7 +5493,7 @@ def CIR_AtomicClearOp : CIR_Op<"atomic.clear"> { }]; } -def CIR_AtomicFence : CIR_Op<"atomic.fence"> { +def CIR_AtomicFenceOp : CIR_Op<"atomic.fence"> { let summary = "Atomic thread fence"; let description = [{ C/C++ Atomic thread fence synchronization primitive. Implements the builtin diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index 16c006df6853e..bc7f2e59edadd 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -60,9 +60,8 @@ static RValue emitBuiltinBitOp(CIRGenFunction &cgf, const CallExpr *e, return RValue::get(result); } -static mlir::Value makeAtomicFenceValue(CIRGenFunction &cgf, - const CallExpr *expr, - cir::SyncScopeKind syncScope) { +static void emitAtomicFenceOp(CIRGenFunction &cgf, const CallExpr *expr, + cir::SyncScopeKind syncScope) { CIRGenBuilderTy &builder = cgf.getBuilder(); mlir::Value orderingVal = cgf.emitScalarExpr(expr->getArg(0)); @@ -72,7 +71,7 @@ static mlir::Value makeAtomicFenceValue(CIRGenFunction &cgf, // TODO(cir): Emit code to switch on `orderingVal`, // and creating the fence op for valid values. cgf.cgm.errorNYI("Variable atomic fence ordering"); - return {}; + return; } auto constOrderingAttr = constOrdering.getValueAttr(); @@ -80,11 +79,11 @@ static mlir::Value makeAtomicFenceValue(CIRGenFunction &cgf, auto ordering = static_cast(constOrderingAttr.getUInt()); - cir::AtomicFence::create( + cir::AtomicFenceOp::create( builder, cgf.getLoc(expr->getSourceRange()), ordering, cir::SyncScopeKindAttr::get(&cgf.getMLIRContext(), syncScope)); - return {}; + return; } namespace { @@ -1010,12 +1009,14 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID, case Builtin::BI__atomic_test_and_set: case Builtin::BI__atomic_clear: return errorBuiltinNYI(*this, e, builtinID); - case Builtin::BI__atomic_thread_fence: - return RValue::get( - makeAtomicFenceValue(*this, e, cir::SyncScopeKind::System)); - case Builtin::BI__atomic_signal_fence: - return RValue::get( - makeAtomicFenceValue(*this, e, cir::SyncScopeKind::SingleThread)); + case Builtin::BI__atomic_thread_fence: { + emitAtomicFenceOp(*this, e, cir::SyncScopeKind::System); + return RValue::get(nullptr); + } + case Builtin::BI__atomic_signal_fence: { + emitAtomicFenceOp(*this, e, cir::SyncScopeKind::SingleThread); + return RValue::get(nullptr); + } case Builtin::BI__c11_atomic_thread_fence: case Builtin::BI__c11_atomic_signal_fence: case Builtin::BI__scoped_atomic_thread_fence: diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 97bd3cf850daa..c8b395b1feb93 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -860,8 +860,8 @@ mlir::LogicalResult CIRToLLVMAtomicClearOpLowering::matchAndRewrite( return mlir::success(); } -mlir::LogicalResult CIRToLLVMAtomicFenceLowering::matchAndRewrite( - cir::AtomicFence op, OpAdaptor adaptor, +mlir::LogicalResult CIRToLLVMAtomicFenceOpLowering::matchAndRewrite( + cir::AtomicFenceOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { mlir::LLVM::AtomicOrdering llvmOrder = getLLVMMemOrder(adaptor.getOrdering());