[llvm] AMDGPU: Avoid null and poison pointers in call-argument-types (PR #230012)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 8 00:29:10 PDT 2026
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/230012
Cleanup these tests to avoid unnecessarily depending on undefined behavior
and -amdgpu-scalarize-global-loads=0.
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
>From 29178b74aa0cdfbc48ac8dc0fbaa05a4f485516c Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 7 Oct 2026 21:48:49 +0200
Subject: [PATCH] AMDGPU: Avoid null and poison pointers in call-argument-types
Cleanup these tests to avoid unnecessarily depending on undefined behavior
and -amdgpu-scalarize-global-loads=0.
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
---
.../CodeGen/AMDGPU/call-argument-types.ll | 2562 +++++++++--------
1 file changed, 1291 insertions(+), 1271 deletions(-)
diff --git a/llvm/test/CodeGen/AMDGPU/call-argument-types.ll b/llvm/test/CodeGen/AMDGPU/call-argument-types.ll
index b5e4c0d7fad3b..4bcf28df172c0 100644
--- a/llvm/test/CodeGen/AMDGPU/call-argument-types.ll
+++ b/llvm/test/CodeGen/AMDGPU/call-argument-types.ll
@@ -1,11 +1,11 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -mtriple=amdgpu8.03 -mattr=-flat-for-global -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
-; RUN: llc -mtriple=amdgpu7.01 -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=CI %s
-; RUN: llc -mtriple=amdgpu9.00 -global-isel=0 -mattr=-flat-for-global -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=GFX9,SDAG %s
-; RUN: llc -mtriple=amdgpu11.00 -mattr=+real-true16 -mattr=-flat-for-global -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-TRUE16 %s
-; RUN: llc -mtriple=amdgpu11.00 -mattr=-real-true16 -mattr=-flat-for-global -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-FAKE16 %s
-; RUN: llc -mtriple=amdgpu8.03-amd-amdhsa -mattr=-flat-for-global -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=HSA %s
-; RUN: llc -mtriple=amdgpu9.00 -global-isel=1 -mattr=-flat-for-global -amdgpu-scalarize-global-loads=0 < %s | FileCheck -enable-var-scope -check-prefixes=GFX9,GISEL %s
+; RUN: llc -mtriple=amdgpu8.03 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=VI %s
+; RUN: llc -mtriple=amdgpu7.01 < %s | FileCheck -enable-var-scope -check-prefixes=CI %s
+; RUN: llc -mtriple=amdgpu9.00 -global-isel=0 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX9,SDAG %s
+; RUN: llc -mtriple=amdgpu11.00 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-TRUE16 %s
+; RUN: llc -mtriple=amdgpu11.00 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-FAKE16 %s
+; RUN: llc -mtriple=amdgpu8.03-amd-amdhsa -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=HSA %s
+; RUN: llc -mtriple=amdgpu9.00 -global-isel=1 -mattr=-flat-for-global < %s | FileCheck -enable-var-scope -check-prefixes=GFX9,GISEL %s
declare hidden void @external_void_func_i1(i1) #0
declare hidden void @external_void_func_i1_signext(i1 signext) #0
@@ -1398,19 +1398,22 @@ define amdgpu_kernel void @test_call_external_void_func_i64_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v2i64() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v2i64(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v2i64:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_mov_b64 s[0:1], 0
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v2i64 at rel32@lo+4
@@ -1423,16 +1426,19 @@ define amdgpu_kernel void @test_call_external_void_func_v2i64() #0 {
;
; CI-LABEL: test_call_external_void_func_v2i64:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_mov_b64 s[0:1], 0
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v2i64 at rel32@lo+4
@@ -1443,53 +1449,57 @@ define amdgpu_kernel void @test_call_external_void_func_v2i64() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v2i64:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_mov_b64 s[0:1], 0
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v2i64 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v2i64 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v2i64:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v2i64 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v2i64 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v2i64:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b64 s[4:5], 0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v2i64 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v2i64 at rel32@hi+12
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v2i64:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_mov_b64 s[8:9], 0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v2i64 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v2i64 at rel32@hi+12
@@ -1497,32 +1507,9 @@ define amdgpu_kernel void @test_call_external_void_func_v2i64() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v2i64:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_mov_b64 s[0:1], 0
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v2i64 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v2i64 at rel32@hi+12
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: v_mov_b32_e32 v2, s2
-; GISEL-NEXT: v_mov_b32_e32 v3, s3
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %val = load <2 x i64>, ptr addrspace(1) null
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <2 x i64>, ptr addrspace(1) %in, i32 %tid
+ %val = load <2 x i64>, ptr addrspace(1) %gep
call void @external_void_func_v2i64(<2 x i64> %val)
ret void
}
@@ -1650,19 +1637,22 @@ define amdgpu_kernel void @test_call_external_void_func_v2i64_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v3i64() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v3i64(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v3i64:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_mov_b64 s[0:1], 0
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v3i64 at rel32@lo+4
@@ -1677,16 +1667,19 @@ define amdgpu_kernel void @test_call_external_void_func_v3i64() #0 {
;
; CI-LABEL: test_call_external_void_func_v3i64:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_mov_b64 s[0:1], 0
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v3i64 at rel32@lo+4
@@ -1701,16 +1694,16 @@ define amdgpu_kernel void @test_call_external_void_func_v3i64() #0 {
;
; SDAG-LABEL: test_call_external_void_func_v3i64:
; SDAG: ; %bb.0:
+; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
+; SDAG-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; SDAG-NEXT: s_mov_b32 s38, -1
+; SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; SDAG-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_mov_b64 s[0:1], 0
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; SDAG-NEXT: s_add_u32 s36, s36, s5
; SDAG-NEXT: s_addc_u32 s37, s37, 0
; SDAG-NEXT: s_getpc_b64 s[4:5]
; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v3i64 at rel32@lo+4
@@ -1725,30 +1718,34 @@ define amdgpu_kernel void @test_call_external_void_func_v3i64() #0 {
;
; GFX11-LABEL: test_call_external_void_func_v3i64:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b64 s[4:5], 0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
-; GFX11-NEXT: v_dual_mov_b32 v4, 1 :: v_dual_mov_b32 v5, 2
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_dual_mov_b32 v5, 2 :: v_dual_lshlrev_b32 v0, 4, v0
+; GFX11-NEXT: v_mov_b32_e32 v4, 1
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v3i64 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v3i64 at rel32@hi+12
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v3i64:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_mov_b64 s[8:9], 0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v3i64 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v3i64 at rel32@hi+12
@@ -1761,50 +1758,52 @@ define amdgpu_kernel void @test_call_external_void_func_v3i64() #0 {
;
; GISEL-LABEL: test_call_external_void_func_v3i64:
; GISEL: ; %bb.0:
+; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GISEL-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; GISEL-NEXT: s_mov_b32 s38, -1
+; GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GISEL-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_mov_b64 s[0:1], 0
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0
+; GISEL-NEXT: s_add_u32 s36, s36, s5
; GISEL-NEXT: s_addc_u32 s37, s37, 0
; GISEL-NEXT: s_getpc_b64 s[4:5]
; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v3i64 at rel32@lo+4
; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v3i64 at rel32@hi+12
; GISEL-NEXT: v_mov_b32_e32 v4, 1
; GISEL-NEXT: v_mov_b32_e32 v5, 2
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: v_mov_b32_e32 v2, s2
-; GISEL-NEXT: v_mov_b32_e32 v3, s3
; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
; GISEL-NEXT: s_mov_b32 s32, 0
; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
; GISEL-NEXT: s_endpgm
- %load = load <2 x i64>, ptr addrspace(1) null
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <2 x i64>, ptr addrspace(1) %in, i32 %tid
+ %load = load <2 x i64>, ptr addrspace(1) %gep
%val = shufflevector <2 x i64> %load, <2 x i64> <i64 8589934593, i64 poison>, <3 x i32> <i32 0, i32 1, i32 2>
call void @external_void_func_v3i64(<3 x i64> %val)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v4i64() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v4i64(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v4i64:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_mov_b64 s[0:1], 0
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v4i64 at rel32@lo+4
@@ -1821,16 +1820,19 @@ define amdgpu_kernel void @test_call_external_void_func_v4i64() #0 {
;
; CI-LABEL: test_call_external_void_func_v4i64:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_mov_b64 s[0:1], 0
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v4i64 at rel32@lo+4
@@ -1847,16 +1849,16 @@ define amdgpu_kernel void @test_call_external_void_func_v4i64() #0 {
;
; SDAG-LABEL: test_call_external_void_func_v4i64:
; SDAG: ; %bb.0:
+; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
+; SDAG-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; SDAG-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; SDAG-NEXT: s_mov_b32 s38, -1
+; SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; SDAG-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_mov_b64 s[0:1], 0
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; SDAG-NEXT: s_add_u32 s36, s36, s5
; SDAG-NEXT: s_addc_u32 s37, s37, 0
; SDAG-NEXT: s_getpc_b64 s[4:5]
; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v4i64 at rel32@lo+4
@@ -1873,31 +1875,35 @@ define amdgpu_kernel void @test_call_external_void_func_v4i64() #0 {
;
; GFX11-LABEL: test_call_external_void_func_v4i64:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b64 s[4:5], 0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
-; GFX11-NEXT: v_dual_mov_b32 v4, 1 :: v_dual_mov_b32 v5, 2
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: v_dual_mov_b32 v6, 3 :: v_dual_mov_b32 v7, 4
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_dual_mov_b32 v5, 2 :: v_dual_lshlrev_b32 v0, 4, v0
+; GFX11-NEXT: v_dual_mov_b32 v4, 1 :: v_dual_mov_b32 v7, 4
+; GFX11-NEXT: v_mov_b32_e32 v6, 3
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v4i64 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v4i64 at rel32@hi+12
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v4i64:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_mov_b64 s[8:9], 0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v4i64 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v4i64 at rel32@hi+12
@@ -1912,25 +1918,22 @@ define amdgpu_kernel void @test_call_external_void_func_v4i64() #0 {
;
; GISEL-LABEL: test_call_external_void_func_v4i64:
; GISEL: ; %bb.0:
+; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GISEL-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; GISEL-NEXT: s_mov_b32 s38, -1
+; GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GISEL-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_mov_b64 s[0:1], 0
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0
+; GISEL-NEXT: s_add_u32 s36, s36, s5
; GISEL-NEXT: s_addc_u32 s37, s37, 0
; GISEL-NEXT: s_getpc_b64 s[4:5]
; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v4i64 at rel32@lo+4
; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v4i64 at rel32@hi+12
; GISEL-NEXT: v_mov_b32_e32 v4, 1
; GISEL-NEXT: v_mov_b32_e32 v5, 2
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: v_mov_b32_e32 v2, s2
-; GISEL-NEXT: v_mov_b32_e32 v3, s3
; GISEL-NEXT: v_mov_b32_e32 v6, 3
; GISEL-NEXT: v_mov_b32_e32 v7, 4
; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
@@ -1938,7 +1941,9 @@ define amdgpu_kernel void @test_call_external_void_func_v4i64() #0 {
; GISEL-NEXT: s_mov_b32 s32, 0
; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
; GISEL-NEXT: s_endpgm
- %load = load <2 x i64>, ptr addrspace(1) null
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <2 x i64>, ptr addrspace(1) %in, i32 %tid
+ %load = load <2 x i64>, ptr addrspace(1) %gep
%val = shufflevector <2 x i64> %load, <2 x i64> <i64 8589934593, i64 17179869187>, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
call void @external_void_func_v4i64(<4 x i64> %val)
ret void
@@ -2897,17 +2902,21 @@ define amdgpu_kernel void @test_call_external_void_func_v3f64_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v2i16() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v2i16(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v2i16:
; VI: ; %bb.0:
+; VI-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s3
+; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dword v0, v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dword v0, off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v2i16 at rel32@lo+4
@@ -2925,10 +2934,14 @@ define amdgpu_kernel void @test_call_external_void_func_v2i16() #0 {
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dword v0, off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
+; CI-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s7, 0xf000
+; CI-NEXT: s_mov_b32 s6, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v2i16 at rel32@lo+4
@@ -2946,16 +2959,17 @@ define amdgpu_kernel void @test_call_external_void_func_v2i16() #0 {
; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; SDAG-NEXT: s_mov_b32 s38, -1
; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dword v0, off, s[0:3], 0
+; SDAG-NEXT: s_add_u32 s36, s36, s5
+; SDAG-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x24
+; SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; SDAG-NEXT: s_addc_u32 s37, s37, 0
+; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
+; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
+; SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; SDAG-NEXT: global_load_dword v0, v0, s[4:5]
; SDAG-NEXT: s_getpc_b64 s[4:5]
; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v2i16 at rel32@lo+4
; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v2i16 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
; SDAG-NEXT: s_mov_b32 s32, 0
; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
@@ -2963,26 +2977,32 @@ define amdgpu_kernel void @test_call_external_void_func_v2i16() #0 {
;
; GFX11-LABEL: test_call_external_void_func_v2i16:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b32 v0, off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v2i16 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v2i16 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v2i16:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dword v0, off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 2, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dword v0, v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v2i16 at rel32@lo+4
@@ -2994,42 +3014,49 @@ define amdgpu_kernel void @test_call_external_void_func_v2i16() #0 {
;
; GISEL-LABEL: test_call_external_void_func_v2i16:
; GISEL: ; %bb.0:
+; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GISEL-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_load_dword s8, s[0:1], 0x0
; GISEL-NEXT: s_mov_b32 s38, -1
+; GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GISEL-NEXT: global_load_dword v0, v0, s[0:1]
; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
+; GISEL-NEXT: s_add_u32 s36, s36, s5
; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
; GISEL-NEXT: s_getpc_b64 s[4:5]
; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v2i16 at rel32@lo+4
; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v2i16 at rel32@hi+12
; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s8
; GISEL-NEXT: s_mov_b32 s32, 0
; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
; GISEL-NEXT: s_endpgm
- %val = load <2 x i16>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <2 x i16>, ptr addrspace(1) %in, i32 %tid
+ %val = load <2 x i16>, ptr addrspace(1) %gep
call void @external_void_func_v2i16(<2 x i16> %val)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v3i16() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v3i16(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v3i16:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v3i16 at rel32@lo+4
; VI-NEXT: s_addc_u32 s5, s5, external_void_func_v3i16 at rel32@hi+12
@@ -3041,16 +3068,20 @@ define amdgpu_kernel void @test_call_external_void_func_v3i16() #0 {
;
; CI-LABEL: test_call_external_void_func_v3i16:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v3i16 at rel32@lo+4
; CI-NEXT: s_addc_u32 s5, s5, external_void_func_v3i16 at rel32@hi+12
@@ -3062,97 +3093,88 @@ define amdgpu_kernel void @test_call_external_void_func_v3i16() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v3i16:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v3i16 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v3i16 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v3i16:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx2 v[0:1], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v3i16 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v3i16 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v3i16:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b64 v[0:1], off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v3i16 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v3i16 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v3i16:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dwordx2 v[0:1], off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_addc_u32 s1, s1, 0
-; HSA-NEXT: s_getpc_b64 s[8:9]
-; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v3i16 at rel32@lo+4
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
+; HSA-NEXT: s_addc_u32 s1, s1, 0
+; HSA-NEXT: s_getpc_b64 s[8:9]
+; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v3i16 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v3i16 at rel32@hi+12
; HSA-NEXT: s_mov_b64 s[6:7], s[4:5]
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v3i16:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v3i16 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v3i16 at rel32@hi+12
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %val = load <3 x i16>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <3 x i16>, ptr addrspace(1) %in, i32 %tid
+ %val = load <3 x i16>, ptr addrspace(1) %gep
call void @external_void_func_v3i16(<3 x i16> %val)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v3f16() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v3f16(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v3f16:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v3f16 at rel32@lo+4
; VI-NEXT: s_addc_u32 s5, s5, external_void_func_v3f16 at rel32@hi+12
@@ -3164,16 +3186,20 @@ define amdgpu_kernel void @test_call_external_void_func_v3f16() #0 {
;
; CI-LABEL: test_call_external_void_func_v3f16:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v3f16 at rel32@lo+4
; CI-NEXT: s_addc_u32 s5, s5, external_void_func_v3f16 at rel32@hi+12
@@ -3185,49 +3211,56 @@ define amdgpu_kernel void @test_call_external_void_func_v3f16() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v3f16:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v3f16 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v3f16 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v3f16:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx2 v[0:1], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v3f16 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v3f16 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v3f16:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b64 v[0:1], off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v3f16 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v3f16 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v3f16:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dwordx2 v[0:1], off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v3f16 at rel32@lo+4
@@ -3236,29 +3269,9 @@ define amdgpu_kernel void @test_call_external_void_func_v3f16() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v3f16:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v3f16 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v3f16 at rel32@hi+12
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %val = load <3 x half>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <3 x half>, ptr addrspace(1) %in, i32 %tid
+ %val = load <3 x half>, ptr addrspace(1) %gep
call void @external_void_func_v3f16(<3 x half> %val)
ret void
}
@@ -3488,19 +3501,23 @@ define amdgpu_kernel void @test_call_external_void_func_v3f16_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v4i16() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v4i16(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v4i16:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v4i16 at rel32@lo+4
; VI-NEXT: s_addc_u32 s5, s5, external_void_func_v4i16 at rel32@hi+12
@@ -3512,16 +3529,20 @@ define amdgpu_kernel void @test_call_external_void_func_v4i16() #0 {
;
; CI-LABEL: test_call_external_void_func_v4i16:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v4i16 at rel32@lo+4
; CI-NEXT: s_addc_u32 s5, s5, external_void_func_v4i16 at rel32@hi+12
@@ -3531,49 +3552,56 @@ define amdgpu_kernel void @test_call_external_void_func_v4i16() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v4i16:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v4i16 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v4i16 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v4i16:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx2 v[0:1], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v4i16 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v4i16 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v4i16:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b64 v[0:1], off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v4i16 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v4i16 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v4i16:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dwordx2 v[0:1], off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v4i16 at rel32@lo+4
@@ -3582,29 +3610,9 @@ define amdgpu_kernel void @test_call_external_void_func_v4i16() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v4i16:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v4i16 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v4i16 at rel32@hi+12
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %val = load <4 x i16>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <4 x i16>, ptr addrspace(1) %in, i32 %tid
+ %val = load <4 x i16>, ptr addrspace(1) %gep
call void @external_void_func_v4i16(<4 x i16> %val)
ret void
}
@@ -3722,17 +3730,21 @@ define amdgpu_kernel void @test_call_external_void_func_v4i16_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v2f16() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v2f16(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v2f16:
; VI: ; %bb.0:
+; VI-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s3
+; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dword v0, v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dword v0, off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v2f16 at rel32@lo+4
@@ -3750,10 +3762,14 @@ define amdgpu_kernel void @test_call_external_void_func_v2f16() #0 {
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dword v0, off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
+; CI-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s7, 0xf000
+; CI-NEXT: s_mov_b32 s6, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 2, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v2f16 at rel32@lo+4
@@ -3771,16 +3787,17 @@ define amdgpu_kernel void @test_call_external_void_func_v2f16() #0 {
; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; SDAG-NEXT: s_mov_b32 s38, -1
; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dword v0, off, s[0:3], 0
+; SDAG-NEXT: s_add_u32 s36, s36, s5
+; SDAG-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x24
+; SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; SDAG-NEXT: s_addc_u32 s37, s37, 0
+; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
+; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
+; SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; SDAG-NEXT: global_load_dword v0, v0, s[4:5]
; SDAG-NEXT: s_getpc_b64 s[4:5]
; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v2f16 at rel32@lo+4
; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v2f16 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
; SDAG-NEXT: s_mov_b32 s32, 0
; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
@@ -3788,26 +3805,32 @@ define amdgpu_kernel void @test_call_external_void_func_v2f16() #0 {
;
; GFX11-LABEL: test_call_external_void_func_v2f16:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b32 v0, off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v2f16 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v2f16 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v2f16:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dword v0, off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 2, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dword v0, v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v2f16 at rel32@lo+4
@@ -3819,42 +3842,49 @@ define amdgpu_kernel void @test_call_external_void_func_v2f16() #0 {
;
; GISEL-LABEL: test_call_external_void_func_v2f16:
; GISEL: ; %bb.0:
+; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GISEL-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0
; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_load_dword s8, s[0:1], 0x0
; GISEL-NEXT: s_mov_b32 s38, -1
+; GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GISEL-NEXT: global_load_dword v0, v0, s[0:1]
; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
+; GISEL-NEXT: s_add_u32 s36, s36, s5
; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
; GISEL-NEXT: s_getpc_b64 s[4:5]
; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v2f16 at rel32@lo+4
; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v2f16 at rel32@hi+12
; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s8
; GISEL-NEXT: s_mov_b32 s32, 0
; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
; GISEL-NEXT: s_endpgm
- %val = load <2 x half>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <2 x half>, ptr addrspace(1) %in, i32 %tid
+ %val = load <2 x half>, ptr addrspace(1) %gep
call void @external_void_func_v2f16(<2 x half> %val)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v2i32() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v2i32(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v2i32:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v2i32 at rel32@lo+4
; VI-NEXT: s_addc_u32 s5, s5, external_void_func_v2i32 at rel32@hi+12
@@ -3866,16 +3896,20 @@ define amdgpu_kernel void @test_call_external_void_func_v2i32() #0 {
;
; CI-LABEL: test_call_external_void_func_v2i32:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v2i32 at rel32@lo+4
; CI-NEXT: s_addc_u32 s5, s5, external_void_func_v2i32 at rel32@hi+12
@@ -3885,49 +3919,56 @@ define amdgpu_kernel void @test_call_external_void_func_v2i32() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v2i32:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx2 v[0:1], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v2i32 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v2i32 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v2i32:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx2 v[0:1], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v2i32 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v2i32 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v2i32:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b64 v[0:1], off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v2i32 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v2i32 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v2i32:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dwordx2 v[0:1], off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx2 v[0:1], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v2i32 at rel32@lo+4
@@ -3936,29 +3977,9 @@ define amdgpu_kernel void @test_call_external_void_func_v2i32() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v2i32:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v2i32 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v2i32 at rel32@hi+12
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %val = load <2 x i32>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <2 x i32>, ptr addrspace(1) %in, i32 %tid
+ %val = load <2 x i32>, ptr addrspace(1) %gep
call void @external_void_func_v2i32(<2 x i32> %val)
ret void
}
@@ -4316,19 +4337,23 @@ define amdgpu_kernel void @test_call_external_void_func_v3i32_i32(i32) #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v4i32() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v4i32(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v4i32:
; VI: ; %bb.0:
+; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
-; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v4i32 at rel32@lo+4
; VI-NEXT: s_addc_u32 s5, s5, external_void_func_v4i32 at rel32@hi+12
@@ -4340,16 +4365,20 @@ define amdgpu_kernel void @test_call_external_void_func_v4i32() #0 {
;
; CI-LABEL: test_call_external_void_func_v4i32:
; CI: ; %bb.0:
+; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[0:3], 0 addr64
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
-; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v4i32 at rel32@lo+4
; CI-NEXT: s_addc_u32 s5, s5, external_void_func_v4i32 at rel32@hi+12
@@ -4359,49 +4388,56 @@ define amdgpu_kernel void @test_call_external_void_func_v4i32() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v4i32:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v4i32 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v4i32 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v4i32:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v4i32 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v4i32 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v4i32:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_mov_b32 s3, 0x31016000
-; GFX11-NEXT: s_mov_b32 s2, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v0, 4, v0
; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0
+; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v4i32 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v4i32 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v4i32:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_mov_b32 s7, 0x1100f000
-; HSA-NEXT: s_mov_b32 s6, -1
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; HSA-NEXT: s_add_u32 s0, s0, s9
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
+; HSA-NEXT: s_waitcnt lgkmcnt(0)
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v4i32 at rel32@lo+4
@@ -4410,31 +4446,9 @@ define amdgpu_kernel void @test_call_external_void_func_v4i32() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v4i32:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v4i32 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v4i32 at rel32@hi+12
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s1
-; GISEL-NEXT: v_mov_b32_e32 v2, s2
-; GISEL-NEXT: v_mov_b32_e32 v3, s3
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %val = load <4 x i32>, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <4 x i32>, ptr addrspace(1) %in, i32 %tid
+ %val = load <4 x i32>, ptr addrspace(1) %gep
call void @external_void_func_v4i32(<4 x i32> %val)
ret void
}
@@ -4691,21 +4705,25 @@ define amdgpu_kernel void @test_call_external_void_func_v5i32_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v8i32() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v8i32(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v8i32:
; VI: ; %bb.0:
-; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 5, v0
+; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
-; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
; VI-NEXT: s_waitcnt lgkmcnt(0)
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; VI-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 offset:16
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v4, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[4:5]
+; VI-NEXT: v_add_u32_e32 v4, vcc, 16, v4
+; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v5, vcc
+; VI-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; VI-NEXT: s_mov_b32 s39, 0xe80000
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v8i32 at rel32@lo+4
@@ -4718,18 +4736,20 @@ define amdgpu_kernel void @test_call_external_void_func_v8i32() #0 {
;
; CI-LABEL: test_call_external_void_func_v8i32:
; CI: ; %bb.0:
-; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v4, 5, v0
+; CI-NEXT: v_mov_b32_e32 v5, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[4:5], s[0:3], 0 addr64
+; CI-NEXT: buffer_load_dwordx4 v[4:7], v[4:5], s[0:3], 0 addr64 offset:16
+; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: s_waitcnt lgkmcnt(0)
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; CI-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 offset:16
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v8i32 at rel32@lo+4
@@ -4740,60 +4760,63 @@ define amdgpu_kernel void @test_call_external_void_func_v8i32() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v8i32:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: s_waitcnt lgkmcnt(0)
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; SDAG-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 offset:16
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v8i32 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v8i32 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v8i32:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v8, 5, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx4 v[0:3], v8, s[0:1]
+; GFX9-NEXT: global_load_dwordx4 v[4:7], v8, s[0:1] offset:16
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v8i32 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v8i32 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v8i32:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
-; GFX11-NEXT: s_getpc_b64 s[2:3]
-; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v8i32 at rel32@lo+4
-; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v8i32 at rel32@hi+12
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v4, 5, v0
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
; GFX11-NEXT: s_mov_b32 s32, 0
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
; GFX11-NEXT: s_clause 0x1
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: buffer_load_b128 v[4:7], off, s[4:7], 0 offset:16
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: global_load_b128 v[0:3], v4, s[2:3]
+; GFX11-NEXT: global_load_b128 v[4:7], v4, s[2:3] offset:16
+; GFX11-NEXT: s_getpc_b64 s[2:3]
+; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v8i32 at rel32@lo+4
+; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v8i32 at rel32@hi+12
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v8i32:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: s_addc_u32 s1, s1, 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 5, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
; HSA-NEXT: s_waitcnt lgkmcnt(0)
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
-; HSA-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v4, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v5, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[4:5]
+; HSA-NEXT: v_add_u32_e32 v4, vcc, 16, v4
+; HSA-NEXT: v_addc_u32_e32 v5, vcc, 0, v5, vcc
+; HSA-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; HSA-NEXT: s_add_u32 s0, s0, s11
+; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v8i32 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v8i32 at rel32@hi+12
@@ -4801,38 +4824,9 @@ define amdgpu_kernel void @test_call_external_void_func_v8i32() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v8i32:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_load_dwordx8 s[8:15], s[0:1], 0x0
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v8i32 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v8i32 at rel32@hi+12
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s8
-; GISEL-NEXT: v_mov_b32_e32 v1, s9
-; GISEL-NEXT: v_mov_b32_e32 v2, s10
-; GISEL-NEXT: v_mov_b32_e32 v3, s11
-; GISEL-NEXT: v_mov_b32_e32 v4, s12
-; GISEL-NEXT: v_mov_b32_e32 v5, s13
-; GISEL-NEXT: v_mov_b32_e32 v6, s14
-; GISEL-NEXT: v_mov_b32_e32 v7, s15
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %ptr = load ptr addrspace(1), ptr addrspace(4) poison
- %val = load <8 x i32>, ptr addrspace(1) %ptr
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <8 x i32>, ptr addrspace(1) %in, i32 %tid
+ %val = load <8 x i32>, ptr addrspace(1) %gep
call void @external_void_func_v8i32(<8 x i32> %val)
ret void
}
@@ -4982,23 +4976,31 @@ define amdgpu_kernel void @test_call_external_void_func_v8i32_imm() #0 {
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v16i32() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v16i32(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v16i32:
; VI: ; %bb.0:
-; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 6, v0
+; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
-; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
; VI-NEXT: s_waitcnt lgkmcnt(0)
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; VI-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 offset:16
-; VI-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 offset:32
-; VI-NEXT: buffer_load_dwordx4 v[12:15], off, s[0:3], 0 offset:48
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v12, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v13, vcc, 0, v1, vcc
+; VI-NEXT: v_add_u32_e32 v4, vcc, 16, v12
+; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v13, vcc
+; VI-NEXT: v_add_u32_e32 v8, vcc, 32, v12
+; VI-NEXT: v_addc_u32_e32 v9, vcc, 0, v13, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[12:13]
+; VI-NEXT: v_add_u32_e32 v12, vcc, 48, v12
+; VI-NEXT: v_addc_u32_e32 v13, vcc, 0, v13, vcc
+; VI-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; VI-NEXT: flat_load_dwordx4 v[8:11], v[8:9]
+; VI-NEXT: flat_load_dwordx4 v[12:15], v[12:13]
+; VI-NEXT: s_mov_b32 s39, 0xe80000
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v16i32 at rel32@lo+4
@@ -5011,20 +5013,22 @@ define amdgpu_kernel void @test_call_external_void_func_v16i32() #0 {
;
; CI-LABEL: test_call_external_void_func_v16i32:
; CI: ; %bb.0:
-; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v12, 6, v0
+; CI-NEXT: v_mov_b32_e32 v13, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[12:13], s[0:3], 0 addr64
+; CI-NEXT: buffer_load_dwordx4 v[4:7], v[12:13], s[0:3], 0 addr64 offset:16
+; CI-NEXT: buffer_load_dwordx4 v[8:11], v[12:13], s[0:3], 0 addr64 offset:32
+; CI-NEXT: buffer_load_dwordx4 v[12:15], v[12:13], s[0:3], 0 addr64 offset:48
+; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: s_waitcnt lgkmcnt(0)
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; CI-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 offset:16
-; CI-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 offset:32
-; CI-NEXT: buffer_load_dwordx4 v[12:15], off, s[0:3], 0 offset:48
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v16i32 at rel32@lo+4
@@ -5035,66 +5039,73 @@ define amdgpu_kernel void @test_call_external_void_func_v16i32() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v16i32:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: s_waitcnt lgkmcnt(0)
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; SDAG-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 offset:16
-; SDAG-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 offset:32
-; SDAG-NEXT: buffer_load_dwordx4 v[12:15], off, s[0:3], 0 offset:48
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v16i32 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v16i32 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v16i32:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v16, 6, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx4 v[0:3], v16, s[0:1]
+; GFX9-NEXT: global_load_dwordx4 v[4:7], v16, s[0:1] offset:16
+; GFX9-NEXT: global_load_dwordx4 v[8:11], v16, s[0:1] offset:32
+; GFX9-NEXT: global_load_dwordx4 v[12:15], v16, s[0:1] offset:48
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v16i32 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v16i32 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v16i32:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
-; GFX11-NEXT: s_getpc_b64 s[2:3]
-; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v16i32 at rel32@lo+4
-; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v16i32 at rel32@hi+12
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v12, 6, v0
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
; GFX11-NEXT: s_mov_b32 s32, 0
; GFX11-NEXT: s_waitcnt lgkmcnt(0)
; GFX11-NEXT: s_clause 0x3
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: buffer_load_b128 v[4:7], off, s[4:7], 0 offset:16
-; GFX11-NEXT: buffer_load_b128 v[8:11], off, s[4:7], 0 offset:32
-; GFX11-NEXT: buffer_load_b128 v[12:15], off, s[4:7], 0 offset:48
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: global_load_b128 v[0:3], v12, s[2:3]
+; GFX11-NEXT: global_load_b128 v[4:7], v12, s[2:3] offset:16
+; GFX11-NEXT: global_load_b128 v[8:11], v12, s[2:3] offset:32
+; GFX11-NEXT: global_load_b128 v[12:15], v12, s[2:3] offset:48
+; GFX11-NEXT: s_getpc_b64 s[2:3]
+; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v16i32 at rel32@lo+4
+; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v16i32 at rel32@hi+12
+; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v16i32:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: s_addc_u32 s1, s1, 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 6, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
; HSA-NEXT: s_waitcnt lgkmcnt(0)
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
-; HSA-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
-; HSA-NEXT: buffer_load_dwordx4 v[8:11], off, s[8:11], 0 offset:32
-; HSA-NEXT: buffer_load_dwordx4 v[12:15], off, s[8:11], 0 offset:48
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v12, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v13, vcc, 0, v1, vcc
+; HSA-NEXT: v_add_u32_e32 v4, vcc, 16, v12
+; HSA-NEXT: v_addc_u32_e32 v5, vcc, 0, v13, vcc
+; HSA-NEXT: v_add_u32_e32 v8, vcc, 32, v12
+; HSA-NEXT: v_addc_u32_e32 v9, vcc, 0, v13, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[12:13]
+; HSA-NEXT: v_add_u32_e32 v12, vcc, 48, v12
+; HSA-NEXT: v_addc_u32_e32 v13, vcc, 0, v13, vcc
+; HSA-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; HSA-NEXT: flat_load_dwordx4 v[8:11], v[8:9]
+; HSA-NEXT: flat_load_dwordx4 v[12:15], v[12:13]
+; HSA-NEXT: s_add_u32 s0, s0, s11
+; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v16i32 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v16i32 at rel32@hi+12
@@ -5102,167 +5113,150 @@ define amdgpu_kernel void @test_call_external_void_func_v16i32() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v16i32:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_load_dwordx16 s[8:23], s[0:1], 0x0
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v16i32 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v16i32 at rel32@hi+12
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s8
-; GISEL-NEXT: v_mov_b32_e32 v1, s9
-; GISEL-NEXT: v_mov_b32_e32 v2, s10
-; GISEL-NEXT: v_mov_b32_e32 v3, s11
-; GISEL-NEXT: v_mov_b32_e32 v4, s12
-; GISEL-NEXT: v_mov_b32_e32 v5, s13
-; GISEL-NEXT: v_mov_b32_e32 v6, s14
-; GISEL-NEXT: v_mov_b32_e32 v7, s15
-; GISEL-NEXT: v_mov_b32_e32 v8, s16
-; GISEL-NEXT: v_mov_b32_e32 v9, s17
-; GISEL-NEXT: v_mov_b32_e32 v10, s18
-; GISEL-NEXT: v_mov_b32_e32 v11, s19
-; GISEL-NEXT: v_mov_b32_e32 v12, s20
-; GISEL-NEXT: v_mov_b32_e32 v13, s21
-; GISEL-NEXT: v_mov_b32_e32 v14, s22
-; GISEL-NEXT: v_mov_b32_e32 v15, s23
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %ptr = load ptr addrspace(1), ptr addrspace(4) poison
- %val = load <16 x i32>, ptr addrspace(1) %ptr
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <16 x i32>, ptr addrspace(1) %in, i32 %tid
+ %val = load <16 x i32>, ptr addrspace(1) %gep
call void @external_void_func_v16i32(<16 x i32> %val)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v32i32() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v32i32(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v32i32:
; VI: ; %bb.0:
-; VI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
-; VI-NEXT: s_mov_b32 s7, 0xf000
-; VI-NEXT: s_mov_b32 s6, -1
+; VI-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 7, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; VI-NEXT: s_waitcnt lgkmcnt(0)
-; VI-NEXT: buffer_load_dwordx4 v[24:27], off, s[4:7], 0 offset:96
-; VI-NEXT: buffer_load_dwordx4 v[28:31], off, s[4:7], 0 offset:112
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; VI-NEXT: buffer_load_dwordx4 v[4:7], off, s[4:7], 0 offset:16
-; VI-NEXT: buffer_load_dwordx4 v[8:11], off, s[4:7], 0 offset:32
-; VI-NEXT: buffer_load_dwordx4 v[12:15], off, s[4:7], 0 offset:48
-; VI-NEXT: buffer_load_dwordx4 v[16:19], off, s[4:7], 0 offset:64
-; VI-NEXT: buffer_load_dwordx4 v[20:23], off, s[4:7], 0 offset:80
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v1, s3
+; VI-NEXT: v_add_u32_e32 v24, vcc, s2, v0
+; VI-NEXT: v_addc_u32_e32 v25, vcc, 0, v1, vcc
+; VI-NEXT: v_add_u32_e32 v4, vcc, 16, v24
+; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v25, vcc
+; VI-NEXT: v_add_u32_e32 v8, vcc, 32, v24
+; VI-NEXT: v_addc_u32_e32 v9, vcc, 0, v25, vcc
+; VI-NEXT: s_movk_i32 s2, 0x70
+; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v24
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v25, vcc
+; VI-NEXT: v_add_u32_e32 v12, vcc, 48, v24
+; VI-NEXT: v_addc_u32_e32 v13, vcc, 0, v25, vcc
+; VI-NEXT: v_add_u32_e32 v16, vcc, 64, v24
+; VI-NEXT: v_addc_u32_e32 v17, vcc, 0, v25, vcc
+; VI-NEXT: s_movk_i32 s2, 0x50
+; VI-NEXT: v_add_u32_e32 v20, vcc, s2, v24
+; VI-NEXT: v_addc_u32_e32 v21, vcc, 0, v25, vcc
+; VI-NEXT: s_movk_i32 s2, 0x60
+; VI-NEXT: flat_load_dwordx4 v[28:31], v[0:1]
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[24:25]
+; VI-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; VI-NEXT: v_add_u32_e32 v24, vcc, s2, v24
+; VI-NEXT: v_addc_u32_e32 v25, vcc, 0, v25, vcc
+; VI-NEXT: flat_load_dwordx4 v[8:11], v[8:9]
+; VI-NEXT: flat_load_dwordx4 v[20:23], v[20:21]
+; VI-NEXT: flat_load_dwordx4 v[12:15], v[12:13]
+; VI-NEXT: flat_load_dwordx4 v[16:19], v[16:17]
+; VI-NEXT: flat_load_dwordx4 v[24:27], v[24:25]
; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_mov_b32 s32, 0
-; VI-NEXT: s_getpc_b64 s[8:9]
-; VI-NEXT: s_add_u32 s8, s8, external_void_func_v32i32 at rel32@lo+4
-; VI-NEXT: s_addc_u32 s9, s9, external_void_func_v32i32 at rel32@hi+12
+; VI-NEXT: s_getpc_b64 s[4:5]
+; VI-NEXT: s_add_u32 s4, s4, external_void_func_v32i32 at rel32@lo+4
+; VI-NEXT: s_addc_u32 s5, s5, external_void_func_v32i32 at rel32@hi+12
; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
; VI-NEXT: s_mov_b64 s[0:1], s[36:37]
; VI-NEXT: s_mov_b64 s[2:3], s[38:39]
-; VI-NEXT: s_waitcnt vmcnt(6)
+; VI-NEXT: s_waitcnt vmcnt(7)
; VI-NEXT: buffer_store_dword v31, off, s[36:39], s32
-; VI-NEXT: s_swappc_b64 s[30:31], s[8:9]
+; VI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; VI-NEXT: s_endpgm
;
; CI-LABEL: test_call_external_void_func_v32i32:
; CI: ; %bb.0:
-; CI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
-; CI-NEXT: s_mov_b32 s7, 0xf000
-; CI-NEXT: s_mov_b32 s6, -1
; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; CI-NEXT: s_waitcnt lgkmcnt(0)
-; CI-NEXT: buffer_load_dwordx4 v[24:27], off, s[4:7], 0 offset:96
-; CI-NEXT: buffer_load_dwordx4 v[28:31], off, s[4:7], 0 offset:112
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; CI-NEXT: buffer_load_dwordx4 v[4:7], off, s[4:7], 0 offset:16
-; CI-NEXT: buffer_load_dwordx4 v[8:11], off, s[4:7], 0 offset:32
-; CI-NEXT: buffer_load_dwordx4 v[12:15], off, s[4:7], 0 offset:48
-; CI-NEXT: buffer_load_dwordx4 v[16:19], off, s[4:7], 0 offset:64
-; CI-NEXT: buffer_load_dwordx4 v[20:23], off, s[4:7], 0 offset:80
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
+; CI-NEXT: s_add_u32 s36, s36, s5
+; CI-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s7, 0xf000
+; CI-NEXT: s_mov_b32 s6, 0
+; CI-NEXT: v_lshlrev_b32_e32 v24, 7, v0
+; CI-NEXT: v_mov_b32_e32 v25, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[28:31], v[24:25], s[4:7], 0 addr64 offset:112
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[24:25], s[4:7], 0 addr64
+; CI-NEXT: buffer_load_dwordx4 v[4:7], v[24:25], s[4:7], 0 addr64 offset:16
+; CI-NEXT: buffer_load_dwordx4 v[8:11], v[24:25], s[4:7], 0 addr64 offset:32
+; CI-NEXT: buffer_load_dwordx4 v[12:15], v[24:25], s[4:7], 0 addr64 offset:48
+; CI-NEXT: buffer_load_dwordx4 v[16:19], v[24:25], s[4:7], 0 addr64 offset:64
+; CI-NEXT: buffer_load_dwordx4 v[20:23], v[24:25], s[4:7], 0 addr64 offset:80
+; CI-NEXT: buffer_load_dwordx4 v[24:27], v[24:25], s[4:7], 0 addr64 offset:96
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_mov_b32 s32, 0
-; CI-NEXT: s_getpc_b64 s[8:9]
-; CI-NEXT: s_add_u32 s8, s8, external_void_func_v32i32 at rel32@lo+4
-; CI-NEXT: s_addc_u32 s9, s9, external_void_func_v32i32 at rel32@hi+12
+; CI-NEXT: s_getpc_b64 s[4:5]
+; CI-NEXT: s_add_u32 s4, s4, external_void_func_v32i32 at rel32@lo+4
+; CI-NEXT: s_addc_u32 s5, s5, external_void_func_v32i32 at rel32@hi+12
; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_mov_b64 s[0:1], s[36:37]
; CI-NEXT: s_mov_b64 s[2:3], s[38:39]
-; CI-NEXT: s_waitcnt vmcnt(6)
+; CI-NEXT: s_waitcnt vmcnt(7)
; CI-NEXT: buffer_store_dword v31, off, s[36:39], s32
-; CI-NEXT: s_swappc_b64 s[30:31], s[8:9]
+; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
; SDAG-LABEL: test_call_external_void_func_v32i32:
; SDAG: ; %bb.0:
-; SDAG-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
-; SDAG-NEXT: s_mov_b32 s7, 0xf000
-; SDAG-NEXT: s_mov_b32 s6, -1
; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_waitcnt lgkmcnt(0)
-; SDAG-NEXT: buffer_load_dwordx4 v[24:27], off, s[4:7], 0 offset:96
-; SDAG-NEXT: buffer_load_dwordx4 v[28:31], off, s[4:7], 0 offset:112
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; SDAG-NEXT: buffer_load_dwordx4 v[4:7], off, s[4:7], 0 offset:16
-; SDAG-NEXT: buffer_load_dwordx4 v[8:11], off, s[4:7], 0 offset:32
-; SDAG-NEXT: buffer_load_dwordx4 v[12:15], off, s[4:7], 0 offset:48
-; SDAG-NEXT: buffer_load_dwordx4 v[16:19], off, s[4:7], 0 offset:64
-; SDAG-NEXT: buffer_load_dwordx4 v[20:23], off, s[4:7], 0 offset:80
; SDAG-NEXT: s_mov_b32 s38, -1
; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
+; SDAG-NEXT: s_add_u32 s36, s36, s5
+; SDAG-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x24
+; SDAG-NEXT: v_lshlrev_b32_e32 v24, 7, v0
; SDAG-NEXT: s_addc_u32 s37, s37, 0
; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_getpc_b64 s[8:9]
-; SDAG-NEXT: s_add_u32 s8, s8, external_void_func_v32i32 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s9, s9, external_void_func_v32i32 at rel32@hi+12
+; SDAG-NEXT: s_waitcnt lgkmcnt(0)
+; SDAG-NEXT: global_load_dwordx4 v[28:31], v24, s[4:5] offset:112
+; SDAG-NEXT: global_load_dwordx4 v[0:3], v24, s[4:5]
+; SDAG-NEXT: global_load_dwordx4 v[4:7], v24, s[4:5] offset:16
+; SDAG-NEXT: global_load_dwordx4 v[8:11], v24, s[4:5] offset:32
+; SDAG-NEXT: global_load_dwordx4 v[12:15], v24, s[4:5] offset:48
+; SDAG-NEXT: global_load_dwordx4 v[16:19], v24, s[4:5] offset:64
+; SDAG-NEXT: global_load_dwordx4 v[20:23], v24, s[4:5] offset:80
+; SDAG-NEXT: s_nop 0
+; SDAG-NEXT: global_load_dwordx4 v[24:27], v24, s[4:5] offset:96
+; SDAG-NEXT: s_getpc_b64 s[4:5]
+; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v32i32 at rel32@lo+4
+; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v32i32 at rel32@hi+12
; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_waitcnt vmcnt(6)
+; SDAG-NEXT: s_waitcnt vmcnt(7)
; SDAG-NEXT: buffer_store_dword v31, off, s[36:39], s32
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[8:9]
+; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
; SDAG-NEXT: s_endpgm
;
; GFX11-LABEL: test_call_external_void_func_v32i32:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-NEXT: v_lshlrev_b32_e32 v24, 7, v0
; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: s_clause 0x7
+; GFX11-NEXT: global_load_b128 v[28:31], v24, s[2:3] offset:112
+; GFX11-NEXT: global_load_b128 v[0:3], v24, s[2:3]
+; GFX11-NEXT: global_load_b128 v[4:7], v24, s[2:3] offset:16
+; GFX11-NEXT: global_load_b128 v[8:11], v24, s[2:3] offset:32
+; GFX11-NEXT: global_load_b128 v[12:15], v24, s[2:3] offset:48
+; GFX11-NEXT: global_load_b128 v[16:19], v24, s[2:3] offset:64
+; GFX11-NEXT: global_load_b128 v[20:23], v24, s[2:3] offset:80
+; GFX11-NEXT: global_load_b128 v[24:27], v24, s[2:3] offset:96
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v32i32 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v32i32 at rel32@hi+12
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: s_clause 0x7
-; GFX11-NEXT: buffer_load_b128 v[28:31], off, s[4:7], 0 offset:112
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: buffer_load_b128 v[4:7], off, s[4:7], 0 offset:16
-; GFX11-NEXT: buffer_load_b128 v[8:11], off, s[4:7], 0 offset:32
-; GFX11-NEXT: buffer_load_b128 v[12:15], off, s[4:7], 0 offset:48
-; GFX11-NEXT: buffer_load_b128 v[16:19], off, s[4:7], 0 offset:64
-; GFX11-NEXT: buffer_load_b128 v[20:23], off, s[4:7], 0 offset:80
-; GFX11-NEXT: buffer_load_b128 v[24:27], off, s[4:7], 0 offset:96
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
; GFX11-NEXT: s_waitcnt vmcnt(7)
; GFX11-NEXT: scratch_store_b32 off, v31, s32
; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
@@ -5270,116 +5264,135 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32() #0 {
;
; HSA-LABEL: test_call_external_void_func_v32i32:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: s_addc_u32 s1, s1, 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 7, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
; HSA-NEXT: s_waitcnt lgkmcnt(0)
-; HSA-NEXT: buffer_load_dwordx4 v[28:31], off, s[8:11], 0 offset:112
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
-; HSA-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
-; HSA-NEXT: buffer_load_dwordx4 v[8:11], off, s[8:11], 0 offset:32
-; HSA-NEXT: buffer_load_dwordx4 v[12:15], off, s[8:11], 0 offset:48
-; HSA-NEXT: buffer_load_dwordx4 v[16:19], off, s[8:11], 0 offset:64
-; HSA-NEXT: buffer_load_dwordx4 v[20:23], off, s[8:11], 0 offset:80
-; HSA-NEXT: buffer_load_dwordx4 v[24:27], off, s[8:11], 0 offset:96
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v24, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v25, vcc, 0, v1, vcc
+; HSA-NEXT: v_add_u32_e32 v4, vcc, 16, v24
+; HSA-NEXT: v_addc_u32_e32 v5, vcc, 0, v25, vcc
+; HSA-NEXT: v_add_u32_e32 v8, vcc, 32, v24
+; HSA-NEXT: v_addc_u32_e32 v9, vcc, 0, v25, vcc
+; HSA-NEXT: s_movk_i32 s6, 0x70
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v24
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v25, vcc
+; HSA-NEXT: v_add_u32_e32 v12, vcc, 48, v24
+; HSA-NEXT: v_addc_u32_e32 v13, vcc, 0, v25, vcc
+; HSA-NEXT: v_add_u32_e32 v16, vcc, 64, v24
+; HSA-NEXT: v_addc_u32_e32 v17, vcc, 0, v25, vcc
+; HSA-NEXT: s_movk_i32 s6, 0x50
+; HSA-NEXT: v_add_u32_e32 v20, vcc, s6, v24
+; HSA-NEXT: v_addc_u32_e32 v21, vcc, 0, v25, vcc
+; HSA-NEXT: s_movk_i32 s6, 0x60
+; HSA-NEXT: flat_load_dwordx4 v[28:31], v[0:1]
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[24:25]
+; HSA-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; HSA-NEXT: v_add_u32_e32 v24, vcc, s6, v24
+; HSA-NEXT: v_addc_u32_e32 v25, vcc, 0, v25, vcc
+; HSA-NEXT: flat_load_dwordx4 v[8:11], v[8:9]
+; HSA-NEXT: flat_load_dwordx4 v[20:23], v[20:21]
+; HSA-NEXT: flat_load_dwordx4 v[12:15], v[12:13]
+; HSA-NEXT: flat_load_dwordx4 v[16:19], v[16:17]
+; HSA-NEXT: flat_load_dwordx4 v[24:27], v[24:25]
+; HSA-NEXT: s_add_u32 s0, s0, s11
+; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_mov_b32 s32, 0
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
-; HSA-NEXT: s_getpc_b64 s[12:13]
-; HSA-NEXT: s_add_u32 s12, s12, external_void_func_v32i32 at rel32@lo+4
-; HSA-NEXT: s_addc_u32 s13, s13, external_void_func_v32i32 at rel32@hi+12
+; HSA-NEXT: s_getpc_b64 s[8:9]
+; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v32i32 at rel32@lo+4
+; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v32i32 at rel32@hi+12
; HSA-NEXT: s_mov_b64 s[6:7], s[4:5]
; HSA-NEXT: s_waitcnt vmcnt(7)
; HSA-NEXT: buffer_store_dword v31, off, s[0:3], s32
-; HSA-NEXT: s_swappc_b64 s[30:31], s[12:13]
+; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
;
; GISEL-LABEL: test_call_external_void_func_v32i32:
; GISEL: ; %bb.0:
; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s52, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s53, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s54, -1
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_load_dwordx16 s[8:23], s[0:1], 0x40
-; GISEL-NEXT: s_load_dwordx16 s[36:51], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s55, 0xe00000
-; GISEL-NEXT: s_add_u32 s52, s52, s3
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_addc_u32 s53, s53, 0
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s23
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v32i32 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v32i32 at rel32@hi+12
-; GISEL-NEXT: buffer_store_dword v0, off, s[52:55], s32
-; GISEL-NEXT: v_mov_b32_e32 v0, s36
-; GISEL-NEXT: v_mov_b32_e32 v1, s37
-; GISEL-NEXT: v_mov_b32_e32 v2, s38
-; GISEL-NEXT: v_mov_b32_e32 v3, s39
-; GISEL-NEXT: v_mov_b32_e32 v4, s40
-; GISEL-NEXT: v_mov_b32_e32 v5, s41
-; GISEL-NEXT: v_mov_b32_e32 v6, s42
-; GISEL-NEXT: v_mov_b32_e32 v7, s43
-; GISEL-NEXT: v_mov_b32_e32 v8, s44
-; GISEL-NEXT: v_mov_b32_e32 v9, s45
-; GISEL-NEXT: v_mov_b32_e32 v10, s46
-; GISEL-NEXT: v_mov_b32_e32 v11, s47
-; GISEL-NEXT: v_mov_b32_e32 v12, s48
-; GISEL-NEXT: v_mov_b32_e32 v13, s49
-; GISEL-NEXT: v_mov_b32_e32 v14, s50
-; GISEL-NEXT: v_mov_b32_e32 v15, s51
-; GISEL-NEXT: v_mov_b32_e32 v16, s8
-; GISEL-NEXT: v_mov_b32_e32 v17, s9
-; GISEL-NEXT: v_mov_b32_e32 v18, s10
-; GISEL-NEXT: v_mov_b32_e32 v19, s11
-; GISEL-NEXT: s_mov_b64 s[0:1], s[52:53]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[54:55]
-; GISEL-NEXT: v_mov_b32_e32 v20, s12
-; GISEL-NEXT: v_mov_b32_e32 v21, s13
-; GISEL-NEXT: v_mov_b32_e32 v22, s14
-; GISEL-NEXT: v_mov_b32_e32 v23, s15
-; GISEL-NEXT: v_mov_b32_e32 v24, s16
-; GISEL-NEXT: v_mov_b32_e32 v25, s17
-; GISEL-NEXT: v_mov_b32_e32 v26, s18
-; GISEL-NEXT: v_mov_b32_e32 v27, s19
-; GISEL-NEXT: v_mov_b32_e32 v28, s20
-; GISEL-NEXT: v_mov_b32_e32 v29, s21
-; GISEL-NEXT: v_mov_b32_e32 v30, s22
+; GISEL-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GISEL-NEXT: v_lshlrev_b32_e32 v24, 7, v0
+; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GISEL-NEXT: s_waitcnt lgkmcnt(0)
+; GISEL-NEXT: global_load_dwordx4 v[28:31], v24, s[0:1] offset:112
+; GISEL-NEXT: global_load_dwordx4 v[0:3], v24, s[0:1]
+; GISEL-NEXT: global_load_dwordx4 v[4:7], v24, s[0:1] offset:16
+; GISEL-NEXT: global_load_dwordx4 v[8:11], v24, s[0:1] offset:32
+; GISEL-NEXT: global_load_dwordx4 v[12:15], v24, s[0:1] offset:48
+; GISEL-NEXT: global_load_dwordx4 v[16:19], v24, s[0:1] offset:64
+; GISEL-NEXT: global_load_dwordx4 v[20:23], v24, s[0:1] offset:80
+; GISEL-NEXT: s_nop 0
+; GISEL-NEXT: global_load_dwordx4 v[24:27], v24, s[0:1] offset:96
+; GISEL-NEXT: s_mov_b32 s38, -1
+; GISEL-NEXT: s_mov_b32 s39, 0xe00000
+; GISEL-NEXT: s_add_u32 s36, s36, s5
+; GISEL-NEXT: s_addc_u32 s37, s37, 0
+; GISEL-NEXT: s_mov_b32 s32, 0
+; GISEL-NEXT: s_getpc_b64 s[4:5]
+; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v32i32 at rel32@lo+4
+; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v32i32 at rel32@hi+12
+; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GISEL-NEXT: s_waitcnt vmcnt(7)
+; GISEL-NEXT: buffer_store_dword v31, off, s[36:39], s32
; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
; GISEL-NEXT: s_endpgm
- %ptr = load ptr addrspace(1), ptr addrspace(4) poison
- %val = load <32 x i32>, ptr addrspace(1) %ptr
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <32 x i32>, ptr addrspace(1) %in, i32 %tid
+ %val = load <32 x i32>, ptr addrspace(1) %gep
call void @external_void_func_v32i32(<32 x i32> %val)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
+define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32, ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v32i32_i32:
; VI: ; %bb.0:
+; VI-NEXT: s_load_dwordx2 s[2:3], s[2:3], 0x2c
+; VI-NEXT: v_lshlrev_b32_e32 v1, 7, v0
; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
+; VI-NEXT: s_waitcnt lgkmcnt(0)
+; VI-NEXT: v_mov_b32_e32 v2, s3
+; VI-NEXT: v_add_u32_e32 v20, vcc, s2, v1
+; VI-NEXT: v_addc_u32_e32 v21, vcc, 0, v2, vcc
+; VI-NEXT: v_add_u32_e32 v4, vcc, 16, v20
+; VI-NEXT: v_addc_u32_e32 v5, vcc, 0, v21, vcc
+; VI-NEXT: v_add_u32_e32 v8, vcc, 32, v20
+; VI-NEXT: v_addc_u32_e32 v9, vcc, 0, v21, vcc
+; VI-NEXT: v_mul_hi_i32_i24_e32 v1, 0xffffff84, v0
+; VI-NEXT: v_mul_i32_i24_e32 v0, 0xffffff84, v0
+; VI-NEXT: v_add_u32_e32 v0, vcc, v20, v0
+; VI-NEXT: s_movk_i32 s2, 0x70
+; VI-NEXT: v_addc_u32_e32 v1, vcc, v21, v1, vcc
+; VI-NEXT: flat_load_dword v32, v[0:1]
+; VI-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; VI-NEXT: v_add_u32_e32 v0, vcc, s2, v20
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v21, vcc
+; VI-NEXT: v_add_u32_e32 v12, vcc, 48, v20
+; VI-NEXT: v_addc_u32_e32 v13, vcc, 0, v21, vcc
+; VI-NEXT: v_add_u32_e32 v16, vcc, 64, v20
+; VI-NEXT: v_addc_u32_e32 v17, vcc, 0, v21, vcc
+; VI-NEXT: s_movk_i32 s2, 0x50
+; VI-NEXT: v_add_u32_e32 v22, vcc, s2, v20
+; VI-NEXT: v_addc_u32_e32 v23, vcc, 0, v21, vcc
+; VI-NEXT: s_movk_i32 s2, 0x60
+; VI-NEXT: v_add_u32_e32 v24, vcc, s2, v20
+; VI-NEXT: v_addc_u32_e32 v25, vcc, 0, v21, vcc
+; VI-NEXT: flat_load_dwordx4 v[28:31], v[0:1]
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[20:21]
+; VI-NEXT: flat_load_dwordx4 v[8:11], v[8:9]
+; VI-NEXT: flat_load_dwordx4 v[12:15], v[12:13]
+; VI-NEXT: flat_load_dwordx4 v[16:19], v[16:17]
+; VI-NEXT: flat_load_dwordx4 v[20:23], v[22:23]
+; VI-NEXT: flat_load_dwordx4 v[24:27], v[24:25]
; VI-NEXT: s_mov_b32 s39, 0xe80000
; VI-NEXT: s_add_u32 s36, s36, s5
-; VI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
-; VI-NEXT: s_mov_b32 s7, 0xf000
-; VI-NEXT: s_mov_b32 s6, -1
; VI-NEXT: s_addc_u32 s37, s37, 0
-; VI-NEXT: s_waitcnt lgkmcnt(0)
-; VI-NEXT: buffer_load_dword v32, off, s[4:7], 0
-; VI-NEXT: buffer_load_dwordx4 v[28:31], off, s[4:7], 0 offset:112
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; VI-NEXT: buffer_load_dwordx4 v[4:7], off, s[4:7], 0 offset:16
-; VI-NEXT: buffer_load_dwordx4 v[8:11], off, s[4:7], 0 offset:32
-; VI-NEXT: buffer_load_dwordx4 v[12:15], off, s[4:7], 0 offset:48
-; VI-NEXT: buffer_load_dwordx4 v[16:19], off, s[4:7], 0 offset:64
-; VI-NEXT: buffer_load_dwordx4 v[20:23], off, s[4:7], 0 offset:80
-; VI-NEXT: buffer_load_dwordx4 v[24:27], off, s[4:7], 0 offset:96
; VI-NEXT: s_mov_b32 s32, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v32i32_i32 at rel32@lo+4
@@ -5389,7 +5402,7 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
; VI-NEXT: s_mov_b64 s[2:3], s[38:39]
; VI-NEXT: s_waitcnt vmcnt(8)
; VI-NEXT: buffer_store_dword v32, off, s[36:39], s32 offset:4
-; VI-NEXT: s_waitcnt vmcnt(8)
+; VI-NEXT: s_waitcnt vmcnt(7)
; VI-NEXT: buffer_store_dword v31, off, s[36:39], s32
; VI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; VI-NEXT: s_endpgm
@@ -5401,20 +5414,32 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
; CI-NEXT: s_add_u32 s36, s36, s5
-; CI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
+; CI-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0xb
+; CI-NEXT: v_mov_b32_e32 v8, v0
+; CI-NEXT: v_lshlrev_b32_e32 v28, 7, v8
+; CI-NEXT: v_mul_hi_i32_i24_e32 v11, 0xffffff84, v8
+; CI-NEXT: v_mul_i32_i24_e32 v8, 0xffffff84, v8
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: v_mov_b32_e32 v0, s5
+; CI-NEXT: v_add_i32_e32 v9, vcc, s4, v28
+; CI-NEXT: v_addc_u32_e32 v10, vcc, 0, v0, vcc
+; CI-NEXT: v_mov_b32_e32 v29, 0
; CI-NEXT: s_mov_b32 s7, 0xf000
-; CI-NEXT: s_mov_b32 s6, -1
+; CI-NEXT: s_mov_b32 s6, 0
+; CI-NEXT: v_add_i32_e32 v32, vcc, v9, v8
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[28:29], s[4:7], 0 addr64
+; CI-NEXT: buffer_load_dwordx4 v[4:7], v[28:29], s[4:7], 0 addr64 offset:16
+; CI-NEXT: v_addc_u32_e32 v33, vcc, v10, v11, vcc
+; CI-NEXT: buffer_load_dwordx4 v[8:11], v[28:29], s[4:7], 0 addr64 offset:32
+; CI-NEXT: buffer_load_dwordx4 v[12:15], v[28:29], s[4:7], 0 addr64 offset:48
+; CI-NEXT: buffer_load_dwordx4 v[16:19], v[28:29], s[4:7], 0 addr64 offset:64
+; CI-NEXT: buffer_load_dwordx4 v[20:23], v[28:29], s[4:7], 0 addr64 offset:80
+; CI-NEXT: buffer_load_dwordx4 v[24:27], v[28:29], s[4:7], 0 addr64 offset:96
+; CI-NEXT: buffer_load_dwordx4 v[28:31], v[28:29], s[4:7], 0 addr64 offset:112
+; CI-NEXT: s_mov_b32 s4, s6
+; CI-NEXT: s_mov_b32 s5, s6
+; CI-NEXT: buffer_load_dword v32, v[32:33], s[4:7], 0 addr64
; CI-NEXT: s_addc_u32 s37, s37, 0
-; CI-NEXT: s_waitcnt lgkmcnt(0)
-; CI-NEXT: buffer_load_dword v32, off, s[4:7], 0
-; CI-NEXT: buffer_load_dwordx4 v[28:31], off, s[4:7], 0 offset:112
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; CI-NEXT: buffer_load_dwordx4 v[4:7], off, s[4:7], 0 offset:16
-; CI-NEXT: buffer_load_dwordx4 v[8:11], off, s[4:7], 0 offset:32
-; CI-NEXT: buffer_load_dwordx4 v[12:15], off, s[4:7], 0 offset:48
-; CI-NEXT: buffer_load_dwordx4 v[16:19], off, s[4:7], 0 offset:64
-; CI-NEXT: buffer_load_dwordx4 v[20:23], off, s[4:7], 0 offset:80
-; CI-NEXT: buffer_load_dwordx4 v[24:27], off, s[4:7], 0 offset:96
; CI-NEXT: s_mov_b32 s32, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v32i32_i32 at rel32@lo+4
@@ -5422,10 +5447,10 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
; CI-NEXT: s_mov_b64 s[0:1], s[36:37]
; CI-NEXT: s_mov_b64 s[2:3], s[38:39]
-; CI-NEXT: s_waitcnt vmcnt(8)
-; CI-NEXT: buffer_store_dword v32, off, s[36:39], s32 offset:4
-; CI-NEXT: s_waitcnt vmcnt(8)
+; CI-NEXT: s_waitcnt vmcnt(1)
; CI-NEXT: buffer_store_dword v31, off, s[36:39], s32
+; CI-NEXT: s_waitcnt vmcnt(1)
+; CI-NEXT: buffer_store_dword v32, off, s[36:39], s32 offset:4
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
@@ -5436,20 +5461,28 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
; SDAG-NEXT: s_mov_b32 s38, -1
; SDAG-NEXT: s_mov_b32 s39, 0xe00000
; SDAG-NEXT: s_add_u32 s36, s36, s5
-; SDAG-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
-; SDAG-NEXT: s_mov_b32 s7, 0xf000
-; SDAG-NEXT: s_mov_b32 s6, -1
+; SDAG-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x2c
+; SDAG-NEXT: v_lshlrev_b32_e32 v26, 7, v0
+; SDAG-NEXT: v_mul_hi_i32_i24_e32 v3, 0xffffff84, v0
+; SDAG-NEXT: v_mul_i32_i24_e32 v0, 0xffffff84, v0
; SDAG-NEXT: s_addc_u32 s37, s37, 0
; SDAG-NEXT: s_waitcnt lgkmcnt(0)
-; SDAG-NEXT: buffer_load_dword v32, off, s[4:7], 0
-; SDAG-NEXT: buffer_load_dwordx4 v[28:31], off, s[4:7], 0 offset:112
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[4:7], 0
-; SDAG-NEXT: buffer_load_dwordx4 v[4:7], off, s[4:7], 0 offset:16
-; SDAG-NEXT: buffer_load_dwordx4 v[8:11], off, s[4:7], 0 offset:32
-; SDAG-NEXT: buffer_load_dwordx4 v[12:15], off, s[4:7], 0 offset:48
-; SDAG-NEXT: buffer_load_dwordx4 v[16:19], off, s[4:7], 0 offset:64
-; SDAG-NEXT: buffer_load_dwordx4 v[20:23], off, s[4:7], 0 offset:80
-; SDAG-NEXT: buffer_load_dwordx4 v[24:27], off, s[4:7], 0 offset:96
+; SDAG-NEXT: v_mov_b32_e32 v1, s5
+; SDAG-NEXT: v_add_co_u32_e32 v2, vcc, s4, v26
+; SDAG-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc
+; SDAG-NEXT: v_add_co_u32_e32 v24, vcc, v2, v0
+; SDAG-NEXT: v_addc_co_u32_e32 v25, vcc, v1, v3, vcc
+; SDAG-NEXT: global_load_dword v32, v[24:25], off
+; SDAG-NEXT: global_load_dwordx4 v[28:31], v26, s[4:5] offset:112
+; SDAG-NEXT: global_load_dwordx4 v[0:3], v26, s[4:5]
+; SDAG-NEXT: global_load_dwordx4 v[4:7], v26, s[4:5] offset:16
+; SDAG-NEXT: global_load_dwordx4 v[8:11], v26, s[4:5] offset:32
+; SDAG-NEXT: global_load_dwordx4 v[12:15], v26, s[4:5] offset:48
+; SDAG-NEXT: global_load_dwordx4 v[16:19], v26, s[4:5] offset:64
+; SDAG-NEXT: global_load_dwordx4 v[20:23], v26, s[4:5] offset:80
+; SDAG-NEXT: ; kill: killed $vgpr24 killed $vgpr25
+; SDAG-NEXT: s_nop 0
+; SDAG-NEXT: global_load_dwordx4 v[24:27], v26, s[4:5] offset:96
; SDAG-NEXT: s_mov_b32 s32, 0
; SDAG-NEXT: s_getpc_b64 s[4:5]
; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v32i32_i32 at rel32@lo+4
@@ -5466,25 +5499,32 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
;
; GFX11-LABEL: test_call_external_void_func_v32i32_i32:
; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
+; GFX11-NEXT: s_load_b64 s[2:3], s[2:3], 0x2c
+; GFX11-NEXT: v_lshlrev_b32_e32 v24, 7, v0
+; GFX11-NEXT: v_mul_hi_i32_i24_e32 v1, 0xffffff84, v0
+; GFX11-NEXT: v_mul_i32_i24_e32 v0, 0xffffff84, v0
; GFX11-NEXT: s_mov_b32 s32, 0
+; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-NEXT: v_add_co_u32 v2, s4, s2, v24
+; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
+; GFX11-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s4
+; GFX11-NEXT: v_add_co_u32 v0, vcc_lo, v2, v0
+; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, v3, v1, vcc_lo
+; GFX11-NEXT: s_clause 0x8
+; GFX11-NEXT: global_load_b128 v[28:31], v24, s[2:3] offset:112
+; GFX11-NEXT: global_load_b32 v32, v[0:1], off
+; GFX11-NEXT: global_load_b128 v[0:3], v24, s[2:3]
+; GFX11-NEXT: global_load_b128 v[4:7], v24, s[2:3] offset:16
+; GFX11-NEXT: global_load_b128 v[8:11], v24, s[2:3] offset:32
+; GFX11-NEXT: global_load_b128 v[12:15], v24, s[2:3] offset:48
+; GFX11-NEXT: global_load_b128 v[16:19], v24, s[2:3] offset:64
+; GFX11-NEXT: global_load_b128 v[20:23], v24, s[2:3] offset:80
+; GFX11-NEXT: global_load_b128 v[24:27], v24, s[2:3] offset:96
; GFX11-NEXT: s_getpc_b64 s[2:3]
; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v32i32_i32 at rel32@lo+4
; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v32i32_i32 at rel32@hi+12
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: s_clause 0x8
-; GFX11-NEXT: buffer_load_b128 v[28:31], off, s[4:7], 0 offset:112
-; GFX11-NEXT: buffer_load_b32 v32, off, s[4:7], 0
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: buffer_load_b128 v[4:7], off, s[4:7], 0 offset:16
-; GFX11-NEXT: buffer_load_b128 v[8:11], off, s[4:7], 0 offset:32
-; GFX11-NEXT: buffer_load_b128 v[12:15], off, s[4:7], 0 offset:48
-; GFX11-NEXT: buffer_load_b128 v[16:19], off, s[4:7], 0 offset:64
-; GFX11-NEXT: buffer_load_b128 v[20:23], off, s[4:7], 0 offset:80
-; GFX11-NEXT: buffer_load_b128 v[24:27], off, s[4:7], 0 offset:96
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
; GFX11-NEXT: s_add_i32 s4, s32, 4
; GFX11-NEXT: s_waitcnt vmcnt(8)
; GFX11-NEXT: scratch_store_b32 off, v31, s32
@@ -5495,23 +5535,46 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
;
; HSA-LABEL: test_call_external_void_func_v32i32_i32:
; HSA: ; %bb.0:
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x8
+; HSA-NEXT: v_lshlrev_b32_e32 v1, 7, v0
; HSA-NEXT: s_add_i32 s8, s8, s11
; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
-; HSA-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x0
-; HSA-NEXT: s_add_u32 s0, s0, s11
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
; HSA-NEXT: s_waitcnt lgkmcnt(0)
-; HSA-NEXT: buffer_load_dword v32, off, s[8:11], 0
-; HSA-NEXT: buffer_load_dwordx4 v[28:31], off, s[8:11], 0 offset:112
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
-; HSA-NEXT: buffer_load_dwordx4 v[4:7], off, s[8:11], 0 offset:16
-; HSA-NEXT: buffer_load_dwordx4 v[8:11], off, s[8:11], 0 offset:32
-; HSA-NEXT: buffer_load_dwordx4 v[12:15], off, s[8:11], 0 offset:48
-; HSA-NEXT: buffer_load_dwordx4 v[16:19], off, s[8:11], 0 offset:64
-; HSA-NEXT: buffer_load_dwordx4 v[20:23], off, s[8:11], 0 offset:80
-; HSA-NEXT: buffer_load_dwordx4 v[24:27], off, s[8:11], 0 offset:96
+; HSA-NEXT: v_mov_b32_e32 v2, s7
+; HSA-NEXT: v_add_u32_e32 v20, vcc, s6, v1
+; HSA-NEXT: v_addc_u32_e32 v21, vcc, 0, v2, vcc
+; HSA-NEXT: v_add_u32_e32 v4, vcc, 16, v20
+; HSA-NEXT: v_addc_u32_e32 v5, vcc, 0, v21, vcc
+; HSA-NEXT: v_add_u32_e32 v8, vcc, 32, v20
+; HSA-NEXT: v_addc_u32_e32 v9, vcc, 0, v21, vcc
+; HSA-NEXT: v_mul_hi_i32_i24_e32 v1, 0xffffff84, v0
+; HSA-NEXT: v_mul_i32_i24_e32 v0, 0xffffff84, v0
+; HSA-NEXT: v_add_u32_e32 v0, vcc, v20, v0
+; HSA-NEXT: s_movk_i32 s6, 0x70
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, v21, v1, vcc
+; HSA-NEXT: flat_load_dword v32, v[0:1]
+; HSA-NEXT: flat_load_dwordx4 v[4:7], v[4:5]
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v20
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v21, vcc
+; HSA-NEXT: v_add_u32_e32 v12, vcc, 48, v20
+; HSA-NEXT: v_addc_u32_e32 v13, vcc, 0, v21, vcc
+; HSA-NEXT: v_add_u32_e32 v16, vcc, 64, v20
+; HSA-NEXT: v_addc_u32_e32 v17, vcc, 0, v21, vcc
+; HSA-NEXT: s_movk_i32 s6, 0x50
+; HSA-NEXT: v_add_u32_e32 v22, vcc, s6, v20
+; HSA-NEXT: v_addc_u32_e32 v23, vcc, 0, v21, vcc
+; HSA-NEXT: s_movk_i32 s6, 0x60
+; HSA-NEXT: v_add_u32_e32 v24, vcc, s6, v20
+; HSA-NEXT: v_addc_u32_e32 v25, vcc, 0, v21, vcc
+; HSA-NEXT: flat_load_dwordx4 v[28:31], v[0:1]
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[20:21]
+; HSA-NEXT: flat_load_dwordx4 v[8:11], v[8:9]
+; HSA-NEXT: flat_load_dwordx4 v[12:15], v[12:13]
+; HSA-NEXT: flat_load_dwordx4 v[16:19], v[16:17]
+; HSA-NEXT: flat_load_dwordx4 v[20:23], v[22:23]
+; HSA-NEXT: flat_load_dwordx4 v[24:27], v[24:25]
+; HSA-NEXT: s_add_u32 s0, s0, s11
; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
@@ -5520,7 +5583,7 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
; HSA-NEXT: s_mov_b64 s[6:7], s[4:5]
; HSA-NEXT: s_waitcnt vmcnt(8)
; HSA-NEXT: buffer_store_dword v32, off, s[0:3], s32 offset:4
-; HSA-NEXT: s_waitcnt vmcnt(8)
+; HSA-NEXT: s_waitcnt vmcnt(7)
; HSA-NEXT: buffer_store_dword v31, off, s[0:3], s32
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
@@ -5528,66 +5591,51 @@ define amdgpu_kernel void @test_call_external_void_func_v32i32_i32(i32) #0 {
; GISEL-LABEL: test_call_external_void_func_v32i32_i32:
; GISEL: ; %bb.0:
; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s52, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s53, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s54, -1
+; GISEL-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x2c
+; GISEL-NEXT: v_lshlrev_b32_e32 v3, 7, v0
+; GISEL-NEXT: v_mul_hi_i32_i24_e32 v4, 0xffffff84, v0
+; GISEL-NEXT: v_mul_i32_i24_e32 v0, 0xffffff84, v0
+; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_load_dwordx16 s[8:23], s[0:1], 0x40
-; GISEL-NEXT: s_load_dwordx16 s[36:51], s[0:1], 0x0
-; GISEL-NEXT: s_load_dword s2, s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s55, 0xe00000
-; GISEL-NEXT: s_add_u32 s52, s52, s5
+; GISEL-NEXT: v_mov_b32_e32 v1, s0
+; GISEL-NEXT: v_mov_b32_e32 v2, s1
+; GISEL-NEXT: v_add_co_u32_e32 v1, vcc, v1, v3
+; GISEL-NEXT: v_addc_co_u32_e32 v2, vcc, 0, v2, vcc
+; GISEL-NEXT: v_add_co_u32_e32 v0, vcc, v1, v0
+; GISEL-NEXT: v_addc_co_u32_e32 v1, vcc, v2, v4, vcc
+; GISEL-NEXT: global_load_dword v32, v[0:1], off
+; GISEL-NEXT: global_load_dwordx4 v[28:31], v3, s[0:1] offset:112
+; GISEL-NEXT: global_load_dwordx4 v[4:7], v3, s[0:1] offset:16
+; GISEL-NEXT: global_load_dwordx4 v[8:11], v3, s[0:1] offset:32
+; GISEL-NEXT: global_load_dwordx4 v[12:15], v3, s[0:1] offset:48
+; GISEL-NEXT: global_load_dwordx4 v[16:19], v3, s[0:1] offset:64
+; GISEL-NEXT: global_load_dwordx4 v[20:23], v3, s[0:1] offset:80
+; GISEL-NEXT: global_load_dwordx4 v[24:27], v3, s[0:1] offset:96
+; GISEL-NEXT: ; kill: killed $vgpr0 killed $vgpr1
+; GISEL-NEXT: s_nop 0
+; GISEL-NEXT: global_load_dwordx4 v[0:3], v3, s[0:1]
+; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GISEL-NEXT: s_mov_b32 s38, -1
+; GISEL-NEXT: s_mov_b32 s39, 0xe00000
+; GISEL-NEXT: s_add_u32 s36, s36, s5
+; GISEL-NEXT: s_addc_u32 s37, s37, 0
; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_addc_u32 s53, s53, 0
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s2
-; GISEL-NEXT: buffer_store_dword v0, off, s[52:55], s32 offset:4
-; GISEL-NEXT: v_mov_b32_e32 v0, s23
-; GISEL-NEXT: ; kill: killed $sgpr0_sgpr1
-; GISEL-NEXT: ; kill: killed $sgpr0_sgpr1
; GISEL-NEXT: s_getpc_b64 s[4:5]
; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v32i32_i32 at rel32@lo+4
; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v32i32_i32 at rel32@hi+12
-; GISEL-NEXT: buffer_store_dword v0, off, s[52:55], s32
-; GISEL-NEXT: v_mov_b32_e32 v0, s36
-; GISEL-NEXT: v_mov_b32_e32 v1, s37
-; GISEL-NEXT: v_mov_b32_e32 v2, s38
-; GISEL-NEXT: v_mov_b32_e32 v3, s39
-; GISEL-NEXT: v_mov_b32_e32 v4, s40
-; GISEL-NEXT: v_mov_b32_e32 v5, s41
-; GISEL-NEXT: v_mov_b32_e32 v6, s42
-; GISEL-NEXT: v_mov_b32_e32 v7, s43
-; GISEL-NEXT: v_mov_b32_e32 v8, s44
-; GISEL-NEXT: v_mov_b32_e32 v9, s45
-; GISEL-NEXT: v_mov_b32_e32 v10, s46
-; GISEL-NEXT: v_mov_b32_e32 v11, s47
-; GISEL-NEXT: v_mov_b32_e32 v12, s48
-; GISEL-NEXT: v_mov_b32_e32 v13, s49
-; GISEL-NEXT: v_mov_b32_e32 v14, s50
-; GISEL-NEXT: v_mov_b32_e32 v15, s51
-; GISEL-NEXT: v_mov_b32_e32 v16, s8
-; GISEL-NEXT: v_mov_b32_e32 v17, s9
-; GISEL-NEXT: v_mov_b32_e32 v18, s10
-; GISEL-NEXT: v_mov_b32_e32 v19, s11
-; GISEL-NEXT: s_mov_b64 s[0:1], s[52:53]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[54:55]
-; GISEL-NEXT: v_mov_b32_e32 v20, s12
-; GISEL-NEXT: v_mov_b32_e32 v21, s13
-; GISEL-NEXT: v_mov_b32_e32 v22, s14
-; GISEL-NEXT: v_mov_b32_e32 v23, s15
-; GISEL-NEXT: v_mov_b32_e32 v24, s16
-; GISEL-NEXT: v_mov_b32_e32 v25, s17
-; GISEL-NEXT: v_mov_b32_e32 v26, s18
-; GISEL-NEXT: v_mov_b32_e32 v27, s19
-; GISEL-NEXT: v_mov_b32_e32 v28, s20
-; GISEL-NEXT: v_mov_b32_e32 v29, s21
-; GISEL-NEXT: v_mov_b32_e32 v30, s22
+; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GISEL-NEXT: s_waitcnt vmcnt(8)
+; GISEL-NEXT: buffer_store_dword v32, off, s[36:39], s32 offset:4
+; GISEL-NEXT: s_waitcnt vmcnt(8)
+; GISEL-NEXT: buffer_store_dword v31, off, s[36:39], s32
; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
; GISEL-NEXT: s_endpgm
- %ptr0 = load ptr addrspace(1), ptr addrspace(4) poison
- %val0 = load <32 x i32>, ptr addrspace(1) %ptr0
- %val1 = load i32, ptr addrspace(1) poison
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <32 x i32>, ptr addrspace(1) %in, i32 %tid
+ %val0 = load <32 x i32>, ptr addrspace(1) %gep
+ %gep1 = getelementptr i32, ptr addrspace(1) %in, i32 %tid
+ %val1 = load i32, ptr addrspace(1) %gep1
call void @external_void_func_v32i32_i32(<32 x i32> %val0, i32 %val1)
ret void
}
@@ -5730,21 +5778,25 @@ define amdgpu_kernel void @test_call_external_i32_func_i32_imm(ptr addrspace(1)
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_struct_i8_i32() #0 {
+define amdgpu_kernel void @test_call_external_void_func_struct_i8_i32(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_struct_i8_i32:
; VI: ; %bb.0:
-; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
-; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
; VI-NEXT: s_waitcnt lgkmcnt(0)
-; VI-NEXT: buffer_load_ubyte v0, off, s[0:3], 0
-; VI-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:4
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: v_add_u32_e32 v2, vcc, 4, v0
+; VI-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_ubyte v0, v[0:1]
+; VI-NEXT: flat_load_dword v1, v[2:3]
+; VI-NEXT: s_mov_b32 s39, 0xe80000
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_struct_i8_i32 at rel32@lo+4
@@ -5757,18 +5809,20 @@ define amdgpu_kernel void @test_call_external_void_func_struct_i8_i32() #0 {
;
; CI-LABEL: test_call_external_void_func_struct_i8_i32:
; CI: ; %bb.0:
-; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v1, 3, v0
+; CI-NEXT: v_mov_b32_e32 v2, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_ubyte v0, v[1:2], s[0:3], 0 addr64
+; CI-NEXT: buffer_load_dword v1, v[1:2], s[0:3], 0 addr64 offset:4
+; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: s_waitcnt lgkmcnt(0)
-; CI-NEXT: buffer_load_ubyte v0, off, s[0:3], 0
-; CI-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:4
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_struct_i8_i32 at rel32@lo+4
@@ -5779,77 +5833,80 @@ define amdgpu_kernel void @test_call_external_void_func_struct_i8_i32() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_struct_i8_i32:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: s_waitcnt lgkmcnt(0)
-; SDAG-NEXT: buffer_load_ubyte v0, off, s[0:3], 0
-; SDAG-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:4
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_struct_i8_i32 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_struct_i8_i32 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_struct_i8_i32:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_ubyte v0, v2, s[0:1]
+; GFX9-NEXT: global_load_dword v1, v2, s[0:1] offset:4
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_struct_i8_i32 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_struct_i8_i32 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
; GFX11-TRUE16-LABEL: test_call_external_void_func_struct_i8_i32:
; GFX11-TRUE16: ; %bb.0:
-; GFX11-TRUE16-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1
-; GFX11-TRUE16-NEXT: s_getpc_b64 s[2:3]
-; GFX11-TRUE16-NEXT: s_add_u32 s2, s2, external_void_func_struct_i8_i32 at rel32@lo+4
-; GFX11-TRUE16-NEXT: s_addc_u32 s3, s3, external_void_func_struct_i8_i32 at rel32@hi+12
+; GFX11-TRUE16-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 3, v0
+; GFX11-TRUE16-NEXT: s_mov_b64 s[6:7], s[0:1]
; GFX11-TRUE16-NEXT: s_mov_b32 s32, 0
; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)
; GFX11-TRUE16-NEXT: s_clause 0x1
-; GFX11-TRUE16-NEXT: buffer_load_d16_u8 v0, off, s[4:7], 0
-; GFX11-TRUE16-NEXT: buffer_load_b32 v1, off, s[4:7], 0 offset:4
-; GFX11-TRUE16-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-TRUE16-NEXT: global_load_d16_u8 v0, v1, s[2:3]
+; GFX11-TRUE16-NEXT: global_load_b32 v1, v1, s[2:3] offset:4
+; GFX11-TRUE16-NEXT: s_getpc_b64 s[2:3]
+; GFX11-TRUE16-NEXT: s_add_u32 s2, s2, external_void_func_struct_i8_i32 at rel32@lo+4
+; GFX11-TRUE16-NEXT: s_addc_u32 s3, s3, external_void_func_struct_i8_i32 at rel32@hi+12
+; GFX11-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-TRUE16-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-TRUE16-NEXT: s_endpgm
;
; GFX11-FAKE16-LABEL: test_call_external_void_func_struct_i8_i32:
; GFX11-FAKE16: ; %bb.0:
-; GFX11-FAKE16-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1
-; GFX11-FAKE16-NEXT: s_getpc_b64 s[2:3]
-; GFX11-FAKE16-NEXT: s_add_u32 s2, s2, external_void_func_struct_i8_i32 at rel32@lo+4
-; GFX11-FAKE16-NEXT: s_addc_u32 s3, s3, external_void_func_struct_i8_i32 at rel32@hi+12
+; GFX11-FAKE16-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v1, 3, v0
+; GFX11-FAKE16-NEXT: s_mov_b64 s[6:7], s[0:1]
; GFX11-FAKE16-NEXT: s_mov_b32 s32, 0
; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)
; GFX11-FAKE16-NEXT: s_clause 0x1
-; GFX11-FAKE16-NEXT: buffer_load_u8 v0, off, s[4:7], 0
-; GFX11-FAKE16-NEXT: buffer_load_b32 v1, off, s[4:7], 0 offset:4
-; GFX11-FAKE16-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-FAKE16-NEXT: global_load_u8 v0, v1, s[2:3]
+; GFX11-FAKE16-NEXT: global_load_b32 v1, v1, s[2:3] offset:4
+; GFX11-FAKE16-NEXT: s_getpc_b64 s[2:3]
+; GFX11-FAKE16-NEXT: s_add_u32 s2, s2, external_void_func_struct_i8_i32 at rel32@lo+4
+; GFX11-FAKE16-NEXT: s_addc_u32 s3, s3, external_void_func_struct_i8_i32 at rel32@hi+12
+; GFX11-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX11-FAKE16-NEXT: s_swappc_b64 s[30:31], s[2:3]
; GFX11-FAKE16-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_struct_i8_i32:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: s_addc_u32 s1, s1, 0
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 3, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
; HSA-NEXT: s_waitcnt lgkmcnt(0)
-; HSA-NEXT: buffer_load_ubyte v0, off, s[8:11], 0
-; HSA-NEXT: buffer_load_dword v1, off, s[8:11], 0 offset:4
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: v_add_u32_e32 v2, vcc, 4, v0
+; HSA-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_ubyte v0, v[0:1]
+; HSA-NEXT: flat_load_dword v1, v[2:3]
+; HSA-NEXT: s_add_u32 s0, s0, s11
+; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_struct_i8_i32 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_struct_i8_i32 at rel32@hi+12
@@ -5857,32 +5914,9 @@ define amdgpu_kernel void @test_call_external_void_func_struct_i8_i32() #0 {
; HSA-NEXT: s_mov_b32 s32, 0
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_struct_i8_i32:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_getpc_b64 s[8:9]
-; GISEL-NEXT: s_add_u32 s8, s8, external_void_func_struct_i8_i32 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s9, s9, external_void_func_struct_i8_i32 at rel32@hi+12
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: v_mov_b32_e32 v0, s4
-; GISEL-NEXT: v_mov_b32_e32 v1, s5
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9]
-; GISEL-NEXT: s_endpgm
- %ptr0 = load ptr addrspace(1), ptr addrspace(4) poison
- %val = load { i8, i32 }, ptr addrspace(1) %ptr0
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr { i8, i32 }, ptr addrspace(1) %in, i32 %tid
+ %val = load { i8, i32 }, ptr addrspace(1) %gep
call void @external_void_func_struct_i8_i32({ i8, i32 } %val)
ret void
}
@@ -6339,20 +6373,22 @@ define amdgpu_kernel void @test_call_external_void_func_sret_struct_i8_i32_byval
ret void
}
-define amdgpu_kernel void @test_call_external_void_func_v16i8() #0 {
+define amdgpu_kernel void @test_call_external_void_func_v16i8(ptr addrspace(1) %in) #0 {
; VI-LABEL: test_call_external_void_func_v16i8:
; VI: ; %bb.0:
-; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; VI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; VI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; VI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; VI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; VI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; VI-NEXT: s_mov_b32 s38, -1
-; VI-NEXT: s_mov_b32 s39, 0xe80000
-; VI-NEXT: s_add_u32 s36, s36, s3
-; VI-NEXT: s_mov_b32 s3, 0xf000
-; VI-NEXT: s_mov_b32 s2, -1
; VI-NEXT: s_waitcnt lgkmcnt(0)
-; VI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; VI-NEXT: v_mov_b32_e32 v1, s1
+; VI-NEXT: v_add_u32_e32 v0, vcc, s0, v0
+; VI-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; VI-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; VI-NEXT: s_mov_b32 s39, 0xe80000
+; VI-NEXT: s_add_u32 s36, s36, s5
; VI-NEXT: s_addc_u32 s37, s37, 0
; VI-NEXT: s_getpc_b64 s[4:5]
; VI-NEXT: s_add_u32 s4, s4, external_void_func_v16i8 at rel32@lo+4
@@ -6384,17 +6420,19 @@ define amdgpu_kernel void @test_call_external_void_func_v16i8() #0 {
;
; CI-LABEL: test_call_external_void_func_v16i8:
; CI: ; %bb.0:
-; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b64 s[6:7], s[0:1]
-; CI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
+; CI-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x9
+; CI-NEXT: s_mov_b32 s3, 0xf000
+; CI-NEXT: s_mov_b32 s2, 0
+; CI-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; CI-NEXT: v_mov_b32_e32 v1, 0
+; CI-NEXT: s_waitcnt lgkmcnt(0)
+; CI-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[0:3], 0 addr64
+; CI-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
; CI-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
; CI-NEXT: s_mov_b32 s38, -1
; CI-NEXT: s_mov_b32 s39, 0xe8f000
-; CI-NEXT: s_add_u32 s36, s36, s3
-; CI-NEXT: s_mov_b32 s3, 0xf000
-; CI-NEXT: s_mov_b32 s2, -1
-; CI-NEXT: s_waitcnt lgkmcnt(0)
-; CI-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
+; CI-NEXT: s_add_u32 s36, s36, s5
; CI-NEXT: s_addc_u32 s37, s37, 0
; CI-NEXT: s_getpc_b64 s[4:5]
; CI-NEXT: s_add_u32 s4, s4, external_void_func_v16i8 at rel32@lo+4
@@ -6424,92 +6462,123 @@ define amdgpu_kernel void @test_call_external_void_func_v16i8() #0 {
; CI-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CI-NEXT: s_endpgm
;
-; SDAG-LABEL: test_call_external_void_func_v16i8:
-; SDAG: ; %bb.0:
-; SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; SDAG-NEXT: s_mov_b64 s[6:7], s[0:1]
-; SDAG-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; SDAG-NEXT: s_mov_b32 s38, -1
-; SDAG-NEXT: s_mov_b32 s39, 0xe00000
-; SDAG-NEXT: s_add_u32 s36, s36, s3
-; SDAG-NEXT: s_mov_b32 s3, 0xf000
-; SDAG-NEXT: s_mov_b32 s2, -1
-; SDAG-NEXT: s_waitcnt lgkmcnt(0)
-; SDAG-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0
-; SDAG-NEXT: s_addc_u32 s37, s37, 0
-; SDAG-NEXT: s_getpc_b64 s[4:5]
-; SDAG-NEXT: s_add_u32 s4, s4, external_void_func_v16i8 at rel32@lo+4
-; SDAG-NEXT: s_addc_u32 s5, s5, external_void_func_v16i8 at rel32@hi+12
-; SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
-; SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
-; SDAG-NEXT: s_mov_b32 s32, 0
-; SDAG-NEXT: s_waitcnt vmcnt(0)
-; SDAG-NEXT: v_lshrrev_b32_e32 v16, 8, v0
-; SDAG-NEXT: v_lshrrev_b32_e32 v17, 16, v0
-; SDAG-NEXT: v_lshrrev_b32_e32 v18, 24, v0
-; SDAG-NEXT: v_lshrrev_b32_e32 v5, 8, v1
-; SDAG-NEXT: v_lshrrev_b32_e32 v6, 16, v1
-; SDAG-NEXT: v_lshrrev_b32_e32 v7, 24, v1
-; SDAG-NEXT: v_lshrrev_b32_e32 v9, 8, v2
-; SDAG-NEXT: v_lshrrev_b32_e32 v10, 16, v2
-; SDAG-NEXT: v_lshrrev_b32_e32 v11, 24, v2
-; SDAG-NEXT: v_lshrrev_b32_e32 v13, 8, v3
-; SDAG-NEXT: v_lshrrev_b32_e32 v14, 16, v3
-; SDAG-NEXT: v_lshrrev_b32_e32 v15, 24, v3
-; SDAG-NEXT: v_mov_b32_e32 v4, v1
-; SDAG-NEXT: v_mov_b32_e32 v8, v2
-; SDAG-NEXT: v_mov_b32_e32 v12, v3
-; SDAG-NEXT: v_mov_b32_e32 v1, v16
-; SDAG-NEXT: v_mov_b32_e32 v2, v17
-; SDAG-NEXT: v_mov_b32_e32 v3, v18
-; SDAG-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; SDAG-NEXT: s_endpgm
+; GFX9-LABEL: test_call_external_void_func_v16i8:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX9-NEXT: s_load_dwordx2 s[0:1], s[2:3], 0x24
+; GFX9-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX9-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
+; GFX9-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
+; GFX9-NEXT: s_mov_b32 s38, -1
+; GFX9-NEXT: s_waitcnt lgkmcnt(0)
+; GFX9-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]
+; GFX9-NEXT: s_mov_b32 s39, 0xe00000
+; GFX9-NEXT: s_add_u32 s36, s36, s5
+; GFX9-NEXT: s_addc_u32 s37, s37, 0
+; GFX9-NEXT: s_getpc_b64 s[4:5]
+; GFX9-NEXT: s_add_u32 s4, s4, external_void_func_v16i8 at rel32@lo+4
+; GFX9-NEXT: s_addc_u32 s5, s5, external_void_func_v16i8 at rel32@hi+12
+; GFX9-NEXT: s_mov_b64 s[0:1], s[36:37]
+; GFX9-NEXT: s_mov_b64 s[2:3], s[38:39]
+; GFX9-NEXT: s_mov_b32 s32, 0
+; GFX9-NEXT: s_waitcnt vmcnt(0)
+; GFX9-NEXT: v_lshrrev_b32_e32 v16, 8, v0
+; GFX9-NEXT: v_lshrrev_b32_e32 v17, 16, v0
+; GFX9-NEXT: v_lshrrev_b32_e32 v18, 24, v0
+; GFX9-NEXT: v_lshrrev_b32_e32 v5, 8, v1
+; GFX9-NEXT: v_lshrrev_b32_e32 v6, 16, v1
+; GFX9-NEXT: v_lshrrev_b32_e32 v7, 24, v1
+; GFX9-NEXT: v_lshrrev_b32_e32 v9, 8, v2
+; GFX9-NEXT: v_lshrrev_b32_e32 v10, 16, v2
+; GFX9-NEXT: v_lshrrev_b32_e32 v11, 24, v2
+; GFX9-NEXT: v_lshrrev_b32_e32 v13, 8, v3
+; GFX9-NEXT: v_lshrrev_b32_e32 v14, 16, v3
+; GFX9-NEXT: v_lshrrev_b32_e32 v15, 24, v3
+; GFX9-NEXT: v_mov_b32_e32 v4, v1
+; GFX9-NEXT: v_mov_b32_e32 v8, v2
+; GFX9-NEXT: v_mov_b32_e32 v12, v3
+; GFX9-NEXT: v_mov_b32_e32 v1, v16
+; GFX9-NEXT: v_mov_b32_e32 v2, v17
+; GFX9-NEXT: v_mov_b32_e32 v3, v18
+; GFX9-NEXT: s_swappc_b64 s[30:31], s[4:5]
+; GFX9-NEXT: s_endpgm
;
-; GFX11-LABEL: test_call_external_void_func_v16i8:
-; GFX11: ; %bb.0:
-; GFX11-NEXT: s_load_b64 s[4:5], s[0:1], 0x0
-; GFX11-NEXT: s_mov_b32 s7, 0x31016000
-; GFX11-NEXT: s_mov_b32 s6, -1
-; GFX11-NEXT: s_getpc_b64 s[2:3]
-; GFX11-NEXT: s_add_u32 s2, s2, external_void_func_v16i8 at rel32@lo+4
-; GFX11-NEXT: s_addc_u32 s3, s3, external_void_func_v16i8 at rel32@hi+12
-; GFX11-NEXT: s_mov_b32 s32, 0
-; GFX11-NEXT: s_waitcnt lgkmcnt(0)
-; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[4:7], 0
-; GFX11-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GFX11-NEXT: s_waitcnt vmcnt(0)
-; GFX11-NEXT: v_lshrrev_b32_e32 v16, 8, v0
-; GFX11-NEXT: v_lshrrev_b32_e32 v17, 16, v0
-; GFX11-NEXT: v_lshrrev_b32_e32 v18, 24, v0
-; GFX11-NEXT: v_lshrrev_b32_e32 v5, 8, v1
-; GFX11-NEXT: v_lshrrev_b32_e32 v6, 16, v1
-; GFX11-NEXT: v_lshrrev_b32_e32 v7, 24, v1
-; GFX11-NEXT: v_lshrrev_b32_e32 v9, 8, v2
-; GFX11-NEXT: v_lshrrev_b32_e32 v10, 16, v2
-; GFX11-NEXT: v_lshrrev_b32_e32 v11, 24, v2
-; GFX11-NEXT: v_lshrrev_b32_e32 v13, 8, v3
-; GFX11-NEXT: v_lshrrev_b32_e32 v14, 16, v3
-; GFX11-NEXT: v_lshrrev_b32_e32 v15, 24, v3
-; GFX11-NEXT: v_dual_mov_b32 v4, v1 :: v_dual_mov_b32 v1, v16
-; GFX11-NEXT: v_mov_b32_e32 v8, v2
-; GFX11-NEXT: v_dual_mov_b32 v12, v3 :: v_dual_mov_b32 v3, v18
-; GFX11-NEXT: v_mov_b32_e32 v2, v17
-; GFX11-NEXT: s_swappc_b64 s[30:31], s[2:3]
-; GFX11-NEXT: s_endpgm
+; GFX11-TRUE16-LABEL: test_call_external_void_func_v16i8:
+; GFX11-TRUE16: ; %bb.0:
+; GFX11-TRUE16-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX11-TRUE16-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-TRUE16-NEXT: s_mov_b32 s32, 0
+; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-TRUE16-NEXT: global_load_b128 v[16:19], v0, s[2:3]
+; GFX11-TRUE16-NEXT: s_getpc_b64 s[2:3]
+; GFX11-TRUE16-NEXT: s_add_u32 s2, s2, external_void_func_v16i8 at rel32@lo+4
+; GFX11-TRUE16-NEXT: s_addc_u32 s3, s3, external_void_func_v16i8 at rel32@hi+12
+; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 8, v16
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 24, v16
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 8, v17
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 24, v17
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v9, 8, v18
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v11, 24, v18
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v13, 8, v19
+; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v15, 24, v19
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, v16.l
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v2.l, v16.h
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v4.l, v17.l
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v6.l, v17.h
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v8.l, v18.l
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v10.l, v18.h
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v12.l, v19.l
+; GFX11-TRUE16-NEXT: v_mov_b16_e32 v14.l, v19.h
+; GFX11-TRUE16-NEXT: s_swappc_b64 s[30:31], s[2:3]
+; GFX11-TRUE16-NEXT: s_endpgm
+;
+; GFX11-FAKE16-LABEL: test_call_external_void_func_v16i8:
+; GFX11-FAKE16: ; %bb.0:
+; GFX11-FAKE16-NEXT: s_load_b64 s[2:3], s[2:3], 0x24
+; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; GFX11-FAKE16-NEXT: s_mov_b64 s[6:7], s[0:1]
+; GFX11-FAKE16-NEXT: s_mov_b32 s32, 0
+; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)
+; GFX11-FAKE16-NEXT: global_load_b128 v[0:3], v0, s[2:3]
+; GFX11-FAKE16-NEXT: s_getpc_b64 s[2:3]
+; GFX11-FAKE16-NEXT: s_add_u32 s2, s2, external_void_func_v16i8 at rel32@lo+4
+; GFX11-FAKE16-NEXT: s_addc_u32 s3, s3, external_void_func_v16i8 at rel32@hi+12
+; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v16, 8, v0
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v17, 16, v0
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v18, 24, v0
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 8, v1
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v1
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 24, v1
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v9, 8, v2
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v10, 16, v2
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v11, 24, v2
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v13, 8, v3
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v14, 16, v3
+; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v15, 24, v3
+; GFX11-FAKE16-NEXT: v_dual_mov_b32 v4, v1 :: v_dual_mov_b32 v1, v16
+; GFX11-FAKE16-NEXT: v_mov_b32_e32 v8, v2
+; GFX11-FAKE16-NEXT: v_dual_mov_b32 v12, v3 :: v_dual_mov_b32 v3, v18
+; GFX11-FAKE16-NEXT: v_mov_b32_e32 v2, v17
+; GFX11-FAKE16-NEXT: s_swappc_b64 s[30:31], s[2:3]
+; GFX11-FAKE16-NEXT: s_endpgm
;
; HSA-LABEL: test_call_external_void_func_v16i8:
; HSA: ; %bb.0:
-; HSA-NEXT: s_add_i32 s6, s6, s9
-; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8
-; HSA-NEXT: s_add_u32 s0, s0, s9
-; HSA-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x0
-; HSA-NEXT: s_mov_b32 s11, 0x1100f000
-; HSA-NEXT: s_mov_b32 s10, -1
-; HSA-NEXT: s_addc_u32 s1, s1, 0
-; HSA-NEXT: s_mov_b32 flat_scratch_lo, s7
+; HSA-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0
+; HSA-NEXT: v_lshlrev_b32_e32 v0, 4, v0
+; HSA-NEXT: s_add_i32 s8, s8, s11
+; HSA-NEXT: s_mov_b32 flat_scratch_lo, s9
+; HSA-NEXT: s_lshr_b32 flat_scratch_hi, s8, 8
; HSA-NEXT: s_waitcnt lgkmcnt(0)
-; HSA-NEXT: buffer_load_dwordx4 v[0:3], off, s[8:11], 0
+; HSA-NEXT: v_mov_b32_e32 v1, s7
+; HSA-NEXT: v_add_u32_e32 v0, vcc, s6, v0
+; HSA-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
+; HSA-NEXT: flat_load_dwordx4 v[0:3], v[0:1]
+; HSA-NEXT: s_add_u32 s0, s0, s11
+; HSA-NEXT: s_addc_u32 s1, s1, 0
; HSA-NEXT: s_getpc_b64 s[8:9]
; HSA-NEXT: s_add_u32 s8, s8, external_void_func_v16i8 at rel32@lo+4
; HSA-NEXT: s_addc_u32 s9, s9, external_void_func_v16i8 at rel32@hi+12
@@ -6536,58 +6605,9 @@ define amdgpu_kernel void @test_call_external_void_func_v16i8() #0 {
; HSA-NEXT: v_mov_b32_e32 v3, v18
; HSA-NEXT: s_swappc_b64 s[30:31], s[8:9]
; HSA-NEXT: s_endpgm
-;
-; GISEL-LABEL: test_call_external_void_func_v16i8:
-; GISEL: ; %bb.0:
-; GISEL-NEXT: s_mov_b64 s[6:7], s[0:1]
-; GISEL-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0
-; GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
-; GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
-; GISEL-NEXT: s_mov_b32 s38, -1
-; GISEL-NEXT: s_mov_b32 s39, 0xe00000
-; GISEL-NEXT: s_add_u32 s36, s36, s3
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0
-; GISEL-NEXT: s_addc_u32 s37, s37, 0
-; GISEL-NEXT: s_mov_b32 s32, 0
-; GISEL-NEXT: s_waitcnt lgkmcnt(0)
-; GISEL-NEXT: s_lshr_b32 s8, s0, 8
-; GISEL-NEXT: s_lshr_b32 s9, s0, 16
-; GISEL-NEXT: s_lshr_b32 s10, s0, 24
-; GISEL-NEXT: s_lshr_b32 s11, s1, 8
-; GISEL-NEXT: s_lshr_b32 s12, s1, 16
-; GISEL-NEXT: s_lshr_b32 s13, s1, 24
-; GISEL-NEXT: s_lshr_b32 s14, s2, 8
-; GISEL-NEXT: s_lshr_b32 s15, s2, 16
-; GISEL-NEXT: s_lshr_b32 s16, s2, 24
-; GISEL-NEXT: s_lshr_b32 s17, s3, 8
-; GISEL-NEXT: s_lshr_b32 s18, s3, 16
-; GISEL-NEXT: s_lshr_b32 s19, s3, 24
-; GISEL-NEXT: s_getpc_b64 s[4:5]
-; GISEL-NEXT: s_add_u32 s4, s4, external_void_func_v16i8 at rel32@lo+4
-; GISEL-NEXT: s_addc_u32 s5, s5, external_void_func_v16i8 at rel32@hi+12
-; GISEL-NEXT: v_mov_b32_e32 v0, s0
-; GISEL-NEXT: v_mov_b32_e32 v1, s8
-; GISEL-NEXT: v_mov_b32_e32 v2, s9
-; GISEL-NEXT: v_mov_b32_e32 v3, s10
-; GISEL-NEXT: v_mov_b32_e32 v4, s1
-; GISEL-NEXT: v_mov_b32_e32 v5, s11
-; GISEL-NEXT: v_mov_b32_e32 v6, s12
-; GISEL-NEXT: v_mov_b32_e32 v7, s13
-; GISEL-NEXT: v_mov_b32_e32 v8, s2
-; GISEL-NEXT: v_mov_b32_e32 v9, s14
-; GISEL-NEXT: v_mov_b32_e32 v10, s15
-; GISEL-NEXT: v_mov_b32_e32 v11, s16
-; GISEL-NEXT: v_mov_b32_e32 v12, s3
-; GISEL-NEXT: v_mov_b32_e32 v13, s17
-; GISEL-NEXT: v_mov_b32_e32 v14, s18
-; GISEL-NEXT: v_mov_b32_e32 v15, s19
-; GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
-; GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
-; GISEL-NEXT: s_swappc_b64 s[30:31], s[4:5]
-; GISEL-NEXT: s_endpgm
- %ptr = load ptr addrspace(1), ptr addrspace(4) poison
- %val = load <16 x i8>, ptr addrspace(1) %ptr
+ %tid = call i32 @llvm.amdgcn.workitem.id.x()
+ %gep = getelementptr <16 x i8>, ptr addrspace(1) %in, i32 %tid
+ %val = load <16 x i8>, ptr addrspace(1) %gep
call void @external_void_func_v16i8(<16 x i8> %val)
ret void
}
More information about the llvm-commits
mailing list