| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu9.00-amd-amdhsa < %s | FileCheck --check-prefixes=CHECK,DAGISEL %s |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu9.00-amd-amdhsa < %s | FileCheck --check-prefixes=CHECK,GISEL %s |
| |
| ; The nonnull flag on addrspacecast allows the target to skip the null check |
| ; that maps a source null pointer to the destination null pointer. |
| |
| define void @local_to_flat(ptr addrspace(3) %ptr) { |
| ; CHECK-LABEL: local_to_flat: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: s_mov_b64 s[4:5], src_shared_base |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s5 |
| ; CHECK-NEXT: v_mov_b32_e32 v2, 7 |
| ; CHECK-NEXT: flat_store_dword v[0:1], v2 |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] |
| %1 = addrspacecast nonnull ptr addrspace(3) %ptr to ptr |
| store volatile i32 7, ptr %1, align 4 |
| ret void |
| } |
| |
| define void @private_to_flat(ptr addrspace(5) %ptr) { |
| ; CHECK-LABEL: private_to_flat: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s5 |
| ; CHECK-NEXT: v_mov_b32_e32 v2, 7 |
| ; CHECK-NEXT: flat_store_dword v[0:1], v2 |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] |
| %1 = addrspacecast nonnull ptr addrspace(5) %ptr to ptr |
| store volatile i32 7, ptr %1, align 4 |
| ret void |
| } |
| |
| define void @flat_to_local(ptr %ptr) { |
| ; CHECK-LABEL: flat_to_local: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: v_mov_b32_e32 v1, 7 |
| ; CHECK-NEXT: ds_write_b32 v0, v1 |
| ; CHECK-NEXT: s_waitcnt lgkmcnt(0) |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] |
| %1 = addrspacecast nonnull ptr %ptr to ptr addrspace(3) |
| store volatile i32 7, ptr addrspace(3) %1, align 4 |
| ret void |
| } |
| |
| define void @flat_to_private(ptr %ptr) { |
| ; CHECK-LABEL: flat_to_private: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: v_mov_b32_e32 v1, 7 |
| ; CHECK-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] |
| %1 = addrspacecast nonnull ptr %ptr to ptr addrspace(5) |
| store volatile i32 7, ptr addrspace(5) %1, align 4 |
| ret void |
| } |
| |
| ; The nonnull flag must survive scalarization of a vector addrspacecast, so no |
| ; per-element null check is emitted. |
| define <2 x ptr> @local_to_flat_vector(<2 x ptr addrspace(3)> %ptr) { |
| ; CHECK-LABEL: local_to_flat_vector: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: s_mov_b64 s[4:5], src_shared_base |
| ; CHECK-NEXT: v_mov_b32_e32 v2, v1 |
| ; CHECK-NEXT: v_mov_b32_e32 v1, s5 |
| ; CHECK-NEXT: v_mov_b32_e32 v3, s5 |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] |
| %1 = addrspacecast nonnull <2 x ptr addrspace(3)> %ptr to <2 x ptr> |
| ret <2 x ptr> %1 |
| } |
| |
| ; The nonnull flag must also survive vector type-legalization that splits the |
| ; addrspacecast (v32 splits repeatedly). |
| define <32 x ptr> @local_to_flat_vector_split(<32 x ptr addrspace(3)> %ptr) { |
| ; DAGISEL-LABEL: local_to_flat_vector_split: |
| ; DAGISEL: ; %bb.0: |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; DAGISEL-NEXT: buffer_store_dword v30, v0, s[0:3], 0 offen offset:232 |
| ; DAGISEL-NEXT: buffer_store_dword v29, v0, s[0:3], 0 offen offset:224 |
| ; DAGISEL-NEXT: buffer_store_dword v28, v0, s[0:3], 0 offen offset:216 |
| ; DAGISEL-NEXT: buffer_store_dword v27, v0, s[0:3], 0 offen offset:208 |
| ; DAGISEL-NEXT: buffer_store_dword v26, v0, s[0:3], 0 offen offset:200 |
| ; DAGISEL-NEXT: buffer_load_dword v26, off, s[0:3], s32 offset:4 |
| ; DAGISEL-NEXT: s_nop 0 |
| ; DAGISEL-NEXT: buffer_load_dword v27, off, s[0:3], s32 |
| ; DAGISEL-NEXT: s_mov_b64 s[4:5], src_shared_base |
| ; DAGISEL-NEXT: buffer_store_dword v25, v0, s[0:3], 0 offen offset:192 |
| ; DAGISEL-NEXT: buffer_store_dword v24, v0, s[0:3], 0 offen offset:184 |
| ; DAGISEL-NEXT: buffer_store_dword v23, v0, s[0:3], 0 offen offset:176 |
| ; DAGISEL-NEXT: buffer_store_dword v22, v0, s[0:3], 0 offen offset:168 |
| ; DAGISEL-NEXT: buffer_store_dword v21, v0, s[0:3], 0 offen offset:160 |
| ; DAGISEL-NEXT: buffer_store_dword v20, v0, s[0:3], 0 offen offset:152 |
| ; DAGISEL-NEXT: buffer_store_dword v19, v0, s[0:3], 0 offen offset:144 |
| ; DAGISEL-NEXT: buffer_store_dword v18, v0, s[0:3], 0 offen offset:136 |
| ; DAGISEL-NEXT: buffer_store_dword v17, v0, s[0:3], 0 offen offset:128 |
| ; DAGISEL-NEXT: buffer_store_dword v16, v0, s[0:3], 0 offen offset:120 |
| ; DAGISEL-NEXT: buffer_store_dword v15, v0, s[0:3], 0 offen offset:112 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:104 |
| ; DAGISEL-NEXT: v_mov_b32_e32 v14, s5 |
| ; DAGISEL-NEXT: buffer_store_dword v13, v0, s[0:3], 0 offen offset:96 |
| ; DAGISEL-NEXT: buffer_store_dword v12, v0, s[0:3], 0 offen offset:88 |
| ; DAGISEL-NEXT: buffer_store_dword v11, v0, s[0:3], 0 offen offset:80 |
| ; DAGISEL-NEXT: buffer_store_dword v10, v0, s[0:3], 0 offen offset:72 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:252 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:244 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:236 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:228 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:220 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:212 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:204 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:196 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:188 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:180 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:172 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:164 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:156 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:148 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:140 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:132 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:124 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:116 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:108 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:100 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:92 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:84 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:76 |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(40) |
| ; DAGISEL-NEXT: buffer_store_dword v26, v0, s[0:3], 0 offen offset:248 |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(40) |
| ; DAGISEL-NEXT: buffer_store_dword v27, v0, s[0:3], 0 offen offset:240 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:68 |
| ; DAGISEL-NEXT: buffer_store_dword v9, v0, s[0:3], 0 offen offset:64 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:60 |
| ; DAGISEL-NEXT: buffer_store_dword v8, v0, s[0:3], 0 offen offset:56 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:52 |
| ; DAGISEL-NEXT: buffer_store_dword v7, v0, s[0:3], 0 offen offset:48 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:44 |
| ; DAGISEL-NEXT: buffer_store_dword v6, v0, s[0:3], 0 offen offset:40 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:36 |
| ; DAGISEL-NEXT: buffer_store_dword v5, v0, s[0:3], 0 offen offset:32 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:28 |
| ; DAGISEL-NEXT: buffer_store_dword v4, v0, s[0:3], 0 offen offset:24 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:20 |
| ; DAGISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:16 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:12 |
| ; DAGISEL-NEXT: buffer_store_dword v2, v0, s[0:3], 0 offen offset:8 |
| ; DAGISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:4 |
| ; DAGISEL-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(0) |
| ; DAGISEL-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GISEL-LABEL: local_to_flat_vector_split: |
| ; GISEL: ; %bb.0: |
| ; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GISEL-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen |
| ; GISEL-NEXT: buffer_store_dword v2, v0, s[0:3], 0 offen offset:8 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:16 |
| ; GISEL-NEXT: buffer_store_dword v4, v0, s[0:3], 0 offen offset:24 |
| ; GISEL-NEXT: buffer_load_dword v1, off, s[0:3], s32 |
| ; GISEL-NEXT: s_mov_b64 s[4:5], src_shared_base |
| ; GISEL-NEXT: buffer_load_dword v2, off, s[0:3], s32 offset:4 |
| ; GISEL-NEXT: v_mov_b32_e32 v3, s5 |
| ; GISEL-NEXT: buffer_store_dword v5, v0, s[0:3], 0 offen offset:32 |
| ; GISEL-NEXT: buffer_store_dword v6, v0, s[0:3], 0 offen offset:40 |
| ; GISEL-NEXT: buffer_store_dword v7, v0, s[0:3], 0 offen offset:48 |
| ; GISEL-NEXT: buffer_store_dword v8, v0, s[0:3], 0 offen offset:56 |
| ; GISEL-NEXT: buffer_store_dword v9, v0, s[0:3], 0 offen offset:64 |
| ; GISEL-NEXT: buffer_store_dword v10, v0, s[0:3], 0 offen offset:72 |
| ; GISEL-NEXT: buffer_store_dword v11, v0, s[0:3], 0 offen offset:80 |
| ; GISEL-NEXT: buffer_store_dword v12, v0, s[0:3], 0 offen offset:88 |
| ; GISEL-NEXT: buffer_store_dword v13, v0, s[0:3], 0 offen offset:96 |
| ; GISEL-NEXT: buffer_store_dword v14, v0, s[0:3], 0 offen offset:104 |
| ; GISEL-NEXT: buffer_store_dword v15, v0, s[0:3], 0 offen offset:112 |
| ; GISEL-NEXT: buffer_store_dword v16, v0, s[0:3], 0 offen offset:120 |
| ; GISEL-NEXT: buffer_store_dword v17, v0, s[0:3], 0 offen offset:128 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:4 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:12 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:20 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:28 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:36 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:44 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:52 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:60 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:68 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:76 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:84 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:92 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:100 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:108 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:116 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:124 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:132 |
| ; GISEL-NEXT: buffer_store_dword v18, v0, s[0:3], 0 offen offset:136 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:140 |
| ; GISEL-NEXT: buffer_store_dword v19, v0, s[0:3], 0 offen offset:144 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:148 |
| ; GISEL-NEXT: buffer_store_dword v20, v0, s[0:3], 0 offen offset:152 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:156 |
| ; GISEL-NEXT: buffer_store_dword v21, v0, s[0:3], 0 offen offset:160 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:164 |
| ; GISEL-NEXT: buffer_store_dword v22, v0, s[0:3], 0 offen offset:168 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:172 |
| ; GISEL-NEXT: buffer_store_dword v23, v0, s[0:3], 0 offen offset:176 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:180 |
| ; GISEL-NEXT: buffer_store_dword v24, v0, s[0:3], 0 offen offset:184 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:188 |
| ; GISEL-NEXT: buffer_store_dword v25, v0, s[0:3], 0 offen offset:192 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:196 |
| ; GISEL-NEXT: buffer_store_dword v26, v0, s[0:3], 0 offen offset:200 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:204 |
| ; GISEL-NEXT: buffer_store_dword v27, v0, s[0:3], 0 offen offset:208 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:212 |
| ; GISEL-NEXT: buffer_store_dword v28, v0, s[0:3], 0 offen offset:216 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:220 |
| ; GISEL-NEXT: buffer_store_dword v29, v0, s[0:3], 0 offen offset:224 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:228 |
| ; GISEL-NEXT: buffer_store_dword v30, v0, s[0:3], 0 offen offset:232 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:236 |
| ; GISEL-NEXT: s_waitcnt vmcnt(57) |
| ; GISEL-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:240 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:244 |
| ; GISEL-NEXT: s_waitcnt vmcnt(58) |
| ; GISEL-NEXT: buffer_store_dword v2, v0, s[0:3], 0 offen offset:248 |
| ; GISEL-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen offset:252 |
| ; GISEL-NEXT: s_waitcnt vmcnt(0) |
| ; GISEL-NEXT: s_setpc_b64 s[30:31] |
| %1 = addrspacecast nonnull <32 x ptr addrspace(3)> %ptr to <32 x ptr> |
| ret <32 x ptr> %1 |
| } |
| |
| ; Two nonnull casts of the same flat source to different destination address |
| ; spaces must not be CSEd together despite sharing an operand and the flag. |
| define void @nonnull_casts_different_dest(i64 %i) { |
| ; CHECK-LABEL: nonnull_casts_different_dest: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: v_mov_b32_e32 v1, 7 |
| ; CHECK-NEXT: ds_write_b32 v0, v1 |
| ; CHECK-NEXT: v_mov_b32_e32 v1, 8 |
| ; CHECK-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen |
| ; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) |
| ; CHECK-NEXT: s_setpc_b64 s[30:31] |
| %flat = inttoptr i64 %i to ptr |
| %local = addrspacecast nonnull ptr %flat to ptr addrspace(3) |
| %priv = addrspacecast nonnull ptr %flat to ptr addrspace(5) |
| store volatile i32 7, ptr addrspace(3) %local, align 4 |
| store volatile i32 8, ptr addrspace(5) %priv, align 4 |
| ret void |
| } |
| |
| ; The inverted case: nonnull casts to flat from two different source address |
| ; spaces. Each source has its own null value, so the casts are distinct. |
| define void @nonnull_casts_different_src(i32 %i) { |
| ; DAGISEL-LABEL: nonnull_casts_different_src: |
| ; DAGISEL: ; %bb.0: |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; DAGISEL-NEXT: s_mov_b64 s[4:5], src_shared_base |
| ; DAGISEL-NEXT: s_mov_b64 s[6:7], src_private_base |
| ; DAGISEL-NEXT: v_mov_b32_e32 v1, s5 |
| ; DAGISEL-NEXT: v_mov_b32_e32 v4, 7 |
| ; DAGISEL-NEXT: v_mov_b32_e32 v2, v0 |
| ; DAGISEL-NEXT: v_mov_b32_e32 v3, s7 |
| ; DAGISEL-NEXT: flat_store_dword v[0:1], v4 |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(0) |
| ; DAGISEL-NEXT: v_mov_b32_e32 v0, 8 |
| ; DAGISEL-NEXT: flat_store_dword v[2:3], v0 |
| ; DAGISEL-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) |
| ; DAGISEL-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GISEL-LABEL: nonnull_casts_different_src: |
| ; GISEL: ; %bb.0: |
| ; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GISEL-NEXT: s_mov_b64 s[4:5], src_shared_base |
| ; GISEL-NEXT: s_mov_b64 s[6:7], src_private_base |
| ; GISEL-NEXT: v_mov_b32_e32 v1, s5 |
| ; GISEL-NEXT: v_mov_b32_e32 v4, 7 |
| ; GISEL-NEXT: v_mov_b32_e32 v3, s7 |
| ; GISEL-NEXT: v_mov_b32_e32 v2, v0 |
| ; GISEL-NEXT: flat_store_dword v[0:1], v4 |
| ; GISEL-NEXT: s_waitcnt vmcnt(0) |
| ; GISEL-NEXT: v_mov_b32_e32 v0, 8 |
| ; GISEL-NEXT: flat_store_dword v[2:3], v0 |
| ; GISEL-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) |
| ; GISEL-NEXT: s_setpc_b64 s[30:31] |
| %local = inttoptr i32 %i to ptr addrspace(3) |
| %priv = inttoptr i32 %i to ptr addrspace(5) |
| %flat.local = addrspacecast nonnull ptr addrspace(3) %local to ptr |
| %flat.priv = addrspacecast nonnull ptr addrspace(5) %priv to ptr |
| store volatile i32 7, ptr %flat.local, align 4 |
| store volatile i32 8, ptr %flat.priv, align 4 |
| ret void |
| } |