Skip to content

Commit a37abe0

Browse files
committed
[CIR] Change AtomicFenceOp's syncscope to OptionalAttr
1 parent 0bedc28 commit a37abe0

File tree

4 files changed

+23
-22
lines changed

4 files changed

+23
-22
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

+5-5
Original file line numberDiff line numberDiff line change
@@ -5568,17 +5568,17 @@ def AtomicFence : CIR_Op<"atomic.fence"> {
55685568

55695569
Example:
55705570
```mlir
5571-
cir.atomic.fence system seq_cst
5572-
cir.atomic.fence single_thread seq_cst
5571+
cir.atomic.fence syncscope(system) seq_cst
5572+
cir.atomic.fence syncscope(single_thread) seq_cst
55735573
```
55745574

55755575
}];
5576+
let arguments = (ins Arg<MemOrder, "memory order">:$ordering,
5577+
OptionalAttr<MemScopeKind>:$syncscope);
55765578
let results = (outs);
5577-
let arguments = (ins Arg<MemScopeKind, "sync scope">:$sync_scope,
5578-
Arg<MemOrder, "memory order">:$ordering);
55795579

55805580
let assemblyFormat = [{
5581-
$sync_scope $ordering attr-dict
5581+
(`syncscope` `(` $syncscope^ `)`)? $ordering attr-dict
55825582
}];
55835583

55845584
let hasVerifier = 0;

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ static mlir::Value makeAtomicFenceValue(CIRGenFunction &cgf,
366366
static_cast<cir::MemOrder>(constOrderingAttr.getUInt());
367367

368368
builder.create<cir::AtomicFence>(cgf.getLoc(expr->getSourceRange()),
369-
syncScope, ordering);
369+
ordering, MemScopeKindAttr::get(&cgf.getMLIRContext(), syncScope));
370370
}
371371

372372
return mlir::Value();

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,12 @@ static mlir::Value emitToMemory(mlir::ConversionPatternRewriter &rewriter,
405405
return value;
406406
}
407407

408+
std::optional<llvm::StringRef> getLLVMSyncScope(std::optional<cir::MemScopeKind> syncScope) {
409+
if (syncScope.has_value())
410+
return syncScope.value() == cir::MemScopeKind::MemScope_SingleThread ? "singlethread"
411+
: "";
412+
return std::nullopt;
413+
}
408414
} // namespace
409415

410416
//===----------------------------------------------------------------------===//
@@ -3199,11 +3205,6 @@ mlir::LLVM::AtomicOrdering getLLVMAtomicOrder(cir::MemOrder memo) {
31993205
llvm_unreachable("shouldn't get here");
32003206
}
32013207

