Files
TheRock/compiler/amd-llvm/clang/test/CodeGen/scoped-fence-ops.c
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

335 lines
15 KiB
C

// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=amdgcn-amd-amdhsa -ffreestanding \
// RUN: -fvisibility=hidden | FileCheck --check-prefix=AMDGCN %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=amdgcn-amd-amdhsa -ffreestanding \
// RUN: -cl-std=CL2.0 -fvisibility=hidden | FileCheck --check-prefix=AMDGCN %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=spirv64-unknown-unknown -ffreestanding \
// RUN: -fvisibility=hidden | FileCheck --check-prefix=SPIRV %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-unknown-linux-gnu -ffreestanding \
// RUN: -fvisibility=hidden | FileCheck --check-prefix=X86_64 %s
// AMDGCN-LABEL: define hidden void @fe1a(
// AMDGCN-SAME: ) #[[ATTR0:[0-9]+]] {
// AMDGCN-NEXT: [[ENTRY:.*:]]
// AMDGCN-NEXT: fence syncscope("workgroup") release
// AMDGCN-NEXT: ret void
//
// SPIRV-LABEL: define hidden spir_func void @fe1a(
// SPIRV-SAME: ) #[[ATTR0:[0-9]+]] {
// SPIRV-NEXT: [[ENTRY:.*:]]
// SPIRV-NEXT: fence syncscope("workgroup") release
// SPIRV-NEXT: ret void
//
// X86_64-LABEL: define hidden void @fe1a(
// X86_64-SAME: ) #[[ATTR0:[0-9]+]] {
// X86_64-NEXT: [[ENTRY:.*:]]
// X86_64-NEXT: fence release
// X86_64-NEXT: ret void
//
void fe1a() {
__scoped_atomic_thread_fence(__ATOMIC_RELEASE, __MEMORY_SCOPE_WRKGRP);
}
// AMDGCN_CL_DEF-LABEL: define hidden void @fe1b(
// AMDGCN_CL_DEF-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] {
// AMDGCN_CL_DEF-NEXT: [[ENTRY:.*:]]
// AMDGCN_CL_DEF-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
// AMDGCN_CL_DEF-NEXT: [[ORD_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ORD_ADDR]] to ptr
// AMDGCN_CL_DEF-NEXT: store i32 [[ORD]], ptr [[ORD_ADDR_ASCAST]], align 4
// AMDGCN_CL_DEF-NEXT: [[TMP0:%.*]] = load i32, ptr [[ORD_ADDR_ASCAST]], align 4
// AMDGCN_CL_DEF-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// AMDGCN_CL_DEF-NEXT: i32 1, label %[[ACQUIRE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 2, label %[[ACQUIRE]]
// AMDGCN_CL_DEF-NEXT: i32 3, label %[[RELEASE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 4, label %[[ACQREL:.*]]
// AMDGCN_CL_DEF-NEXT: i32 5, label %[[SEQCST:.*]]
// AMDGCN_CL_DEF-NEXT: ]
// AMDGCN_CL_DEF: [[ATOMIC_SCOPE_CONTINUE]]:
// AMDGCN_CL_DEF-NEXT: ret void
// AMDGCN_CL_DEF: [[ACQUIRE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("workgroup") acquire
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[RELEASE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("workgroup") release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[ACQREL]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("workgroup") acq_rel
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[SEQCST]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("workgroup") seq_cst
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
// AMDGCN_CL_20-LABEL: define hidden void @fe1b(
// AMDGCN_CL_20-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] {
// AMDGCN_CL_20-NEXT: [[ENTRY:.*:]]
// AMDGCN_CL_20-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
// AMDGCN_CL_20-NEXT: store i32 [[ORD]], ptr addrspace(5) [[ORD_ADDR]], align 4
// AMDGCN_CL_20-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(5) [[ORD_ADDR]], align 4
// AMDGCN_CL_20-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// AMDGCN_CL_20-NEXT: i32 1, label %[[ACQUIRE:.*]]
// AMDGCN_CL_20-NEXT: i32 2, label %[[ACQUIRE]]
// AMDGCN_CL_20-NEXT: i32 3, label %[[RELEASE:.*]]
// AMDGCN_CL_20-NEXT: i32 4, label %[[ACQREL:.*]]
// AMDGCN_CL_20-NEXT: i32 5, label %[[SEQCST:.*]]
// AMDGCN_CL_20-NEXT: ]
// AMDGCN_CL_20: [[ATOMIC_SCOPE_CONTINUE]]:
// AMDGCN_CL_20-NEXT: ret void
// AMDGCN_CL_20: [[ACQUIRE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("workgroup") acquire
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[RELEASE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("workgroup") release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[ACQREL]]:
// AMDGCN_CL_20-NEXT: fence syncscope("workgroup") acq_rel
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[SEQCST]]:
// AMDGCN_CL_20-NEXT: fence syncscope("workgroup") seq_cst
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
// SPIRV-LABEL: define hidden spir_func void @fe1b(
// SPIRV-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] {
// SPIRV-NEXT: [[ENTRY:.*:]]
// SPIRV-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4
// SPIRV-NEXT: store i32 [[ORD]], ptr [[ORD_ADDR]], align 4
// SPIRV-NEXT: [[TMP0:%.*]] = load i32, ptr [[ORD_ADDR]], align 4
// SPIRV-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// SPIRV-NEXT: i32 1, label %[[ACQUIRE:.*]]
// SPIRV-NEXT: i32 2, label %[[ACQUIRE]]
// SPIRV-NEXT: i32 3, label %[[RELEASE:.*]]
// SPIRV-NEXT: i32 4, label %[[ACQREL:.*]]
// SPIRV-NEXT: i32 5, label %[[SEQCST:.*]]
// SPIRV-NEXT: ]
// SPIRV: [[ATOMIC_SCOPE_CONTINUE]]:
// SPIRV-NEXT: ret void
// SPIRV: [[ACQUIRE]]:
// SPIRV-NEXT: fence syncscope("workgroup") acquire
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[RELEASE]]:
// SPIRV-NEXT: fence syncscope("workgroup") release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[ACQREL]]:
// SPIRV-NEXT: fence syncscope("workgroup") acq_rel
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[SEQCST]]:
// SPIRV-NEXT: fence syncscope("workgroup") seq_cst
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
// X86_64-LABEL: define hidden void @fe1b(
// X86_64-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] {
// X86_64-NEXT: [[ENTRY:.*:]]
// X86_64-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4
// X86_64-NEXT: store i32 [[ORD]], ptr [[ORD_ADDR]], align 4
// X86_64-NEXT: [[TMP0:%.*]] = load i32, ptr [[ORD_ADDR]], align 4
// X86_64-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// X86_64-NEXT: i32 1, label %[[ACQUIRE:.*]]
// X86_64-NEXT: i32 2, label %[[ACQUIRE]]
// X86_64-NEXT: i32 3, label %[[RELEASE:.*]]
// X86_64-NEXT: i32 4, label %[[ACQREL:.*]]
// X86_64-NEXT: i32 5, label %[[SEQCST:.*]]
// X86_64-NEXT: ]
// X86_64: [[ATOMIC_SCOPE_CONTINUE]]:
// X86_64-NEXT: ret void
// X86_64: [[ACQUIRE]]:
// X86_64-NEXT: fence acquire
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[RELEASE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[ACQREL]]:
// X86_64-NEXT: fence acq_rel
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[SEQCST]]:
// X86_64-NEXT: fence seq_cst
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
void fe1b(int ord) {
__scoped_atomic_thread_fence(ord, __MEMORY_SCOPE_WRKGRP);
}
// AMDGCN_CL_DEF-LABEL: define hidden void @fe1c(
// AMDGCN_CL_DEF-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] {
// AMDGCN_CL_DEF-NEXT: [[ENTRY:.*:]]
// AMDGCN_CL_DEF-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
// AMDGCN_CL_DEF-NEXT: [[SCOPE_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[SCOPE_ADDR]] to ptr
// AMDGCN_CL_DEF-NEXT: store i32 [[SCOPE]], ptr [[SCOPE_ADDR_ASCAST]], align 4
// AMDGCN_CL_DEF-NEXT: [[TMP0:%.*]] = load i32, ptr [[SCOPE_ADDR_ASCAST]], align 4
// AMDGCN_CL_DEF-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// AMDGCN_CL_DEF-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 5, label %[[CLUSTER_SCOPE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]]
// AMDGCN_CL_DEF-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]]
// AMDGCN_CL_DEF-NEXT: ]
// AMDGCN_CL_DEF: [[ATOMIC_SCOPE_CONTINUE]]:
// AMDGCN_CL_DEF-NEXT: ret void
// AMDGCN_CL_DEF: [[SYSTEM_SCOPE]]:
// AMDGCN_CL_DEF-NEXT: fence release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[DEVICE_SCOPE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("agent") release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[WORKGROUP_SCOPE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("workgroup") release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[CLUSTER_SCOPE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("cluster") release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[WAVEFRONT_SCOPE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("wavefront") release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_DEF: [[SINGLE_SCOPE]]:
// AMDGCN_CL_DEF-NEXT: fence syncscope("singlethread") release
// AMDGCN_CL_DEF-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
// AMDGCN_CL_20-LABEL: define hidden void @fe1c(
// AMDGCN_CL_20-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] {
// AMDGCN_CL_20-NEXT: [[ENTRY:.*:]]
// AMDGCN_CL_20-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
// AMDGCN_CL_20-NEXT: store i32 [[SCOPE]], ptr addrspace(5) [[SCOPE_ADDR]], align 4
// AMDGCN_CL_20-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(5) [[SCOPE_ADDR]], align 4
// AMDGCN_CL_20-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// AMDGCN_CL_20-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]]
// AMDGCN_CL_20-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]]
// AMDGCN_CL_20-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]]
// AMDGCN_CL_20-NEXT: i32 5, label %[[CLUSTER_SCOPE:.*]]
// AMDGCN_CL_20-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]]
// AMDGCN_CL_20-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]]
// AMDGCN_CL_20-NEXT: ]
// AMDGCN_CL_20: [[ATOMIC_SCOPE_CONTINUE]]:
// AMDGCN_CL_20-NEXT: ret void
// AMDGCN_CL_20: [[SYSTEM_SCOPE]]:
// AMDGCN_CL_20-NEXT: fence release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[DEVICE_SCOPE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("agent") release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[WORKGROUP_SCOPE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("workgroup") release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[CLUSTER_SCOPE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("cluster") release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[WAVEFRONT_SCOPE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("wavefront") release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// AMDGCN_CL_20: [[SINGLE_SCOPE]]:
// AMDGCN_CL_20-NEXT: fence syncscope("singlethread") release
// AMDGCN_CL_20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
// SPIRV-LABEL: define hidden spir_func void @fe1c(
// SPIRV-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] {
// SPIRV-NEXT: [[ENTRY:.*:]]
// SPIRV-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4
// SPIRV-NEXT: store i32 [[SCOPE]], ptr [[SCOPE_ADDR]], align 4
// SPIRV-NEXT: [[TMP0:%.*]] = load i32, ptr [[SCOPE_ADDR]], align 4
// SPIRV-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// SPIRV-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]]
// SPIRV-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]]
// SPIRV-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]]
// SPIRV-NEXT: i32 5, label %[[CLUSTER_SCOPE:.*]]
// SPIRV-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]]
// SPIRV-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]]
// SPIRV-NEXT: ]
// SPIRV: [[ATOMIC_SCOPE_CONTINUE]]:
// SPIRV-NEXT: ret void
// SPIRV: [[SYSTEM_SCOPE]]:
// SPIRV-NEXT: fence release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[DEVICE_SCOPE]]:
// SPIRV-NEXT: fence syncscope("device") release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[WORKGROUP_SCOPE]]:
// SPIRV-NEXT: fence syncscope("workgroup") release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[CLUSTER_SCOPE]]:
// SPIRV-NEXT: fence syncscope("workgroup") release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[WAVEFRONT_SCOPE]]:
// SPIRV-NEXT: fence syncscope("subgroup") release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// SPIRV: [[SINGLE_SCOPE]]:
// SPIRV-NEXT: fence syncscope("singlethread") release
// SPIRV-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
// X86_64-LABEL: define hidden void @fe1c(
// X86_64-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] {
// X86_64-NEXT: [[ENTRY:.*:]]
// X86_64-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4
// X86_64-NEXT: store i32 [[SCOPE]], ptr [[SCOPE_ADDR]], align 4
// X86_64-NEXT: [[TMP0:%.*]] = load i32, ptr [[SCOPE_ADDR]], align 4
// X86_64-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [
// X86_64-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]]
// X86_64-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]]
// X86_64-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]]
// X86_64-NEXT: i32 5, label %[[CLUSTER_SCOPE:.*]]
// X86_64-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]]
// X86_64-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]]
// X86_64-NEXT: ]
// X86_64: [[ATOMIC_SCOPE_CONTINUE]]:
// X86_64-NEXT: ret void
// X86_64: [[SYSTEM_SCOPE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[DEVICE_SCOPE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[WORKGROUP_SCOPE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[CLUSTER_SCOPE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[WAVEFRONT_SCOPE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
// X86_64: [[SINGLE_SCOPE]]:
// X86_64-NEXT: fence release
// X86_64-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]]
//
void fe1c(int scope) {
__scoped_atomic_thread_fence(__ATOMIC_RELEASE, scope);
}
// AMDGCN-LABEL: define hidden void @fe2a(
// AMDGCN-SAME: ) #[[ATTR0]] {
// AMDGCN-NEXT: [[ENTRY:.*:]]
// AMDGCN-NEXT: ret void
//
// SPIRV-LABEL: define hidden spir_func void @fe2a(
// SPIRV-SAME: ) #[[ATTR0]] {
// SPIRV-NEXT: [[ENTRY:.*:]]
// SPIRV-NEXT: ret void
//
// X86_64-LABEL: define hidden void @fe2a(
// X86_64-SAME: ) #[[ATTR0]] {
// X86_64-NEXT: [[ENTRY:.*:]]
// X86_64-NEXT: ret void
//
void fe2a() {
__scoped_atomic_thread_fence(999, __MEMORY_SCOPE_SYSTEM);
}
// AMDGCN-LABEL: define hidden void @fe2b(
// AMDGCN-SAME: ) #[[ATTR0]] {
// AMDGCN-NEXT: [[ENTRY:.*:]]
// AMDGCN-NEXT: fence release
// AMDGCN-NEXT: ret void
//
// SPIRV-LABEL: define hidden spir_func void @fe2b(
// SPIRV-SAME: ) #[[ATTR0]] {
// SPIRV-NEXT: [[ENTRY:.*:]]
// SPIRV-NEXT: fence release
// SPIRV-NEXT: ret void
//
// X86_64-LABEL: define hidden void @fe2b(
// X86_64-SAME: ) #[[ATTR0]] {
// X86_64-NEXT: [[ENTRY:.*:]]
// X86_64-NEXT: fence release
// X86_64-NEXT: ret void
//
void fe2b() {
__scoped_atomic_thread_fence(__ATOMIC_RELEASE, 999);
}