From a37abe0ded628131bcf0db1efbace726260191b8 Mon Sep 17 00:00:00 2001 From: Letu Ren Date: Sat, 1 Mar 2025 14:25:35 +0800 Subject: [PATCH 1/2] [CIR] Change AtomicFenceOp's syncscope to OptionalAttr --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 10 ++++----- clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp | 2 +- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 21 ++++++++++--------- clang/test/CIR/CodeGen/atomic-thread-fence.c | 12 +++++------ 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 76706c655f27..199a12452e98 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -5568,17 +5568,17 @@ def AtomicFence : CIR_Op<"atomic.fence"> { Example: ```mlir - cir.atomic.fence system seq_cst - cir.atomic.fence single_thread seq_cst + cir.atomic.fence syncscope(system) seq_cst + cir.atomic.fence syncscope(single_thread) seq_cst ``` }]; + let arguments = (ins Arg:$ordering, + OptionalAttr:$syncscope); let results = (outs); - let arguments = (ins Arg:$sync_scope, - Arg:$ordering); let assemblyFormat = [{ - $sync_scope $ordering attr-dict + (`syncscope` `(` $syncscope^ `)`)? $ordering attr-dict }]; let hasVerifier = 0; diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index 52fe2840e9fb..50292ca0101f 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -366,7 +366,7 @@ static mlir::Value makeAtomicFenceValue(CIRGenFunction &cgf, static_cast(constOrderingAttr.getUInt()); builder.create(cgf.getLoc(expr->getSourceRange()), - syncScope, ordering); + ordering, MemScopeKindAttr::get(&cgf.getMLIRContext(), syncScope)); } return mlir::Value(); diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 12f783fe778a..42f55f3c5c6f 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -405,6 +405,12 @@ static mlir::Value emitToMemory(mlir::ConversionPatternRewriter &rewriter, return value; } +std::optional getLLVMSyncScope(std::optional syncScope) { + if (syncScope.has_value()) + return syncScope.value() == cir::MemScopeKind::MemScope_SingleThread ? "singlethread" + : ""; + return std::nullopt; +} } // namespace //===----------------------------------------------------------------------===// @@ -3199,11 +3205,6 @@ mlir::LLVM::AtomicOrdering getLLVMAtomicOrder(cir::MemOrder memo) { llvm_unreachable("shouldn't get here"); } -llvm::StringRef getLLVMSyncScope(cir::MemScopeKind syncScope) { - return syncScope == cir::MemScopeKind::MemScope_SingleThread ? "singlethread" - : ""; -} - mlir::LogicalResult CIRToLLVMAtomicCmpXchgLowering::matchAndRewrite( cir::AtomicCmpXchg op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { @@ -3214,8 +3215,7 @@ mlir::LogicalResult CIRToLLVMAtomicCmpXchgLowering::matchAndRewrite( op.getLoc(), adaptor.getPtr(), expected, desired, getLLVMAtomicOrder(adaptor.getSuccOrder()), getLLVMAtomicOrder(adaptor.getFailOrder())); - if (const auto ss = adaptor.getSyncscope(); ss.has_value()) - cmpxchg.setSyncscope(getLLVMSyncScope(ss.value())); + cmpxchg.setSyncscope(getLLVMSyncScope(adaptor.getSyncscope())); cmpxchg.setAlignment(adaptor.getAlignment()); cmpxchg.setWeak(adaptor.getWeak()); cmpxchg.setVolatile_(adaptor.getIsVolatile()); @@ -3377,10 +3377,11 @@ mlir::LogicalResult CIRToLLVMAtomicFenceLowering::matchAndRewrite( cir::AtomicFence op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { auto llvmOrder = getLLVMAtomicOrder(adaptor.getOrdering()); - auto llvmSyncScope = getLLVMSyncScope(adaptor.getSyncScope()); - rewriter.replaceOpWithNewOp(op, llvmOrder, - llvmSyncScope); + auto fence = rewriter.create(op.getLoc(), llvmOrder); + fence.setSyncscope(getLLVMSyncScope(adaptor.getSyncscope())); + + rewriter.replaceOp(op, fence); return mlir::success(); } diff --git a/clang/test/CIR/CodeGen/atomic-thread-fence.c b/clang/test/CIR/CodeGen/atomic-thread-fence.c index 1b3199f56165..a12fc643536b 100644 --- a/clang/test/CIR/CodeGen/atomic-thread-fence.c +++ b/clang/test/CIR/CodeGen/atomic-thread-fence.c @@ -16,7 +16,7 @@ void applyThreadFence() { } // CIR-LABEL: @applyThreadFence -// CIR: cir.atomic.fence system seq_cst +// CIR: cir.atomic.fence syncscope(system) seq_cst // CIR: cir.return // LLVM-LABEL: @applyThreadFence @@ -27,7 +27,7 @@ void applySignalFence() { __atomic_signal_fence(__ATOMIC_SEQ_CST); } // CIR-LABEL: @applySignalFence -// CIR: cir.atomic.fence single_thread seq_cst +// CIR: cir.atomic.fence syncscope(single_thread) seq_cst // CIR: cir.return // LLVM-LABEL: @applySignalFence @@ -40,7 +40,7 @@ void modifyWithThreadFence(DataPtr d) { } // CIR-LABEL: @modifyWithThreadFence // CIR: %[[DATA:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["d", init] {alignment = 8 : i64} -// CIR: cir.atomic.fence system seq_cst +// CIR: cir.atomic.fence syncscope(system) seq_cst // CIR: %[[VAL_42:.*]] = cir.const #cir.int<42> : !s32i // CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr>, !cir.ptr // CIR: %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][0] {name = "value"} : !cir.ptr -> !cir.ptr @@ -61,7 +61,7 @@ void modifyWithSignalFence(DataPtr d) { } // CIR-LABEL: @modifyWithSignalFence // CIR: %[[DATA:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["d", init] {alignment = 8 : i64} -// CIR: cir.atomic.fence single_thread seq_cst +// CIR: cir.atomic.fence syncscope(single_thread) seq_cst // CIR: %[[VAL_42:.*]] = cir.const #cir.int<24> : !s32i // CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr>, !cir.ptr // CIR: %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][0] {name = "value"} : !cir.ptr -> !cir.ptr @@ -83,7 +83,7 @@ void loadWithThreadFence(DataPtr d) { // CIR-LABEL: @loadWithThreadFence // CIR: %[[DATA:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["d", init] {alignment = 8 : i64} // CIR: %[[ATOMIC_TEMP:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["atomic-temp"] {alignment = 8 : i64} -// CIR: cir.atomic.fence system seq_cst +// CIR: cir.atomic.fence syncscope(system) seq_cst // CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr>, !cir.ptr // CIR: %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][1] {name = "ptr"} : !cir.ptr -> !cir.ptr> // CIR: %[[CASTED_DATA_VALUE:.*]] = cir.cast(bitcast, %[[DATA_VALUE]] : !cir.ptr>), !cir.ptr @@ -112,7 +112,7 @@ void loadWithSignalFence(DataPtr d) { // CIR-LABEL: @loadWithSignalFence // CIR: %[[DATA:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["d", init] {alignment = 8 : i64} // CIR: %[[ATOMIC_TEMP:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["atomic-temp"] {alignment = 8 : i64} -// CIR: cir.atomic.fence single_thread seq_cst +// CIR: cir.atomic.fence syncscope(single_thread) seq_cst // CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr>, !cir.ptr // CIR: %[[DATA_PTR:.*]] = cir.get_member %[[LOAD_DATA]][1] {name = "ptr"} : !cir.ptr -> !cir.ptr> // CIR: %[[CASTED_DATA_PTR:.*]] = cir.cast(bitcast, %[[DATA_PTR]] : !cir.ptr>), !cir.ptr From 03992e0a11a3a119d713827dd8a7aa91461a3250 Mon Sep 17 00:00:00 2001 From: Letu Ren Date: Sat, 1 Mar 2025 14:28:47 +0800 Subject: [PATCH 2/2] format code --- clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp | 5 +++-- clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index 50292ca0101f..07a672dde0ed 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -365,8 +365,9 @@ static mlir::Value makeAtomicFenceValue(CIRGenFunction &cgf, cir::MemOrder ordering = static_cast(constOrderingAttr.getUInt()); - builder.create(cgf.getLoc(expr->getSourceRange()), - ordering, MemScopeKindAttr::get(&cgf.getMLIRContext(), syncScope)); + builder.create( + cgf.getLoc(expr->getSourceRange()), ordering, + MemScopeKindAttr::get(&cgf.getMLIRContext(), syncScope)); } return mlir::Value(); diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 42f55f3c5c6f..2976a50ae622 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -405,10 +405,12 @@ static mlir::Value emitToMemory(mlir::ConversionPatternRewriter &rewriter, return value; } -std::optional getLLVMSyncScope(std::optional syncScope) { +std::optional +getLLVMSyncScope(std::optional syncScope) { if (syncScope.has_value()) - return syncScope.value() == cir::MemScopeKind::MemScope_SingleThread ? "singlethread" - : ""; + return syncScope.value() == cir::MemScopeKind::MemScope_SingleThread + ? "singlethread" + : ""; return std::nullopt; } } // namespace