3202-
llvm::StringRef getLLVMSyncScope(cir::MemScopeKind syncScope) {
3203-
return syncScope == cir::MemScopeKind::MemScope_SingleThread ? "singlethread"
3204-
: "";
3205-
}
3206-
32073208
mlir::LogicalResult CIRToLLVMAtomicCmpXchgLowering::matchAndRewrite(
32083209
cir::AtomicCmpXchg op, OpAdaptor adaptor,
32093210
mlir::ConversionPatternRewriter &rewriter) const {
@@ -3214,8 +3215,7 @@ mlir::LogicalResult CIRToLLVMAtomicCmpXchgLowering::matchAndRewrite(
32143215
op.getLoc(), adaptor.getPtr(), expected, desired,
32153216
getLLVMAtomicOrder(adaptor.getSuccOrder()),
32163217
getLLVMAtomicOrder(adaptor.getFailOrder()));
3217-
if (const auto ss = adaptor.getSyncscope(); ss.has_value())
3218-
cmpxchg.setSyncscope(getLLVMSyncScope(ss.value()));
3218+
cmpxchg.setSyncscope(getLLVMSyncScope(adaptor.getSyncscope()));
32193219
cmpxchg.setAlignment(adaptor.getAlignment());
32203220
cmpxchg.setWeak(adaptor.getWeak());
32213221
cmpxchg.setVolatile_(adaptor.getIsVolatile());
@@ -3377,10 +3377,11 @@ mlir::LogicalResult CIRToLLVMAtomicFenceLowering::matchAndRewrite(
33773377
cir::AtomicFence op, OpAdaptor adaptor,
33783378
mlir::ConversionPatternRewriter &rewriter) const {
33793379
auto llvmOrder = getLLVMAtomicOrder(adaptor.getOrdering());
3380-
auto llvmSyncScope = getLLVMSyncScope(adaptor.getSyncScope());
33813380

3382-
rewriter.replaceOpWithNewOp<mlir::LLVM::FenceOp>(op, llvmOrder,
3383-
llvmSyncScope);
3381+
auto fence = rewriter.create<mlir::LLVM::FenceOp>(op.getLoc(), llvmOrder);
3382+
fence.setSyncscope(getLLVMSyncScope(adaptor.getSyncscope()));
3383+
3384+
rewriter.replaceOp(op, fence);
33843385

33853386
return mlir::success();
33863387
}

clang/test/CIR/CodeGen/atomic-thread-fence.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void applyThreadFence() {
1616
}
1717

1818
// CIR-LABEL: @applyThreadFence
19-
// CIR: cir.atomic.fence system seq_cst
19+
// CIR: cir.atomic.fence syncscope(system) seq_cst
2020
// CIR: cir.return
2121

2222
// LLVM-LABEL: @applyThreadFence
@@ -27,7 +27,7 @@ void applySignalFence() {
2727
__atomic_signal_fence(__ATOMIC_SEQ_CST);
2828
}
2929
// CIR-LABEL: @applySignalFence
30-
// CIR: cir.atomic.fence single_thread seq_cst
30+
// CIR: cir.atomic.fence syncscope(single_thread) seq_cst
3131
// CIR: cir.return
3232

3333
// LLVM-LABEL: @applySignalFence
@@ -40,7 +40,7 @@ void modifyWithThreadFence(DataPtr d) {
4040
}
4141
// CIR-LABEL: @modifyWithThreadFence
4242
// CIR: %[[DATA:.*]] = cir.alloca !cir.ptr<!ty_Data>, !cir.ptr<!cir.ptr<!ty_Data>>, ["d", init] {alignment = 8 : i64}
43-
// CIR: cir.atomic.fence system seq_cst
43+
// CIR: cir.atomic.fence syncscope(system) seq_cst
4444
// CIR: %[[VAL_42:.*]] = cir.const #cir.int<42> : !s32i
4545
// CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr<!cir.ptr<!ty_Data>>, !cir.ptr<!ty_Data>
4646
// CIR: %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][0] {name = "value"} : !cir.ptr<!ty_Data> -> !cir.ptr<!s32i>
@@ -61,7 +61,7 @@ void modifyWithSignalFence(DataPtr d) {
6161
}
6262
// CIR-LABEL: @modifyWithSignalFence
6363
// CIR: %[[DATA:.*]] = cir.alloca !cir.ptr<!ty_Data>, !cir.ptr<!cir.ptr<!ty_Data>>, ["d", init] {alignment = 8 : i64}
64-
// CIR: cir.atomic.fence single_thread seq_cst
64+
// CIR: cir.atomic.fence syncscope(single_thread) seq_cst
6565
// CIR: %[[VAL_42:.*]] = cir.const #cir.int<24> : !s32i
6666
// CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr<!cir.ptr<!ty_Data>>, !cir.ptr<!ty_Data>
6767
// CIR: %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][0] {name = "value"} : !cir.ptr<!ty_Data> -> !cir.ptr<!s32i>
@@ -83,7 +83,7 @@ void loadWithThreadFence(DataPtr d) {
8383
// CIR-LABEL: @loadWithThreadFence
8484
// CIR: %[[DATA:.*]] = cir.alloca !cir.ptr<!ty_Data>, !cir.ptr<!cir.ptr<!ty_Data>>, ["d", init] {alignment = 8 : i64}
8585
// CIR: %[[ATOMIC_TEMP:.*]] = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["atomic-temp"] {alignment = 8 : i64}
86-
// CIR: cir.atomic.fence system seq_cst
86+
// CIR: cir.atomic.fence syncscope(system) seq_cst
8787
// CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr<!cir.ptr<!ty_Data>>, !cir.ptr<!ty_Data>
8888
// CIR: %[[DATA_VALUE:.*]] = cir.get_member %[[LOAD_DATA]][1] {name = "ptr"} : !cir.ptr<!ty_Data> -> !cir.ptr<!cir.ptr<!void>>
8989
// CIR: %[[CASTED_DATA_VALUE:.*]] = cir.cast(bitcast, %[[DATA_VALUE]] : !cir.ptr<!cir.ptr<!void>>), !cir.ptr<!u64i>
@@ -112,7 +112,7 @@ void loadWithSignalFence(DataPtr d) {
112112
// CIR-LABEL: @loadWithSignalFence
113113
// CIR: %[[DATA:.*]] = cir.alloca !cir.ptr<!ty_Data>, !cir.ptr<!cir.ptr<!ty_Data>>, ["d", init] {alignment = 8 : i64}
114114
// CIR: %[[ATOMIC_TEMP:.*]] = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["atomic-temp"] {alignment = 8 : i64}
115-
// CIR: cir.atomic.fence single_thread seq_cst
115+
// CIR: cir.atomic.fence syncscope(single_thread) seq_cst
116116
// CIR: %[[LOAD_DATA:.*]] = cir.load %[[DATA]] : !cir.ptr<!cir.ptr<!ty_Data>>, !cir.ptr<!ty_Data>
117117
// CIR: %[[DATA_PTR:.*]] = cir.get_member %[[LOAD_DATA]][1] {name = "ptr"} : !cir.ptr<!ty_Data> -> !cir.ptr<!cir.ptr<!void>>
118118
// CIR: %[[CASTED_DATA_PTR:.*]] = cir.cast(bitcast, %[[DATA_PTR]] : !cir.ptr<!cir.ptr<!void>>), !cir.ptr<!u64i>

0 commit comments

Comments
 (0)