|
1 | 1 | // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
|
2 | 2 | // RUN: %clang_cc1 %s -emit-llvm -o - -triple=amdgcn-amd-amdhsa -ffreestanding \
|
3 |
| -// RUN: -fvisibility=hidden | FileCheck --check-prefix=AMDGCN %s |
| 3 | +// RUN: -fvisibility=hidden | FileCheck --check-prefixes=AMDGCN,AMDGCN-CL12 %s |
4 | 4 | // RUN: %clang_cc1 %s -emit-llvm -o - -triple=amdgcn-amd-amdhsa -ffreestanding \
|
5 |
| -// RUN: -cl-std=CL2.0 -fvisibility=hidden | FileCheck --check-prefix=AMDGCN %s |
| 5 | +// RUN: -cl-std=CL2.0 -fvisibility=hidden | FileCheck --check-prefixes=AMDGCN,AMDGCN-CL20 %s |
6 | 6 | // RUN: %clang_cc1 %s -emit-llvm -o - -triple=spirv64-unknown-unknown -ffreestanding \
|
7 | 7 | // RUN: -fvisibility=hidden | FileCheck --check-prefix=SPIRV %s
|
8 | 8 | // RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-unknown-linux-gnu -ffreestanding \
|
@@ -30,34 +30,62 @@ void fe1a() {
|
30 | 30 | __scoped_atomic_thread_fence(__ATOMIC_RELEASE, __MEMORY_SCOPE_WRKGRP);
|
31 | 31 | }
|
32 | 32 |
|
33 |
| -// AMDGCN-LABEL: define hidden void @fe1b( |
34 |
| -// AMDGCN-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] { |
35 |
| -// AMDGCN-NEXT: [[ENTRY:.*:]] |
36 |
| -// AMDGCN-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4, addrspace(5) |
37 |
| -// AMDGCN-NEXT: [[ORD_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ORD_ADDR]] to ptr |
38 |
| -// AMDGCN-NEXT: store i32 [[ORD]], ptr [[ORD_ADDR_ASCAST]], align 4 |
39 |
| -// AMDGCN-NEXT: [[TMP0:%.*]] = load i32, ptr [[ORD_ADDR_ASCAST]], align 4 |
40 |
| -// AMDGCN-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [ |
41 |
| -// AMDGCN-NEXT: i32 1, label %[[ACQUIRE:.*]] |
42 |
| -// AMDGCN-NEXT: i32 2, label %[[ACQUIRE]] |
43 |
| -// AMDGCN-NEXT: i32 3, label %[[RELEASE:.*]] |
44 |
| -// AMDGCN-NEXT: i32 4, label %[[ACQREL:.*]] |
45 |
| -// AMDGCN-NEXT: i32 5, label %[[SEQCST:.*]] |
46 |
| -// AMDGCN-NEXT: ] |
47 |
| -// AMDGCN: [[ATOMIC_SCOPE_CONTINUE]]: |
48 |
| -// AMDGCN-NEXT: ret void |
49 |
| -// AMDGCN: [[ACQUIRE]]: |
50 |
| -// AMDGCN-NEXT: fence syncscope("workgroup") acquire |
51 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
52 |
| -// AMDGCN: [[RELEASE]]: |
53 |
| -// AMDGCN-NEXT: fence syncscope("workgroup") release |
54 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
55 |
| -// AMDGCN: [[ACQREL]]: |
56 |
| -// AMDGCN-NEXT: fence syncscope("workgroup") acq_rel |
57 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
58 |
| -// AMDGCN: [[SEQCST]]: |
59 |
| -// AMDGCN-NEXT: fence syncscope("workgroup") seq_cst |
60 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 33 | +// AMDGCN-CL12-LABEL: define hidden void @fe1b( |
| 34 | +// AMDGCN-CL12-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] { |
| 35 | +// AMDGCN-CL12-NEXT: [[ENTRY:.*:]] |
| 36 | +// AMDGCN-CL12-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4, addrspace(5) |
| 37 | +// AMDGCN-CL12-NEXT: [[ORD_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ORD_ADDR]] to ptr |
| 38 | +// AMDGCN-CL12-NEXT: store i32 [[ORD]], ptr [[ORD_ADDR_ASCAST]], align 4 |
| 39 | +// AMDGCN-CL12-NEXT: [[TMP0:%.*]] = load i32, ptr [[ORD_ADDR_ASCAST]], align 4 |
| 40 | +// AMDGCN-CL12-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [ |
| 41 | +// AMDGCN-CL12-NEXT: i32 1, label %[[ACQUIRE:.*]] |
| 42 | +// AMDGCN-CL12-NEXT: i32 2, label %[[ACQUIRE]] |
| 43 | +// AMDGCN-CL12-NEXT: i32 3, label %[[RELEASE:.*]] |
| 44 | +// AMDGCN-CL12-NEXT: i32 4, label %[[ACQREL:.*]] |
| 45 | +// AMDGCN-CL12-NEXT: i32 5, label %[[SEQCST:.*]] |
| 46 | +// AMDGCN-CL12-NEXT: ] |
| 47 | +// AMDGCN-CL12: [[ATOMIC_SCOPE_CONTINUE]]: |
| 48 | +// AMDGCN-CL12-NEXT: ret void |
| 49 | +// AMDGCN-CL12: [[ACQUIRE]]: |
| 50 | +// AMDGCN-CL12-NEXT: fence syncscope("workgroup") acquire |
| 51 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 52 | +// AMDGCN-CL12: [[RELEASE]]: |
| 53 | +// AMDGCN-CL12-NEXT: fence syncscope("workgroup") release |
| 54 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 55 | +// AMDGCN-CL12: [[ACQREL]]: |
| 56 | +// AMDGCN-CL12-NEXT: fence syncscope("workgroup") acq_rel |
| 57 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 58 | +// AMDGCN-CL12: [[SEQCST]]: |
| 59 | +// AMDGCN-CL12-NEXT: fence syncscope("workgroup") seq_cst |
| 60 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 61 | +// |
| 62 | +// AMDGCN-CL20-LABEL: define hidden void @fe1b( |
| 63 | +// AMDGCN-CL20-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] { |
| 64 | +// AMDGCN-CL20-NEXT: [[ENTRY:.*:]] |
| 65 | +// AMDGCN-CL20-NEXT: [[ORD_ADDR:%.*]] = alloca i32, align 4, addrspace(5) |
| 66 | +// AMDGCN-CL20-NEXT: store i32 [[ORD]], ptr addrspace(5) [[ORD_ADDR]], align 4 |
| 67 | +// AMDGCN-CL20-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(5) [[ORD_ADDR]], align 4 |
| 68 | +// AMDGCN-CL20-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [ |
| 69 | +// AMDGCN-CL20-NEXT: i32 1, label %[[ACQUIRE:.*]] |
| 70 | +// AMDGCN-CL20-NEXT: i32 2, label %[[ACQUIRE]] |
| 71 | +// AMDGCN-CL20-NEXT: i32 3, label %[[RELEASE:.*]] |
| 72 | +// AMDGCN-CL20-NEXT: i32 4, label %[[ACQREL:.*]] |
| 73 | +// AMDGCN-CL20-NEXT: i32 5, label %[[SEQCST:.*]] |
| 74 | +// AMDGCN-CL20-NEXT: ] |
| 75 | +// AMDGCN-CL20: [[ATOMIC_SCOPE_CONTINUE]]: |
| 76 | +// AMDGCN-CL20-NEXT: ret void |
| 77 | +// AMDGCN-CL20: [[ACQUIRE]]: |
| 78 | +// AMDGCN-CL20-NEXT: fence syncscope("workgroup") acquire |
| 79 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 80 | +// AMDGCN-CL20: [[RELEASE]]: |
| 81 | +// AMDGCN-CL20-NEXT: fence syncscope("workgroup") release |
| 82 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 83 | +// AMDGCN-CL20: [[ACQREL]]: |
| 84 | +// AMDGCN-CL20-NEXT: fence syncscope("workgroup") acq_rel |
| 85 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 86 | +// AMDGCN-CL20: [[SEQCST]]: |
| 87 | +// AMDGCN-CL20-NEXT: fence syncscope("workgroup") seq_cst |
| 88 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
61 | 89 | //
|
62 | 90 | // SPIRV-LABEL: define hidden spir_func void @fe1b(
|
63 | 91 | // SPIRV-SAME: i32 noundef [[ORD:%.*]]) #[[ATTR0]] {
|
@@ -119,37 +147,68 @@ void fe1b(int ord) {
|
119 | 147 | __scoped_atomic_thread_fence(ord, __MEMORY_SCOPE_WRKGRP);
|
120 | 148 | }
|
121 | 149 |
|
122 |
| -// AMDGCN-LABEL: define hidden void @fe1c( |
123 |
| -// AMDGCN-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] { |
124 |
| -// AMDGCN-NEXT: [[ENTRY:.*:]] |
125 |
| -// AMDGCN-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4, addrspace(5) |
126 |
| -// AMDGCN-NEXT: [[SCOPE_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[SCOPE_ADDR]] to ptr |
127 |
| -// AMDGCN-NEXT: store i32 [[SCOPE]], ptr [[SCOPE_ADDR_ASCAST]], align 4 |
128 |
| -// AMDGCN-NEXT: [[TMP0:%.*]] = load i32, ptr [[SCOPE_ADDR_ASCAST]], align 4 |
129 |
| -// AMDGCN-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [ |
130 |
| -// AMDGCN-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]] |
131 |
| -// AMDGCN-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]] |
132 |
| -// AMDGCN-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]] |
133 |
| -// AMDGCN-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]] |
134 |
| -// AMDGCN-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]] |
135 |
| -// AMDGCN-NEXT: ] |
136 |
| -// AMDGCN: [[ATOMIC_SCOPE_CONTINUE]]: |
137 |
| -// AMDGCN-NEXT: ret void |
138 |
| -// AMDGCN: [[DEVICE_SCOPE]]: |
139 |
| -// AMDGCN-NEXT: fence syncscope("agent") release |
140 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
141 |
| -// AMDGCN: [[SYSTEM_SCOPE]]: |
142 |
| -// AMDGCN-NEXT: fence release |
143 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
144 |
| -// AMDGCN: [[WORKGROUP_SCOPE]]: |
145 |
| -// AMDGCN-NEXT: fence syncscope("workgroup") release |
146 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
147 |
| -// AMDGCN: [[WAVEFRONT_SCOPE]]: |
148 |
| -// AMDGCN-NEXT: fence syncscope("wavefront") release |
149 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
150 |
| -// AMDGCN: [[SINGLE_SCOPE]]: |
151 |
| -// AMDGCN-NEXT: fence syncscope("singlethread") release |
152 |
| -// AMDGCN-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 150 | +// AMDGCN-CL12-LABEL: define hidden void @fe1c( |
| 151 | +// AMDGCN-CL12-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] { |
| 152 | +// AMDGCN-CL12-NEXT: [[ENTRY:.*:]] |
| 153 | +// AMDGCN-CL12-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4, addrspace(5) |
| 154 | +// AMDGCN-CL12-NEXT: [[SCOPE_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[SCOPE_ADDR]] to ptr |
| 155 | +// AMDGCN-CL12-NEXT: store i32 [[SCOPE]], ptr [[SCOPE_ADDR_ASCAST]], align 4 |
| 156 | +// AMDGCN-CL12-NEXT: [[TMP0:%.*]] = load i32, ptr [[SCOPE_ADDR_ASCAST]], align 4 |
| 157 | +// AMDGCN-CL12-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [ |
| 158 | +// AMDGCN-CL12-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]] |
| 159 | +// AMDGCN-CL12-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]] |
| 160 | +// AMDGCN-CL12-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]] |
| 161 | +// AMDGCN-CL12-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]] |
| 162 | +// AMDGCN-CL12-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]] |
| 163 | +// AMDGCN-CL12-NEXT: ] |
| 164 | +// AMDGCN-CL12: [[ATOMIC_SCOPE_CONTINUE]]: |
| 165 | +// AMDGCN-CL12-NEXT: ret void |
| 166 | +// AMDGCN-CL12: [[DEVICE_SCOPE]]: |
| 167 | +// AMDGCN-CL12-NEXT: fence syncscope("agent") release |
| 168 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 169 | +// AMDGCN-CL12: [[SYSTEM_SCOPE]]: |
| 170 | +// AMDGCN-CL12-NEXT: fence release |
| 171 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 172 | +// AMDGCN-CL12: [[WORKGROUP_SCOPE]]: |
| 173 | +// AMDGCN-CL12-NEXT: fence syncscope("workgroup") release |
| 174 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 175 | +// AMDGCN-CL12: [[WAVEFRONT_SCOPE]]: |
| 176 | +// AMDGCN-CL12-NEXT: fence syncscope("wavefront") release |
| 177 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 178 | +// AMDGCN-CL12: [[SINGLE_SCOPE]]: |
| 179 | +// AMDGCN-CL12-NEXT: fence syncscope("singlethread") release |
| 180 | +// AMDGCN-CL12-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 181 | +// |
| 182 | +// AMDGCN-CL20-LABEL: define hidden void @fe1c( |
| 183 | +// AMDGCN-CL20-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] { |
| 184 | +// AMDGCN-CL20-NEXT: [[ENTRY:.*:]] |
| 185 | +// AMDGCN-CL20-NEXT: [[SCOPE_ADDR:%.*]] = alloca i32, align 4, addrspace(5) |
| 186 | +// AMDGCN-CL20-NEXT: store i32 [[SCOPE]], ptr addrspace(5) [[SCOPE_ADDR]], align 4 |
| 187 | +// AMDGCN-CL20-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(5) [[SCOPE_ADDR]], align 4 |
| 188 | +// AMDGCN-CL20-NEXT: switch i32 [[TMP0]], label %[[ATOMIC_SCOPE_CONTINUE:.*]] [ |
| 189 | +// AMDGCN-CL20-NEXT: i32 1, label %[[DEVICE_SCOPE:.*]] |
| 190 | +// AMDGCN-CL20-NEXT: i32 0, label %[[SYSTEM_SCOPE:.*]] |
| 191 | +// AMDGCN-CL20-NEXT: i32 2, label %[[WORKGROUP_SCOPE:.*]] |
| 192 | +// AMDGCN-CL20-NEXT: i32 3, label %[[WAVEFRONT_SCOPE:.*]] |
| 193 | +// AMDGCN-CL20-NEXT: i32 4, label %[[SINGLE_SCOPE:.*]] |
| 194 | +// AMDGCN-CL20-NEXT: ] |
| 195 | +// AMDGCN-CL20: [[ATOMIC_SCOPE_CONTINUE]]: |
| 196 | +// AMDGCN-CL20-NEXT: ret void |
| 197 | +// AMDGCN-CL20: [[DEVICE_SCOPE]]: |
| 198 | +// AMDGCN-CL20-NEXT: fence syncscope("agent") release |
| 199 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 200 | +// AMDGCN-CL20: [[SYSTEM_SCOPE]]: |
| 201 | +// AMDGCN-CL20-NEXT: fence release |
| 202 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 203 | +// AMDGCN-CL20: [[WORKGROUP_SCOPE]]: |
| 204 | +// AMDGCN-CL20-NEXT: fence syncscope("workgroup") release |
| 205 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 206 | +// AMDGCN-CL20: [[WAVEFRONT_SCOPE]]: |
| 207 | +// AMDGCN-CL20-NEXT: fence syncscope("wavefront") release |
| 208 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
| 209 | +// AMDGCN-CL20: [[SINGLE_SCOPE]]: |
| 210 | +// AMDGCN-CL20-NEXT: fence syncscope("singlethread") release |
| 211 | +// AMDGCN-CL20-NEXT: br label %[[ATOMIC_SCOPE_CONTINUE]] |
153 | 212 | //
|
154 | 213 | // SPIRV-LABEL: define hidden spir_func void @fe1c(
|
155 | 214 | // SPIRV-SAME: i32 noundef [[SCOPE:%.*]]) #[[ATTR0]] {
|
|
0 commit comments