|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2 |
| -; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -passes=atomic-expand %s | FileCheck %s |
3 |
| -; RUN: opt -mtriple=r600-mesa-mesa3d -S -passes=atomic-expand %s | FileCheck %s |
| 2 | +; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -passes=atomic-expand %s | FileCheck -check-prefixes=CHECK,GCN %s |
| 3 | +; RUN: opt -mtriple=r600-mesa-mesa3d -S -passes=atomic-expand %s | FileCheck -check-prefixes=CHECK,R600 %s |
4 | 4 |
|
5 | 5 | target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5"
|
6 | 6 |
|
@@ -163,6 +163,53 @@ define i16 @test_atomicrmw_and_i16_global_agent(ptr addrspace(1) %ptr, i16 %valu
|
163 | 163 | ret i16 %res
|
164 | 164 | }
|
165 | 165 |
|
| 166 | +define i16 @test_atomicrmw_and_i16_global_agent_align4(ptr addrspace(1) %ptr, i16 %value) { |
| 167 | +; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4( |
| 168 | +; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32 |
| 169 | +; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536 |
| 170 | +; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4 |
| 171 | +; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16 |
| 172 | +; CHECK-NEXT: ret i16 [[EXTRACTED]] |
| 173 | +; |
| 174 | + %res = atomicrmw and ptr addrspace(1) %ptr, i16 %value syncscope("agent") seq_cst, align 4 |
| 175 | + ret i16 %res |
| 176 | +} |
| 177 | + |
| 178 | +; Preserve unknown metadata |
| 179 | +define i16 @test_atomicrmw_and_i16_global_agent_preserve_md(ptr addrspace(1) %ptr, i16 %value) { |
| 180 | +; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_preserve_md( |
| 181 | +; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4) |
| 182 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64 |
| 183 | +; CHECK-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3 |
| 184 | +; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3 |
| 185 | +; CHECK-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32 |
| 186 | +; CHECK-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]] |
| 187 | +; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1 |
| 188 | +; CHECK-NEXT: [[TMP3:%.*]] = zext i16 [[VALUE:%.*]] to i32 |
| 189 | +; CHECK-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]] |
| 190 | +; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]] |
| 191 | +; CHECK-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4 |
| 192 | +; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]] |
| 193 | +; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16 |
| 194 | +; CHECK-NEXT: ret i16 [[EXTRACTED]] |
| 195 | +; |
| 196 | + %res = atomicrmw and ptr addrspace(1) %ptr, i16 %value syncscope("agent") seq_cst, !noundef !0, !some.unknown.md !0 |
| 197 | + ret i16 %res |
| 198 | +} |
| 199 | + |
| 200 | +; Preserve unknown metadata |
| 201 | +define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_md(ptr addrspace(1) %ptr, i16 %value) { |
| 202 | +; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_md( |
| 203 | +; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32 |
| 204 | +; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536 |
| 205 | +; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4 |
| 206 | +; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16 |
| 207 | +; CHECK-NEXT: ret i16 [[EXTRACTED]] |
| 208 | +; |
| 209 | + %res = atomicrmw and ptr addrspace(1) %ptr, i16 %value syncscope("agent") seq_cst, align 4, !noundef !0, !some.unknown.md !0 |
| 210 | + ret i16 %res |
| 211 | +} |
| 212 | + |
166 | 213 | define i16 @test_atomicrmw_nand_i16_global_agent(ptr addrspace(1) %ptr, i16 %value) {
|
167 | 214 | ; CHECK-LABEL: @test_atomicrmw_nand_i16_global_agent(
|
168 | 215 | ; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)
|
@@ -1064,3 +1111,8 @@ define bfloat @test_atomicrmw_xchg_bf16_global_agent_align4(ptr addrspace(1) %pt
|
1064 | 1111 | %res = atomicrmw xchg ptr addrspace(1) %ptr, bfloat %value syncscope("agent") seq_cst, align 4
|
1065 | 1112 | ret bfloat %res
|
1066 | 1113 | }
|
| 1114 | + |
| 1115 | +!0 = !{} |
| 1116 | +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: |
| 1117 | +; GCN: {{.*}} |
| 1118 | +; R600: {{.*}} |
0 commit comments