937 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; TODO: Run these for global isel as well.3; RUN: llc -mtriple=amdgcn -mcpu=gfx1013 < %s | FileCheck -check-prefixes=PRE-GFX12,GFX10,GFX1013 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck -check-prefixes=PRE-GFX12,GFX10,GFX1030 %s5; RUN: not --crash llc -mtriple=amdgcn -mcpu=gfx1012 < %s 2>&1 | FileCheck -check-prefix=ERR %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=PRE-GFX12,GFX11,GFX11-TRUE16 %s7; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=PRE-GFX12,GFX11,GFX11-FAKE16 %s8; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-SDAG-TRUE16 %s9; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-SDAG-FAKE16 %s10; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-GISEL-TRUE16 %s11; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-GISEL-FAKE16 %s12 13; uint4 llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(uint node_ptr, float ray_extent, float3 ray_origin, float3 ray_dir, float3 ray_inv_dir, uint4 texture_descr)14; uint4 llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(uint node_ptr, float ray_extent, float3 ray_origin, half3 ray_dir, half3 ray_inv_dir, uint4 texture_descr)15; uint4 llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(ulong node_ptr, float ray_extent, float3 ray_origin, float3 ray_dir, float3 ray_inv_dir, uint4 texture_descr)16; uint4 llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(ulong node_ptr, float ray_extent, float3 ray_origin, half3 ray_dir, half3 ray_inv_dir, uint4 texture_descr)17 18declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32, float, <3 x float>, <3 x float>, <3 x float>, <4 x i32>)19declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32, float, <3 x float>, <3 x half>, <3 x half>, <4 x i32>)20declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64, float, <3 x float>, <3 x float>, <3 x float>, <4 x i32>)21declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64, float, <3 x float>, <3 x half>, <3 x half>, <4 x i32>)22 23; ERR: in function image_bvh_intersect_ray{{.*}}intrinsic not supported on subtarget24; Arguments are flattened to represent the actual VGPR_A layout, so we have no25; extra moves in the generated kernel.26define amdgpu_ps <4 x float> @image_bvh_intersect_ray(i32 %node_ptr, float %ray_extent, float %ray_origin_x, float %ray_origin_y, float %ray_origin_z, float %ray_dir_x, float %ray_dir_y, float %ray_dir_z, float %ray_inv_dir_x, float %ray_inv_dir_y, float %ray_inv_dir_z, <4 x i32> inreg %tdescr) {27; PRE-GFX12-LABEL: image_bvh_intersect_ray:28; PRE-GFX12: ; %bb.0: ; %main_body29; PRE-GFX12-NEXT: image_bvh_intersect_ray v[0:3], v[0:10], s[0:3]30; PRE-GFX12-NEXT: s_waitcnt vmcnt(0)31; PRE-GFX12-NEXT: ; return to shader part epilog32;33; GFX12-LABEL: image_bvh_intersect_ray:34; GFX12: ; %bb.0: ; %main_body35; GFX12-NEXT: image_bvh_intersect_ray v[0:3], [v0, v1, v[2:4], v[5:7], v[8:10]], s[0:3]36; GFX12-NEXT: s_wait_bvhcnt 0x037; GFX12-NEXT: ; return to shader part epilog38main_body:39 %ray_origin0 = insertelement <3 x float> poison, float %ray_origin_x, i32 040 %ray_origin1 = insertelement <3 x float> %ray_origin0, float %ray_origin_y, i32 141 %ray_origin = insertelement <3 x float> %ray_origin1, float %ray_origin_z, i32 242 %ray_dir0 = insertelement <3 x float> poison, float %ray_dir_x, i32 043 %ray_dir1 = insertelement <3 x float> %ray_dir0, float %ray_dir_y, i32 144 %ray_dir = insertelement <3 x float> %ray_dir1, float %ray_dir_z, i32 245 %ray_inv_dir0 = insertelement <3 x float> poison, float %ray_inv_dir_x, i32 046 %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float %ray_inv_dir_y, i32 147 %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float %ray_inv_dir_z, i32 248 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)49 %r = bitcast <4 x i32> %v to <4 x float>50 ret <4 x float> %r51}52 53define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16(i32 inreg %node_ptr, float inreg %ray_extent, <3 x float> inreg %ray_origin, <3 x half> inreg %ray_dir, <3 x half> inreg %ray_inv_dir, <4 x i32> inreg %tdescr) {54; GFX10-LABEL: image_bvh_intersect_ray_a16:55; GFX10: ; %bb.0: ; %main_body56; GFX10-NEXT: s_mov_b32 s15, s1257; GFX10-NEXT: s_mov_b32 s12, s958; GFX10-NEXT: s_lshr_b32 s9, s7, 1659; GFX10-NEXT: s_pack_ll_b32_b16 s6, s6, s760; GFX10-NEXT: s_pack_ll_b32_b16 s7, s9, s861; GFX10-NEXT: v_mov_b32_e32 v0, s062; GFX10-NEXT: v_mov_b32_e32 v1, s163; GFX10-NEXT: v_mov_b32_e32 v2, s264; GFX10-NEXT: v_mov_b32_e32 v3, s365; GFX10-NEXT: v_mov_b32_e32 v4, s466; GFX10-NEXT: v_mov_b32_e32 v5, s567; GFX10-NEXT: v_mov_b32_e32 v6, s668; GFX10-NEXT: v_mov_b32_e32 v7, s769; GFX10-NEXT: s_mov_b32 s14, s1170; GFX10-NEXT: s_mov_b32 s13, s1071; GFX10-NEXT: image_bvh_intersect_ray v[0:3], v[0:7], s[12:15] a1672; GFX10-NEXT: s_waitcnt vmcnt(0)73; GFX10-NEXT: ; return to shader part epilog74;75; GFX11-LABEL: image_bvh_intersect_ray_a16:76; GFX11: ; %bb.0: ; %main_body77; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s378; GFX11-NEXT: s_lshr_b32 s2, s7, 1679; GFX11-NEXT: s_lshr_b32 s3, s5, 1680; GFX11-NEXT: v_dual_mov_b32 v6, s0 :: v_dual_mov_b32 v7, s181; GFX11-NEXT: s_pack_ll_b32_b16 s2, s3, s282; GFX11-NEXT: s_pack_ll_b32_b16 s3, s5, s783; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)84; GFX11-NEXT: v_dual_mov_b32 v2, s4 :: v_dual_mov_b32 v3, s385; GFX11-NEXT: s_pack_ll_b32_b16 s4, s6, s886; GFX11-NEXT: v_dual_mov_b32 v4, s2 :: v_dual_mov_b32 v5, s487; GFX11-NEXT: s_mov_b32 s15, s1288; GFX11-NEXT: s_mov_b32 s14, s1189; GFX11-NEXT: s_mov_b32 s13, s1090; GFX11-NEXT: s_mov_b32 s12, s991; GFX11-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[0:2], v[3:5]], s[12:15] a1692; GFX11-NEXT: s_waitcnt vmcnt(0)93; GFX11-NEXT: ; return to shader part epilog94;95; GFX12-SDAG-LABEL: image_bvh_intersect_ray_a16:96; GFX12-SDAG: ; %bb.0: ; %main_body97; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s398; GFX12-SDAG-NEXT: s_lshr_b32 s2, s7, 1699; GFX12-SDAG-NEXT: s_lshr_b32 s3, s5, 16100; GFX12-SDAG-NEXT: v_dual_mov_b32 v6, s0 :: v_dual_mov_b32 v7, s1101; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)102; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s2, s3, s2103; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s3, s5, s7104; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)105; GFX12-SDAG-NEXT: v_dual_mov_b32 v2, s4 :: v_dual_mov_b32 v3, s3106; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s4, s6, s8107; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)108; GFX12-SDAG-NEXT: v_dual_mov_b32 v4, s2 :: v_dual_mov_b32 v5, s4109; GFX12-SDAG-NEXT: s_mov_b32 s15, s12110; GFX12-SDAG-NEXT: s_mov_b32 s14, s11111; GFX12-SDAG-NEXT: s_mov_b32 s13, s10112; GFX12-SDAG-NEXT: s_mov_b32 s12, s9113; GFX12-SDAG-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[0:2], v[3:5]], s[12:15] a16114; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0115; GFX12-SDAG-NEXT: ; return to shader part epilog116;117; GFX12-GISEL-TRUE16-LABEL: image_bvh_intersect_ray_a16:118; GFX12-GISEL-TRUE16: ; %bb.0: ; %main_body119; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s20, s2120; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s22, s4121; GFX12-GISEL-TRUE16-NEXT: s_pack_ll_b32_b16 s4, s7, s5122; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s21, s3123; GFX12-GISEL-TRUE16-NEXT: s_pack_ll_b32_b16 s6, s8, s6124; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s5, s4125; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v0, s20 :: v_dual_mov_b32 v1, s21126; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v2, s22 :: v_dual_mov_b32 v3, s4127; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v6, s0 :: v_dual_mov_b32 v7, s1128; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v4, s5 :: v_dual_mov_b32 v5, s6129; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s16, s9130; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s17, s10131; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s18, s11132; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s19, s12133; GFX12-GISEL-TRUE16-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[0:2], v[3:5]], s[16:19] a16134; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0135; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog136;137; GFX12-GISEL-FAKE16-LABEL: image_bvh_intersect_ray_a16:138; GFX12-GISEL-FAKE16: ; %bb.0: ; %main_body139; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s20, s2140; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s22, s4141; GFX12-GISEL-FAKE16-NEXT: s_pack_ll_b32_b16 s4, s7, s5142; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s21, s3143; GFX12-GISEL-FAKE16-NEXT: s_pack_hh_b32_b16 s5, s7, s5144; GFX12-GISEL-FAKE16-NEXT: s_pack_ll_b32_b16 s6, s8, s6145; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v0, s20 :: v_dual_mov_b32 v1, s21146; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v2, s22 :: v_dual_mov_b32 v3, s4147; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v6, s0 :: v_dual_mov_b32 v7, s1148; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v4, s5 :: v_dual_mov_b32 v5, s6149; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s16, s9150; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s17, s10151; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s18, s11152; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s19, s12153; GFX12-GISEL-FAKE16-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[0:2], v[3:5]], s[16:19] a16154; GFX12-GISEL-FAKE16-NEXT: s_wait_bvhcnt 0x0155; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog156main_body:157 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)158 %r = bitcast <4 x i32> %v to <4 x float>159 ret <4 x float> %r160}161 162; Arguments are flattened to represent the actual VGPR_A layout, so we have no163; extra moves in the generated kernel.164define amdgpu_ps <4 x float> @image_bvh64_intersect_ray(<2 x i32> %node_ptr_vec, float %ray_extent, float %ray_origin_x, float %ray_origin_y, float %ray_origin_z, float %ray_dir_x, float %ray_dir_y, float %ray_dir_z, float %ray_inv_dir_x, float %ray_inv_dir_y, float %ray_inv_dir_z, <4 x i32> inreg %tdescr) {165; PRE-GFX12-LABEL: image_bvh64_intersect_ray:166; PRE-GFX12: ; %bb.0: ; %main_body167; PRE-GFX12-NEXT: image_bvh64_intersect_ray v[0:3], v[0:11], s[0:3]168; PRE-GFX12-NEXT: s_waitcnt vmcnt(0)169; PRE-GFX12-NEXT: ; return to shader part epilog170;171; GFX12-LABEL: image_bvh64_intersect_ray:172; GFX12: ; %bb.0: ; %main_body173; GFX12-NEXT: image_bvh64_intersect_ray v[0:3], [v[0:1], v2, v[3:5], v[6:8], v[9:11]], s[0:3]174; GFX12-NEXT: s_wait_bvhcnt 0x0175; GFX12-NEXT: ; return to shader part epilog176main_body:177 %node_ptr = bitcast <2 x i32> %node_ptr_vec to i64178 %ray_origin0 = insertelement <3 x float> poison, float %ray_origin_x, i32 0179 %ray_origin1 = insertelement <3 x float> %ray_origin0, float %ray_origin_y, i32 1180 %ray_origin = insertelement <3 x float> %ray_origin1, float %ray_origin_z, i32 2181 %ray_dir0 = insertelement <3 x float> poison, float %ray_dir_x, i32 0182 %ray_dir1 = insertelement <3 x float> %ray_dir0, float %ray_dir_y, i32 1183 %ray_dir = insertelement <3 x float> %ray_dir1, float %ray_dir_z, i32 2184 %ray_inv_dir0 = insertelement <3 x float> poison, float %ray_inv_dir_x, i32 0185 %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float %ray_inv_dir_y, i32 1186 %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float %ray_inv_dir_z, i32 2187 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)188 %r = bitcast <4 x i32> %v to <4 x float>189 ret <4 x float> %r190}191 192define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16(i64 inreg %node_ptr, float inreg %ray_extent, <3 x float> inreg %ray_origin, <3 x half> inreg %ray_dir, <3 x half> inreg %ray_inv_dir, <4 x i32> inreg %tdescr) {193; GFX10-LABEL: image_bvh64_intersect_ray_a16:194; GFX10: ; %bb.0: ; %main_body195; GFX10-NEXT: s_mov_b32 s14, s12196; GFX10-NEXT: s_mov_b32 s12, s10197; GFX10-NEXT: s_lshr_b32 s10, s8, 16198; GFX10-NEXT: s_pack_ll_b32_b16 s7, s7, s8199; GFX10-NEXT: s_pack_ll_b32_b16 s8, s10, s9200; GFX10-NEXT: v_mov_b32_e32 v0, s0201; GFX10-NEXT: v_mov_b32_e32 v1, s1202; GFX10-NEXT: v_mov_b32_e32 v2, s2203; GFX10-NEXT: v_mov_b32_e32 v3, s3204; GFX10-NEXT: v_mov_b32_e32 v4, s4205; GFX10-NEXT: v_mov_b32_e32 v5, s5206; GFX10-NEXT: v_mov_b32_e32 v6, s6207; GFX10-NEXT: v_mov_b32_e32 v7, s7208; GFX10-NEXT: v_mov_b32_e32 v8, s8209; GFX10-NEXT: s_mov_b32 s15, s13210; GFX10-NEXT: s_mov_b32 s13, s11211; GFX10-NEXT: image_bvh64_intersect_ray v[0:3], v[0:8], s[12:15] a16212; GFX10-NEXT: s_waitcnt vmcnt(0)213; GFX10-NEXT: ; return to shader part epilog214;215; GFX11-LABEL: image_bvh64_intersect_ray_a16:216; GFX11: ; %bb.0: ; %main_body217; GFX11-NEXT: v_dual_mov_b32 v0, s3 :: v_dual_mov_b32 v1, s4218; GFX11-NEXT: v_dual_mov_b32 v2, s5 :: v_dual_mov_b32 v7, s1219; GFX11-NEXT: s_lshr_b32 s3, s6, 16220; GFX11-NEXT: s_pack_ll_b32_b16 s1, s6, s8221; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_4) | instid1(SALU_CYCLE_1)222; GFX11-NEXT: v_dual_mov_b32 v6, s0 :: v_dual_mov_b32 v3, s1223; GFX11-NEXT: s_lshr_b32 s0, s8, 16224; GFX11-NEXT: v_mov_b32_e32 v8, s2225; GFX11-NEXT: s_pack_ll_b32_b16 s0, s3, s0226; GFX11-NEXT: s_pack_ll_b32_b16 s3, s7, s9227; GFX11-NEXT: v_dual_mov_b32 v4, s0 :: v_dual_mov_b32 v5, s3228; GFX11-NEXT: s_mov_b32 s15, s13229; GFX11-NEXT: s_mov_b32 s14, s12230; GFX11-NEXT: s_mov_b32 s13, s11231; GFX11-NEXT: s_mov_b32 s12, s10232; GFX11-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[0:2], v[3:5]], s[12:15] a16233; GFX11-NEXT: s_waitcnt vmcnt(0)234; GFX11-NEXT: ; return to shader part epilog235;236; GFX12-SDAG-LABEL: image_bvh64_intersect_ray_a16:237; GFX12-SDAG: ; %bb.0: ; %main_body238; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, s3 :: v_dual_mov_b32 v1, s4239; GFX12-SDAG-NEXT: v_dual_mov_b32 v2, s5 :: v_dual_mov_b32 v7, s1240; GFX12-SDAG-NEXT: s_lshr_b32 s3, s6, 16241; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s1, s6, s8242; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)243; GFX12-SDAG-NEXT: v_dual_mov_b32 v6, s0 :: v_dual_mov_b32 v3, s1244; GFX12-SDAG-NEXT: s_lshr_b32 s0, s8, 16245; GFX12-SDAG-NEXT: v_mov_b32_e32 v8, s2246; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)247; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s0, s3, s0248; GFX12-SDAG-NEXT: s_pack_ll_b32_b16 s3, s7, s9249; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)250; GFX12-SDAG-NEXT: v_dual_mov_b32 v4, s0 :: v_dual_mov_b32 v5, s3251; GFX12-SDAG-NEXT: s_mov_b32 s15, s13252; GFX12-SDAG-NEXT: s_mov_b32 s14, s12253; GFX12-SDAG-NEXT: s_mov_b32 s13, s11254; GFX12-SDAG-NEXT: s_mov_b32 s12, s10255; GFX12-SDAG-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[0:2], v[3:5]], s[12:15] a16256; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0257; GFX12-SDAG-NEXT: ; return to shader part epilog258;259; GFX12-GISEL-TRUE16-LABEL: image_bvh64_intersect_ray_a16:260; GFX12-GISEL-TRUE16: ; %bb.0: ; %main_body261; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s21, s4262; GFX12-GISEL-TRUE16-NEXT: s_pack_ll_b32_b16 s4, s8, s6263; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s20, s3264; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s22, s5265; GFX12-GISEL-TRUE16-NEXT: s_pack_ll_b32_b16 s6, s9, s7266; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s5, s4267; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v0, s20 :: v_dual_mov_b32 v3, s4268; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v7, s1 :: v_dual_mov_b32 v6, s0269; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v8, s2 :: v_dual_mov_b32 v1, s21270; GFX12-GISEL-TRUE16-NEXT: v_dual_mov_b32 v2, s22 :: v_dual_mov_b32 v5, s6271; GFX12-GISEL-TRUE16-NEXT: v_mov_b32_e32 v4, s5272; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s16, s10273; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s17, s11274; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s18, s12275; GFX12-GISEL-TRUE16-NEXT: s_mov_b32 s19, s13276; GFX12-GISEL-TRUE16-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[0:2], v[3:5]], s[16:19] a16277; GFX12-GISEL-TRUE16-NEXT: s_wait_bvhcnt 0x0278; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog279;280; GFX12-GISEL-FAKE16-LABEL: image_bvh64_intersect_ray_a16:281; GFX12-GISEL-FAKE16: ; %bb.0: ; %main_body282; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s20, s3283; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s21, s4284; GFX12-GISEL-FAKE16-NEXT: s_pack_ll_b32_b16 s4, s8, s6285; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s22, s5286; GFX12-GISEL-FAKE16-NEXT: s_pack_hh_b32_b16 s5, s8, s6287; GFX12-GISEL-FAKE16-NEXT: s_pack_ll_b32_b16 s6, s9, s7288; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v0, s20 :: v_dual_mov_b32 v3, s4289; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v7, s1 :: v_dual_mov_b32 v6, s0290; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v8, s2 :: v_dual_mov_b32 v1, s21291; GFX12-GISEL-FAKE16-NEXT: v_dual_mov_b32 v2, s22 :: v_dual_mov_b32 v5, s6292; GFX12-GISEL-FAKE16-NEXT: v_mov_b32_e32 v4, s5293; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s16, s10294; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s17, s11295; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s18, s12296; GFX12-GISEL-FAKE16-NEXT: s_mov_b32 s19, s13297; GFX12-GISEL-FAKE16-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[0:2], v[3:5]], s[16:19] a16298; GFX12-GISEL-FAKE16-NEXT: s_wait_bvhcnt 0x0299; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog300main_body:301 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)302 %r = bitcast <4 x i32> %v to <4 x float>303 ret <4 x float> %r304}305 306; TODO: NSA reassign is very limited and cannot work with VGPR tuples and subregs.307 308define amdgpu_kernel void @image_bvh_intersect_ray_nsa_reassign(ptr %p_node_ptr, ptr %p_ray, <4 x i32> %tdescr) {309; GFX1013-LABEL: image_bvh_intersect_ray_nsa_reassign:310; GFX1013: ; %bb.0: ; %main_body311; GFX1013-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x24312; GFX1013-NEXT: v_lshlrev_b32_e32 v0, 2, v0313; GFX1013-NEXT: v_mov_b32_e32 v10, 0x41000000314; GFX1013-NEXT: v_mov_b32_e32 v9, 0x40e00000315; GFX1013-NEXT: v_mov_b32_e32 v8, 0x40c00000316; GFX1013-NEXT: v_mov_b32_e32 v7, 0x40a00000317; GFX1013-NEXT: v_mov_b32_e32 v6, 4.0318; GFX1013-NEXT: s_waitcnt lgkmcnt(0)319; GFX1013-NEXT: v_add_co_u32 v2, s0, s8, v0320; GFX1013-NEXT: v_add_co_ci_u32_e64 v3, s0, s9, 0, s0321; GFX1013-NEXT: v_add_co_u32 v4, s0, s10, v0322; GFX1013-NEXT: v_add_co_ci_u32_e64 v5, s0, s11, 0, s0323; GFX1013-NEXT: flat_load_dword v0, v[2:3]324; GFX1013-NEXT: flat_load_dword v1, v[4:5]325; GFX1013-NEXT: v_mov_b32_e32 v2, 0326; GFX1013-NEXT: v_mov_b32_e32 v5, 0x40400000327; GFX1013-NEXT: v_mov_b32_e32 v4, 2.0328; GFX1013-NEXT: v_mov_b32_e32 v3, 1.0329; GFX1013-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)330; GFX1013-NEXT: image_bvh_intersect_ray v[0:3], v[0:10], s[12:15]331; GFX1013-NEXT: s_waitcnt vmcnt(0)332; GFX1013-NEXT: flat_store_dwordx4 v[0:1], v[0:3]333; GFX1013-NEXT: s_endpgm334;335; GFX1030-LABEL: image_bvh_intersect_ray_nsa_reassign:336; GFX1030: ; %bb.0: ; %main_body337; GFX1030-NEXT: s_load_dwordx8 s[0:7], s[4:5], 0x24338; GFX1030-NEXT: v_lshlrev_b32_e32 v2, 2, v0339; GFX1030-NEXT: v_mov_b32_e32 v10, 0x41000000340; GFX1030-NEXT: v_mov_b32_e32 v9, 0x40e00000341; GFX1030-NEXT: v_mov_b32_e32 v8, 0x40c00000342; GFX1030-NEXT: v_mov_b32_e32 v7, 0x40a00000343; GFX1030-NEXT: v_mov_b32_e32 v6, 4.0344; GFX1030-NEXT: v_mov_b32_e32 v5, 0x40400000345; GFX1030-NEXT: v_mov_b32_e32 v4, 2.0346; GFX1030-NEXT: s_waitcnt lgkmcnt(0)347; GFX1030-NEXT: v_add_co_u32 v0, s0, s0, v2348; GFX1030-NEXT: v_add_co_ci_u32_e64 v1, null, s1, 0, s0349; GFX1030-NEXT: v_add_co_u32 v2, s0, s2, v2350; GFX1030-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s0351; GFX1030-NEXT: flat_load_dword v0, v[0:1]352; GFX1030-NEXT: flat_load_dword v1, v[2:3]353; GFX1030-NEXT: v_mov_b32_e32 v2, 0354; GFX1030-NEXT: v_mov_b32_e32 v3, 1.0355; GFX1030-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)356; GFX1030-NEXT: image_bvh_intersect_ray v[0:3], v[0:10], s[4:7]357; GFX1030-NEXT: s_waitcnt vmcnt(0)358; GFX1030-NEXT: flat_store_dwordx4 v[0:1], v[0:3]359; GFX1030-NEXT: s_endpgm360;361; GFX11-LABEL: image_bvh_intersect_ray_nsa_reassign:362; GFX11: ; %bb.0: ; %main_body363; GFX11-NEXT: s_load_b256 s[0:7], s[4:5], 0x24364; GFX11-NEXT: v_dual_mov_b32 v7, 1.0 :: v_dual_and_b32 v0, 0x3ff, v0365; GFX11-NEXT: v_dual_mov_b32 v5, 0x40a00000 :: v_dual_mov_b32 v6, 0366; GFX11-NEXT: v_mov_b32_e32 v8, 2.0367; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2)368; GFX11-NEXT: v_lshlrev_b32_e32 v2, 2, v0369; GFX11-NEXT: v_mov_b32_e32 v4, 4.0370; GFX11-NEXT: s_waitcnt lgkmcnt(0)371; GFX11-NEXT: v_add_co_u32 v0, s0, s0, v2372; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)373; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s1, 0, s0374; GFX11-NEXT: v_add_co_u32 v2, s0, s2, v2375; GFX11-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s0376; GFX11-NEXT: flat_load_b32 v9, v[0:1]377; GFX11-NEXT: flat_load_b32 v10, v[2:3]378; GFX11-NEXT: v_mov_b32_e32 v0, 0x40c00000379; GFX11-NEXT: v_mov_b32_e32 v1, 0x40e00000380; GFX11-NEXT: v_mov_b32_e32 v2, 0x41000000381; GFX11-NEXT: v_mov_b32_e32 v3, 0x40400000382; GFX11-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)383; GFX11-NEXT: image_bvh_intersect_ray v[0:3], [v9, v10, v[6:8], v[3:5], v[0:2]], s[4:7]384; GFX11-NEXT: s_waitcnt vmcnt(0)385; GFX11-NEXT: flat_store_b128 v[0:1], v[0:3]386; GFX11-NEXT: s_endpgm387;388; GFX12-SDAG-LABEL: image_bvh_intersect_ray_nsa_reassign:389; GFX12-SDAG: ; %bb.0: ; %main_body390; GFX12-SDAG-NEXT: s_load_b256 s[0:7], s[4:5], 0x24391; GFX12-SDAG-NEXT: v_dual_mov_b32 v7, 1.0 :: v_dual_and_b32 v0, 0x3ff, v0392; GFX12-SDAG-NEXT: v_dual_mov_b32 v5, 0x40a00000 :: v_dual_mov_b32 v6, 0393; GFX12-SDAG-NEXT: v_mov_b32_e32 v8, 2.0394; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2)395; GFX12-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0396; GFX12-SDAG-NEXT: v_mov_b32_e32 v4, 4.0397; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0398; GFX12-SDAG-NEXT: v_add_co_u32 v0, s0, s0, v2399; GFX12-SDAG-NEXT: s_wait_alu depctr_va_sdst(0)400; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s1, 0, s0401; GFX12-SDAG-NEXT: v_add_co_u32 v2, s0, s2, v2402; GFX12-SDAG-NEXT: s_wait_alu depctr_va_sdst(0)403; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s0404; GFX12-SDAG-NEXT: flat_load_b32 v9, v[0:1]405; GFX12-SDAG-NEXT: flat_load_b32 v10, v[2:3]406; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0x40c00000407; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 0x40e00000408; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0x41000000409; GFX12-SDAG-NEXT: v_mov_b32_e32 v3, 0x40400000410; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0411; GFX12-SDAG-NEXT: image_bvh_intersect_ray v[0:3], [v9, v10, v[6:8], v[3:5], v[0:2]], s[4:7]412; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0413; GFX12-SDAG-NEXT: flat_store_b128 v[0:1], v[0:3]414; GFX12-SDAG-NEXT: s_endpgm415;416; GFX12-GISEL-LABEL: image_bvh_intersect_ray_nsa_reassign:417; GFX12-GISEL: ; %bb.0: ; %main_body418; GFX12-GISEL-NEXT: s_load_b256 s[0:7], s[4:5], 0x24419; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0420; GFX12-GISEL-NEXT: s_mov_b32 s10, 0x40a00000421; GFX12-GISEL-NEXT: s_mov_b32 s9, 4.0422; GFX12-GISEL-NEXT: s_mov_b32 s8, 0x40400000423; GFX12-GISEL-NEXT: s_mov_b32 s12, 0x40c00000424; GFX12-GISEL-NEXT: v_lshlrev_b32_e32 v4, 2, v0425; GFX12-GISEL-NEXT: s_mov_b32 s14, 0x41000000426; GFX12-GISEL-NEXT: s_mov_b32 s13, 0x40e00000427; GFX12-GISEL-NEXT: v_mov_b32_e32 v6, s12428; GFX12-GISEL-NEXT: v_dual_mov_b32 v8, s14 :: v_dual_mov_b32 v7, s13429; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0430; GFX12-GISEL-NEXT: v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3431; GFX12-GISEL-NEXT: s_mov_b32 s2, 2.0432; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1433; GFX12-GISEL-NEXT: s_mov_b32 s0, 0434; GFX12-GISEL-NEXT: s_mov_b32 s1, 1.0435; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)436; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, v4437; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo438; GFX12-GISEL-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4439; GFX12-GISEL-NEXT: s_wait_alu depctr_va_vcc(0)440; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v3, null, 0, v3, vcc_lo441; GFX12-GISEL-NEXT: flat_load_b32 v9, v[0:1]442; GFX12-GISEL-NEXT: flat_load_b32 v10, v[2:3]443; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)444; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v3, s8445; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, s1 :: v_dual_mov_b32 v2, s2446; GFX12-GISEL-NEXT: v_dual_mov_b32 v4, s9 :: v_dual_mov_b32 v5, s10447; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0448; GFX12-GISEL-NEXT: image_bvh_intersect_ray v[0:3], [v9, v10, v[0:2], v[3:5], v[6:8]], s[4:7]449; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0450; GFX12-GISEL-NEXT: flat_store_b128 v[0:1], v[0:3]451; GFX12-GISEL-NEXT: s_endpgm452main_body:453 %lid = tail call i32 @llvm.amdgcn.workitem.id.x()454 %gep_node_ptr = getelementptr inbounds i32, ptr %p_node_ptr, i32 %lid455 %node_ptr = load i32, ptr %gep_node_ptr, align 4456 %gep_ray = getelementptr inbounds float, ptr %p_ray, i32 %lid457 %ray_extent = load float, ptr %gep_ray, align 4458 %ray_origin0 = insertelement <3 x float> poison, float 0.0, i32 0459 %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1460 %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2461 %ray_dir0 = insertelement <3 x float> poison, float 3.0, i32 0462 %ray_dir1 = insertelement <3 x float> %ray_dir0, float 4.0, i32 1463 %ray_dir = insertelement <3 x float> %ray_dir1, float 5.0, i32 2464 %ray_inv_dir0 = insertelement <3 x float> poison, float 6.0, i32 0465 %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float 7.0, i32 1466 %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float 8.0, i32 2467 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)468 store <4 x i32> %v, ptr poison469 ret void470}471 472define amdgpu_kernel void @image_bvh_intersect_ray_a16_nsa_reassign(ptr %p_node_ptr, ptr %p_ray, <4 x i32> %tdescr) {473; GFX1013-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:474; GFX1013: ; %bb.0: ; %main_body475; GFX1013-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0x24476; GFX1013-NEXT: v_lshlrev_b32_e32 v0, 2, v0477; GFX1013-NEXT: v_mov_b32_e32 v7, 0x48004700478; GFX1013-NEXT: v_mov_b32_e32 v6, 0x46004500479; GFX1013-NEXT: s_waitcnt lgkmcnt(0)480; GFX1013-NEXT: v_add_co_u32 v2, s0, s8, v0481; GFX1013-NEXT: v_add_co_ci_u32_e64 v3, s0, s9, 0, s0482; GFX1013-NEXT: v_add_co_u32 v4, s0, s10, v0483; GFX1013-NEXT: v_add_co_ci_u32_e64 v5, s0, s11, 0, s0484; GFX1013-NEXT: flat_load_dword v0, v[2:3]485; GFX1013-NEXT: flat_load_dword v1, v[4:5]486; GFX1013-NEXT: v_mov_b32_e32 v2, 0487; GFX1013-NEXT: v_mov_b32_e32 v5, 0x44004200488; GFX1013-NEXT: v_mov_b32_e32 v4, 2.0489; GFX1013-NEXT: v_mov_b32_e32 v3, 1.0490; GFX1013-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)491; GFX1013-NEXT: image_bvh_intersect_ray v[0:3], v[0:7], s[12:15] a16492; GFX1013-NEXT: s_waitcnt vmcnt(0)493; GFX1013-NEXT: flat_store_dwordx4 v[0:1], v[0:3]494; GFX1013-NEXT: s_endpgm495;496; GFX1030-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:497; GFX1030: ; %bb.0: ; %main_body498; GFX1030-NEXT: s_load_dwordx8 s[0:7], s[4:5], 0x24499; GFX1030-NEXT: v_lshlrev_b32_e32 v2, 2, v0500; GFX1030-NEXT: v_mov_b32_e32 v7, 0x48004700501; GFX1030-NEXT: v_mov_b32_e32 v6, 0x46004500502; GFX1030-NEXT: v_mov_b32_e32 v5, 0x44004200503; GFX1030-NEXT: v_mov_b32_e32 v4, 2.0504; GFX1030-NEXT: s_waitcnt lgkmcnt(0)505; GFX1030-NEXT: v_add_co_u32 v0, s0, s0, v2506; GFX1030-NEXT: v_add_co_ci_u32_e64 v1, null, s1, 0, s0507; GFX1030-NEXT: v_add_co_u32 v2, s0, s2, v2508; GFX1030-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s0509; GFX1030-NEXT: flat_load_dword v0, v[0:1]510; GFX1030-NEXT: flat_load_dword v1, v[2:3]511; GFX1030-NEXT: v_mov_b32_e32 v2, 0512; GFX1030-NEXT: v_mov_b32_e32 v3, 1.0513; GFX1030-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)514; GFX1030-NEXT: image_bvh_intersect_ray v[0:3], v[0:7], s[4:7] a16515; GFX1030-NEXT: s_waitcnt vmcnt(0)516; GFX1030-NEXT: flat_store_dwordx4 v[0:1], v[0:3]517; GFX1030-NEXT: s_endpgm518;519; GFX11-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:520; GFX11: ; %bb.0: ; %main_body521; GFX11-NEXT: s_load_b256 s[0:7], s[4:5], 0x24522; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0523; GFX11-NEXT: v_dual_mov_b32 v4, 1.0 :: v_dual_mov_b32 v5, 2.0524; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)525; GFX11-NEXT: v_lshlrev_b32_e32 v2, 2, v0526; GFX11-NEXT: s_waitcnt lgkmcnt(0)527; GFX11-NEXT: v_add_co_u32 v0, s0, s0, v2528; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)529; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s1, 0, s0530; GFX11-NEXT: v_add_co_u32 v2, s0, s2, v2531; GFX11-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s0532; GFX11-NEXT: flat_load_b32 v6, v[0:1]533; GFX11-NEXT: flat_load_b32 v7, v[2:3]534; GFX11-NEXT: v_mov_b32_e32 v0, 0x46004200535; GFX11-NEXT: v_mov_b32_e32 v1, 0x47004400536; GFX11-NEXT: v_dual_mov_b32 v2, 0x48004500 :: v_dual_mov_b32 v3, 0537; GFX11-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)538; GFX11-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[3:5], v[0:2]], s[4:7] a16539; GFX11-NEXT: s_waitcnt vmcnt(0)540; GFX11-NEXT: flat_store_b128 v[0:1], v[0:3]541; GFX11-NEXT: s_endpgm542;543; GFX12-SDAG-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:544; GFX12-SDAG: ; %bb.0: ; %main_body545; GFX12-SDAG-NEXT: s_load_b256 s[0:7], s[4:5], 0x24546; GFX12-SDAG-NEXT: v_and_b32_e32 v0, 0x3ff, v0547; GFX12-SDAG-NEXT: v_dual_mov_b32 v4, 1.0 :: v_dual_mov_b32 v5, 2.0548; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)549; GFX12-SDAG-NEXT: v_lshlrev_b32_e32 v2, 2, v0550; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0551; GFX12-SDAG-NEXT: v_add_co_u32 v0, s0, s0, v2552; GFX12-SDAG-NEXT: s_wait_alu depctr_va_sdst(0)553; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s1, 0, s0554; GFX12-SDAG-NEXT: v_add_co_u32 v2, s0, s2, v2555; GFX12-SDAG-NEXT: s_wait_alu depctr_va_sdst(0)556; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v3, null, s3, 0, s0557; GFX12-SDAG-NEXT: flat_load_b32 v6, v[0:1]558; GFX12-SDAG-NEXT: flat_load_b32 v7, v[2:3]559; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0x46004200560; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 0x47004400561; GFX12-SDAG-NEXT: v_dual_mov_b32 v2, 0x48004500 :: v_dual_mov_b32 v3, 0562; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0563; GFX12-SDAG-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[3:5], v[0:2]], s[4:7] a16564; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0565; GFX12-SDAG-NEXT: flat_store_b128 v[0:1], v[0:3]566; GFX12-SDAG-NEXT: s_endpgm567;568; GFX12-GISEL-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:569; GFX12-GISEL: ; %bb.0: ; %main_body570; GFX12-GISEL-NEXT: s_load_b256 s[0:7], s[4:5], 0x24571; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0572; GFX12-GISEL-NEXT: s_mov_b32 s8, 0x42004600573; GFX12-GISEL-NEXT: s_mov_b32 s9, 0x44004700574; GFX12-GISEL-NEXT: s_mov_b32 s10, 0x45004800575; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)576; GFX12-GISEL-NEXT: v_lshlrev_b32_e32 v4, 2, v0577; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0578; GFX12-GISEL-NEXT: v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3579; GFX12-GISEL-NEXT: s_mov_b32 s2, 2.0580; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1581; GFX12-GISEL-NEXT: s_mov_b32 s0, 0582; GFX12-GISEL-NEXT: s_mov_b32 s1, 1.0583; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)584; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, v4585; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo586; GFX12-GISEL-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4587; GFX12-GISEL-NEXT: s_wait_alu depctr_va_vcc(0)588; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v3, null, 0, v3, vcc_lo589; GFX12-GISEL-NEXT: flat_load_b32 v6, v[0:1]590; GFX12-GISEL-NEXT: flat_load_b32 v7, v[2:3]591; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)592; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v3, s8593; GFX12-GISEL-NEXT: v_dual_mov_b32 v1, s1 :: v_dual_mov_b32 v2, s2594; GFX12-GISEL-NEXT: v_dual_mov_b32 v4, s9 :: v_dual_mov_b32 v5, s10595; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0596; GFX12-GISEL-NEXT: image_bvh_intersect_ray v[0:3], [v6, v7, v[0:2], v[3:5]], s[4:7] a16597; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0598; GFX12-GISEL-NEXT: flat_store_b128 v[0:1], v[0:3]599; GFX12-GISEL-NEXT: s_endpgm600main_body:601 %lid = tail call i32 @llvm.amdgcn.workitem.id.x()602 %gep_node_ptr = getelementptr inbounds i32, ptr %p_node_ptr, i32 %lid603 %node_ptr = load i32, ptr %gep_node_ptr, align 4604 %gep_ray = getelementptr inbounds float, ptr %p_ray, i32 %lid605 %ray_extent = load float, ptr %gep_ray, align 4606 %ray_origin0 = insertelement <3 x float> poison, float 0.0, i32 0607 %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1608 %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2609 %ray_dir0 = insertelement <3 x half> poison, half 3.0, i32 0610 %ray_dir1 = insertelement <3 x half> %ray_dir0, half 4.0, i32 1611 %ray_dir = insertelement <3 x half> %ray_dir1, half 5.0, i32 2612 %ray_inv_dir0 = insertelement <3 x half> poison, half 6.0, i32 0613 %ray_inv_dir1 = insertelement <3 x half> %ray_inv_dir0, half 7.0, i32 1614 %ray_inv_dir = insertelement <3 x half> %ray_inv_dir1, half 8.0, i32 2615 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)616 store <4 x i32> %v, ptr poison617 ret void618}619 620define amdgpu_kernel void @image_bvh64_intersect_ray_nsa_reassign(ptr %p_ray, <4 x i32> %tdescr) {621; GFX1013-LABEL: image_bvh64_intersect_ray_nsa_reassign:622; GFX1013: ; %bb.0: ; %main_body623; GFX1013-NEXT: s_clause 0x1624; GFX1013-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x24625; GFX1013-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34626; GFX1013-NEXT: v_lshlrev_b32_e32 v0, 2, v0627; GFX1013-NEXT: v_mov_b32_e32 v3, 0628; GFX1013-NEXT: v_mov_b32_e32 v11, 0x41000000629; GFX1013-NEXT: v_mov_b32_e32 v10, 0x40e00000630; GFX1013-NEXT: v_mov_b32_e32 v9, 0x40c00000631; GFX1013-NEXT: v_mov_b32_e32 v8, 0x40a00000632; GFX1013-NEXT: v_mov_b32_e32 v7, 4.0633; GFX1013-NEXT: v_mov_b32_e32 v6, 0x40400000634; GFX1013-NEXT: v_mov_b32_e32 v5, 2.0635; GFX1013-NEXT: v_mov_b32_e32 v4, 1.0636; GFX1013-NEXT: s_waitcnt lgkmcnt(0)637; GFX1013-NEXT: v_add_co_u32 v0, s4, s6, v0638; GFX1013-NEXT: v_add_co_ci_u32_e64 v1, s4, s7, 0, s4639; GFX1013-NEXT: flat_load_dword v2, v[0:1]640; GFX1013-NEXT: v_bfrev_b32_e32 v1, 4.0641; GFX1013-NEXT: v_mov_b32_e32 v0, 0xb36211c7642; GFX1013-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)643; GFX1013-NEXT: image_bvh64_intersect_ray v[0:3], v[0:11], s[0:3]644; GFX1013-NEXT: s_waitcnt vmcnt(0)645; GFX1013-NEXT: flat_store_dwordx4 v[0:1], v[0:3]646; GFX1013-NEXT: s_endpgm647;648; GFX1030-LABEL: image_bvh64_intersect_ray_nsa_reassign:649; GFX1030: ; %bb.0: ; %main_body650; GFX1030-NEXT: s_clause 0x1651; GFX1030-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x24652; GFX1030-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34653; GFX1030-NEXT: v_lshlrev_b32_e32 v0, 2, v0654; GFX1030-NEXT: v_mov_b32_e32 v3, 0655; GFX1030-NEXT: v_mov_b32_e32 v11, 0x41000000656; GFX1030-NEXT: v_mov_b32_e32 v10, 0x40e00000657; GFX1030-NEXT: v_mov_b32_e32 v9, 0x40c00000658; GFX1030-NEXT: v_mov_b32_e32 v8, 0x40a00000659; GFX1030-NEXT: v_mov_b32_e32 v7, 4.0660; GFX1030-NEXT: v_mov_b32_e32 v6, 0x40400000661; GFX1030-NEXT: v_mov_b32_e32 v5, 2.0662; GFX1030-NEXT: v_mov_b32_e32 v4, 1.0663; GFX1030-NEXT: s_waitcnt lgkmcnt(0)664; GFX1030-NEXT: v_add_co_u32 v0, s4, s6, v0665; GFX1030-NEXT: v_add_co_ci_u32_e64 v1, null, s7, 0, s4666; GFX1030-NEXT: flat_load_dword v2, v[0:1]667; GFX1030-NEXT: v_bfrev_b32_e32 v1, 4.0668; GFX1030-NEXT: v_mov_b32_e32 v0, 0xb36211c7669; GFX1030-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)670; GFX1030-NEXT: image_bvh64_intersect_ray v[0:3], v[0:11], s[0:3]671; GFX1030-NEXT: s_waitcnt vmcnt(0)672; GFX1030-NEXT: flat_store_dwordx4 v[0:1], v[0:3]673; GFX1030-NEXT: s_endpgm674;675; GFX11-LABEL: image_bvh64_intersect_ray_nsa_reassign:676; GFX11: ; %bb.0: ; %main_body677; GFX11-NEXT: s_clause 0x1678; GFX11-NEXT: s_load_b64 s[6:7], s[4:5], 0x24679; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x34680; GFX11-NEXT: v_dual_mov_b32 v7, 1.0 :: v_dual_and_b32 v0, 0x3ff, v0681; GFX11-NEXT: v_mov_b32_e32 v2, 0x41000000682; GFX11-NEXT: v_dual_mov_b32 v3, 0x40400000 :: v_dual_mov_b32 v4, 4.0683; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3)684; GFX11-NEXT: v_dual_mov_b32 v5, 0x40a00000 :: v_dual_lshlrev_b32 v0, 2, v0685; GFX11-NEXT: v_mov_b32_e32 v6, 0686; GFX11-NEXT: v_dual_mov_b32 v8, 2.0 :: v_dual_mov_b32 v9, 0xb36211c7687; GFX11-NEXT: v_bfrev_b32_e32 v10, 4.0688; GFX11-NEXT: s_waitcnt lgkmcnt(0)689; GFX11-NEXT: v_add_co_u32 v0, s4, s6, v0690; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)691; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s7, 0, s4692; GFX11-NEXT: flat_load_b32 v11, v[0:1]693; GFX11-NEXT: v_mov_b32_e32 v0, 0x40c00000694; GFX11-NEXT: v_mov_b32_e32 v1, 0x40e00000695; GFX11-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)696; GFX11-NEXT: image_bvh64_intersect_ray v[0:3], [v[9:10], v11, v[6:8], v[3:5], v[0:2]], s[0:3]697; GFX11-NEXT: s_waitcnt vmcnt(0)698; GFX11-NEXT: flat_store_b128 v[0:1], v[0:3]699; GFX11-NEXT: s_endpgm700;701; GFX12-SDAG-LABEL: image_bvh64_intersect_ray_nsa_reassign:702; GFX12-SDAG: ; %bb.0: ; %main_body703; GFX12-SDAG-NEXT: s_clause 0x1704; GFX12-SDAG-NEXT: s_load_b64 s[6:7], s[4:5], 0x24705; GFX12-SDAG-NEXT: s_load_b128 s[0:3], s[4:5], 0x34706; GFX12-SDAG-NEXT: v_dual_mov_b32 v7, 1.0 :: v_dual_and_b32 v0, 0x3ff, v0707; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0x41000000708; GFX12-SDAG-NEXT: v_dual_mov_b32 v3, 0x40400000 :: v_dual_mov_b32 v4, 4.0709; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_3)710; GFX12-SDAG-NEXT: v_dual_mov_b32 v5, 0x40a00000 :: v_dual_lshlrev_b32 v0, 2, v0711; GFX12-SDAG-NEXT: v_mov_b32_e32 v6, 0712; GFX12-SDAG-NEXT: v_dual_mov_b32 v8, 2.0 :: v_dual_mov_b32 v9, 0xb36211c7713; GFX12-SDAG-NEXT: v_bfrev_b32_e32 v10, 4.0714; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0715; GFX12-SDAG-NEXT: v_add_co_u32 v0, s4, s6, v0716; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)717; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s7, 0, s4718; GFX12-SDAG-NEXT: flat_load_b32 v11, v[0:1]719; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0x40c00000720; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 0x40e00000721; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0722; GFX12-SDAG-NEXT: image_bvh64_intersect_ray v[0:3], [v[9:10], v11, v[6:8], v[3:5], v[0:2]], s[0:3]723; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0724; GFX12-SDAG-NEXT: flat_store_b128 v[0:1], v[0:3]725; GFX12-SDAG-NEXT: s_endpgm726;727; GFX12-GISEL-LABEL: image_bvh64_intersect_ray_nsa_reassign:728; GFX12-GISEL: ; %bb.0: ; %main_body729; GFX12-GISEL-NEXT: s_clause 0x1730; GFX12-GISEL-NEXT: s_load_b64 s[6:7], s[4:5], 0x24731; GFX12-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x34732; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0733; GFX12-GISEL-NEXT: s_mov_b32 s5, 1.0734; GFX12-GISEL-NEXT: s_mov_b32 s4, 0735; GFX12-GISEL-NEXT: v_mov_b32_e32 v9, 0xb36211c7736; GFX12-GISEL-NEXT: s_mov_b32 s8, 0x40400000737; GFX12-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0738; GFX12-GISEL-NEXT: s_mov_b32 s12, 0x40c00000739; GFX12-GISEL-NEXT: s_mov_b32 s10, 0x40a00000740; GFX12-GISEL-NEXT: s_mov_b32 s9, 4.0741; GFX12-GISEL-NEXT: s_mov_b32 s14, 0x41000000742; GFX12-GISEL-NEXT: s_mov_b32 s13, 0x40e00000743; GFX12-GISEL-NEXT: v_mov_b32_e32 v6, s12744; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v10, 4.0745; GFX12-GISEL-NEXT: v_dual_mov_b32 v8, s14 :: v_dual_mov_b32 v3, s8746; GFX12-GISEL-NEXT: v_dual_mov_b32 v4, s9 :: v_dual_mov_b32 v7, s13747; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0748; GFX12-GISEL-NEXT: v_dual_mov_b32 v5, s10 :: v_dual_mov_b32 v0, s6749; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, s7750; GFX12-GISEL-NEXT: s_mov_b32 s6, 2.0751; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)752; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2753; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo754; GFX12-GISEL-NEXT: flat_load_b32 v11, v[0:1]755; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5756; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)757; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s6758; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0759; GFX12-GISEL-NEXT: image_bvh64_intersect_ray v[0:3], [v[9:10], v11, v[0:2], v[3:5], v[6:8]], s[0:3]760; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0761; GFX12-GISEL-NEXT: flat_store_b128 v[0:1], v[0:3]762; GFX12-GISEL-NEXT: s_endpgm763main_body:764 %lid = tail call i32 @llvm.amdgcn.workitem.id.x()765 %gep_ray = getelementptr inbounds float, ptr %p_ray, i32 %lid766 %ray_extent = load float, ptr %gep_ray, align 4767 %ray_origin0 = insertelement <3 x float> poison, float 0.0, i32 0768 %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1769 %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2770 %ray_dir0 = insertelement <3 x float> poison, float 3.0, i32 0771 %ray_dir1 = insertelement <3 x float> %ray_dir0, float 4.0, i32 1772 %ray_dir = insertelement <3 x float> %ray_dir1, float 5.0, i32 2773 %ray_inv_dir0 = insertelement <3 x float> poison, float 6.0, i32 0774 %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float 7.0, i32 1775 %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float 8.0, i32 2776 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64 1111111111111, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)777 store <4 x i32> %v, ptr poison778 ret void779}780 781define amdgpu_kernel void @image_bvh64_intersect_ray_a16_nsa_reassign(ptr %p_ray, <4 x i32> %tdescr) {782; GFX1013-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:783; GFX1013: ; %bb.0: ; %main_body784; GFX1013-NEXT: s_clause 0x1785; GFX1013-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x24786; GFX1013-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34787; GFX1013-NEXT: v_lshlrev_b32_e32 v0, 2, v0788; GFX1013-NEXT: v_mov_b32_e32 v3, 0789; GFX1013-NEXT: v_mov_b32_e32 v8, 0x48004700790; GFX1013-NEXT: v_mov_b32_e32 v7, 0x46004500791; GFX1013-NEXT: v_mov_b32_e32 v6, 0x44004200792; GFX1013-NEXT: v_mov_b32_e32 v5, 2.0793; GFX1013-NEXT: v_mov_b32_e32 v4, 1.0794; GFX1013-NEXT: s_waitcnt lgkmcnt(0)795; GFX1013-NEXT: v_add_co_u32 v0, s4, s6, v0796; GFX1013-NEXT: v_add_co_ci_u32_e64 v1, s4, s7, 0, s4797; GFX1013-NEXT: flat_load_dword v2, v[0:1]798; GFX1013-NEXT: v_bfrev_b32_e32 v1, 4.0799; GFX1013-NEXT: v_mov_b32_e32 v0, 0xb36211c6800; GFX1013-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)801; GFX1013-NEXT: image_bvh64_intersect_ray v[0:3], v[0:8], s[0:3] a16802; GFX1013-NEXT: s_waitcnt vmcnt(0)803; GFX1013-NEXT: flat_store_dwordx4 v[0:1], v[0:3]804; GFX1013-NEXT: s_endpgm805;806; GFX1030-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:807; GFX1030: ; %bb.0: ; %main_body808; GFX1030-NEXT: s_clause 0x1809; GFX1030-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x24810; GFX1030-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34811; GFX1030-NEXT: v_lshlrev_b32_e32 v0, 2, v0812; GFX1030-NEXT: v_mov_b32_e32 v3, 0813; GFX1030-NEXT: v_mov_b32_e32 v8, 0x48004700814; GFX1030-NEXT: v_mov_b32_e32 v7, 0x46004500815; GFX1030-NEXT: v_mov_b32_e32 v6, 0x44004200816; GFX1030-NEXT: v_mov_b32_e32 v5, 2.0817; GFX1030-NEXT: v_mov_b32_e32 v4, 1.0818; GFX1030-NEXT: s_waitcnt lgkmcnt(0)819; GFX1030-NEXT: v_add_co_u32 v0, s4, s6, v0820; GFX1030-NEXT: v_add_co_ci_u32_e64 v1, null, s7, 0, s4821; GFX1030-NEXT: flat_load_dword v2, v[0:1]822; GFX1030-NEXT: v_bfrev_b32_e32 v1, 4.0823; GFX1030-NEXT: v_mov_b32_e32 v0, 0xb36211c6824; GFX1030-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)825; GFX1030-NEXT: image_bvh64_intersect_ray v[0:3], v[0:8], s[0:3] a16826; GFX1030-NEXT: s_waitcnt vmcnt(0)827; GFX1030-NEXT: flat_store_dwordx4 v[0:1], v[0:3]828; GFX1030-NEXT: s_endpgm829;830; GFX11-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:831; GFX11: ; %bb.0: ; %main_body832; GFX11-NEXT: s_clause 0x1833; GFX11-NEXT: s_load_b64 s[6:7], s[4:5], 0x24834; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x34835; GFX11-NEXT: v_dual_mov_b32 v3, 0 :: v_dual_and_b32 v0, 0x3ff, v0836; GFX11-NEXT: v_mov_b32_e32 v2, 0x48004500837; GFX11-NEXT: v_mov_b32_e32 v4, 1.0838; GFX11-NEXT: v_mov_b32_e32 v6, 0xb36211c6839; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_3) | instid1(VALU_DEP_3)840; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0841; GFX11-NEXT: v_bfrev_b32_e32 v7, 4.0842; GFX11-NEXT: v_mov_b32_e32 v5, 2.0843; GFX11-NEXT: s_waitcnt lgkmcnt(0)844; GFX11-NEXT: v_add_co_u32 v0, s4, s6, v0845; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)846; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s7, 0, s4847; GFX11-NEXT: flat_load_b32 v8, v[0:1]848; GFX11-NEXT: v_mov_b32_e32 v0, 0x46004200849; GFX11-NEXT: v_mov_b32_e32 v1, 0x47004400850; GFX11-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)851; GFX11-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[3:5], v[0:2]], s[0:3] a16852; GFX11-NEXT: s_waitcnt vmcnt(0)853; GFX11-NEXT: flat_store_b128 v[0:1], v[0:3]854; GFX11-NEXT: s_endpgm855;856; GFX12-SDAG-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:857; GFX12-SDAG: ; %bb.0: ; %main_body858; GFX12-SDAG-NEXT: s_clause 0x1859; GFX12-SDAG-NEXT: s_load_b64 s[6:7], s[4:5], 0x24860; GFX12-SDAG-NEXT: s_load_b128 s[0:3], s[4:5], 0x34861; GFX12-SDAG-NEXT: v_dual_mov_b32 v3, 0 :: v_dual_and_b32 v0, 0x3ff, v0862; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, 0x48004500863; GFX12-SDAG-NEXT: v_mov_b32_e32 v4, 1.0864; GFX12-SDAG-NEXT: v_mov_b32_e32 v6, 0xb36211c6865; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_3) | instid1(VALU_DEP_3)866; GFX12-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0867; GFX12-SDAG-NEXT: v_bfrev_b32_e32 v7, 4.0868; GFX12-SDAG-NEXT: v_mov_b32_e32 v5, 2.0869; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0870; GFX12-SDAG-NEXT: v_add_co_u32 v0, s4, s6, v0871; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)872; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s7, 0, s4873; GFX12-SDAG-NEXT: flat_load_b32 v8, v[0:1]874; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 0x46004200875; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 0x47004400876; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x0877; GFX12-SDAG-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[3:5], v[0:2]], s[0:3] a16878; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x0879; GFX12-SDAG-NEXT: flat_store_b128 v[0:1], v[0:3]880; GFX12-SDAG-NEXT: s_endpgm881;882; GFX12-GISEL-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:883; GFX12-GISEL: ; %bb.0: ; %main_body884; GFX12-GISEL-NEXT: s_clause 0x1885; GFX12-GISEL-NEXT: s_load_b64 s[6:7], s[4:5], 0x24886; GFX12-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x34887; GFX12-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0888; GFX12-GISEL-NEXT: s_mov_b32 s5, 1.0889; GFX12-GISEL-NEXT: s_mov_b32 s4, 0890; GFX12-GISEL-NEXT: s_mov_b32 s8, 0x42004600891; GFX12-GISEL-NEXT: s_mov_b32 s9, 0x44004700892; GFX12-GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0893; GFX12-GISEL-NEXT: s_mov_b32 s10, 0x45004800894; GFX12-GISEL-NEXT: v_mov_b32_e32 v6, 0xb36211c6895; GFX12-GISEL-NEXT: v_bfrev_b32_e32 v7, 4.0896; GFX12-GISEL-NEXT: v_dual_mov_b32 v3, s8 :: v_dual_mov_b32 v4, s9897; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0898; GFX12-GISEL-NEXT: v_dual_mov_b32 v5, s10 :: v_dual_mov_b32 v0, s6899; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, s7900; GFX12-GISEL-NEXT: s_mov_b32 s6, 2.0901; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)902; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2903; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo904; GFX12-GISEL-NEXT: flat_load_b32 v8, v[0:1]905; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5906; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)907; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s6908; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x0909; GFX12-GISEL-NEXT: image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[0:2], v[3:5]], s[0:3] a16910; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x0911; GFX12-GISEL-NEXT: flat_store_b128 v[0:1], v[0:3]912; GFX12-GISEL-NEXT: s_endpgm913main_body:914 %lid = tail call i32 @llvm.amdgcn.workitem.id.x()915 %gep_ray = getelementptr inbounds float, ptr %p_ray, i32 %lid916 %ray_extent = load float, ptr %gep_ray, align 4917 %ray_origin0 = insertelement <3 x float> poison, float 0.0, i32 0918 %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1919 %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2920 %ray_dir0 = insertelement <3 x half> poison, half 3.0, i32 0921 %ray_dir1 = insertelement <3 x half> %ray_dir0, half 4.0, i32 1922 %ray_dir = insertelement <3 x half> %ray_dir1, half 5.0, i32 2923 %ray_inv_dir0 = insertelement <3 x half> poison, half 6.0, i32 0924 %ray_inv_dir1 = insertelement <3 x half> %ray_inv_dir0, half 7.0, i32 1925 %ray_inv_dir = insertelement <3 x half> %ray_inv_dir1, half 8.0, i32 2926 %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64 1111111111110, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)927 store <4 x i32> %v, ptr poison928 ret void929}930 931declare i32 @llvm.amdgcn.workitem.id.x()932;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:933; GFX11-FAKE16: {{.*}}934; GFX11-TRUE16: {{.*}}935; GFX12-SDAG-FAKE16: {{.*}}936; GFX12-SDAG-TRUE16: {{.*}}937