1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=2 -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 3; RUN: llc -mtriple=amdgcn-amd-amdhsa --amdhsa-code-object-version=2 -verify-machineinstrs -global-isel < %s | FileCheck -check-prefix=GISEL %s 4 5@gv.fptr0 = external hidden unnamed_addr addrspace(4) constant void()*, align 4 6@gv.fptr1 = external hidden unnamed_addr addrspace(4) constant void(i32)*, align 4 7 8define amdgpu_kernel void @test_indirect_call_sgpr_ptr(i8) { 9; GCN-LABEL: test_indirect_call_sgpr_ptr: 10; GCN: .amd_kernel_code_t 11; GCN-NEXT: amd_code_version_major = 1 12; GCN-NEXT: amd_code_version_minor = 2 13; GCN-NEXT: amd_machine_kind = 1 14; GCN-NEXT: amd_machine_version_major = 7 15; GCN-NEXT: amd_machine_version_minor = 0 16; GCN-NEXT: amd_machine_version_stepping = 0 17; GCN-NEXT: kernel_code_entry_byte_offset = 256 18; GCN-NEXT: kernel_code_prefetch_byte_size = 0 19; GCN-NEXT: granulated_workitem_vgpr_count = 10 20; GCN-NEXT: granulated_wavefront_sgpr_count = 8 21; GCN-NEXT: priority = 0 22; GCN-NEXT: float_mode = 240 23; GCN-NEXT: priv = 0 24; GCN-NEXT: enable_dx10_clamp = 1 25; GCN-NEXT: debug_mode = 0 26; GCN-NEXT: enable_ieee_mode = 1 27; GCN-NEXT: enable_wgp_mode = 0 28; GCN-NEXT: enable_mem_ordered = 0 29; GCN-NEXT: enable_fwd_progress = 0 30; GCN-NEXT: enable_sgpr_private_segment_wave_byte_offset = 1 31; GCN-NEXT: user_sgpr_count = 14 32; GCN-NEXT: enable_trap_handler = 0 33; GCN-NEXT: enable_sgpr_workgroup_id_x = 1 34; GCN-NEXT: enable_sgpr_workgroup_id_y = 1 35; GCN-NEXT: enable_sgpr_workgroup_id_z = 1 36; GCN-NEXT: enable_sgpr_workgroup_info = 0 37; GCN-NEXT: enable_vgpr_workitem_id = 2 38; GCN-NEXT: enable_exception_msb = 0 39; GCN-NEXT: granulated_lds_size = 0 40; GCN-NEXT: enable_exception = 0 41; GCN-NEXT: enable_sgpr_private_segment_buffer = 1 42; GCN-NEXT: enable_sgpr_dispatch_ptr = 1 43; GCN-NEXT: enable_sgpr_queue_ptr = 1 44; GCN-NEXT: enable_sgpr_kernarg_segment_ptr = 1 45; GCN-NEXT: enable_sgpr_dispatch_id = 1 46; GCN-NEXT: enable_sgpr_flat_scratch_init = 1 47; GCN-NEXT: enable_sgpr_private_segment_size = 0 48; GCN-NEXT: enable_sgpr_grid_workgroup_count_x = 0 49; GCN-NEXT: enable_sgpr_grid_workgroup_count_y = 0 50; GCN-NEXT: enable_sgpr_grid_workgroup_count_z = 0 51; GCN-NEXT: enable_wavefront_size32 = 0 52; GCN-NEXT: enable_ordered_append_gds = 0 53; GCN-NEXT: private_element_size = 1 54; GCN-NEXT: is_ptr64 = 1 55; GCN-NEXT: is_dynamic_callstack = 1 56; GCN-NEXT: is_debug_enabled = 0 57; GCN-NEXT: is_xnack_enabled = 0 58; GCN-NEXT: workitem_private_segment_byte_size = 16384 59; GCN-NEXT: workgroup_group_segment_byte_size = 0 60; GCN-NEXT: gds_segment_byte_size = 0 61; GCN-NEXT: kernarg_segment_byte_size = 64 62; GCN-NEXT: workgroup_fbarrier_count = 0 63; GCN-NEXT: wavefront_sgpr_count = 68 64; GCN-NEXT: workitem_vgpr_count = 42 65; GCN-NEXT: reserved_vgpr_first = 0 66; GCN-NEXT: reserved_vgpr_count = 0 67; GCN-NEXT: reserved_sgpr_first = 0 68; GCN-NEXT: reserved_sgpr_count = 0 69; GCN-NEXT: debug_wavefront_private_segment_offset_sgpr = 0 70; GCN-NEXT: debug_private_segment_buffer_sgpr = 0 71; GCN-NEXT: kernarg_segment_alignment = 4 72; GCN-NEXT: group_segment_alignment = 4 73; GCN-NEXT: private_segment_alignment = 4 74; GCN-NEXT: wavefront_size = 6 75; GCN-NEXT: call_convention = -1 76; GCN-NEXT: runtime_loader_kernel_symbol = 0 77; GCN-NEXT: .end_amd_kernel_code_t 78; GCN-NEXT: ; %bb.0: 79; GCN-NEXT: s_mov_b32 s32, 0 80; GCN-NEXT: s_mov_b32 flat_scratch_lo, s13 81; GCN-NEXT: s_add_i32 s12, s12, s17 82; GCN-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8 83; GCN-NEXT: s_add_u32 s0, s0, s17 84; GCN-NEXT: s_addc_u32 s1, s1, 0 85; GCN-NEXT: s_mov_b32 s13, s15 86; GCN-NEXT: s_mov_b32 s12, s14 87; GCN-NEXT: s_getpc_b64 s[14:15] 88; GCN-NEXT: s_add_u32 s14, s14, gv.fptr0@rel32@lo+4 89; GCN-NEXT: s_addc_u32 s15, s15, gv.fptr0@rel32@hi+12 90; GCN-NEXT: v_lshlrev_b32_e32 v2, 20, v2 91; GCN-NEXT: s_load_dwordx2 s[18:19], s[14:15], 0x0 92; GCN-NEXT: s_add_u32 s8, s8, 8 93; GCN-NEXT: s_addc_u32 s9, s9, 0 94; GCN-NEXT: v_lshlrev_b32_e32 v1, 10, v1 95; GCN-NEXT: v_or_b32_e32 v0, v0, v1 96; GCN-NEXT: v_or_b32_e32 v31, v0, v2 97; GCN-NEXT: s_mov_b32 s14, s16 98; GCN-NEXT: s_waitcnt lgkmcnt(0) 99; GCN-NEXT: s_swappc_b64 s[30:31], s[18:19] 100; GCN-NEXT: s_endpgm 101; 102; GISEL-LABEL: test_indirect_call_sgpr_ptr: 103; GISEL: .amd_kernel_code_t 104; GISEL-NEXT: amd_code_version_major = 1 105; GISEL-NEXT: amd_code_version_minor = 2 106; GISEL-NEXT: amd_machine_kind = 1 107; GISEL-NEXT: amd_machine_version_major = 7 108; GISEL-NEXT: amd_machine_version_minor = 0 109; GISEL-NEXT: amd_machine_version_stepping = 0 110; GISEL-NEXT: kernel_code_entry_byte_offset = 256 111; GISEL-NEXT: kernel_code_prefetch_byte_size = 0 112; GISEL-NEXT: granulated_workitem_vgpr_count = 10 113; GISEL-NEXT: granulated_wavefront_sgpr_count = 8 114; GISEL-NEXT: priority = 0 115; GISEL-NEXT: float_mode = 240 116; GISEL-NEXT: priv = 0 117; GISEL-NEXT: enable_dx10_clamp = 1 118; GISEL-NEXT: debug_mode = 0 119; GISEL-NEXT: enable_ieee_mode = 1 120; GISEL-NEXT: enable_wgp_mode = 0 121; GISEL-NEXT: enable_mem_ordered = 0 122; GISEL-NEXT: enable_fwd_progress = 0 123; GISEL-NEXT: enable_sgpr_private_segment_wave_byte_offset = 1 124; GISEL-NEXT: user_sgpr_count = 14 125; GISEL-NEXT: enable_trap_handler = 0 126; GISEL-NEXT: enable_sgpr_workgroup_id_x = 1 127; GISEL-NEXT: enable_sgpr_workgroup_id_y = 1 128; GISEL-NEXT: enable_sgpr_workgroup_id_z = 1 129; GISEL-NEXT: enable_sgpr_workgroup_info = 0 130; GISEL-NEXT: enable_vgpr_workitem_id = 2 131; GISEL-NEXT: enable_exception_msb = 0 132; GISEL-NEXT: granulated_lds_size = 0 133; GISEL-NEXT: enable_exception = 0 134; GISEL-NEXT: enable_sgpr_private_segment_buffer = 1 135; GISEL-NEXT: enable_sgpr_dispatch_ptr = 1 136; GISEL-NEXT: enable_sgpr_queue_ptr = 1 137; GISEL-NEXT: enable_sgpr_kernarg_segment_ptr = 1 138; GISEL-NEXT: enable_sgpr_dispatch_id = 1 139; GISEL-NEXT: enable_sgpr_flat_scratch_init = 1 140; GISEL-NEXT: enable_sgpr_private_segment_size = 0 141; GISEL-NEXT: enable_sgpr_grid_workgroup_count_x = 0 142; GISEL-NEXT: enable_sgpr_grid_workgroup_count_y = 0 143; GISEL-NEXT: enable_sgpr_grid_workgroup_count_z = 0 144; GISEL-NEXT: enable_wavefront_size32 = 0 145; GISEL-NEXT: enable_ordered_append_gds = 0 146; GISEL-NEXT: private_element_size = 1 147; GISEL-NEXT: is_ptr64 = 1 148; GISEL-NEXT: is_dynamic_callstack = 1 149; GISEL-NEXT: is_debug_enabled = 0 150; GISEL-NEXT: is_xnack_enabled = 0 151; GISEL-NEXT: workitem_private_segment_byte_size = 16384 152; GISEL-NEXT: workgroup_group_segment_byte_size = 0 153; GISEL-NEXT: gds_segment_byte_size = 0 154; GISEL-NEXT: kernarg_segment_byte_size = 64 155; GISEL-NEXT: workgroup_fbarrier_count = 0 156; GISEL-NEXT: wavefront_sgpr_count = 68 157; GISEL-NEXT: workitem_vgpr_count = 42 158; GISEL-NEXT: reserved_vgpr_first = 0 159; GISEL-NEXT: reserved_vgpr_count = 0 160; GISEL-NEXT: reserved_sgpr_first = 0 161; GISEL-NEXT: reserved_sgpr_count = 0 162; GISEL-NEXT: debug_wavefront_private_segment_offset_sgpr = 0 163; GISEL-NEXT: debug_private_segment_buffer_sgpr = 0 164; GISEL-NEXT: kernarg_segment_alignment = 4 165; GISEL-NEXT: group_segment_alignment = 4 166; GISEL-NEXT: private_segment_alignment = 4 167; GISEL-NEXT: wavefront_size = 6 168; GISEL-NEXT: call_convention = -1 169; GISEL-NEXT: runtime_loader_kernel_symbol = 0 170; GISEL-NEXT: .end_amd_kernel_code_t 171; GISEL-NEXT: ; %bb.0: 172; GISEL-NEXT: s_mov_b32 s32, 0 173; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13 174; GISEL-NEXT: s_add_i32 s12, s12, s17 175; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8 176; GISEL-NEXT: s_add_u32 s0, s0, s17 177; GISEL-NEXT: s_addc_u32 s1, s1, 0 178; GISEL-NEXT: s_mov_b32 s13, s15 179; GISEL-NEXT: s_mov_b32 s12, s14 180; GISEL-NEXT: s_getpc_b64 s[14:15] 181; GISEL-NEXT: s_add_u32 s14, s14, gv.fptr0@rel32@lo+4 182; GISEL-NEXT: s_addc_u32 s15, s15, gv.fptr0@rel32@hi+12 183; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1 184; GISEL-NEXT: s_load_dwordx2 s[18:19], s[14:15], 0x0 185; GISEL-NEXT: s_add_u32 s8, s8, 8 186; GISEL-NEXT: s_addc_u32 s9, s9, 0 187; GISEL-NEXT: v_or_b32_e32 v0, v0, v1 188; GISEL-NEXT: v_lshlrev_b32_e32 v1, 20, v2 189; GISEL-NEXT: v_or_b32_e32 v31, v0, v1 190; GISEL-NEXT: s_mov_b32 s14, s16 191; GISEL-NEXT: s_waitcnt lgkmcnt(0) 192; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19] 193; GISEL-NEXT: s_endpgm 194 %fptr = load void()*, void()* addrspace(4)* @gv.fptr0 195 call void %fptr() 196 ret void 197} 198 199define amdgpu_kernel void @test_indirect_call_sgpr_ptr_arg(i8) { 200; GCN-LABEL: test_indirect_call_sgpr_ptr_arg: 201; GCN: .amd_kernel_code_t 202; GCN-NEXT: amd_code_version_major = 1 203; GCN-NEXT: amd_code_version_minor = 2 204; GCN-NEXT: amd_machine_kind = 1 205; GCN-NEXT: amd_machine_version_major = 7 206; GCN-NEXT: amd_machine_version_minor = 0 207; GCN-NEXT: amd_machine_version_stepping = 0 208; GCN-NEXT: kernel_code_entry_byte_offset = 256 209; GCN-NEXT: kernel_code_prefetch_byte_size = 0 210; GCN-NEXT: granulated_workitem_vgpr_count = 10 211; GCN-NEXT: granulated_wavefront_sgpr_count = 8 212; GCN-NEXT: priority = 0 213; GCN-NEXT: float_mode = 240 214; GCN-NEXT: priv = 0 215; GCN-NEXT: enable_dx10_clamp = 1 216; GCN-NEXT: debug_mode = 0 217; GCN-NEXT: enable_ieee_mode = 1 218; GCN-NEXT: enable_wgp_mode = 0 219; GCN-NEXT: enable_mem_ordered = 0 220; GCN-NEXT: enable_fwd_progress = 0 221; GCN-NEXT: enable_sgpr_private_segment_wave_byte_offset = 1 222; GCN-NEXT: user_sgpr_count = 14 223; GCN-NEXT: enable_trap_handler = 0 224; GCN-NEXT: enable_sgpr_workgroup_id_x = 1 225; GCN-NEXT: enable_sgpr_workgroup_id_y = 1 226; GCN-NEXT: enable_sgpr_workgroup_id_z = 1 227; GCN-NEXT: enable_sgpr_workgroup_info = 0 228; GCN-NEXT: enable_vgpr_workitem_id = 2 229; GCN-NEXT: enable_exception_msb = 0 230; GCN-NEXT: granulated_lds_size = 0 231; GCN-NEXT: enable_exception = 0 232; GCN-NEXT: enable_sgpr_private_segment_buffer = 1 233; GCN-NEXT: enable_sgpr_dispatch_ptr = 1 234; GCN-NEXT: enable_sgpr_queue_ptr = 1 235; GCN-NEXT: enable_sgpr_kernarg_segment_ptr = 1 236; GCN-NEXT: enable_sgpr_dispatch_id = 1 237; GCN-NEXT: enable_sgpr_flat_scratch_init = 1 238; GCN-NEXT: enable_sgpr_private_segment_size = 0 239; GCN-NEXT: enable_sgpr_grid_workgroup_count_x = 0 240; GCN-NEXT: enable_sgpr_grid_workgroup_count_y = 0 241; GCN-NEXT: enable_sgpr_grid_workgroup_count_z = 0 242; GCN-NEXT: enable_wavefront_size32 = 0 243; GCN-NEXT: enable_ordered_append_gds = 0 244; GCN-NEXT: private_element_size = 1 245; GCN-NEXT: is_ptr64 = 1 246; GCN-NEXT: is_dynamic_callstack = 1 247; GCN-NEXT: is_debug_enabled = 0 248; GCN-NEXT: is_xnack_enabled = 0 249; GCN-NEXT: workitem_private_segment_byte_size = 16384 250; GCN-NEXT: workgroup_group_segment_byte_size = 0 251; GCN-NEXT: gds_segment_byte_size = 0 252; GCN-NEXT: kernarg_segment_byte_size = 64 253; GCN-NEXT: workgroup_fbarrier_count = 0 254; GCN-NEXT: wavefront_sgpr_count = 68 255; GCN-NEXT: workitem_vgpr_count = 42 256; GCN-NEXT: reserved_vgpr_first = 0 257; GCN-NEXT: reserved_vgpr_count = 0 258; GCN-NEXT: reserved_sgpr_first = 0 259; GCN-NEXT: reserved_sgpr_count = 0 260; GCN-NEXT: debug_wavefront_private_segment_offset_sgpr = 0 261; GCN-NEXT: debug_private_segment_buffer_sgpr = 0 262; GCN-NEXT: kernarg_segment_alignment = 4 263; GCN-NEXT: group_segment_alignment = 4 264; GCN-NEXT: private_segment_alignment = 4 265; GCN-NEXT: wavefront_size = 6 266; GCN-NEXT: call_convention = -1 267; GCN-NEXT: runtime_loader_kernel_symbol = 0 268; GCN-NEXT: .end_amd_kernel_code_t 269; GCN-NEXT: ; %bb.0: 270; GCN-NEXT: s_mov_b32 s32, 0 271; GCN-NEXT: s_mov_b32 flat_scratch_lo, s13 272; GCN-NEXT: s_add_i32 s12, s12, s17 273; GCN-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8 274; GCN-NEXT: s_add_u32 s0, s0, s17 275; GCN-NEXT: s_addc_u32 s1, s1, 0 276; GCN-NEXT: s_mov_b32 s13, s15 277; GCN-NEXT: s_mov_b32 s12, s14 278; GCN-NEXT: s_getpc_b64 s[14:15] 279; GCN-NEXT: s_add_u32 s14, s14, gv.fptr1@rel32@lo+4 280; GCN-NEXT: s_addc_u32 s15, s15, gv.fptr1@rel32@hi+12 281; GCN-NEXT: v_lshlrev_b32_e32 v2, 20, v2 282; GCN-NEXT: v_lshlrev_b32_e32 v1, 10, v1 283; GCN-NEXT: s_load_dwordx2 s[18:19], s[14:15], 0x0 284; GCN-NEXT: s_add_u32 s8, s8, 8 285; GCN-NEXT: s_addc_u32 s9, s9, 0 286; GCN-NEXT: v_or_b32_e32 v0, v0, v1 287; GCN-NEXT: v_or_b32_e32 v31, v0, v2 288; GCN-NEXT: v_mov_b32_e32 v0, 0x7b 289; GCN-NEXT: s_mov_b32 s14, s16 290; GCN-NEXT: s_waitcnt lgkmcnt(0) 291; GCN-NEXT: s_swappc_b64 s[30:31], s[18:19] 292; GCN-NEXT: s_endpgm 293; 294; GISEL-LABEL: test_indirect_call_sgpr_ptr_arg: 295; GISEL: .amd_kernel_code_t 296; GISEL-NEXT: amd_code_version_major = 1 297; GISEL-NEXT: amd_code_version_minor = 2 298; GISEL-NEXT: amd_machine_kind = 1 299; GISEL-NEXT: amd_machine_version_major = 7 300; GISEL-NEXT: amd_machine_version_minor = 0 301; GISEL-NEXT: amd_machine_version_stepping = 0 302; GISEL-NEXT: kernel_code_entry_byte_offset = 256 303; GISEL-NEXT: kernel_code_prefetch_byte_size = 0 304; GISEL-NEXT: granulated_workitem_vgpr_count = 10 305; GISEL-NEXT: granulated_wavefront_sgpr_count = 8 306; GISEL-NEXT: priority = 0 307; GISEL-NEXT: float_mode = 240 308; GISEL-NEXT: priv = 0 309; GISEL-NEXT: enable_dx10_clamp = 1 310; GISEL-NEXT: debug_mode = 0 311; GISEL-NEXT: enable_ieee_mode = 1 312; GISEL-NEXT: enable_wgp_mode = 0 313; GISEL-NEXT: enable_mem_ordered = 0 314; GISEL-NEXT: enable_fwd_progress = 0 315; GISEL-NEXT: enable_sgpr_private_segment_wave_byte_offset = 1 316; GISEL-NEXT: user_sgpr_count = 14 317; GISEL-NEXT: enable_trap_handler = 0 318; GISEL-NEXT: enable_sgpr_workgroup_id_x = 1 319; GISEL-NEXT: enable_sgpr_workgroup_id_y = 1 320; GISEL-NEXT: enable_sgpr_workgroup_id_z = 1 321; GISEL-NEXT: enable_sgpr_workgroup_info = 0 322; GISEL-NEXT: enable_vgpr_workitem_id = 2 323; GISEL-NEXT: enable_exception_msb = 0 324; GISEL-NEXT: granulated_lds_size = 0 325; GISEL-NEXT: enable_exception = 0 326; GISEL-NEXT: enable_sgpr_private_segment_buffer = 1 327; GISEL-NEXT: enable_sgpr_dispatch_ptr = 1 328; GISEL-NEXT: enable_sgpr_queue_ptr = 1 329; GISEL-NEXT: enable_sgpr_kernarg_segment_ptr = 1 330; GISEL-NEXT: enable_sgpr_dispatch_id = 1 331; GISEL-NEXT: enable_sgpr_flat_scratch_init = 1 332; GISEL-NEXT: enable_sgpr_private_segment_size = 0 333; GISEL-NEXT: enable_sgpr_grid_workgroup_count_x = 0 334; GISEL-NEXT: enable_sgpr_grid_workgroup_count_y = 0 335; GISEL-NEXT: enable_sgpr_grid_workgroup_count_z = 0 336; GISEL-NEXT: enable_wavefront_size32 = 0 337; GISEL-NEXT: enable_ordered_append_gds = 0 338; GISEL-NEXT: private_element_size = 1 339; GISEL-NEXT: is_ptr64 = 1 340; GISEL-NEXT: is_dynamic_callstack = 1 341; GISEL-NEXT: is_debug_enabled = 0 342; GISEL-NEXT: is_xnack_enabled = 0 343; GISEL-NEXT: workitem_private_segment_byte_size = 16384 344; GISEL-NEXT: workgroup_group_segment_byte_size = 0 345; GISEL-NEXT: gds_segment_byte_size = 0 346; GISEL-NEXT: kernarg_segment_byte_size = 64 347; GISEL-NEXT: workgroup_fbarrier_count = 0 348; GISEL-NEXT: wavefront_sgpr_count = 68 349; GISEL-NEXT: workitem_vgpr_count = 42 350; GISEL-NEXT: reserved_vgpr_first = 0 351; GISEL-NEXT: reserved_vgpr_count = 0 352; GISEL-NEXT: reserved_sgpr_first = 0 353; GISEL-NEXT: reserved_sgpr_count = 0 354; GISEL-NEXT: debug_wavefront_private_segment_offset_sgpr = 0 355; GISEL-NEXT: debug_private_segment_buffer_sgpr = 0 356; GISEL-NEXT: kernarg_segment_alignment = 4 357; GISEL-NEXT: group_segment_alignment = 4 358; GISEL-NEXT: private_segment_alignment = 4 359; GISEL-NEXT: wavefront_size = 6 360; GISEL-NEXT: call_convention = -1 361; GISEL-NEXT: runtime_loader_kernel_symbol = 0 362; GISEL-NEXT: .end_amd_kernel_code_t 363; GISEL-NEXT: ; %bb.0: 364; GISEL-NEXT: s_mov_b32 s32, 0 365; GISEL-NEXT: s_mov_b32 flat_scratch_lo, s13 366; GISEL-NEXT: s_add_i32 s12, s12, s17 367; GISEL-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8 368; GISEL-NEXT: s_add_u32 s0, s0, s17 369; GISEL-NEXT: s_addc_u32 s1, s1, 0 370; GISEL-NEXT: s_mov_b32 s13, s15 371; GISEL-NEXT: s_mov_b32 s12, s14 372; GISEL-NEXT: s_getpc_b64 s[14:15] 373; GISEL-NEXT: s_add_u32 s14, s14, gv.fptr1@rel32@lo+4 374; GISEL-NEXT: s_addc_u32 s15, s15, gv.fptr1@rel32@hi+12 375; GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1 376; GISEL-NEXT: s_load_dwordx2 s[18:19], s[14:15], 0x0 377; GISEL-NEXT: s_add_u32 s8, s8, 8 378; GISEL-NEXT: v_or_b32_e32 v0, v0, v1 379; GISEL-NEXT: s_addc_u32 s9, s9, 0 380; GISEL-NEXT: v_lshlrev_b32_e32 v1, 20, v2 381; GISEL-NEXT: v_or_b32_e32 v31, v0, v1 382; GISEL-NEXT: v_mov_b32_e32 v0, 0x7b 383; GISEL-NEXT: s_mov_b32 s14, s16 384; GISEL-NEXT: s_waitcnt lgkmcnt(0) 385; GISEL-NEXT: s_swappc_b64 s[30:31], s[18:19] 386; GISEL-NEXT: s_endpgm 387 %fptr = load void(i32)*, void(i32)* addrspace(4)* @gv.fptr1 388 call void %fptr(i32 123) 389 ret void 390} 391 392define void @test_indirect_call_vgpr_ptr(void()* %fptr) { 393; GCN-LABEL: test_indirect_call_vgpr_ptr: 394; GCN: ; %bb.0: 395; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 396; GCN-NEXT: s_or_saveexec_b64 s[16:17], -1 397; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 398; GCN-NEXT: s_mov_b64 exec, s[16:17] 399; GCN-NEXT: v_writelane_b32 v40, s33, 17 400; GCN-NEXT: s_mov_b32 s33, s32 401; GCN-NEXT: s_addk_i32 s32, 0x400 402; GCN-NEXT: v_writelane_b32 v40, s30, 0 403; GCN-NEXT: v_writelane_b32 v40, s31, 1 404; GCN-NEXT: v_writelane_b32 v40, s34, 2 405; GCN-NEXT: v_writelane_b32 v40, s35, 3 406; GCN-NEXT: v_writelane_b32 v40, s36, 4 407; GCN-NEXT: v_writelane_b32 v40, s37, 5 408; GCN-NEXT: v_writelane_b32 v40, s38, 6 409; GCN-NEXT: v_writelane_b32 v40, s39, 7 410; GCN-NEXT: v_writelane_b32 v40, s40, 8 411; GCN-NEXT: v_writelane_b32 v40, s41, 9 412; GCN-NEXT: v_writelane_b32 v40, s42, 10 413; GCN-NEXT: v_writelane_b32 v40, s43, 11 414; GCN-NEXT: v_writelane_b32 v40, s44, 12 415; GCN-NEXT: v_writelane_b32 v40, s46, 13 416; GCN-NEXT: v_writelane_b32 v40, s47, 14 417; GCN-NEXT: v_writelane_b32 v40, s48, 15 418; GCN-NEXT: v_writelane_b32 v40, s49, 16 419; GCN-NEXT: s_mov_b32 s42, s14 420; GCN-NEXT: s_mov_b32 s43, s13 421; GCN-NEXT: s_mov_b32 s44, s12 422; GCN-NEXT: s_mov_b64 s[34:35], s[10:11] 423; GCN-NEXT: s_mov_b64 s[36:37], s[8:9] 424; GCN-NEXT: s_mov_b64 s[38:39], s[6:7] 425; GCN-NEXT: s_mov_b64 s[40:41], s[4:5] 426; GCN-NEXT: s_mov_b64 s[46:47], exec 427; GCN-NEXT: .LBB2_1: ; =>This Inner Loop Header: Depth=1 428; GCN-NEXT: v_readfirstlane_b32 s16, v0 429; GCN-NEXT: v_readfirstlane_b32 s17, v1 430; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 431; GCN-NEXT: s_and_saveexec_b64 s[48:49], vcc 432; GCN-NEXT: s_mov_b64 s[4:5], s[40:41] 433; GCN-NEXT: s_mov_b64 s[6:7], s[38:39] 434; GCN-NEXT: s_mov_b64 s[8:9], s[36:37] 435; GCN-NEXT: s_mov_b64 s[10:11], s[34:35] 436; GCN-NEXT: s_mov_b32 s12, s44 437; GCN-NEXT: s_mov_b32 s13, s43 438; GCN-NEXT: s_mov_b32 s14, s42 439; GCN-NEXT: s_swappc_b64 s[30:31], s[16:17] 440; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1 441; GCN-NEXT: ; implicit-def: $vgpr31 442; GCN-NEXT: s_xor_b64 exec, exec, s[48:49] 443; GCN-NEXT: s_cbranch_execnz .LBB2_1 444; GCN-NEXT: ; %bb.2: 445; GCN-NEXT: s_mov_b64 exec, s[46:47] 446; GCN-NEXT: v_readlane_b32 s49, v40, 16 447; GCN-NEXT: v_readlane_b32 s48, v40, 15 448; GCN-NEXT: v_readlane_b32 s47, v40, 14 449; GCN-NEXT: v_readlane_b32 s46, v40, 13 450; GCN-NEXT: v_readlane_b32 s44, v40, 12 451; GCN-NEXT: v_readlane_b32 s43, v40, 11 452; GCN-NEXT: v_readlane_b32 s42, v40, 10 453; GCN-NEXT: v_readlane_b32 s41, v40, 9 454; GCN-NEXT: v_readlane_b32 s40, v40, 8 455; GCN-NEXT: v_readlane_b32 s39, v40, 7 456; GCN-NEXT: v_readlane_b32 s38, v40, 6 457; GCN-NEXT: v_readlane_b32 s37, v40, 5 458; GCN-NEXT: v_readlane_b32 s36, v40, 4 459; GCN-NEXT: v_readlane_b32 s35, v40, 3 460; GCN-NEXT: v_readlane_b32 s34, v40, 2 461; GCN-NEXT: v_readlane_b32 s31, v40, 1 462; GCN-NEXT: v_readlane_b32 s30, v40, 0 463; GCN-NEXT: s_addk_i32 s32, 0xfc00 464; GCN-NEXT: v_readlane_b32 s33, v40, 17 465; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 466; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 467; GCN-NEXT: s_mov_b64 exec, s[4:5] 468; GCN-NEXT: s_waitcnt vmcnt(0) 469; GCN-NEXT: s_setpc_b64 s[30:31] 470; 471; GISEL-LABEL: test_indirect_call_vgpr_ptr: 472; GISEL: ; %bb.0: 473; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 474; GISEL-NEXT: s_or_saveexec_b64 s[16:17], -1 475; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 476; GISEL-NEXT: s_mov_b64 exec, s[16:17] 477; GISEL-NEXT: v_writelane_b32 v40, s33, 17 478; GISEL-NEXT: s_mov_b32 s33, s32 479; GISEL-NEXT: s_addk_i32 s32, 0x400 480; GISEL-NEXT: v_writelane_b32 v40, s30, 0 481; GISEL-NEXT: v_writelane_b32 v40, s31, 1 482; GISEL-NEXT: v_writelane_b32 v40, s34, 2 483; GISEL-NEXT: v_writelane_b32 v40, s35, 3 484; GISEL-NEXT: v_writelane_b32 v40, s36, 4 485; GISEL-NEXT: v_writelane_b32 v40, s37, 5 486; GISEL-NEXT: v_writelane_b32 v40, s38, 6 487; GISEL-NEXT: v_writelane_b32 v40, s39, 7 488; GISEL-NEXT: v_writelane_b32 v40, s40, 8 489; GISEL-NEXT: v_writelane_b32 v40, s41, 9 490; GISEL-NEXT: v_writelane_b32 v40, s42, 10 491; GISEL-NEXT: v_writelane_b32 v40, s43, 11 492; GISEL-NEXT: v_writelane_b32 v40, s44, 12 493; GISEL-NEXT: v_writelane_b32 v40, s46, 13 494; GISEL-NEXT: v_writelane_b32 v40, s47, 14 495; GISEL-NEXT: v_writelane_b32 v40, s48, 15 496; GISEL-NEXT: v_writelane_b32 v40, s49, 16 497; GISEL-NEXT: s_mov_b32 s42, s14 498; GISEL-NEXT: s_mov_b32 s43, s13 499; GISEL-NEXT: s_mov_b32 s44, s12 500; GISEL-NEXT: s_mov_b64 s[34:35], s[10:11] 501; GISEL-NEXT: s_mov_b64 s[36:37], s[8:9] 502; GISEL-NEXT: s_mov_b64 s[38:39], s[6:7] 503; GISEL-NEXT: s_mov_b64 s[40:41], s[4:5] 504; GISEL-NEXT: s_mov_b64 s[46:47], exec 505; GISEL-NEXT: .LBB2_1: ; =>This Inner Loop Header: Depth=1 506; GISEL-NEXT: v_readfirstlane_b32 s16, v0 507; GISEL-NEXT: v_readfirstlane_b32 s17, v1 508; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 509; GISEL-NEXT: s_and_saveexec_b64 s[48:49], vcc 510; GISEL-NEXT: s_mov_b64 s[4:5], s[40:41] 511; GISEL-NEXT: s_mov_b64 s[6:7], s[38:39] 512; GISEL-NEXT: s_mov_b64 s[8:9], s[36:37] 513; GISEL-NEXT: s_mov_b64 s[10:11], s[34:35] 514; GISEL-NEXT: s_mov_b32 s12, s44 515; GISEL-NEXT: s_mov_b32 s13, s43 516; GISEL-NEXT: s_mov_b32 s14, s42 517; GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17] 518; GISEL-NEXT: ; implicit-def: $vgpr0 519; GISEL-NEXT: ; implicit-def: $vgpr31 520; GISEL-NEXT: s_xor_b64 exec, exec, s[48:49] 521; GISEL-NEXT: s_cbranch_execnz .LBB2_1 522; GISEL-NEXT: ; %bb.2: 523; GISEL-NEXT: s_mov_b64 exec, s[46:47] 524; GISEL-NEXT: v_readlane_b32 s49, v40, 16 525; GISEL-NEXT: v_readlane_b32 s48, v40, 15 526; GISEL-NEXT: v_readlane_b32 s47, v40, 14 527; GISEL-NEXT: v_readlane_b32 s46, v40, 13 528; GISEL-NEXT: v_readlane_b32 s44, v40, 12 529; GISEL-NEXT: v_readlane_b32 s43, v40, 11 530; GISEL-NEXT: v_readlane_b32 s42, v40, 10 531; GISEL-NEXT: v_readlane_b32 s41, v40, 9 532; GISEL-NEXT: v_readlane_b32 s40, v40, 8 533; GISEL-NEXT: v_readlane_b32 s39, v40, 7 534; GISEL-NEXT: v_readlane_b32 s38, v40, 6 535; GISEL-NEXT: v_readlane_b32 s37, v40, 5 536; GISEL-NEXT: v_readlane_b32 s36, v40, 4 537; GISEL-NEXT: v_readlane_b32 s35, v40, 3 538; GISEL-NEXT: v_readlane_b32 s34, v40, 2 539; GISEL-NEXT: v_readlane_b32 s31, v40, 1 540; GISEL-NEXT: v_readlane_b32 s30, v40, 0 541; GISEL-NEXT: s_addk_i32 s32, 0xfc00 542; GISEL-NEXT: v_readlane_b32 s33, v40, 17 543; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 544; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 545; GISEL-NEXT: s_mov_b64 exec, s[4:5] 546; GISEL-NEXT: s_waitcnt vmcnt(0) 547; GISEL-NEXT: s_setpc_b64 s[30:31] 548 call void %fptr() 549 ret void 550} 551 552define void @test_indirect_call_vgpr_ptr_arg(void(i32)* %fptr) { 553; GCN-LABEL: test_indirect_call_vgpr_ptr_arg: 554; GCN: ; %bb.0: 555; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 556; GCN-NEXT: s_or_saveexec_b64 s[16:17], -1 557; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 558; GCN-NEXT: s_mov_b64 exec, s[16:17] 559; GCN-NEXT: v_writelane_b32 v40, s33, 17 560; GCN-NEXT: s_mov_b32 s33, s32 561; GCN-NEXT: s_addk_i32 s32, 0x400 562; GCN-NEXT: v_writelane_b32 v40, s30, 0 563; GCN-NEXT: v_writelane_b32 v40, s31, 1 564; GCN-NEXT: v_writelane_b32 v40, s34, 2 565; GCN-NEXT: v_writelane_b32 v40, s35, 3 566; GCN-NEXT: v_writelane_b32 v40, s36, 4 567; GCN-NEXT: v_writelane_b32 v40, s37, 5 568; GCN-NEXT: v_writelane_b32 v40, s38, 6 569; GCN-NEXT: v_writelane_b32 v40, s39, 7 570; GCN-NEXT: v_writelane_b32 v40, s40, 8 571; GCN-NEXT: v_writelane_b32 v40, s41, 9 572; GCN-NEXT: v_writelane_b32 v40, s42, 10 573; GCN-NEXT: v_writelane_b32 v40, s43, 11 574; GCN-NEXT: v_writelane_b32 v40, s44, 12 575; GCN-NEXT: v_writelane_b32 v40, s46, 13 576; GCN-NEXT: v_writelane_b32 v40, s47, 14 577; GCN-NEXT: v_writelane_b32 v40, s48, 15 578; GCN-NEXT: v_writelane_b32 v40, s49, 16 579; GCN-NEXT: s_mov_b32 s42, s14 580; GCN-NEXT: s_mov_b32 s43, s13 581; GCN-NEXT: s_mov_b32 s44, s12 582; GCN-NEXT: s_mov_b64 s[34:35], s[10:11] 583; GCN-NEXT: s_mov_b64 s[36:37], s[8:9] 584; GCN-NEXT: s_mov_b64 s[38:39], s[6:7] 585; GCN-NEXT: s_mov_b64 s[40:41], s[4:5] 586; GCN-NEXT: s_mov_b64 s[46:47], exec 587; GCN-NEXT: v_mov_b32_e32 v2, 0x7b 588; GCN-NEXT: .LBB3_1: ; =>This Inner Loop Header: Depth=1 589; GCN-NEXT: v_readfirstlane_b32 s16, v0 590; GCN-NEXT: v_readfirstlane_b32 s17, v1 591; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 592; GCN-NEXT: s_and_saveexec_b64 s[48:49], vcc 593; GCN-NEXT: s_mov_b64 s[4:5], s[40:41] 594; GCN-NEXT: s_mov_b64 s[6:7], s[38:39] 595; GCN-NEXT: s_mov_b64 s[8:9], s[36:37] 596; GCN-NEXT: s_mov_b64 s[10:11], s[34:35] 597; GCN-NEXT: s_mov_b32 s12, s44 598; GCN-NEXT: s_mov_b32 s13, s43 599; GCN-NEXT: s_mov_b32 s14, s42 600; GCN-NEXT: v_mov_b32_e32 v0, v2 601; GCN-NEXT: s_swappc_b64 s[30:31], s[16:17] 602; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1 603; GCN-NEXT: ; implicit-def: $vgpr31 604; GCN-NEXT: ; implicit-def: $vgpr2 605; GCN-NEXT: s_xor_b64 exec, exec, s[48:49] 606; GCN-NEXT: s_cbranch_execnz .LBB3_1 607; GCN-NEXT: ; %bb.2: 608; GCN-NEXT: s_mov_b64 exec, s[46:47] 609; GCN-NEXT: v_readlane_b32 s49, v40, 16 610; GCN-NEXT: v_readlane_b32 s48, v40, 15 611; GCN-NEXT: v_readlane_b32 s47, v40, 14 612; GCN-NEXT: v_readlane_b32 s46, v40, 13 613; GCN-NEXT: v_readlane_b32 s44, v40, 12 614; GCN-NEXT: v_readlane_b32 s43, v40, 11 615; GCN-NEXT: v_readlane_b32 s42, v40, 10 616; GCN-NEXT: v_readlane_b32 s41, v40, 9 617; GCN-NEXT: v_readlane_b32 s40, v40, 8 618; GCN-NEXT: v_readlane_b32 s39, v40, 7 619; GCN-NEXT: v_readlane_b32 s38, v40, 6 620; GCN-NEXT: v_readlane_b32 s37, v40, 5 621; GCN-NEXT: v_readlane_b32 s36, v40, 4 622; GCN-NEXT: v_readlane_b32 s35, v40, 3 623; GCN-NEXT: v_readlane_b32 s34, v40, 2 624; GCN-NEXT: v_readlane_b32 s31, v40, 1 625; GCN-NEXT: v_readlane_b32 s30, v40, 0 626; GCN-NEXT: s_addk_i32 s32, 0xfc00 627; GCN-NEXT: v_readlane_b32 s33, v40, 17 628; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 629; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 630; GCN-NEXT: s_mov_b64 exec, s[4:5] 631; GCN-NEXT: s_waitcnt vmcnt(0) 632; GCN-NEXT: s_setpc_b64 s[30:31] 633; 634; GISEL-LABEL: test_indirect_call_vgpr_ptr_arg: 635; GISEL: ; %bb.0: 636; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 637; GISEL-NEXT: s_or_saveexec_b64 s[16:17], -1 638; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 639; GISEL-NEXT: s_mov_b64 exec, s[16:17] 640; GISEL-NEXT: v_writelane_b32 v40, s33, 17 641; GISEL-NEXT: s_mov_b32 s33, s32 642; GISEL-NEXT: s_addk_i32 s32, 0x400 643; GISEL-NEXT: v_writelane_b32 v40, s30, 0 644; GISEL-NEXT: v_writelane_b32 v40, s31, 1 645; GISEL-NEXT: v_writelane_b32 v40, s34, 2 646; GISEL-NEXT: v_writelane_b32 v40, s35, 3 647; GISEL-NEXT: v_writelane_b32 v40, s36, 4 648; GISEL-NEXT: v_writelane_b32 v40, s37, 5 649; GISEL-NEXT: v_writelane_b32 v40, s38, 6 650; GISEL-NEXT: v_writelane_b32 v40, s39, 7 651; GISEL-NEXT: v_writelane_b32 v40, s40, 8 652; GISEL-NEXT: v_writelane_b32 v40, s41, 9 653; GISEL-NEXT: v_writelane_b32 v40, s42, 10 654; GISEL-NEXT: v_writelane_b32 v40, s43, 11 655; GISEL-NEXT: v_writelane_b32 v40, s44, 12 656; GISEL-NEXT: v_writelane_b32 v40, s46, 13 657; GISEL-NEXT: v_writelane_b32 v40, s47, 14 658; GISEL-NEXT: v_writelane_b32 v40, s48, 15 659; GISEL-NEXT: v_writelane_b32 v40, s49, 16 660; GISEL-NEXT: s_mov_b32 s42, s14 661; GISEL-NEXT: s_mov_b32 s43, s13 662; GISEL-NEXT: s_mov_b32 s44, s12 663; GISEL-NEXT: s_mov_b64 s[34:35], s[10:11] 664; GISEL-NEXT: s_mov_b64 s[36:37], s[8:9] 665; GISEL-NEXT: s_mov_b64 s[38:39], s[6:7] 666; GISEL-NEXT: s_mov_b64 s[40:41], s[4:5] 667; GISEL-NEXT: s_mov_b64 s[46:47], exec 668; GISEL-NEXT: .LBB3_1: ; =>This Inner Loop Header: Depth=1 669; GISEL-NEXT: v_readfirstlane_b32 s16, v0 670; GISEL-NEXT: v_readfirstlane_b32 s17, v1 671; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 672; GISEL-NEXT: s_and_saveexec_b64 s[48:49], vcc 673; GISEL-NEXT: v_mov_b32_e32 v0, 0x7b 674; GISEL-NEXT: s_mov_b64 s[4:5], s[40:41] 675; GISEL-NEXT: s_mov_b64 s[6:7], s[38:39] 676; GISEL-NEXT: s_mov_b64 s[8:9], s[36:37] 677; GISEL-NEXT: s_mov_b64 s[10:11], s[34:35] 678; GISEL-NEXT: s_mov_b32 s12, s44 679; GISEL-NEXT: s_mov_b32 s13, s43 680; GISEL-NEXT: s_mov_b32 s14, s42 681; GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17] 682; GISEL-NEXT: ; implicit-def: $vgpr0 683; GISEL-NEXT: ; implicit-def: $vgpr31 684; GISEL-NEXT: s_xor_b64 exec, exec, s[48:49] 685; GISEL-NEXT: s_cbranch_execnz .LBB3_1 686; GISEL-NEXT: ; %bb.2: 687; GISEL-NEXT: s_mov_b64 exec, s[46:47] 688; GISEL-NEXT: v_readlane_b32 s49, v40, 16 689; GISEL-NEXT: v_readlane_b32 s48, v40, 15 690; GISEL-NEXT: v_readlane_b32 s47, v40, 14 691; GISEL-NEXT: v_readlane_b32 s46, v40, 13 692; GISEL-NEXT: v_readlane_b32 s44, v40, 12 693; GISEL-NEXT: v_readlane_b32 s43, v40, 11 694; GISEL-NEXT: v_readlane_b32 s42, v40, 10 695; GISEL-NEXT: v_readlane_b32 s41, v40, 9 696; GISEL-NEXT: v_readlane_b32 s40, v40, 8 697; GISEL-NEXT: v_readlane_b32 s39, v40, 7 698; GISEL-NEXT: v_readlane_b32 s38, v40, 6 699; GISEL-NEXT: v_readlane_b32 s37, v40, 5 700; GISEL-NEXT: v_readlane_b32 s36, v40, 4 701; GISEL-NEXT: v_readlane_b32 s35, v40, 3 702; GISEL-NEXT: v_readlane_b32 s34, v40, 2 703; GISEL-NEXT: v_readlane_b32 s31, v40, 1 704; GISEL-NEXT: v_readlane_b32 s30, v40, 0 705; GISEL-NEXT: s_addk_i32 s32, 0xfc00 706; GISEL-NEXT: v_readlane_b32 s33, v40, 17 707; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 708; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 709; GISEL-NEXT: s_mov_b64 exec, s[4:5] 710; GISEL-NEXT: s_waitcnt vmcnt(0) 711; GISEL-NEXT: s_setpc_b64 s[30:31] 712 call void %fptr(i32 123) 713 ret void 714} 715 716define i32 @test_indirect_call_vgpr_ptr_ret(i32()* %fptr) { 717; GCN-LABEL: test_indirect_call_vgpr_ptr_ret: 718; GCN: ; %bb.0: 719; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 720; GCN-NEXT: s_or_saveexec_b64 s[16:17], -1 721; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 722; GCN-NEXT: s_mov_b64 exec, s[16:17] 723; GCN-NEXT: v_writelane_b32 v40, s33, 17 724; GCN-NEXT: s_mov_b32 s33, s32 725; GCN-NEXT: s_addk_i32 s32, 0x400 726; GCN-NEXT: v_writelane_b32 v40, s30, 0 727; GCN-NEXT: v_writelane_b32 v40, s31, 1 728; GCN-NEXT: v_writelane_b32 v40, s34, 2 729; GCN-NEXT: v_writelane_b32 v40, s35, 3 730; GCN-NEXT: v_writelane_b32 v40, s36, 4 731; GCN-NEXT: v_writelane_b32 v40, s37, 5 732; GCN-NEXT: v_writelane_b32 v40, s38, 6 733; GCN-NEXT: v_writelane_b32 v40, s39, 7 734; GCN-NEXT: v_writelane_b32 v40, s40, 8 735; GCN-NEXT: v_writelane_b32 v40, s41, 9 736; GCN-NEXT: v_writelane_b32 v40, s42, 10 737; GCN-NEXT: v_writelane_b32 v40, s43, 11 738; GCN-NEXT: v_writelane_b32 v40, s44, 12 739; GCN-NEXT: v_writelane_b32 v40, s46, 13 740; GCN-NEXT: v_writelane_b32 v40, s47, 14 741; GCN-NEXT: v_writelane_b32 v40, s48, 15 742; GCN-NEXT: v_writelane_b32 v40, s49, 16 743; GCN-NEXT: s_mov_b32 s42, s14 744; GCN-NEXT: s_mov_b32 s43, s13 745; GCN-NEXT: s_mov_b32 s44, s12 746; GCN-NEXT: s_mov_b64 s[34:35], s[10:11] 747; GCN-NEXT: s_mov_b64 s[36:37], s[8:9] 748; GCN-NEXT: s_mov_b64 s[38:39], s[6:7] 749; GCN-NEXT: s_mov_b64 s[40:41], s[4:5] 750; GCN-NEXT: s_mov_b64 s[46:47], exec 751; GCN-NEXT: .LBB4_1: ; =>This Inner Loop Header: Depth=1 752; GCN-NEXT: v_readfirstlane_b32 s16, v0 753; GCN-NEXT: v_readfirstlane_b32 s17, v1 754; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 755; GCN-NEXT: s_and_saveexec_b64 s[48:49], vcc 756; GCN-NEXT: s_mov_b64 s[4:5], s[40:41] 757; GCN-NEXT: s_mov_b64 s[6:7], s[38:39] 758; GCN-NEXT: s_mov_b64 s[8:9], s[36:37] 759; GCN-NEXT: s_mov_b64 s[10:11], s[34:35] 760; GCN-NEXT: s_mov_b32 s12, s44 761; GCN-NEXT: s_mov_b32 s13, s43 762; GCN-NEXT: s_mov_b32 s14, s42 763; GCN-NEXT: s_swappc_b64 s[30:31], s[16:17] 764; GCN-NEXT: v_mov_b32_e32 v2, v0 765; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1 766; GCN-NEXT: ; implicit-def: $vgpr31 767; GCN-NEXT: s_xor_b64 exec, exec, s[48:49] 768; GCN-NEXT: s_cbranch_execnz .LBB4_1 769; GCN-NEXT: ; %bb.2: 770; GCN-NEXT: s_mov_b64 exec, s[46:47] 771; GCN-NEXT: v_add_i32_e32 v0, vcc, 1, v2 772; GCN-NEXT: v_readlane_b32 s49, v40, 16 773; GCN-NEXT: v_readlane_b32 s48, v40, 15 774; GCN-NEXT: v_readlane_b32 s47, v40, 14 775; GCN-NEXT: v_readlane_b32 s46, v40, 13 776; GCN-NEXT: v_readlane_b32 s44, v40, 12 777; GCN-NEXT: v_readlane_b32 s43, v40, 11 778; GCN-NEXT: v_readlane_b32 s42, v40, 10 779; GCN-NEXT: v_readlane_b32 s41, v40, 9 780; GCN-NEXT: v_readlane_b32 s40, v40, 8 781; GCN-NEXT: v_readlane_b32 s39, v40, 7 782; GCN-NEXT: v_readlane_b32 s38, v40, 6 783; GCN-NEXT: v_readlane_b32 s37, v40, 5 784; GCN-NEXT: v_readlane_b32 s36, v40, 4 785; GCN-NEXT: v_readlane_b32 s35, v40, 3 786; GCN-NEXT: v_readlane_b32 s34, v40, 2 787; GCN-NEXT: v_readlane_b32 s31, v40, 1 788; GCN-NEXT: v_readlane_b32 s30, v40, 0 789; GCN-NEXT: s_addk_i32 s32, 0xfc00 790; GCN-NEXT: v_readlane_b32 s33, v40, 17 791; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 792; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 793; GCN-NEXT: s_mov_b64 exec, s[4:5] 794; GCN-NEXT: s_waitcnt vmcnt(0) 795; GCN-NEXT: s_setpc_b64 s[30:31] 796; 797; GISEL-LABEL: test_indirect_call_vgpr_ptr_ret: 798; GISEL: ; %bb.0: 799; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 800; GISEL-NEXT: s_or_saveexec_b64 s[16:17], -1 801; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 802; GISEL-NEXT: s_mov_b64 exec, s[16:17] 803; GISEL-NEXT: v_writelane_b32 v40, s33, 17 804; GISEL-NEXT: s_mov_b32 s33, s32 805; GISEL-NEXT: s_addk_i32 s32, 0x400 806; GISEL-NEXT: v_writelane_b32 v40, s30, 0 807; GISEL-NEXT: v_writelane_b32 v40, s31, 1 808; GISEL-NEXT: v_writelane_b32 v40, s34, 2 809; GISEL-NEXT: v_writelane_b32 v40, s35, 3 810; GISEL-NEXT: v_writelane_b32 v40, s36, 4 811; GISEL-NEXT: v_writelane_b32 v40, s37, 5 812; GISEL-NEXT: v_writelane_b32 v40, s38, 6 813; GISEL-NEXT: v_writelane_b32 v40, s39, 7 814; GISEL-NEXT: v_writelane_b32 v40, s40, 8 815; GISEL-NEXT: v_writelane_b32 v40, s41, 9 816; GISEL-NEXT: v_writelane_b32 v40, s42, 10 817; GISEL-NEXT: v_writelane_b32 v40, s43, 11 818; GISEL-NEXT: v_writelane_b32 v40, s44, 12 819; GISEL-NEXT: v_writelane_b32 v40, s46, 13 820; GISEL-NEXT: v_writelane_b32 v40, s47, 14 821; GISEL-NEXT: v_writelane_b32 v40, s48, 15 822; GISEL-NEXT: v_writelane_b32 v40, s49, 16 823; GISEL-NEXT: s_mov_b32 s42, s14 824; GISEL-NEXT: s_mov_b32 s43, s13 825; GISEL-NEXT: s_mov_b32 s44, s12 826; GISEL-NEXT: s_mov_b64 s[34:35], s[10:11] 827; GISEL-NEXT: s_mov_b64 s[36:37], s[8:9] 828; GISEL-NEXT: s_mov_b64 s[38:39], s[6:7] 829; GISEL-NEXT: s_mov_b64 s[40:41], s[4:5] 830; GISEL-NEXT: s_mov_b64 s[46:47], exec 831; GISEL-NEXT: .LBB4_1: ; =>This Inner Loop Header: Depth=1 832; GISEL-NEXT: v_readfirstlane_b32 s16, v0 833; GISEL-NEXT: v_readfirstlane_b32 s17, v1 834; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 835; GISEL-NEXT: s_and_saveexec_b64 s[48:49], vcc 836; GISEL-NEXT: s_mov_b64 s[4:5], s[40:41] 837; GISEL-NEXT: s_mov_b64 s[6:7], s[38:39] 838; GISEL-NEXT: s_mov_b64 s[8:9], s[36:37] 839; GISEL-NEXT: s_mov_b64 s[10:11], s[34:35] 840; GISEL-NEXT: s_mov_b32 s12, s44 841; GISEL-NEXT: s_mov_b32 s13, s43 842; GISEL-NEXT: s_mov_b32 s14, s42 843; GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17] 844; GISEL-NEXT: v_mov_b32_e32 v1, v0 845; GISEL-NEXT: ; implicit-def: $vgpr0 846; GISEL-NEXT: ; implicit-def: $vgpr31 847; GISEL-NEXT: s_xor_b64 exec, exec, s[48:49] 848; GISEL-NEXT: s_cbranch_execnz .LBB4_1 849; GISEL-NEXT: ; %bb.2: 850; GISEL-NEXT: s_mov_b64 exec, s[46:47] 851; GISEL-NEXT: v_add_i32_e32 v0, vcc, 1, v1 852; GISEL-NEXT: v_readlane_b32 s49, v40, 16 853; GISEL-NEXT: v_readlane_b32 s48, v40, 15 854; GISEL-NEXT: v_readlane_b32 s47, v40, 14 855; GISEL-NEXT: v_readlane_b32 s46, v40, 13 856; GISEL-NEXT: v_readlane_b32 s44, v40, 12 857; GISEL-NEXT: v_readlane_b32 s43, v40, 11 858; GISEL-NEXT: v_readlane_b32 s42, v40, 10 859; GISEL-NEXT: v_readlane_b32 s41, v40, 9 860; GISEL-NEXT: v_readlane_b32 s40, v40, 8 861; GISEL-NEXT: v_readlane_b32 s39, v40, 7 862; GISEL-NEXT: v_readlane_b32 s38, v40, 6 863; GISEL-NEXT: v_readlane_b32 s37, v40, 5 864; GISEL-NEXT: v_readlane_b32 s36, v40, 4 865; GISEL-NEXT: v_readlane_b32 s35, v40, 3 866; GISEL-NEXT: v_readlane_b32 s34, v40, 2 867; GISEL-NEXT: v_readlane_b32 s31, v40, 1 868; GISEL-NEXT: v_readlane_b32 s30, v40, 0 869; GISEL-NEXT: s_addk_i32 s32, 0xfc00 870; GISEL-NEXT: v_readlane_b32 s33, v40, 17 871; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 872; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 873; GISEL-NEXT: s_mov_b64 exec, s[4:5] 874; GISEL-NEXT: s_waitcnt vmcnt(0) 875; GISEL-NEXT: s_setpc_b64 s[30:31] 876 %a = call i32 %fptr() 877 %b = add i32 %a, 1 878 ret i32 %b 879} 880 881define void @test_indirect_call_vgpr_ptr_in_branch(void()* %fptr, i1 %cond) { 882; GCN-LABEL: test_indirect_call_vgpr_ptr_in_branch: 883; GCN: ; %bb.0: ; %bb0 884; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 885; GCN-NEXT: s_or_saveexec_b64 s[16:17], -1 886; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 887; GCN-NEXT: s_mov_b64 exec, s[16:17] 888; GCN-NEXT: v_writelane_b32 v40, s33, 19 889; GCN-NEXT: s_mov_b32 s33, s32 890; GCN-NEXT: s_addk_i32 s32, 0x400 891; GCN-NEXT: v_writelane_b32 v40, s30, 0 892; GCN-NEXT: v_writelane_b32 v40, s31, 1 893; GCN-NEXT: v_writelane_b32 v40, s34, 2 894; GCN-NEXT: v_writelane_b32 v40, s35, 3 895; GCN-NEXT: v_writelane_b32 v40, s36, 4 896; GCN-NEXT: v_writelane_b32 v40, s37, 5 897; GCN-NEXT: v_writelane_b32 v40, s38, 6 898; GCN-NEXT: v_writelane_b32 v40, s39, 7 899; GCN-NEXT: v_writelane_b32 v40, s40, 8 900; GCN-NEXT: v_writelane_b32 v40, s41, 9 901; GCN-NEXT: v_writelane_b32 v40, s42, 10 902; GCN-NEXT: v_writelane_b32 v40, s43, 11 903; GCN-NEXT: v_writelane_b32 v40, s44, 12 904; GCN-NEXT: v_writelane_b32 v40, s46, 13 905; GCN-NEXT: v_writelane_b32 v40, s47, 14 906; GCN-NEXT: v_writelane_b32 v40, s48, 15 907; GCN-NEXT: v_writelane_b32 v40, s49, 16 908; GCN-NEXT: v_writelane_b32 v40, s50, 17 909; GCN-NEXT: v_writelane_b32 v40, s51, 18 910; GCN-NEXT: s_mov_b32 s42, s14 911; GCN-NEXT: s_mov_b32 s43, s13 912; GCN-NEXT: s_mov_b32 s44, s12 913; GCN-NEXT: s_mov_b64 s[34:35], s[10:11] 914; GCN-NEXT: s_mov_b64 s[36:37], s[8:9] 915; GCN-NEXT: s_mov_b64 s[38:39], s[6:7] 916; GCN-NEXT: s_mov_b64 s[40:41], s[4:5] 917; GCN-NEXT: v_and_b32_e32 v2, 1, v2 918; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v2 919; GCN-NEXT: s_and_saveexec_b64 s[46:47], vcc 920; GCN-NEXT: s_cbranch_execz .LBB5_4 921; GCN-NEXT: ; %bb.1: ; %bb1 922; GCN-NEXT: s_mov_b64 s[48:49], exec 923; GCN-NEXT: .LBB5_2: ; =>This Inner Loop Header: Depth=1 924; GCN-NEXT: v_readfirstlane_b32 s16, v0 925; GCN-NEXT: v_readfirstlane_b32 s17, v1 926; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 927; GCN-NEXT: s_and_saveexec_b64 s[50:51], vcc 928; GCN-NEXT: s_mov_b64 s[4:5], s[40:41] 929; GCN-NEXT: s_mov_b64 s[6:7], s[38:39] 930; GCN-NEXT: s_mov_b64 s[8:9], s[36:37] 931; GCN-NEXT: s_mov_b64 s[10:11], s[34:35] 932; GCN-NEXT: s_mov_b32 s12, s44 933; GCN-NEXT: s_mov_b32 s13, s43 934; GCN-NEXT: s_mov_b32 s14, s42 935; GCN-NEXT: s_swappc_b64 s[30:31], s[16:17] 936; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1 937; GCN-NEXT: ; implicit-def: $vgpr31 938; GCN-NEXT: s_xor_b64 exec, exec, s[50:51] 939; GCN-NEXT: s_cbranch_execnz .LBB5_2 940; GCN-NEXT: ; %bb.3: 941; GCN-NEXT: s_mov_b64 exec, s[48:49] 942; GCN-NEXT: .LBB5_4: ; %bb2 943; GCN-NEXT: s_or_b64 exec, exec, s[46:47] 944; GCN-NEXT: v_readlane_b32 s51, v40, 18 945; GCN-NEXT: v_readlane_b32 s50, v40, 17 946; GCN-NEXT: v_readlane_b32 s49, v40, 16 947; GCN-NEXT: v_readlane_b32 s48, v40, 15 948; GCN-NEXT: v_readlane_b32 s47, v40, 14 949; GCN-NEXT: v_readlane_b32 s46, v40, 13 950; GCN-NEXT: v_readlane_b32 s44, v40, 12 951; GCN-NEXT: v_readlane_b32 s43, v40, 11 952; GCN-NEXT: v_readlane_b32 s42, v40, 10 953; GCN-NEXT: v_readlane_b32 s41, v40, 9 954; GCN-NEXT: v_readlane_b32 s40, v40, 8 955; GCN-NEXT: v_readlane_b32 s39, v40, 7 956; GCN-NEXT: v_readlane_b32 s38, v40, 6 957; GCN-NEXT: v_readlane_b32 s37, v40, 5 958; GCN-NEXT: v_readlane_b32 s36, v40, 4 959; GCN-NEXT: v_readlane_b32 s35, v40, 3 960; GCN-NEXT: v_readlane_b32 s34, v40, 2 961; GCN-NEXT: v_readlane_b32 s31, v40, 1 962; GCN-NEXT: v_readlane_b32 s30, v40, 0 963; GCN-NEXT: s_addk_i32 s32, 0xfc00 964; GCN-NEXT: v_readlane_b32 s33, v40, 19 965; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 966; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 967; GCN-NEXT: s_mov_b64 exec, s[4:5] 968; GCN-NEXT: s_waitcnt vmcnt(0) 969; GCN-NEXT: s_setpc_b64 s[30:31] 970; 971; GISEL-LABEL: test_indirect_call_vgpr_ptr_in_branch: 972; GISEL: ; %bb.0: ; %bb0 973; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 974; GISEL-NEXT: s_or_saveexec_b64 s[16:17], -1 975; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 976; GISEL-NEXT: s_mov_b64 exec, s[16:17] 977; GISEL-NEXT: v_writelane_b32 v40, s33, 19 978; GISEL-NEXT: s_mov_b32 s33, s32 979; GISEL-NEXT: s_addk_i32 s32, 0x400 980; GISEL-NEXT: v_writelane_b32 v40, s30, 0 981; GISEL-NEXT: v_writelane_b32 v40, s31, 1 982; GISEL-NEXT: v_writelane_b32 v40, s34, 2 983; GISEL-NEXT: v_writelane_b32 v40, s35, 3 984; GISEL-NEXT: v_writelane_b32 v40, s36, 4 985; GISEL-NEXT: v_writelane_b32 v40, s37, 5 986; GISEL-NEXT: v_writelane_b32 v40, s38, 6 987; GISEL-NEXT: v_writelane_b32 v40, s39, 7 988; GISEL-NEXT: v_writelane_b32 v40, s40, 8 989; GISEL-NEXT: v_writelane_b32 v40, s41, 9 990; GISEL-NEXT: v_writelane_b32 v40, s42, 10 991; GISEL-NEXT: v_writelane_b32 v40, s43, 11 992; GISEL-NEXT: v_writelane_b32 v40, s44, 12 993; GISEL-NEXT: v_writelane_b32 v40, s46, 13 994; GISEL-NEXT: v_writelane_b32 v40, s47, 14 995; GISEL-NEXT: v_writelane_b32 v40, s48, 15 996; GISEL-NEXT: v_writelane_b32 v40, s49, 16 997; GISEL-NEXT: v_writelane_b32 v40, s50, 17 998; GISEL-NEXT: v_writelane_b32 v40, s51, 18 999; GISEL-NEXT: s_mov_b32 s42, s14 1000; GISEL-NEXT: s_mov_b32 s43, s13 1001; GISEL-NEXT: s_mov_b32 s44, s12 1002; GISEL-NEXT: s_mov_b64 s[34:35], s[10:11] 1003; GISEL-NEXT: s_mov_b64 s[36:37], s[8:9] 1004; GISEL-NEXT: s_mov_b64 s[38:39], s[6:7] 1005; GISEL-NEXT: s_mov_b64 s[40:41], s[4:5] 1006; GISEL-NEXT: v_and_b32_e32 v2, 1, v2 1007; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2 1008; GISEL-NEXT: s_and_saveexec_b64 s[46:47], vcc 1009; GISEL-NEXT: s_cbranch_execz .LBB5_4 1010; GISEL-NEXT: ; %bb.1: ; %bb1 1011; GISEL-NEXT: s_mov_b64 s[48:49], exec 1012; GISEL-NEXT: .LBB5_2: ; =>This Inner Loop Header: Depth=1 1013; GISEL-NEXT: v_readfirstlane_b32 s16, v0 1014; GISEL-NEXT: v_readfirstlane_b32 s17, v1 1015; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1] 1016; GISEL-NEXT: s_and_saveexec_b64 s[50:51], vcc 1017; GISEL-NEXT: s_mov_b64 s[4:5], s[40:41] 1018; GISEL-NEXT: s_mov_b64 s[6:7], s[38:39] 1019; GISEL-NEXT: s_mov_b64 s[8:9], s[36:37] 1020; GISEL-NEXT: s_mov_b64 s[10:11], s[34:35] 1021; GISEL-NEXT: s_mov_b32 s12, s44 1022; GISEL-NEXT: s_mov_b32 s13, s43 1023; GISEL-NEXT: s_mov_b32 s14, s42 1024; GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17] 1025; GISEL-NEXT: ; implicit-def: $vgpr0 1026; GISEL-NEXT: ; implicit-def: $vgpr31 1027; GISEL-NEXT: s_xor_b64 exec, exec, s[50:51] 1028; GISEL-NEXT: s_cbranch_execnz .LBB5_2 1029; GISEL-NEXT: ; %bb.3: 1030; GISEL-NEXT: s_mov_b64 exec, s[48:49] 1031; GISEL-NEXT: .LBB5_4: ; %bb2 1032; GISEL-NEXT: s_or_b64 exec, exec, s[46:47] 1033; GISEL-NEXT: v_readlane_b32 s51, v40, 18 1034; GISEL-NEXT: v_readlane_b32 s50, v40, 17 1035; GISEL-NEXT: v_readlane_b32 s49, v40, 16 1036; GISEL-NEXT: v_readlane_b32 s48, v40, 15 1037; GISEL-NEXT: v_readlane_b32 s47, v40, 14 1038; GISEL-NEXT: v_readlane_b32 s46, v40, 13 1039; GISEL-NEXT: v_readlane_b32 s44, v40, 12 1040; GISEL-NEXT: v_readlane_b32 s43, v40, 11 1041; GISEL-NEXT: v_readlane_b32 s42, v40, 10 1042; GISEL-NEXT: v_readlane_b32 s41, v40, 9 1043; GISEL-NEXT: v_readlane_b32 s40, v40, 8 1044; GISEL-NEXT: v_readlane_b32 s39, v40, 7 1045; GISEL-NEXT: v_readlane_b32 s38, v40, 6 1046; GISEL-NEXT: v_readlane_b32 s37, v40, 5 1047; GISEL-NEXT: v_readlane_b32 s36, v40, 4 1048; GISEL-NEXT: v_readlane_b32 s35, v40, 3 1049; GISEL-NEXT: v_readlane_b32 s34, v40, 2 1050; GISEL-NEXT: v_readlane_b32 s31, v40, 1 1051; GISEL-NEXT: v_readlane_b32 s30, v40, 0 1052; GISEL-NEXT: s_addk_i32 s32, 0xfc00 1053; GISEL-NEXT: v_readlane_b32 s33, v40, 19 1054; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1055; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1056; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1057; GISEL-NEXT: s_waitcnt vmcnt(0) 1058; GISEL-NEXT: s_setpc_b64 s[30:31] 1059bb0: 1060 br i1 %cond, label %bb1, label %bb2 1061 1062bb1: 1063 call void %fptr() 1064 br label %bb2 1065 1066bb2: 1067 ret void 1068} 1069 1070define void @test_indirect_call_vgpr_ptr_inreg_arg(void(i32)* %fptr) { 1071; GCN-LABEL: test_indirect_call_vgpr_ptr_inreg_arg: 1072; GCN: ; %bb.0: 1073; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1074; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1075; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 1076; GCN-NEXT: s_mov_b64 exec, s[4:5] 1077; GCN-NEXT: v_writelane_b32 v40, s33, 32 1078; GCN-NEXT: s_mov_b32 s33, s32 1079; GCN-NEXT: s_addk_i32 s32, 0x400 1080; GCN-NEXT: v_writelane_b32 v40, s30, 0 1081; GCN-NEXT: v_writelane_b32 v40, s31, 1 1082; GCN-NEXT: v_writelane_b32 v40, s34, 2 1083; GCN-NEXT: v_writelane_b32 v40, s35, 3 1084; GCN-NEXT: v_writelane_b32 v40, s36, 4 1085; GCN-NEXT: v_writelane_b32 v40, s37, 5 1086; GCN-NEXT: v_writelane_b32 v40, s38, 6 1087; GCN-NEXT: v_writelane_b32 v40, s39, 7 1088; GCN-NEXT: v_writelane_b32 v40, s40, 8 1089; GCN-NEXT: v_writelane_b32 v40, s41, 9 1090; GCN-NEXT: v_writelane_b32 v40, s42, 10 1091; GCN-NEXT: v_writelane_b32 v40, s43, 11 1092; GCN-NEXT: v_writelane_b32 v40, s44, 12 1093; GCN-NEXT: v_writelane_b32 v40, s45, 13 1094; GCN-NEXT: v_writelane_b32 v40, s46, 14 1095; GCN-NEXT: v_writelane_b32 v40, s47, 15 1096; GCN-NEXT: v_writelane_b32 v40, s48, 16 1097; GCN-NEXT: v_writelane_b32 v40, s49, 17 1098; GCN-NEXT: v_writelane_b32 v40, s50, 18 1099; GCN-NEXT: v_writelane_b32 v40, s51, 19 1100; GCN-NEXT: v_writelane_b32 v40, s52, 20 1101; GCN-NEXT: v_writelane_b32 v40, s53, 21 1102; GCN-NEXT: v_writelane_b32 v40, s54, 22 1103; GCN-NEXT: v_writelane_b32 v40, s55, 23 1104; GCN-NEXT: v_writelane_b32 v40, s56, 24 1105; GCN-NEXT: v_writelane_b32 v40, s57, 25 1106; GCN-NEXT: v_writelane_b32 v40, s58, 26 1107; GCN-NEXT: v_writelane_b32 v40, s59, 27 1108; GCN-NEXT: v_writelane_b32 v40, s60, 28 1109; GCN-NEXT: v_writelane_b32 v40, s61, 29 1110; GCN-NEXT: v_writelane_b32 v40, s62, 30 1111; GCN-NEXT: v_writelane_b32 v40, s63, 31 1112; GCN-NEXT: s_mov_b64 s[6:7], exec 1113; GCN-NEXT: s_movk_i32 s4, 0x7b 1114; GCN-NEXT: .LBB6_1: ; =>This Inner Loop Header: Depth=1 1115; GCN-NEXT: v_readfirstlane_b32 s10, v0 1116; GCN-NEXT: v_readfirstlane_b32 s11, v1 1117; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[10:11], v[0:1] 1118; GCN-NEXT: s_and_saveexec_b64 s[8:9], vcc 1119; GCN-NEXT: s_swappc_b64 s[30:31], s[10:11] 1120; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1 1121; GCN-NEXT: s_xor_b64 exec, exec, s[8:9] 1122; GCN-NEXT: s_cbranch_execnz .LBB6_1 1123; GCN-NEXT: ; %bb.2: 1124; GCN-NEXT: s_mov_b64 exec, s[6:7] 1125; GCN-NEXT: v_readlane_b32 s63, v40, 31 1126; GCN-NEXT: v_readlane_b32 s62, v40, 30 1127; GCN-NEXT: v_readlane_b32 s61, v40, 29 1128; GCN-NEXT: v_readlane_b32 s60, v40, 28 1129; GCN-NEXT: v_readlane_b32 s59, v40, 27 1130; GCN-NEXT: v_readlane_b32 s58, v40, 26 1131; GCN-NEXT: v_readlane_b32 s57, v40, 25 1132; GCN-NEXT: v_readlane_b32 s56, v40, 24 1133; GCN-NEXT: v_readlane_b32 s55, v40, 23 1134; GCN-NEXT: v_readlane_b32 s54, v40, 22 1135; GCN-NEXT: v_readlane_b32 s53, v40, 21 1136; GCN-NEXT: v_readlane_b32 s52, v40, 20 1137; GCN-NEXT: v_readlane_b32 s51, v40, 19 1138; GCN-NEXT: v_readlane_b32 s50, v40, 18 1139; GCN-NEXT: v_readlane_b32 s49, v40, 17 1140; GCN-NEXT: v_readlane_b32 s48, v40, 16 1141; GCN-NEXT: v_readlane_b32 s47, v40, 15 1142; GCN-NEXT: v_readlane_b32 s46, v40, 14 1143; GCN-NEXT: v_readlane_b32 s45, v40, 13 1144; GCN-NEXT: v_readlane_b32 s44, v40, 12 1145; GCN-NEXT: v_readlane_b32 s43, v40, 11 1146; GCN-NEXT: v_readlane_b32 s42, v40, 10 1147; GCN-NEXT: v_readlane_b32 s41, v40, 9 1148; GCN-NEXT: v_readlane_b32 s40, v40, 8 1149; GCN-NEXT: v_readlane_b32 s39, v40, 7 1150; GCN-NEXT: v_readlane_b32 s38, v40, 6 1151; GCN-NEXT: v_readlane_b32 s37, v40, 5 1152; GCN-NEXT: v_readlane_b32 s36, v40, 4 1153; GCN-NEXT: v_readlane_b32 s35, v40, 3 1154; GCN-NEXT: v_readlane_b32 s34, v40, 2 1155; GCN-NEXT: v_readlane_b32 s31, v40, 1 1156; GCN-NEXT: v_readlane_b32 s30, v40, 0 1157; GCN-NEXT: s_addk_i32 s32, 0xfc00 1158; GCN-NEXT: v_readlane_b32 s33, v40, 32 1159; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1160; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1161; GCN-NEXT: s_mov_b64 exec, s[4:5] 1162; GCN-NEXT: s_waitcnt vmcnt(0) 1163; GCN-NEXT: s_setpc_b64 s[30:31] 1164; 1165; GISEL-LABEL: test_indirect_call_vgpr_ptr_inreg_arg: 1166; GISEL: ; %bb.0: 1167; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1168; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1169; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 1170; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1171; GISEL-NEXT: v_writelane_b32 v40, s33, 32 1172; GISEL-NEXT: s_mov_b32 s33, s32 1173; GISEL-NEXT: s_addk_i32 s32, 0x400 1174; GISEL-NEXT: v_writelane_b32 v40, s30, 0 1175; GISEL-NEXT: v_writelane_b32 v40, s31, 1 1176; GISEL-NEXT: v_writelane_b32 v40, s34, 2 1177; GISEL-NEXT: v_writelane_b32 v40, s35, 3 1178; GISEL-NEXT: v_writelane_b32 v40, s36, 4 1179; GISEL-NEXT: v_writelane_b32 v40, s37, 5 1180; GISEL-NEXT: v_writelane_b32 v40, s38, 6 1181; GISEL-NEXT: v_writelane_b32 v40, s39, 7 1182; GISEL-NEXT: v_writelane_b32 v40, s40, 8 1183; GISEL-NEXT: v_writelane_b32 v40, s41, 9 1184; GISEL-NEXT: v_writelane_b32 v40, s42, 10 1185; GISEL-NEXT: v_writelane_b32 v40, s43, 11 1186; GISEL-NEXT: v_writelane_b32 v40, s44, 12 1187; GISEL-NEXT: v_writelane_b32 v40, s45, 13 1188; GISEL-NEXT: v_writelane_b32 v40, s46, 14 1189; GISEL-NEXT: v_writelane_b32 v40, s47, 15 1190; GISEL-NEXT: v_writelane_b32 v40, s48, 16 1191; GISEL-NEXT: v_writelane_b32 v40, s49, 17 1192; GISEL-NEXT: v_writelane_b32 v40, s50, 18 1193; GISEL-NEXT: v_writelane_b32 v40, s51, 19 1194; GISEL-NEXT: v_writelane_b32 v40, s52, 20 1195; GISEL-NEXT: v_writelane_b32 v40, s53, 21 1196; GISEL-NEXT: v_writelane_b32 v40, s54, 22 1197; GISEL-NEXT: v_writelane_b32 v40, s55, 23 1198; GISEL-NEXT: v_writelane_b32 v40, s56, 24 1199; GISEL-NEXT: v_writelane_b32 v40, s57, 25 1200; GISEL-NEXT: v_writelane_b32 v40, s58, 26 1201; GISEL-NEXT: v_writelane_b32 v40, s59, 27 1202; GISEL-NEXT: v_writelane_b32 v40, s60, 28 1203; GISEL-NEXT: v_writelane_b32 v40, s61, 29 1204; GISEL-NEXT: v_writelane_b32 v40, s62, 30 1205; GISEL-NEXT: v_writelane_b32 v40, s63, 31 1206; GISEL-NEXT: s_mov_b64 s[6:7], exec 1207; GISEL-NEXT: s_movk_i32 s4, 0x7b 1208; GISEL-NEXT: .LBB6_1: ; =>This Inner Loop Header: Depth=1 1209; GISEL-NEXT: v_readfirstlane_b32 s8, v0 1210; GISEL-NEXT: v_readfirstlane_b32 s9, v1 1211; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[8:9], v[0:1] 1212; GISEL-NEXT: s_and_saveexec_b64 s[10:11], vcc 1213; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9] 1214; GISEL-NEXT: ; implicit-def: $vgpr0 1215; GISEL-NEXT: s_xor_b64 exec, exec, s[10:11] 1216; GISEL-NEXT: s_cbranch_execnz .LBB6_1 1217; GISEL-NEXT: ; %bb.2: 1218; GISEL-NEXT: s_mov_b64 exec, s[6:7] 1219; GISEL-NEXT: v_readlane_b32 s63, v40, 31 1220; GISEL-NEXT: v_readlane_b32 s62, v40, 30 1221; GISEL-NEXT: v_readlane_b32 s61, v40, 29 1222; GISEL-NEXT: v_readlane_b32 s60, v40, 28 1223; GISEL-NEXT: v_readlane_b32 s59, v40, 27 1224; GISEL-NEXT: v_readlane_b32 s58, v40, 26 1225; GISEL-NEXT: v_readlane_b32 s57, v40, 25 1226; GISEL-NEXT: v_readlane_b32 s56, v40, 24 1227; GISEL-NEXT: v_readlane_b32 s55, v40, 23 1228; GISEL-NEXT: v_readlane_b32 s54, v40, 22 1229; GISEL-NEXT: v_readlane_b32 s53, v40, 21 1230; GISEL-NEXT: v_readlane_b32 s52, v40, 20 1231; GISEL-NEXT: v_readlane_b32 s51, v40, 19 1232; GISEL-NEXT: v_readlane_b32 s50, v40, 18 1233; GISEL-NEXT: v_readlane_b32 s49, v40, 17 1234; GISEL-NEXT: v_readlane_b32 s48, v40, 16 1235; GISEL-NEXT: v_readlane_b32 s47, v40, 15 1236; GISEL-NEXT: v_readlane_b32 s46, v40, 14 1237; GISEL-NEXT: v_readlane_b32 s45, v40, 13 1238; GISEL-NEXT: v_readlane_b32 s44, v40, 12 1239; GISEL-NEXT: v_readlane_b32 s43, v40, 11 1240; GISEL-NEXT: v_readlane_b32 s42, v40, 10 1241; GISEL-NEXT: v_readlane_b32 s41, v40, 9 1242; GISEL-NEXT: v_readlane_b32 s40, v40, 8 1243; GISEL-NEXT: v_readlane_b32 s39, v40, 7 1244; GISEL-NEXT: v_readlane_b32 s38, v40, 6 1245; GISEL-NEXT: v_readlane_b32 s37, v40, 5 1246; GISEL-NEXT: v_readlane_b32 s36, v40, 4 1247; GISEL-NEXT: v_readlane_b32 s35, v40, 3 1248; GISEL-NEXT: v_readlane_b32 s34, v40, 2 1249; GISEL-NEXT: v_readlane_b32 s31, v40, 1 1250; GISEL-NEXT: v_readlane_b32 s30, v40, 0 1251; GISEL-NEXT: s_addk_i32 s32, 0xfc00 1252; GISEL-NEXT: v_readlane_b32 s33, v40, 32 1253; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1254; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1255; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1256; GISEL-NEXT: s_waitcnt vmcnt(0) 1257; GISEL-NEXT: s_setpc_b64 s[30:31] 1258 call amdgpu_gfx void %fptr(i32 inreg 123) 1259 ret void 1260} 1261 1262define i32 @test_indirect_call_vgpr_ptr_arg_and_reuse(i32 %i, void(i32)* %fptr) { 1263; GCN-LABEL: test_indirect_call_vgpr_ptr_arg_and_reuse: 1264; GCN: ; %bb.0: 1265; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1266; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1267; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill 1268; GCN-NEXT: s_mov_b64 exec, s[4:5] 1269; GCN-NEXT: v_writelane_b32 v40, s33, 32 1270; GCN-NEXT: s_mov_b32 s33, s32 1271; GCN-NEXT: s_addk_i32 s32, 0x400 1272; GCN-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill 1273; GCN-NEXT: v_writelane_b32 v40, s30, 0 1274; GCN-NEXT: v_writelane_b32 v40, s31, 1 1275; GCN-NEXT: v_writelane_b32 v40, s34, 2 1276; GCN-NEXT: v_writelane_b32 v40, s35, 3 1277; GCN-NEXT: v_writelane_b32 v40, s36, 4 1278; GCN-NEXT: v_writelane_b32 v40, s37, 5 1279; GCN-NEXT: v_writelane_b32 v40, s38, 6 1280; GCN-NEXT: v_writelane_b32 v40, s39, 7 1281; GCN-NEXT: v_writelane_b32 v40, s40, 8 1282; GCN-NEXT: v_writelane_b32 v40, s41, 9 1283; GCN-NEXT: v_writelane_b32 v40, s42, 10 1284; GCN-NEXT: v_writelane_b32 v40, s43, 11 1285; GCN-NEXT: v_writelane_b32 v40, s44, 12 1286; GCN-NEXT: v_writelane_b32 v40, s45, 13 1287; GCN-NEXT: v_writelane_b32 v40, s46, 14 1288; GCN-NEXT: v_writelane_b32 v40, s47, 15 1289; GCN-NEXT: v_writelane_b32 v40, s48, 16 1290; GCN-NEXT: v_writelane_b32 v40, s49, 17 1291; GCN-NEXT: v_writelane_b32 v40, s50, 18 1292; GCN-NEXT: v_writelane_b32 v40, s51, 19 1293; GCN-NEXT: v_writelane_b32 v40, s52, 20 1294; GCN-NEXT: v_writelane_b32 v40, s53, 21 1295; GCN-NEXT: v_writelane_b32 v40, s54, 22 1296; GCN-NEXT: v_writelane_b32 v40, s55, 23 1297; GCN-NEXT: v_writelane_b32 v40, s56, 24 1298; GCN-NEXT: v_writelane_b32 v40, s57, 25 1299; GCN-NEXT: v_writelane_b32 v40, s58, 26 1300; GCN-NEXT: v_writelane_b32 v40, s59, 27 1301; GCN-NEXT: v_writelane_b32 v40, s60, 28 1302; GCN-NEXT: v_writelane_b32 v40, s61, 29 1303; GCN-NEXT: v_writelane_b32 v40, s62, 30 1304; GCN-NEXT: v_writelane_b32 v40, s63, 31 1305; GCN-NEXT: v_mov_b32_e32 v41, v0 1306; GCN-NEXT: s_mov_b64 s[4:5], exec 1307; GCN-NEXT: .LBB7_1: ; =>This Inner Loop Header: Depth=1 1308; GCN-NEXT: v_readfirstlane_b32 s8, v1 1309; GCN-NEXT: v_readfirstlane_b32 s9, v2 1310; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[8:9], v[1:2] 1311; GCN-NEXT: s_and_saveexec_b64 s[6:7], vcc 1312; GCN-NEXT: v_mov_b32_e32 v0, v41 1313; GCN-NEXT: s_swappc_b64 s[30:31], s[8:9] 1314; GCN-NEXT: ; implicit-def: $vgpr1_vgpr2 1315; GCN-NEXT: s_xor_b64 exec, exec, s[6:7] 1316; GCN-NEXT: s_cbranch_execnz .LBB7_1 1317; GCN-NEXT: ; %bb.2: 1318; GCN-NEXT: s_mov_b64 exec, s[4:5] 1319; GCN-NEXT: v_mov_b32_e32 v0, v41 1320; GCN-NEXT: v_readlane_b32 s63, v40, 31 1321; GCN-NEXT: v_readlane_b32 s62, v40, 30 1322; GCN-NEXT: v_readlane_b32 s61, v40, 29 1323; GCN-NEXT: v_readlane_b32 s60, v40, 28 1324; GCN-NEXT: v_readlane_b32 s59, v40, 27 1325; GCN-NEXT: v_readlane_b32 s58, v40, 26 1326; GCN-NEXT: v_readlane_b32 s57, v40, 25 1327; GCN-NEXT: v_readlane_b32 s56, v40, 24 1328; GCN-NEXT: v_readlane_b32 s55, v40, 23 1329; GCN-NEXT: v_readlane_b32 s54, v40, 22 1330; GCN-NEXT: v_readlane_b32 s53, v40, 21 1331; GCN-NEXT: v_readlane_b32 s52, v40, 20 1332; GCN-NEXT: v_readlane_b32 s51, v40, 19 1333; GCN-NEXT: v_readlane_b32 s50, v40, 18 1334; GCN-NEXT: v_readlane_b32 s49, v40, 17 1335; GCN-NEXT: v_readlane_b32 s48, v40, 16 1336; GCN-NEXT: v_readlane_b32 s47, v40, 15 1337; GCN-NEXT: v_readlane_b32 s46, v40, 14 1338; GCN-NEXT: v_readlane_b32 s45, v40, 13 1339; GCN-NEXT: v_readlane_b32 s44, v40, 12 1340; GCN-NEXT: v_readlane_b32 s43, v40, 11 1341; GCN-NEXT: v_readlane_b32 s42, v40, 10 1342; GCN-NEXT: v_readlane_b32 s41, v40, 9 1343; GCN-NEXT: v_readlane_b32 s40, v40, 8 1344; GCN-NEXT: v_readlane_b32 s39, v40, 7 1345; GCN-NEXT: v_readlane_b32 s38, v40, 6 1346; GCN-NEXT: v_readlane_b32 s37, v40, 5 1347; GCN-NEXT: v_readlane_b32 s36, v40, 4 1348; GCN-NEXT: v_readlane_b32 s35, v40, 3 1349; GCN-NEXT: v_readlane_b32 s34, v40, 2 1350; GCN-NEXT: v_readlane_b32 s31, v40, 1 1351; GCN-NEXT: v_readlane_b32 s30, v40, 0 1352; GCN-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload 1353; GCN-NEXT: s_addk_i32 s32, 0xfc00 1354; GCN-NEXT: v_readlane_b32 s33, v40, 32 1355; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1356; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload 1357; GCN-NEXT: s_mov_b64 exec, s[4:5] 1358; GCN-NEXT: s_waitcnt vmcnt(0) 1359; GCN-NEXT: s_setpc_b64 s[30:31] 1360; 1361; GISEL-LABEL: test_indirect_call_vgpr_ptr_arg_and_reuse: 1362; GISEL: ; %bb.0: 1363; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1364; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1365; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill 1366; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1367; GISEL-NEXT: v_writelane_b32 v40, s33, 32 1368; GISEL-NEXT: s_mov_b32 s33, s32 1369; GISEL-NEXT: s_addk_i32 s32, 0x400 1370; GISEL-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill 1371; GISEL-NEXT: v_writelane_b32 v40, s30, 0 1372; GISEL-NEXT: v_writelane_b32 v40, s31, 1 1373; GISEL-NEXT: v_writelane_b32 v40, s34, 2 1374; GISEL-NEXT: v_writelane_b32 v40, s35, 3 1375; GISEL-NEXT: v_writelane_b32 v40, s36, 4 1376; GISEL-NEXT: v_writelane_b32 v40, s37, 5 1377; GISEL-NEXT: v_writelane_b32 v40, s38, 6 1378; GISEL-NEXT: v_writelane_b32 v40, s39, 7 1379; GISEL-NEXT: v_writelane_b32 v40, s40, 8 1380; GISEL-NEXT: v_writelane_b32 v40, s41, 9 1381; GISEL-NEXT: v_writelane_b32 v40, s42, 10 1382; GISEL-NEXT: v_writelane_b32 v40, s43, 11 1383; GISEL-NEXT: v_writelane_b32 v40, s44, 12 1384; GISEL-NEXT: v_writelane_b32 v40, s45, 13 1385; GISEL-NEXT: v_writelane_b32 v40, s46, 14 1386; GISEL-NEXT: v_writelane_b32 v40, s47, 15 1387; GISEL-NEXT: v_writelane_b32 v40, s48, 16 1388; GISEL-NEXT: v_writelane_b32 v40, s49, 17 1389; GISEL-NEXT: v_writelane_b32 v40, s50, 18 1390; GISEL-NEXT: v_writelane_b32 v40, s51, 19 1391; GISEL-NEXT: v_writelane_b32 v40, s52, 20 1392; GISEL-NEXT: v_writelane_b32 v40, s53, 21 1393; GISEL-NEXT: v_writelane_b32 v40, s54, 22 1394; GISEL-NEXT: v_writelane_b32 v40, s55, 23 1395; GISEL-NEXT: v_writelane_b32 v40, s56, 24 1396; GISEL-NEXT: v_writelane_b32 v40, s57, 25 1397; GISEL-NEXT: v_writelane_b32 v40, s58, 26 1398; GISEL-NEXT: v_writelane_b32 v40, s59, 27 1399; GISEL-NEXT: v_writelane_b32 v40, s60, 28 1400; GISEL-NEXT: v_writelane_b32 v40, s61, 29 1401; GISEL-NEXT: v_writelane_b32 v40, s62, 30 1402; GISEL-NEXT: v_writelane_b32 v40, s63, 31 1403; GISEL-NEXT: v_mov_b32_e32 v41, v0 1404; GISEL-NEXT: s_mov_b64 s[4:5], exec 1405; GISEL-NEXT: .LBB7_1: ; =>This Inner Loop Header: Depth=1 1406; GISEL-NEXT: v_readfirstlane_b32 s6, v1 1407; GISEL-NEXT: v_readfirstlane_b32 s7, v2 1408; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[6:7], v[1:2] 1409; GISEL-NEXT: s_and_saveexec_b64 s[8:9], vcc 1410; GISEL-NEXT: v_mov_b32_e32 v0, v41 1411; GISEL-NEXT: s_swappc_b64 s[30:31], s[6:7] 1412; GISEL-NEXT: ; implicit-def: $vgpr1 1413; GISEL-NEXT: s_xor_b64 exec, exec, s[8:9] 1414; GISEL-NEXT: s_cbranch_execnz .LBB7_1 1415; GISEL-NEXT: ; %bb.2: 1416; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1417; GISEL-NEXT: v_mov_b32_e32 v0, v41 1418; GISEL-NEXT: v_readlane_b32 s63, v40, 31 1419; GISEL-NEXT: v_readlane_b32 s62, v40, 30 1420; GISEL-NEXT: v_readlane_b32 s61, v40, 29 1421; GISEL-NEXT: v_readlane_b32 s60, v40, 28 1422; GISEL-NEXT: v_readlane_b32 s59, v40, 27 1423; GISEL-NEXT: v_readlane_b32 s58, v40, 26 1424; GISEL-NEXT: v_readlane_b32 s57, v40, 25 1425; GISEL-NEXT: v_readlane_b32 s56, v40, 24 1426; GISEL-NEXT: v_readlane_b32 s55, v40, 23 1427; GISEL-NEXT: v_readlane_b32 s54, v40, 22 1428; GISEL-NEXT: v_readlane_b32 s53, v40, 21 1429; GISEL-NEXT: v_readlane_b32 s52, v40, 20 1430; GISEL-NEXT: v_readlane_b32 s51, v40, 19 1431; GISEL-NEXT: v_readlane_b32 s50, v40, 18 1432; GISEL-NEXT: v_readlane_b32 s49, v40, 17 1433; GISEL-NEXT: v_readlane_b32 s48, v40, 16 1434; GISEL-NEXT: v_readlane_b32 s47, v40, 15 1435; GISEL-NEXT: v_readlane_b32 s46, v40, 14 1436; GISEL-NEXT: v_readlane_b32 s45, v40, 13 1437; GISEL-NEXT: v_readlane_b32 s44, v40, 12 1438; GISEL-NEXT: v_readlane_b32 s43, v40, 11 1439; GISEL-NEXT: v_readlane_b32 s42, v40, 10 1440; GISEL-NEXT: v_readlane_b32 s41, v40, 9 1441; GISEL-NEXT: v_readlane_b32 s40, v40, 8 1442; GISEL-NEXT: v_readlane_b32 s39, v40, 7 1443; GISEL-NEXT: v_readlane_b32 s38, v40, 6 1444; GISEL-NEXT: v_readlane_b32 s37, v40, 5 1445; GISEL-NEXT: v_readlane_b32 s36, v40, 4 1446; GISEL-NEXT: v_readlane_b32 s35, v40, 3 1447; GISEL-NEXT: v_readlane_b32 s34, v40, 2 1448; GISEL-NEXT: v_readlane_b32 s31, v40, 1 1449; GISEL-NEXT: v_readlane_b32 s30, v40, 0 1450; GISEL-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload 1451; GISEL-NEXT: s_addk_i32 s32, 0xfc00 1452; GISEL-NEXT: v_readlane_b32 s33, v40, 32 1453; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1454; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload 1455; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1456; GISEL-NEXT: s_waitcnt vmcnt(0) 1457; GISEL-NEXT: s_setpc_b64 s[30:31] 1458 call amdgpu_gfx void %fptr(i32 %i) 1459 ret i32 %i 1460} 1461 1462; Use a variable inside a waterfall loop and use the return variable after the loop. 1463; TODO The argument and return variable could be in the same physical register, but the register 1464; allocator is not able to do that because the return value clashes with the liverange of an 1465; IMPLICIT_DEF of the argument. 1466define i32 @test_indirect_call_vgpr_ptr_arg_and_return(i32 %i, i32(i32)* %fptr) { 1467; GCN-LABEL: test_indirect_call_vgpr_ptr_arg_and_return: 1468; GCN: ; %bb.0: 1469; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1470; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1471; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 1472; GCN-NEXT: s_mov_b64 exec, s[4:5] 1473; GCN-NEXT: v_writelane_b32 v40, s33, 32 1474; GCN-NEXT: s_mov_b32 s33, s32 1475; GCN-NEXT: s_addk_i32 s32, 0x400 1476; GCN-NEXT: v_writelane_b32 v40, s30, 0 1477; GCN-NEXT: v_writelane_b32 v40, s31, 1 1478; GCN-NEXT: v_writelane_b32 v40, s34, 2 1479; GCN-NEXT: v_writelane_b32 v40, s35, 3 1480; GCN-NEXT: v_writelane_b32 v40, s36, 4 1481; GCN-NEXT: v_writelane_b32 v40, s37, 5 1482; GCN-NEXT: v_writelane_b32 v40, s38, 6 1483; GCN-NEXT: v_writelane_b32 v40, s39, 7 1484; GCN-NEXT: v_writelane_b32 v40, s40, 8 1485; GCN-NEXT: v_writelane_b32 v40, s41, 9 1486; GCN-NEXT: v_writelane_b32 v40, s42, 10 1487; GCN-NEXT: v_writelane_b32 v40, s43, 11 1488; GCN-NEXT: v_writelane_b32 v40, s44, 12 1489; GCN-NEXT: v_writelane_b32 v40, s45, 13 1490; GCN-NEXT: v_writelane_b32 v40, s46, 14 1491; GCN-NEXT: v_writelane_b32 v40, s47, 15 1492; GCN-NEXT: v_writelane_b32 v40, s48, 16 1493; GCN-NEXT: v_writelane_b32 v40, s49, 17 1494; GCN-NEXT: v_writelane_b32 v40, s50, 18 1495; GCN-NEXT: v_writelane_b32 v40, s51, 19 1496; GCN-NEXT: v_writelane_b32 v40, s52, 20 1497; GCN-NEXT: v_writelane_b32 v40, s53, 21 1498; GCN-NEXT: v_writelane_b32 v40, s54, 22 1499; GCN-NEXT: v_writelane_b32 v40, s55, 23 1500; GCN-NEXT: v_writelane_b32 v40, s56, 24 1501; GCN-NEXT: v_writelane_b32 v40, s57, 25 1502; GCN-NEXT: v_writelane_b32 v40, s58, 26 1503; GCN-NEXT: v_writelane_b32 v40, s59, 27 1504; GCN-NEXT: v_writelane_b32 v40, s60, 28 1505; GCN-NEXT: v_writelane_b32 v40, s61, 29 1506; GCN-NEXT: v_writelane_b32 v40, s62, 30 1507; GCN-NEXT: v_writelane_b32 v40, s63, 31 1508; GCN-NEXT: s_mov_b64 s[4:5], exec 1509; GCN-NEXT: .LBB8_1: ; =>This Inner Loop Header: Depth=1 1510; GCN-NEXT: v_readfirstlane_b32 s8, v1 1511; GCN-NEXT: v_readfirstlane_b32 s9, v2 1512; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[8:9], v[1:2] 1513; GCN-NEXT: s_and_saveexec_b64 s[6:7], vcc 1514; GCN-NEXT: s_swappc_b64 s[30:31], s[8:9] 1515; GCN-NEXT: v_mov_b32_e32 v3, v0 1516; GCN-NEXT: ; implicit-def: $vgpr1_vgpr2 1517; GCN-NEXT: ; implicit-def: $vgpr0 1518; GCN-NEXT: s_xor_b64 exec, exec, s[6:7] 1519; GCN-NEXT: s_cbranch_execnz .LBB8_1 1520; GCN-NEXT: ; %bb.2: 1521; GCN-NEXT: s_mov_b64 exec, s[4:5] 1522; GCN-NEXT: v_mov_b32_e32 v0, v3 1523; GCN-NEXT: v_readlane_b32 s63, v40, 31 1524; GCN-NEXT: v_readlane_b32 s62, v40, 30 1525; GCN-NEXT: v_readlane_b32 s61, v40, 29 1526; GCN-NEXT: v_readlane_b32 s60, v40, 28 1527; GCN-NEXT: v_readlane_b32 s59, v40, 27 1528; GCN-NEXT: v_readlane_b32 s58, v40, 26 1529; GCN-NEXT: v_readlane_b32 s57, v40, 25 1530; GCN-NEXT: v_readlane_b32 s56, v40, 24 1531; GCN-NEXT: v_readlane_b32 s55, v40, 23 1532; GCN-NEXT: v_readlane_b32 s54, v40, 22 1533; GCN-NEXT: v_readlane_b32 s53, v40, 21 1534; GCN-NEXT: v_readlane_b32 s52, v40, 20 1535; GCN-NEXT: v_readlane_b32 s51, v40, 19 1536; GCN-NEXT: v_readlane_b32 s50, v40, 18 1537; GCN-NEXT: v_readlane_b32 s49, v40, 17 1538; GCN-NEXT: v_readlane_b32 s48, v40, 16 1539; GCN-NEXT: v_readlane_b32 s47, v40, 15 1540; GCN-NEXT: v_readlane_b32 s46, v40, 14 1541; GCN-NEXT: v_readlane_b32 s45, v40, 13 1542; GCN-NEXT: v_readlane_b32 s44, v40, 12 1543; GCN-NEXT: v_readlane_b32 s43, v40, 11 1544; GCN-NEXT: v_readlane_b32 s42, v40, 10 1545; GCN-NEXT: v_readlane_b32 s41, v40, 9 1546; GCN-NEXT: v_readlane_b32 s40, v40, 8 1547; GCN-NEXT: v_readlane_b32 s39, v40, 7 1548; GCN-NEXT: v_readlane_b32 s38, v40, 6 1549; GCN-NEXT: v_readlane_b32 s37, v40, 5 1550; GCN-NEXT: v_readlane_b32 s36, v40, 4 1551; GCN-NEXT: v_readlane_b32 s35, v40, 3 1552; GCN-NEXT: v_readlane_b32 s34, v40, 2 1553; GCN-NEXT: v_readlane_b32 s31, v40, 1 1554; GCN-NEXT: v_readlane_b32 s30, v40, 0 1555; GCN-NEXT: s_addk_i32 s32, 0xfc00 1556; GCN-NEXT: v_readlane_b32 s33, v40, 32 1557; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1558; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1559; GCN-NEXT: s_mov_b64 exec, s[4:5] 1560; GCN-NEXT: s_waitcnt vmcnt(0) 1561; GCN-NEXT: s_setpc_b64 s[30:31] 1562; 1563; GISEL-LABEL: test_indirect_call_vgpr_ptr_arg_and_return: 1564; GISEL: ; %bb.0: 1565; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1566; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1567; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 1568; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1569; GISEL-NEXT: v_writelane_b32 v40, s33, 32 1570; GISEL-NEXT: s_mov_b32 s33, s32 1571; GISEL-NEXT: s_addk_i32 s32, 0x400 1572; GISEL-NEXT: v_writelane_b32 v40, s30, 0 1573; GISEL-NEXT: v_writelane_b32 v40, s31, 1 1574; GISEL-NEXT: v_writelane_b32 v40, s34, 2 1575; GISEL-NEXT: v_writelane_b32 v40, s35, 3 1576; GISEL-NEXT: v_writelane_b32 v40, s36, 4 1577; GISEL-NEXT: v_writelane_b32 v40, s37, 5 1578; GISEL-NEXT: v_writelane_b32 v40, s38, 6 1579; GISEL-NEXT: v_writelane_b32 v40, s39, 7 1580; GISEL-NEXT: v_writelane_b32 v40, s40, 8 1581; GISEL-NEXT: v_writelane_b32 v40, s41, 9 1582; GISEL-NEXT: v_writelane_b32 v40, s42, 10 1583; GISEL-NEXT: v_writelane_b32 v40, s43, 11 1584; GISEL-NEXT: v_writelane_b32 v40, s44, 12 1585; GISEL-NEXT: v_writelane_b32 v40, s45, 13 1586; GISEL-NEXT: v_writelane_b32 v40, s46, 14 1587; GISEL-NEXT: v_writelane_b32 v40, s47, 15 1588; GISEL-NEXT: v_writelane_b32 v40, s48, 16 1589; GISEL-NEXT: v_writelane_b32 v40, s49, 17 1590; GISEL-NEXT: v_writelane_b32 v40, s50, 18 1591; GISEL-NEXT: v_writelane_b32 v40, s51, 19 1592; GISEL-NEXT: v_writelane_b32 v40, s52, 20 1593; GISEL-NEXT: v_writelane_b32 v40, s53, 21 1594; GISEL-NEXT: v_writelane_b32 v40, s54, 22 1595; GISEL-NEXT: v_writelane_b32 v40, s55, 23 1596; GISEL-NEXT: v_writelane_b32 v40, s56, 24 1597; GISEL-NEXT: v_writelane_b32 v40, s57, 25 1598; GISEL-NEXT: v_writelane_b32 v40, s58, 26 1599; GISEL-NEXT: v_writelane_b32 v40, s59, 27 1600; GISEL-NEXT: v_writelane_b32 v40, s60, 28 1601; GISEL-NEXT: v_writelane_b32 v40, s61, 29 1602; GISEL-NEXT: v_writelane_b32 v40, s62, 30 1603; GISEL-NEXT: v_writelane_b32 v40, s63, 31 1604; GISEL-NEXT: s_mov_b64 s[4:5], exec 1605; GISEL-NEXT: .LBB8_1: ; =>This Inner Loop Header: Depth=1 1606; GISEL-NEXT: v_readfirstlane_b32 s8, v1 1607; GISEL-NEXT: v_readfirstlane_b32 s9, v2 1608; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[8:9], v[1:2] 1609; GISEL-NEXT: s_and_saveexec_b64 s[6:7], vcc 1610; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9] 1611; GISEL-NEXT: v_mov_b32_e32 v2, v0 1612; GISEL-NEXT: ; implicit-def: $vgpr1 1613; GISEL-NEXT: ; implicit-def: $vgpr0 1614; GISEL-NEXT: s_xor_b64 exec, exec, s[6:7] 1615; GISEL-NEXT: s_cbranch_execnz .LBB8_1 1616; GISEL-NEXT: ; %bb.2: 1617; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1618; GISEL-NEXT: v_mov_b32_e32 v0, v2 1619; GISEL-NEXT: v_readlane_b32 s63, v40, 31 1620; GISEL-NEXT: v_readlane_b32 s62, v40, 30 1621; GISEL-NEXT: v_readlane_b32 s61, v40, 29 1622; GISEL-NEXT: v_readlane_b32 s60, v40, 28 1623; GISEL-NEXT: v_readlane_b32 s59, v40, 27 1624; GISEL-NEXT: v_readlane_b32 s58, v40, 26 1625; GISEL-NEXT: v_readlane_b32 s57, v40, 25 1626; GISEL-NEXT: v_readlane_b32 s56, v40, 24 1627; GISEL-NEXT: v_readlane_b32 s55, v40, 23 1628; GISEL-NEXT: v_readlane_b32 s54, v40, 22 1629; GISEL-NEXT: v_readlane_b32 s53, v40, 21 1630; GISEL-NEXT: v_readlane_b32 s52, v40, 20 1631; GISEL-NEXT: v_readlane_b32 s51, v40, 19 1632; GISEL-NEXT: v_readlane_b32 s50, v40, 18 1633; GISEL-NEXT: v_readlane_b32 s49, v40, 17 1634; GISEL-NEXT: v_readlane_b32 s48, v40, 16 1635; GISEL-NEXT: v_readlane_b32 s47, v40, 15 1636; GISEL-NEXT: v_readlane_b32 s46, v40, 14 1637; GISEL-NEXT: v_readlane_b32 s45, v40, 13 1638; GISEL-NEXT: v_readlane_b32 s44, v40, 12 1639; GISEL-NEXT: v_readlane_b32 s43, v40, 11 1640; GISEL-NEXT: v_readlane_b32 s42, v40, 10 1641; GISEL-NEXT: v_readlane_b32 s41, v40, 9 1642; GISEL-NEXT: v_readlane_b32 s40, v40, 8 1643; GISEL-NEXT: v_readlane_b32 s39, v40, 7 1644; GISEL-NEXT: v_readlane_b32 s38, v40, 6 1645; GISEL-NEXT: v_readlane_b32 s37, v40, 5 1646; GISEL-NEXT: v_readlane_b32 s36, v40, 4 1647; GISEL-NEXT: v_readlane_b32 s35, v40, 3 1648; GISEL-NEXT: v_readlane_b32 s34, v40, 2 1649; GISEL-NEXT: v_readlane_b32 s31, v40, 1 1650; GISEL-NEXT: v_readlane_b32 s30, v40, 0 1651; GISEL-NEXT: s_addk_i32 s32, 0xfc00 1652; GISEL-NEXT: v_readlane_b32 s33, v40, 32 1653; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1654; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1655; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1656; GISEL-NEXT: s_waitcnt vmcnt(0) 1657; GISEL-NEXT: s_setpc_b64 s[30:31] 1658 %ret = call amdgpu_gfx i32 %fptr(i32 %i) 1659 ret i32 %ret 1660} 1661 1662; Calling a vgpr can never be a tail call. 1663define void @test_indirect_tail_call_vgpr_ptr(void()* %fptr) { 1664; GCN-LABEL: test_indirect_tail_call_vgpr_ptr: 1665; GCN: ; %bb.0: 1666; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1667; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1668; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 1669; GCN-NEXT: s_mov_b64 exec, s[4:5] 1670; GCN-NEXT: v_writelane_b32 v40, s33, 32 1671; GCN-NEXT: s_mov_b32 s33, s32 1672; GCN-NEXT: s_addk_i32 s32, 0x400 1673; GCN-NEXT: v_writelane_b32 v40, s30, 0 1674; GCN-NEXT: v_writelane_b32 v40, s31, 1 1675; GCN-NEXT: v_writelane_b32 v40, s34, 2 1676; GCN-NEXT: v_writelane_b32 v40, s35, 3 1677; GCN-NEXT: v_writelane_b32 v40, s36, 4 1678; GCN-NEXT: v_writelane_b32 v40, s37, 5 1679; GCN-NEXT: v_writelane_b32 v40, s38, 6 1680; GCN-NEXT: v_writelane_b32 v40, s39, 7 1681; GCN-NEXT: v_writelane_b32 v40, s40, 8 1682; GCN-NEXT: v_writelane_b32 v40, s41, 9 1683; GCN-NEXT: v_writelane_b32 v40, s42, 10 1684; GCN-NEXT: v_writelane_b32 v40, s43, 11 1685; GCN-NEXT: v_writelane_b32 v40, s44, 12 1686; GCN-NEXT: v_writelane_b32 v40, s45, 13 1687; GCN-NEXT: v_writelane_b32 v40, s46, 14 1688; GCN-NEXT: v_writelane_b32 v40, s47, 15 1689; GCN-NEXT: v_writelane_b32 v40, s48, 16 1690; GCN-NEXT: v_writelane_b32 v40, s49, 17 1691; GCN-NEXT: v_writelane_b32 v40, s50, 18 1692; GCN-NEXT: v_writelane_b32 v40, s51, 19 1693; GCN-NEXT: v_writelane_b32 v40, s52, 20 1694; GCN-NEXT: v_writelane_b32 v40, s53, 21 1695; GCN-NEXT: v_writelane_b32 v40, s54, 22 1696; GCN-NEXT: v_writelane_b32 v40, s55, 23 1697; GCN-NEXT: v_writelane_b32 v40, s56, 24 1698; GCN-NEXT: v_writelane_b32 v40, s57, 25 1699; GCN-NEXT: v_writelane_b32 v40, s58, 26 1700; GCN-NEXT: v_writelane_b32 v40, s59, 27 1701; GCN-NEXT: v_writelane_b32 v40, s60, 28 1702; GCN-NEXT: v_writelane_b32 v40, s61, 29 1703; GCN-NEXT: v_writelane_b32 v40, s62, 30 1704; GCN-NEXT: v_writelane_b32 v40, s63, 31 1705; GCN-NEXT: s_mov_b64 s[4:5], exec 1706; GCN-NEXT: .LBB9_1: ; =>This Inner Loop Header: Depth=1 1707; GCN-NEXT: v_readfirstlane_b32 s8, v0 1708; GCN-NEXT: v_readfirstlane_b32 s9, v1 1709; GCN-NEXT: v_cmp_eq_u64_e32 vcc, s[8:9], v[0:1] 1710; GCN-NEXT: s_and_saveexec_b64 s[6:7], vcc 1711; GCN-NEXT: s_swappc_b64 s[30:31], s[8:9] 1712; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1 1713; GCN-NEXT: s_xor_b64 exec, exec, s[6:7] 1714; GCN-NEXT: s_cbranch_execnz .LBB9_1 1715; GCN-NEXT: ; %bb.2: 1716; GCN-NEXT: s_mov_b64 exec, s[4:5] 1717; GCN-NEXT: v_readlane_b32 s63, v40, 31 1718; GCN-NEXT: v_readlane_b32 s62, v40, 30 1719; GCN-NEXT: v_readlane_b32 s61, v40, 29 1720; GCN-NEXT: v_readlane_b32 s60, v40, 28 1721; GCN-NEXT: v_readlane_b32 s59, v40, 27 1722; GCN-NEXT: v_readlane_b32 s58, v40, 26 1723; GCN-NEXT: v_readlane_b32 s57, v40, 25 1724; GCN-NEXT: v_readlane_b32 s56, v40, 24 1725; GCN-NEXT: v_readlane_b32 s55, v40, 23 1726; GCN-NEXT: v_readlane_b32 s54, v40, 22 1727; GCN-NEXT: v_readlane_b32 s53, v40, 21 1728; GCN-NEXT: v_readlane_b32 s52, v40, 20 1729; GCN-NEXT: v_readlane_b32 s51, v40, 19 1730; GCN-NEXT: v_readlane_b32 s50, v40, 18 1731; GCN-NEXT: v_readlane_b32 s49, v40, 17 1732; GCN-NEXT: v_readlane_b32 s48, v40, 16 1733; GCN-NEXT: v_readlane_b32 s47, v40, 15 1734; GCN-NEXT: v_readlane_b32 s46, v40, 14 1735; GCN-NEXT: v_readlane_b32 s45, v40, 13 1736; GCN-NEXT: v_readlane_b32 s44, v40, 12 1737; GCN-NEXT: v_readlane_b32 s43, v40, 11 1738; GCN-NEXT: v_readlane_b32 s42, v40, 10 1739; GCN-NEXT: v_readlane_b32 s41, v40, 9 1740; GCN-NEXT: v_readlane_b32 s40, v40, 8 1741; GCN-NEXT: v_readlane_b32 s39, v40, 7 1742; GCN-NEXT: v_readlane_b32 s38, v40, 6 1743; GCN-NEXT: v_readlane_b32 s37, v40, 5 1744; GCN-NEXT: v_readlane_b32 s36, v40, 4 1745; GCN-NEXT: v_readlane_b32 s35, v40, 3 1746; GCN-NEXT: v_readlane_b32 s34, v40, 2 1747; GCN-NEXT: v_readlane_b32 s31, v40, 1 1748; GCN-NEXT: v_readlane_b32 s30, v40, 0 1749; GCN-NEXT: s_addk_i32 s32, 0xfc00 1750; GCN-NEXT: v_readlane_b32 s33, v40, 32 1751; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1 1752; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1753; GCN-NEXT: s_mov_b64 exec, s[4:5] 1754; GCN-NEXT: s_waitcnt vmcnt(0) 1755; GCN-NEXT: s_setpc_b64 s[30:31] 1756; 1757; GISEL-LABEL: test_indirect_tail_call_vgpr_ptr: 1758; GISEL: ; %bb.0: 1759; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1760; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1761; GISEL-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 1762; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1763; GISEL-NEXT: v_writelane_b32 v40, s33, 32 1764; GISEL-NEXT: s_mov_b32 s33, s32 1765; GISEL-NEXT: s_addk_i32 s32, 0x400 1766; GISEL-NEXT: v_writelane_b32 v40, s30, 0 1767; GISEL-NEXT: v_writelane_b32 v40, s31, 1 1768; GISEL-NEXT: v_writelane_b32 v40, s34, 2 1769; GISEL-NEXT: v_writelane_b32 v40, s35, 3 1770; GISEL-NEXT: v_writelane_b32 v40, s36, 4 1771; GISEL-NEXT: v_writelane_b32 v40, s37, 5 1772; GISEL-NEXT: v_writelane_b32 v40, s38, 6 1773; GISEL-NEXT: v_writelane_b32 v40, s39, 7 1774; GISEL-NEXT: v_writelane_b32 v40, s40, 8 1775; GISEL-NEXT: v_writelane_b32 v40, s41, 9 1776; GISEL-NEXT: v_writelane_b32 v40, s42, 10 1777; GISEL-NEXT: v_writelane_b32 v40, s43, 11 1778; GISEL-NEXT: v_writelane_b32 v40, s44, 12 1779; GISEL-NEXT: v_writelane_b32 v40, s45, 13 1780; GISEL-NEXT: v_writelane_b32 v40, s46, 14 1781; GISEL-NEXT: v_writelane_b32 v40, s47, 15 1782; GISEL-NEXT: v_writelane_b32 v40, s48, 16 1783; GISEL-NEXT: v_writelane_b32 v40, s49, 17 1784; GISEL-NEXT: v_writelane_b32 v40, s50, 18 1785; GISEL-NEXT: v_writelane_b32 v40, s51, 19 1786; GISEL-NEXT: v_writelane_b32 v40, s52, 20 1787; GISEL-NEXT: v_writelane_b32 v40, s53, 21 1788; GISEL-NEXT: v_writelane_b32 v40, s54, 22 1789; GISEL-NEXT: v_writelane_b32 v40, s55, 23 1790; GISEL-NEXT: v_writelane_b32 v40, s56, 24 1791; GISEL-NEXT: v_writelane_b32 v40, s57, 25 1792; GISEL-NEXT: v_writelane_b32 v40, s58, 26 1793; GISEL-NEXT: v_writelane_b32 v40, s59, 27 1794; GISEL-NEXT: v_writelane_b32 v40, s60, 28 1795; GISEL-NEXT: v_writelane_b32 v40, s61, 29 1796; GISEL-NEXT: v_writelane_b32 v40, s62, 30 1797; GISEL-NEXT: v_writelane_b32 v40, s63, 31 1798; GISEL-NEXT: s_mov_b64 s[4:5], exec 1799; GISEL-NEXT: .LBB9_1: ; =>This Inner Loop Header: Depth=1 1800; GISEL-NEXT: v_readfirstlane_b32 s6, v0 1801; GISEL-NEXT: v_readfirstlane_b32 s7, v1 1802; GISEL-NEXT: v_cmp_eq_u64_e32 vcc, s[6:7], v[0:1] 1803; GISEL-NEXT: s_and_saveexec_b64 s[8:9], vcc 1804; GISEL-NEXT: s_swappc_b64 s[30:31], s[6:7] 1805; GISEL-NEXT: ; implicit-def: $vgpr0 1806; GISEL-NEXT: s_xor_b64 exec, exec, s[8:9] 1807; GISEL-NEXT: s_cbranch_execnz .LBB9_1 1808; GISEL-NEXT: ; %bb.2: 1809; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1810; GISEL-NEXT: v_readlane_b32 s63, v40, 31 1811; GISEL-NEXT: v_readlane_b32 s62, v40, 30 1812; GISEL-NEXT: v_readlane_b32 s61, v40, 29 1813; GISEL-NEXT: v_readlane_b32 s60, v40, 28 1814; GISEL-NEXT: v_readlane_b32 s59, v40, 27 1815; GISEL-NEXT: v_readlane_b32 s58, v40, 26 1816; GISEL-NEXT: v_readlane_b32 s57, v40, 25 1817; GISEL-NEXT: v_readlane_b32 s56, v40, 24 1818; GISEL-NEXT: v_readlane_b32 s55, v40, 23 1819; GISEL-NEXT: v_readlane_b32 s54, v40, 22 1820; GISEL-NEXT: v_readlane_b32 s53, v40, 21 1821; GISEL-NEXT: v_readlane_b32 s52, v40, 20 1822; GISEL-NEXT: v_readlane_b32 s51, v40, 19 1823; GISEL-NEXT: v_readlane_b32 s50, v40, 18 1824; GISEL-NEXT: v_readlane_b32 s49, v40, 17 1825; GISEL-NEXT: v_readlane_b32 s48, v40, 16 1826; GISEL-NEXT: v_readlane_b32 s47, v40, 15 1827; GISEL-NEXT: v_readlane_b32 s46, v40, 14 1828; GISEL-NEXT: v_readlane_b32 s45, v40, 13 1829; GISEL-NEXT: v_readlane_b32 s44, v40, 12 1830; GISEL-NEXT: v_readlane_b32 s43, v40, 11 1831; GISEL-NEXT: v_readlane_b32 s42, v40, 10 1832; GISEL-NEXT: v_readlane_b32 s41, v40, 9 1833; GISEL-NEXT: v_readlane_b32 s40, v40, 8 1834; GISEL-NEXT: v_readlane_b32 s39, v40, 7 1835; GISEL-NEXT: v_readlane_b32 s38, v40, 6 1836; GISEL-NEXT: v_readlane_b32 s37, v40, 5 1837; GISEL-NEXT: v_readlane_b32 s36, v40, 4 1838; GISEL-NEXT: v_readlane_b32 s35, v40, 3 1839; GISEL-NEXT: v_readlane_b32 s34, v40, 2 1840; GISEL-NEXT: v_readlane_b32 s31, v40, 1 1841; GISEL-NEXT: v_readlane_b32 s30, v40, 0 1842; GISEL-NEXT: s_addk_i32 s32, 0xfc00 1843; GISEL-NEXT: v_readlane_b32 s33, v40, 32 1844; GISEL-NEXT: s_or_saveexec_b64 s[4:5], -1 1845; GISEL-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 1846; GISEL-NEXT: s_mov_b64 exec, s[4:5] 1847; GISEL-NEXT: s_waitcnt vmcnt(0) 1848; GISEL-NEXT: s_setpc_b64 s[30:31] 1849 tail call amdgpu_gfx void %fptr() 1850 ret void 1851} 1852