brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.2 KiB · 2e15c37 Raw
509 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck %s -check-prefixes=GFX83; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx942 < %s | FileCheck %s -check-prefixes=GFX9424; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 < %s | FileCheck %s -check-prefixes=GFX105; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck %s -check-prefixes=GFX116; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 < %s | FileCheck %s -check-prefixes=GFX127 8; Tests for the ISD::PTRADD SelectionDAG opcode. This only tests 64-bit address9; spaces since PTRADD is currently only used for these.10 11; Check that basic pointer arithmetic can be lowered.12define ptr @gep_as0(ptr %p, i64 %offset) {13; GFX8-LABEL: gep_as0:14; GFX8:       ; %bb.0: ; %entry15; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)16; GFX8-NEXT:    v_lshlrev_b64 v[2:3], 2, v[2:3]17; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v218; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc19; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 5, v020; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc21; GFX8-NEXT:    s_setpc_b64 s[30:31]22;23; GFX942-LABEL: gep_as0:24; GFX942:       ; %bb.0: ; %entry25; GFX942-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; GFX942-NEXT:    v_lshl_add_u64 v[0:1], v[2:3], 2, v[0:1]27; GFX942-NEXT:    v_lshl_add_u64 v[0:1], v[0:1], 0, 528; GFX942-NEXT:    s_setpc_b64 s[30:31]29;30; GFX10-LABEL: gep_as0:31; GFX10:       ; %bb.0: ; %entry32; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)33; GFX10-NEXT:    v_lshlrev_b64 v[2:3], 2, v[2:3]34; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v235; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo36; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 537; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo38; GFX10-NEXT:    s_setpc_b64 s[30:31]39;40; GFX11-LABEL: gep_as0:41; GFX11:       ; %bb.0: ; %entry42; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)43; GFX11-NEXT:    v_lshlrev_b64 v[2:3], 2, v[2:3]44; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)45; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v246; GFX11-NEXT:    v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo47; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)48; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 549; GFX11-NEXT:    v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo50; GFX11-NEXT:    s_setpc_b64 s[30:31]51;52; GFX12-LABEL: gep_as0:53; GFX12:       ; %bb.0: ; %entry54; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x055; GFX12-NEXT:    s_wait_expcnt 0x056; GFX12-NEXT:    s_wait_samplecnt 0x057; GFX12-NEXT:    s_wait_bvhcnt 0x058; GFX12-NEXT:    s_wait_kmcnt 0x059; GFX12-NEXT:    v_lshlrev_b64_e32 v[2:3], 2, v[2:3]60; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)61; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v262; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)63; GFX12-NEXT:    v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo64; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)65; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 566; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)67; GFX12-NEXT:    v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo68; GFX12-NEXT:    s_setpc_b64 s[30:31]69entry:70  %gep1 = getelementptr inbounds i32, ptr %p, i64 %offset71  %gep2 = getelementptr inbounds i8, ptr %gep1, i64 572  ret ptr %gep273}74 75define amdgpu_kernel void @gep_as0_uniform(ptr %p, i64 %offset, ptr %ret) {76; GFX8-LABEL: gep_as0_uniform:77; GFX8:       ; %bb.0: ; %entry78; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x079; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x1080; GFX8-NEXT:    s_add_i32 s12, s12, s1781; GFX8-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 882; GFX8-NEXT:    s_mov_b32 flat_scratch_lo, s1383; GFX8-NEXT:    s_waitcnt lgkmcnt(0)84; GFX8-NEXT:    s_lshl_b64 s[2:3], s[2:3], 285; GFX8-NEXT:    s_add_u32 s0, s0, s286; GFX8-NEXT:    s_addc_u32 s1, s1, s387; GFX8-NEXT:    v_mov_b32_e32 v4, s088; GFX8-NEXT:    s_add_u32 s0, s4, 489; GFX8-NEXT:    v_mov_b32_e32 v5, s190; GFX8-NEXT:    s_addc_u32 s1, s5, 091; GFX8-NEXT:    v_mov_b32_e32 v3, s192; GFX8-NEXT:    v_mov_b32_e32 v0, s493; GFX8-NEXT:    v_mov_b32_e32 v2, s094; GFX8-NEXT:    v_mov_b32_e32 v1, s595; GFX8-NEXT:    flat_store_dword v[2:3], v596; GFX8-NEXT:    flat_store_dword v[0:1], v497; GFX8-NEXT:    s_endpgm98;99; GFX942-LABEL: gep_as0_uniform:100; GFX942:       ; %bb.0: ; %entry101; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0102; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x10103; GFX942-NEXT:    s_waitcnt lgkmcnt(0)104; GFX942-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2105; GFX942-NEXT:    s_add_u32 s0, s0, s2106; GFX942-NEXT:    s_addc_u32 s1, s1, s3107; GFX942-NEXT:    v_mov_b64_e32 v[0:1], s[6:7]108; GFX942-NEXT:    v_mov_b64_e32 v[2:3], s[0:1]109; GFX942-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]110; GFX942-NEXT:    s_endpgm111;112; GFX10-LABEL: gep_as0_uniform:113; GFX10:       ; %bb.0: ; %entry114; GFX10-NEXT:    s_add_u32 s12, s12, s17115; GFX10-NEXT:    s_addc_u32 s13, s13, 0116; GFX10-NEXT:    s_setreg_b32 hwreg(HW_REG_FLAT_SCR_LO), s12117; GFX10-NEXT:    s_setreg_b32 hwreg(HW_REG_FLAT_SCR_HI), s13118; GFX10-NEXT:    s_clause 0x1119; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0120; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x10121; GFX10-NEXT:    s_waitcnt lgkmcnt(0)122; GFX10-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2123; GFX10-NEXT:    v_mov_b32_e32 v0, s4124; GFX10-NEXT:    s_add_u32 s0, s0, s2125; GFX10-NEXT:    s_addc_u32 s1, s1, s3126; GFX10-NEXT:    v_mov_b32_e32 v1, s5127; GFX10-NEXT:    v_mov_b32_e32 v3, s1128; GFX10-NEXT:    v_mov_b32_e32 v2, s0129; GFX10-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]130; GFX10-NEXT:    s_endpgm131;132; GFX11-LABEL: gep_as0_uniform:133; GFX11:       ; %bb.0: ; %entry134; GFX11-NEXT:    s_clause 0x1135; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0136; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x10137; GFX11-NEXT:    s_waitcnt lgkmcnt(0)138; GFX11-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2139; GFX11-NEXT:    v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5140; GFX11-NEXT:    s_add_u32 s0, s0, s2141; GFX11-NEXT:    s_addc_u32 s1, s1, s3142; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)143; GFX11-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0144; GFX11-NEXT:    flat_store_b64 v[0:1], v[2:3]145; GFX11-NEXT:    s_endpgm146;147; GFX12-LABEL: gep_as0_uniform:148; GFX12:       ; %bb.0: ; %entry149; GFX12-NEXT:    s_clause 0x1150; GFX12-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0151; GFX12-NEXT:    s_load_b64 s[4:5], s[4:5], 0x10152; GFX12-NEXT:    s_wait_kmcnt 0x0153; GFX12-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2154; GFX12-NEXT:    v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5155; GFX12-NEXT:    s_add_nc_u64 s[0:1], s[0:1], s[2:3]156; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)157; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0158; GFX12-NEXT:    flat_store_b64 v[0:1], v[2:3]159; GFX12-NEXT:    s_endpgm160entry:161  %gep = getelementptr inbounds i32, ptr %p, i64 %offset162  store ptr %gep, ptr %ret163  ret void164}165 166; Check that pointer arithmetic with multiple indexing steps can be lowered.167define ptr @multi_gep_as0(ptr %p, i64 %offset) {168; GFX8-LABEL: multi_gep_as0:169; GFX8:       ; %bb.0: ; %entry170; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)171; GFX8-NEXT:    v_lshlrev_b64 v[2:3], 2, v[2:3]172; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2173; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, v1, v3, vcc174; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 5, v0175; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc176; GFX8-NEXT:    s_setpc_b64 s[30:31]177;178; GFX942-LABEL: multi_gep_as0:179; GFX942:       ; %bb.0: ; %entry180; GFX942-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)181; GFX942-NEXT:    v_lshl_add_u64 v[0:1], v[2:3], 2, v[0:1]182; GFX942-NEXT:    v_lshl_add_u64 v[0:1], v[0:1], 0, 5183; GFX942-NEXT:    s_setpc_b64 s[30:31]184;185; GFX10-LABEL: multi_gep_as0:186; GFX10:       ; %bb.0: ; %entry187; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)188; GFX10-NEXT:    v_lshlrev_b64 v[2:3], 2, v[2:3]189; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2190; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo191; GFX10-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 5192; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo193; GFX10-NEXT:    s_setpc_b64 s[30:31]194;195; GFX11-LABEL: multi_gep_as0:196; GFX11:       ; %bb.0: ; %entry197; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)198; GFX11-NEXT:    v_lshlrev_b64 v[2:3], 2, v[2:3]199; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)200; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2201; GFX11-NEXT:    v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo202; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)203; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 5204; GFX11-NEXT:    v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo205; GFX11-NEXT:    s_setpc_b64 s[30:31]206;207; GFX12-LABEL: multi_gep_as0:208; GFX12:       ; %bb.0: ; %entry209; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0210; GFX12-NEXT:    s_wait_expcnt 0x0211; GFX12-NEXT:    s_wait_samplecnt 0x0212; GFX12-NEXT:    s_wait_bvhcnt 0x0213; GFX12-NEXT:    s_wait_kmcnt 0x0214; GFX12-NEXT:    v_lshlrev_b64_e32 v[2:3], 2, v[2:3]215; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)216; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2217; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)218; GFX12-NEXT:    v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo219; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)220; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 5221; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)222; GFX12-NEXT:    v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo223; GFX12-NEXT:    s_setpc_b64 s[30:31]224entry:225  %gep1 = getelementptr inbounds i32, ptr %p, i64 %offset226  %gep2 = getelementptr inbounds i8, ptr %gep1, i64 5227  ret ptr %gep2228}229 230define amdgpu_kernel void @multi_gep_as0_uniform(ptr %p, i64 %offset, ptr %ret) {231; GFX8-LABEL: multi_gep_as0_uniform:232; GFX8:       ; %bb.0: ; %entry233; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0234; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x10235; GFX8-NEXT:    s_add_i32 s12, s12, s17236; GFX8-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8237; GFX8-NEXT:    s_mov_b32 flat_scratch_lo, s13238; GFX8-NEXT:    s_waitcnt lgkmcnt(0)239; GFX8-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2240; GFX8-NEXT:    s_add_u32 s0, s0, s2241; GFX8-NEXT:    s_addc_u32 s1, s1, s3242; GFX8-NEXT:    s_add_u32 s0, s0, 5243; GFX8-NEXT:    s_addc_u32 s1, s1, 0244; GFX8-NEXT:    v_mov_b32_e32 v4, s0245; GFX8-NEXT:    s_add_u32 s0, s4, 4246; GFX8-NEXT:    v_mov_b32_e32 v5, s1247; GFX8-NEXT:    s_addc_u32 s1, s5, 0248; GFX8-NEXT:    v_mov_b32_e32 v3, s1249; GFX8-NEXT:    v_mov_b32_e32 v0, s4250; GFX8-NEXT:    v_mov_b32_e32 v2, s0251; GFX8-NEXT:    v_mov_b32_e32 v1, s5252; GFX8-NEXT:    flat_store_dword v[2:3], v5253; GFX8-NEXT:    flat_store_dword v[0:1], v4254; GFX8-NEXT:    s_endpgm255;256; GFX942-LABEL: multi_gep_as0_uniform:257; GFX942:       ; %bb.0: ; %entry258; GFX942-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0259; GFX942-NEXT:    s_load_dwordx2 s[6:7], s[4:5], 0x10260; GFX942-NEXT:    s_waitcnt lgkmcnt(0)261; GFX942-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2262; GFX942-NEXT:    s_add_u32 s0, s0, s2263; GFX942-NEXT:    s_addc_u32 s1, s1, s3264; GFX942-NEXT:    s_add_u32 s0, s0, 5265; GFX942-NEXT:    s_addc_u32 s1, s1, 0266; GFX942-NEXT:    v_mov_b64_e32 v[0:1], s[6:7]267; GFX942-NEXT:    v_mov_b64_e32 v[2:3], s[0:1]268; GFX942-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]269; GFX942-NEXT:    s_endpgm270;271; GFX10-LABEL: multi_gep_as0_uniform:272; GFX10:       ; %bb.0: ; %entry273; GFX10-NEXT:    s_add_u32 s12, s12, s17274; GFX10-NEXT:    s_addc_u32 s13, s13, 0275; GFX10-NEXT:    s_setreg_b32 hwreg(HW_REG_FLAT_SCR_LO), s12276; GFX10-NEXT:    s_setreg_b32 hwreg(HW_REG_FLAT_SCR_HI), s13277; GFX10-NEXT:    s_clause 0x1278; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0279; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x10280; GFX10-NEXT:    s_waitcnt lgkmcnt(0)281; GFX10-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2282; GFX10-NEXT:    v_mov_b32_e32 v0, s4283; GFX10-NEXT:    s_add_u32 s0, s0, s2284; GFX10-NEXT:    s_addc_u32 s1, s1, s3285; GFX10-NEXT:    s_add_u32 s0, s0, 5286; GFX10-NEXT:    s_addc_u32 s1, s1, 0287; GFX10-NEXT:    v_mov_b32_e32 v1, s5288; GFX10-NEXT:    v_mov_b32_e32 v3, s1289; GFX10-NEXT:    v_mov_b32_e32 v2, s0290; GFX10-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]291; GFX10-NEXT:    s_endpgm292;293; GFX11-LABEL: multi_gep_as0_uniform:294; GFX11:       ; %bb.0: ; %entry295; GFX11-NEXT:    s_clause 0x1296; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0297; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x10298; GFX11-NEXT:    s_waitcnt lgkmcnt(0)299; GFX11-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2300; GFX11-NEXT:    v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5301; GFX11-NEXT:    s_add_u32 s0, s0, s2302; GFX11-NEXT:    s_addc_u32 s1, s1, s3303; GFX11-NEXT:    s_add_u32 s0, s0, 5304; GFX11-NEXT:    s_addc_u32 s1, s1, 0305; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)306; GFX11-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0307; GFX11-NEXT:    flat_store_b64 v[0:1], v[2:3]308; GFX11-NEXT:    s_endpgm309;310; GFX12-LABEL: multi_gep_as0_uniform:311; GFX12:       ; %bb.0: ; %entry312; GFX12-NEXT:    s_clause 0x1313; GFX12-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0314; GFX12-NEXT:    s_load_b64 s[4:5], s[4:5], 0x10315; GFX12-NEXT:    s_wait_kmcnt 0x0316; GFX12-NEXT:    s_lshl_b64 s[2:3], s[2:3], 2317; GFX12-NEXT:    v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5318; GFX12-NEXT:    s_add_nc_u64 s[0:1], s[0:1], s[2:3]319; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)320; GFX12-NEXT:    s_add_nc_u64 s[0:1], s[0:1], 5321; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0322; GFX12-NEXT:    flat_store_b64 v[0:1], v[2:3]323; GFX12-NEXT:    s_endpgm324entry:325  %gep1 = getelementptr inbounds i32, ptr %p, i64 %offset326  %gep2 = getelementptr inbounds i8, ptr %gep1, i64 5327  store ptr %gep2, ptr %ret328  ret void329}330 331; Check that constant offsets are folded into memory instructions.332 333define void @fold_as0(ptr %from, ptr %to) {334; GFX8-LABEL: fold_as0:335; GFX8:       ; %bb.0: ; %entry336; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)337; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 8, v0338; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc339; GFX8-NEXT:    flat_load_dword v4, v[0:1]340; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 8, v2341; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v3, vcc342; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)343; GFX8-NEXT:    flat_store_dword v[0:1], v4344; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)345; GFX8-NEXT:    s_setpc_b64 s[30:31]346;347; GFX942-LABEL: fold_as0:348; GFX942:       ; %bb.0: ; %entry349; GFX942-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)350; GFX942-NEXT:    flat_load_dword v0, v[0:1] offset:8351; GFX942-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)352; GFX942-NEXT:    flat_store_dword v[2:3], v0 offset:8353; GFX942-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)354; GFX942-NEXT:    s_setpc_b64 s[30:31]355;356; GFX10-LABEL: fold_as0:357; GFX10:       ; %bb.0: ; %entry358; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)359; GFX10-NEXT:    flat_load_dword v0, v[0:1] offset:8360; GFX10-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)361; GFX10-NEXT:    flat_store_dword v[2:3], v0 offset:8362; GFX10-NEXT:    s_waitcnt lgkmcnt(0)363; GFX10-NEXT:    s_setpc_b64 s[30:31]364;365; GFX11-LABEL: fold_as0:366; GFX11:       ; %bb.0: ; %entry367; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)368; GFX11-NEXT:    flat_load_b32 v0, v[0:1] offset:8369; GFX11-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)370; GFX11-NEXT:    flat_store_b32 v[2:3], v0 offset:8371; GFX11-NEXT:    s_waitcnt lgkmcnt(0)372; GFX11-NEXT:    s_setpc_b64 s[30:31]373;374; GFX12-LABEL: fold_as0:375; GFX12:       ; %bb.0: ; %entry376; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0377; GFX12-NEXT:    s_wait_expcnt 0x0378; GFX12-NEXT:    s_wait_samplecnt 0x0379; GFX12-NEXT:    s_wait_bvhcnt 0x0380; GFX12-NEXT:    s_wait_kmcnt 0x0381; GFX12-NEXT:    flat_load_b32 v0, v[0:1] offset:8382; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0383; GFX12-NEXT:    flat_store_b32 v[2:3], v0 offset:8384; GFX12-NEXT:    s_wait_dscnt 0x0385; GFX12-NEXT:    s_setpc_b64 s[30:31]386entry:387  %gep.from = getelementptr inbounds i8, ptr %from, i64 8388  %val = load i32, ptr %gep.from, align 4389  %gep.to = getelementptr inbounds i8, ptr %to, i64 8390  store i32 %val, ptr %gep.to, align 4391  ret void392}393 394define void @fold_as1(ptr addrspace(1) %from, ptr addrspace(1) %to) {395; GFX8-LABEL: fold_as1:396; GFX8:       ; %bb.0: ; %entry397; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)398; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 8, v0399; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc400; GFX8-NEXT:    flat_load_dword v4, v[0:1]401; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 8, v2402; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v3, vcc403; GFX8-NEXT:    s_waitcnt vmcnt(0)404; GFX8-NEXT:    flat_store_dword v[0:1], v4405; GFX8-NEXT:    s_waitcnt vmcnt(0)406; GFX8-NEXT:    s_setpc_b64 s[30:31]407;408; GFX942-LABEL: fold_as1:409; GFX942:       ; %bb.0: ; %entry410; GFX942-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)411; GFX942-NEXT:    global_load_dword v0, v[0:1], off offset:8412; GFX942-NEXT:    s_waitcnt vmcnt(0)413; GFX942-NEXT:    global_store_dword v[2:3], v0, off offset:8414; GFX942-NEXT:    s_waitcnt vmcnt(0)415; GFX942-NEXT:    s_setpc_b64 s[30:31]416;417; GFX10-LABEL: fold_as1:418; GFX10:       ; %bb.0: ; %entry419; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)420; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:8421; GFX10-NEXT:    s_waitcnt vmcnt(0)422; GFX10-NEXT:    global_store_dword v[2:3], v0, off offset:8423; GFX10-NEXT:    s_setpc_b64 s[30:31]424;425; GFX11-LABEL: fold_as1:426; GFX11:       ; %bb.0: ; %entry427; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)428; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:8429; GFX11-NEXT:    s_waitcnt vmcnt(0)430; GFX11-NEXT:    global_store_b32 v[2:3], v0, off offset:8431; GFX11-NEXT:    s_setpc_b64 s[30:31]432;433; GFX12-LABEL: fold_as1:434; GFX12:       ; %bb.0: ; %entry435; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0436; GFX12-NEXT:    s_wait_expcnt 0x0437; GFX12-NEXT:    s_wait_samplecnt 0x0438; GFX12-NEXT:    s_wait_bvhcnt 0x0439; GFX12-NEXT:    s_wait_kmcnt 0x0440; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:8441; GFX12-NEXT:    s_wait_loadcnt 0x0442; GFX12-NEXT:    global_store_b32 v[2:3], v0, off offset:8443; GFX12-NEXT:    s_setpc_b64 s[30:31]444entry:445  %gep.from = getelementptr inbounds i8, ptr addrspace(1) %from, i64 8446  %val = load i32, ptr addrspace(1) %gep.from, align 4447  %gep.to = getelementptr inbounds i8, ptr addrspace(1) %to, i64 8448  store i32 %val, ptr addrspace(1) %gep.to, align 4449  ret void450}451 452define void @fold_as4(ptr addrspace(4) %from, ptr addrspace(1) %to) {453; GFX8-LABEL: fold_as4:454; GFX8:       ; %bb.0: ; %entry455; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)456; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 8, v0457; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc458; GFX8-NEXT:    flat_load_dword v4, v[0:1]459; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 8, v2460; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v3, vcc461; GFX8-NEXT:    s_waitcnt vmcnt(0)462; GFX8-NEXT:    flat_store_dword v[0:1], v4463; GFX8-NEXT:    s_waitcnt vmcnt(0)464; GFX8-NEXT:    s_setpc_b64 s[30:31]465;466; GFX942-LABEL: fold_as4:467; GFX942:       ; %bb.0: ; %entry468; GFX942-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)469; GFX942-NEXT:    global_load_dword v0, v[0:1], off offset:8470; GFX942-NEXT:    s_waitcnt vmcnt(0)471; GFX942-NEXT:    global_store_dword v[2:3], v0, off offset:8472; GFX942-NEXT:    s_waitcnt vmcnt(0)473; GFX942-NEXT:    s_setpc_b64 s[30:31]474;475; GFX10-LABEL: fold_as4:476; GFX10:       ; %bb.0: ; %entry477; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)478; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:8479; GFX10-NEXT:    s_waitcnt vmcnt(0)480; GFX10-NEXT:    global_store_dword v[2:3], v0, off offset:8481; GFX10-NEXT:    s_setpc_b64 s[30:31]482;483; GFX11-LABEL: fold_as4:484; GFX11:       ; %bb.0: ; %entry485; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)486; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:8487; GFX11-NEXT:    s_waitcnt vmcnt(0)488; GFX11-NEXT:    global_store_b32 v[2:3], v0, off offset:8489; GFX11-NEXT:    s_setpc_b64 s[30:31]490;491; GFX12-LABEL: fold_as4:492; GFX12:       ; %bb.0: ; %entry493; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0494; GFX12-NEXT:    s_wait_expcnt 0x0495; GFX12-NEXT:    s_wait_samplecnt 0x0496; GFX12-NEXT:    s_wait_bvhcnt 0x0497; GFX12-NEXT:    s_wait_kmcnt 0x0498; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:8499; GFX12-NEXT:    s_wait_loadcnt 0x0500; GFX12-NEXT:    global_store_b32 v[2:3], v0, off offset:8501; GFX12-NEXT:    s_setpc_b64 s[30:31]502entry:503  %gep.from = getelementptr inbounds i8, ptr addrspace(4) %from, i64 8504  %val = load i32, ptr addrspace(4) %gep.from, align 4505  %gep.to = getelementptr inbounds i8, ptr addrspace(1) %to, i64 8506  store i32 %val, ptr addrspace(1) %gep.to, align 4507  ret void508}509