// RUN: cir-opt %s --verify-roundtrip | FileCheck %s !s32i = !cir.int !u32i = !cir.int cir.func @atomic_xchg(%ptr: !cir.ptr, %val: !s32i) { // CHECK-LABEL: @atomic_xchg %0 = cir.atomic.xchg relaxed syncscope(system) %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.xchg relaxed syncscope(system) %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i %1 = cir.atomic.xchg consume syncscope(system) %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.xchg consume syncscope(system) %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i %2 = cir.atomic.xchg acquire syncscope(system) %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.xchg acquire syncscope(system) %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i %3 = cir.atomic.xchg release syncscope(system) %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.xchg release syncscope(system) %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i %4 = cir.atomic.xchg acq_rel syncscope(system) %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.xchg acq_rel syncscope(system) %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i %5 = cir.atomic.xchg seq_cst syncscope(system) %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.xchg seq_cst syncscope(system) %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i cir.return } cir.func @atomic_cmpxchg(%ptr: !cir.ptr, %expected: !s32i, %desired: !s32i) { // CHECK-LABEL: @atomic_cmpxchg %0, %1 = cir.atomic.cmpxchg success(relaxed) failure(relaxed) syncscope(system) %ptr, %expected, %desired : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) // CHECK: cir.atomic.cmpxchg success(relaxed) failure(relaxed) syncscope(system) %{{.+}}, %{{.+}}, %{{.+}} : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) %2, %3 = cir.atomic.cmpxchg weak success(relaxed) failure(relaxed) syncscope(system) %ptr, %expected, %desired : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) // CHECK: cir.atomic.cmpxchg weak success(relaxed) failure(relaxed) syncscope(system) %{{.+}}, %{{.+}}, %{{.+}} : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) %4, %5 = cir.atomic.cmpxchg success(seq_cst) failure(acquire) syncscope(system) %ptr, %expected, %desired : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) // CHECK: cir.atomic.cmpxchg success(seq_cst) failure(acquire) syncscope(system) %{{.+}}, %{{.+}}, %{{.+}} : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) %6, %7 = cir.atomic.cmpxchg weak success(seq_cst) failure(acquire) syncscope(system) %ptr, %expected, %desired : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) // CHECK: cir.atomic.cmpxchg weak success(seq_cst) failure(acquire) syncscope(system) %{{.+}}, %{{.+}}, %{{.+}} : (!cir.ptr, !s32i, !s32i) -> (!s32i, !cir.bool) cir.return } cir.func @atomic_fetch_uinc_wrap(%ptr: !cir.ptr, %val: !s32i) { // CHECK-LABEL: @atomic_fetch_uinc_wrap %0 = cir.atomic.fetch uinc_wrap seq_cst syncscope(system) fetch_first %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.fetch uinc_wrap seq_cst syncscope(system) fetch_first %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i cir.return } cir.func @atomic_fetch_udec_wrap(%ptr: !cir.ptr, %val: !s32i) { // CHECK-LABEL: @atomic_fetch_udec_wrap %0 = cir.atomic.fetch udec_wrap seq_cst syncscope(system) fetch_first %ptr, %val : (!cir.ptr, !s32i) -> !s32i // CHECK: cir.atomic.fetch udec_wrap seq_cst syncscope(system) fetch_first %{{.+}}, %{{.+}} : (!cir.ptr, !s32i) -> !s32i cir.return }