1748 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -verify-machineinstrs -mcpu=gfx942 -amdgpu-mfma-vgpr-form < %s | FileCheck %s3 4target triple = "amdgcn-amd-amdhsa"5 6define amdgpu_kernel void @respect_optnone(double %arg0, double %arg1, ptr addrspace(1) %ptr) #4 {7; CHECK-LABEL: respect_optnone:8; CHECK: ; %bb.0: ; %bb9; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x010; CHECK-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x811; CHECK-NEXT: s_nop 012; CHECK-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x1013; CHECK-NEXT: s_mov_b32 s6, 0x3ff14; CHECK-NEXT: v_and_b32_e64 v0, v0, s615; CHECK-NEXT: s_mov_b32 s6, 316; CHECK-NEXT: v_lshlrev_b32_e64 v0, s6, v017; CHECK-NEXT: s_waitcnt lgkmcnt(0)18; CHECK-NEXT: global_load_dwordx2 v[0:1], v0, s[4:5]19; CHECK-NEXT: v_mov_b64_e32 v[2:3], s[0:1]20; CHECK-NEXT: v_mov_b64_e32 v[4:5], s[2:3]21; CHECK-NEXT: s_waitcnt vmcnt(0)22; CHECK-NEXT: s_nop 023; CHECK-NEXT: v_mfma_f64_4x4x4_4b_f64 v[0:1], v[2:3], v[4:5], v[0:1]24; CHECK-NEXT: s_nop 525; CHECK-NEXT: v_accvgpr_write_b32 a0, v026; CHECK-NEXT: v_accvgpr_write_b32 a1, v127; CHECK-NEXT: ;;#ASMSTART28; CHECK-NEXT: ; use a[0:1]29; CHECK-NEXT: ;;#ASMEND30; CHECK-NEXT: s_endpgm31bb:32 %id = call i32 @llvm.amdgcn.workitem.id.x()33 %gep = getelementptr double, ptr addrspace(1) %ptr, i32 %id34 %src2 = load double, ptr addrspace(1) %gep35 %mai = call double @llvm.amdgcn.mfma.f64.4x4x4f64(double %arg0, double %arg1, double %src2, i32 0, i32 0, i32 0)36 call void asm sideeffect "; use $0", "a"(double %mai)37 ret void38}39 40define amdgpu_kernel void @test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma(ptr addrspace(1) %arg) #0 {41; CHECK-LABEL: test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma:42; CHECK: ; %bb.0: ; %bb43; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x044; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v045; CHECK-NEXT: v_lshlrev_b32_e32 v0, 7, v046; CHECK-NEXT: v_mov_b32_e32 v32, 1.047; CHECK-NEXT: v_mov_b32_e32 v33, 2.048; CHECK-NEXT: s_waitcnt lgkmcnt(0)49; CHECK-NEXT: global_load_dwordx4 v[28:31], v0, s[0:1] offset:11250; CHECK-NEXT: global_load_dwordx4 v[24:27], v0, s[0:1] offset:9651; CHECK-NEXT: global_load_dwordx4 v[20:23], v0, s[0:1] offset:8052; CHECK-NEXT: global_load_dwordx4 v[16:19], v0, s[0:1] offset:6453; CHECK-NEXT: global_load_dwordx4 v[12:15], v0, s[0:1] offset:4854; CHECK-NEXT: global_load_dwordx4 v[8:11], v0, s[0:1] offset:3255; CHECK-NEXT: global_load_dwordx4 v[4:7], v0, s[0:1] offset:1656; CHECK-NEXT: s_nop 057; CHECK-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]58; CHECK-NEXT: v_accvgpr_write_b32 a0, 1.059; CHECK-NEXT: v_accvgpr_write_b32 a1, 2.060; CHECK-NEXT: s_waitcnt vmcnt(0)61; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]62; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[32:63], a0, a1, v[0:31]63; CHECK-NEXT: s_nop 1564; CHECK-NEXT: s_nop 165; CHECK-NEXT: v_mov_b32_e32 v2, v3266; CHECK-NEXT: v_mov_b32_e32 v3, v3367; CHECK-NEXT: v_mov_b32_e32 v4, v3468; CHECK-NEXT: v_mov_b32_e32 v5, v3569; CHECK-NEXT: v_mov_b32_e32 v6, v3670; CHECK-NEXT: v_mov_b32_e32 v7, v3771; CHECK-NEXT: v_mov_b32_e32 v8, v3872; CHECK-NEXT: v_mov_b32_e32 v9, v3973; CHECK-NEXT: v_mov_b32_e32 v10, v4074; CHECK-NEXT: v_mov_b32_e32 v11, v4175; CHECK-NEXT: v_mov_b32_e32 v12, v4276; CHECK-NEXT: v_mov_b32_e32 v13, v4377; CHECK-NEXT: v_mov_b32_e32 v14, v4478; CHECK-NEXT: v_mov_b32_e32 v15, v4579; CHECK-NEXT: v_mov_b32_e32 v16, v4680; CHECK-NEXT: v_mov_b32_e32 v17, v4781; CHECK-NEXT: v_mov_b32_e32 v18, v4882; CHECK-NEXT: v_mov_b32_e32 v19, v4983; CHECK-NEXT: v_mov_b32_e32 v20, v5084; CHECK-NEXT: v_mov_b32_e32 v21, v5185; CHECK-NEXT: v_mov_b32_e32 v22, v5286; CHECK-NEXT: v_mov_b32_e32 v23, v5387; CHECK-NEXT: v_mov_b32_e32 v24, v5488; CHECK-NEXT: v_mov_b32_e32 v25, v5589; CHECK-NEXT: v_mov_b32_e32 v26, v5690; CHECK-NEXT: v_mov_b32_e32 v27, v5791; CHECK-NEXT: v_mov_b32_e32 v28, v5892; CHECK-NEXT: v_mov_b32_e32 v29, v5993; CHECK-NEXT: v_mov_b32_e32 v30, v6094; CHECK-NEXT: v_mov_b32_e32 v31, v6195; CHECK-NEXT: v_mov_b32_e32 v32, 096; CHECK-NEXT: s_nop 097; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], a0, a1, v[0:31]98; CHECK-NEXT: s_nop 1599; CHECK-NEXT: s_nop 1100; CHECK-NEXT: global_store_dwordx4 v32, v[24:27], s[0:1] offset:96101; CHECK-NEXT: global_store_dwordx4 v32, v[28:31], s[0:1] offset:112102; CHECK-NEXT: global_store_dwordx4 v32, v[16:19], s[0:1] offset:64103; CHECK-NEXT: global_store_dwordx4 v32, v[20:23], s[0:1] offset:80104; CHECK-NEXT: global_store_dwordx4 v32, v[8:11], s[0:1] offset:32105; CHECK-NEXT: global_store_dwordx4 v32, v[12:15], s[0:1] offset:48106; CHECK-NEXT: global_store_dwordx4 v32, v[0:3], s[0:1]107; CHECK-NEXT: global_store_dwordx4 v32, v[4:7], s[0:1] offset:16108; CHECK-NEXT: s_endpgm109bb:110 %id = call i32 @llvm.amdgcn.workitem.id.x()111 %gep = getelementptr <32 x float>, ptr addrspace(1) %arg, i32 %id112 %in.1 = load <32 x float>, ptr addrspace(1) %gep, align 128113 %mai.1 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %in.1, i32 0, i32 0, i32 0)114 %mai.2 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.1, i32 0, i32 0, i32 0)115 %tmp.1 = shufflevector <32 x float> %mai.2, <32 x float> %mai.1, <32 x i32> <i32 32, i32 33, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29>116 %mai.3 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %tmp.1, i32 0, i32 0, i32 0)117 store <32 x float> %mai.3, ptr addrspace(1) %arg, align 128118 ret void119}120 121define amdgpu_kernel void @test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma_noshuffle(ptr addrspace(1) %arg) #0 {122; CHECK-LABEL: test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma_noshuffle:123; CHECK: ; %bb.0: ; %bb124; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0125; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v0126; CHECK-NEXT: v_lshlrev_b32_e32 v0, 7, v0127; CHECK-NEXT: v_mov_b32_e32 v32, 1.0128; CHECK-NEXT: v_mov_b32_e32 v33, 2.0129; CHECK-NEXT: s_waitcnt lgkmcnt(0)130; CHECK-NEXT: global_load_dwordx4 v[28:31], v0, s[0:1] offset:112131; CHECK-NEXT: global_load_dwordx4 v[24:27], v0, s[0:1] offset:96132; CHECK-NEXT: global_load_dwordx4 v[20:23], v0, s[0:1] offset:80133; CHECK-NEXT: global_load_dwordx4 v[16:19], v0, s[0:1] offset:64134; CHECK-NEXT: global_load_dwordx4 v[12:15], v0, s[0:1] offset:48135; CHECK-NEXT: global_load_dwordx4 v[8:11], v0, s[0:1] offset:32136; CHECK-NEXT: global_load_dwordx4 v[4:7], v0, s[0:1] offset:16137; CHECK-NEXT: s_nop 0138; CHECK-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]139; CHECK-NEXT: s_waitcnt vmcnt(0)140; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]141; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]142; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]143; CHECK-NEXT: v_mov_b32_e32 v32, 0144; CHECK-NEXT: s_nop 15145; CHECK-NEXT: s_nop 0146; CHECK-NEXT: global_store_dwordx4 v32, v[24:27], s[0:1] offset:96147; CHECK-NEXT: global_store_dwordx4 v32, v[28:31], s[0:1] offset:112148; CHECK-NEXT: global_store_dwordx4 v32, v[16:19], s[0:1] offset:64149; CHECK-NEXT: global_store_dwordx4 v32, v[20:23], s[0:1] offset:80150; CHECK-NEXT: global_store_dwordx4 v32, v[8:11], s[0:1] offset:32151; CHECK-NEXT: global_store_dwordx4 v32, v[12:15], s[0:1] offset:48152; CHECK-NEXT: global_store_dwordx4 v32, v[0:3], s[0:1]153; CHECK-NEXT: global_store_dwordx4 v32, v[4:7], s[0:1] offset:16154; CHECK-NEXT: s_endpgm155bb:156 %id = call i32 @llvm.amdgcn.workitem.id.x()157 %gep = getelementptr <32 x float>, ptr addrspace(1) %arg, i32 %id158 %in.1 = load <32 x float>, ptr addrspace(1) %gep, align 128159 %mai.1 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %in.1, i32 0, i32 0, i32 0)160 %mai.2 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.1, i32 0, i32 0, i32 0)161 %mai.3 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.2, i32 0, i32 0, i32 0)162 store <32 x float> %mai.3, ptr addrspace(1) %arg, align 128163 ret void164}165 166define amdgpu_kernel void @test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma_imm0_src2(ptr addrspace(1) %arg) #0 {167; CHECK-LABEL: test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma_imm0_src2:168; CHECK: ; %bb.0: ; %bb169; CHECK-NEXT: v_mov_b32_e32 v32, 1.0170; CHECK-NEXT: v_mov_b32_e32 v33, 2.0171; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0172; CHECK-NEXT: s_nop 0173; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, 0174; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]175; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]176; CHECK-NEXT: v_mov_b32_e32 v32, 0177; CHECK-NEXT: s_waitcnt lgkmcnt(0)178; CHECK-NEXT: s_nop 15179; CHECK-NEXT: global_store_dwordx4 v32, v[28:31], s[0:1] offset:112180; CHECK-NEXT: global_store_dwordx4 v32, v[24:27], s[0:1] offset:96181; CHECK-NEXT: global_store_dwordx4 v32, v[20:23], s[0:1] offset:80182; CHECK-NEXT: global_store_dwordx4 v32, v[16:19], s[0:1] offset:64183; CHECK-NEXT: global_store_dwordx4 v32, v[12:15], s[0:1] offset:48184; CHECK-NEXT: global_store_dwordx4 v32, v[8:11], s[0:1] offset:32185; CHECK-NEXT: global_store_dwordx4 v32, v[4:7], s[0:1] offset:16186; CHECK-NEXT: global_store_dwordx4 v32, v[0:3], s[0:1]187; CHECK-NEXT: s_endpgm188bb:189 %id = call i32 @llvm.amdgcn.workitem.id.x()190 %gep = getelementptr <32 x float>, ptr addrspace(1) %arg, i32 %id191 %in.1 = load <32 x float>, ptr addrspace(1) %gep, align 128192 %mai.1 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> zeroinitializer, i32 0, i32 0, i32 0)193 %mai.2 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.1, i32 0, i32 0, i32 0)194 %mai.3 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.2, i32 0, i32 0, i32 0)195 store <32 x float> %mai.3, ptr addrspace(1) %arg, align 128196 ret void197}198 199define amdgpu_kernel void @test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma_imm1_src2(ptr addrspace(1) %arg) #0 {200; CHECK-LABEL: test_mfma_f32_32x32x1f32_rewrite_vgpr_mfma_imm1_src2:201; CHECK: ; %bb.0: ; %bb202; CHECK-NEXT: v_mov_b32_e32 v32, 1.0203; CHECK-NEXT: v_mov_b32_e32 v33, 2.0204; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0205; CHECK-NEXT: s_nop 0206; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, 1.0207; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]208; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[0:31], v32, v33, v[0:31]209; CHECK-NEXT: v_mov_b32_e32 v32, 0210; CHECK-NEXT: s_waitcnt lgkmcnt(0)211; CHECK-NEXT: s_nop 15212; CHECK-NEXT: global_store_dwordx4 v32, v[28:31], s[0:1] offset:112213; CHECK-NEXT: global_store_dwordx4 v32, v[24:27], s[0:1] offset:96214; CHECK-NEXT: global_store_dwordx4 v32, v[20:23], s[0:1] offset:80215; CHECK-NEXT: global_store_dwordx4 v32, v[16:19], s[0:1] offset:64216; CHECK-NEXT: global_store_dwordx4 v32, v[12:15], s[0:1] offset:48217; CHECK-NEXT: global_store_dwordx4 v32, v[8:11], s[0:1] offset:32218; CHECK-NEXT: global_store_dwordx4 v32, v[4:7], s[0:1] offset:16219; CHECK-NEXT: global_store_dwordx4 v32, v[0:3], s[0:1]220; CHECK-NEXT: s_endpgm221bb:222 %id = call i32 @llvm.amdgcn.workitem.id.x()223 %gep = getelementptr <32 x float>, ptr addrspace(1) %arg, i32 %id224 %in.1 = load <32 x float>, ptr addrspace(1) %gep, align 128225 %mai.1 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> splat (float 1.000000e+00), i32 0, i32 0, i32 0)226 %mai.2 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.1, i32 0, i32 0, i32 0)227 %mai.3 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 1.000000e+00, float 2.000000e+00, <32 x float> %mai.2, i32 0, i32 0, i32 0)228 store <32 x float> %mai.3, ptr addrspace(1) %arg, align 128229 ret void230}231 232; The inline asm requires the value be copied to an AGPR class, not233; the AV_* pseudo we usually expect for register allocator live range234; splits.235define amdgpu_kernel void @test_rewrite_mfma_direct_copy_to_agpr_class(ptr addrspace(1) %arg) #0 {236; CHECK-LABEL: test_rewrite_mfma_direct_copy_to_agpr_class:237; CHECK: ; %bb.0: ; %bb238; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0239; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v0240; CHECK-NEXT: v_lshlrev_b32_e32 v0, 7, v0241; CHECK-NEXT: v_mov_b32_e32 v32, 2.0242; CHECK-NEXT: v_mov_b32_e32 v33, 4.0243; CHECK-NEXT: s_waitcnt lgkmcnt(0)244; CHECK-NEXT: global_load_dwordx4 a[28:31], v0, s[0:1] offset:112245; CHECK-NEXT: global_load_dwordx4 a[24:27], v0, s[0:1] offset:96246; CHECK-NEXT: global_load_dwordx4 a[20:23], v0, s[0:1] offset:80247; CHECK-NEXT: global_load_dwordx4 a[16:19], v0, s[0:1] offset:64248; CHECK-NEXT: global_load_dwordx4 a[12:15], v0, s[0:1] offset:48249; CHECK-NEXT: global_load_dwordx4 a[8:11], v0, s[0:1] offset:32250; CHECK-NEXT: global_load_dwordx4 a[4:7], v0, s[0:1] offset:16251; CHECK-NEXT: global_load_dwordx4 a[0:3], v0, s[0:1]252; CHECK-NEXT: s_waitcnt vmcnt(0)253; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v32, v33, a[0:31]254; CHECK-NEXT: ;;#ASMSTART255; CHECK-NEXT: ; use a[0:31]256; CHECK-NEXT: ;;#ASMEND257; CHECK-NEXT: s_endpgm258bb:259 %id = call i32 @llvm.amdgcn.workitem.id.x()260 %gep = getelementptr <32 x float>, ptr addrspace(1) %arg, i32 %id261 %in = load <32 x float>, ptr addrspace(1) %gep, align 128262 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 2.0, float 4.0, <32 x float> %in, i32 0, i32 0, i32 0)263 call void asm sideeffect "; use $0", "a"(<32 x float> %mai)264 ret void265}266 267define void @test_rewrite_mfma_imm_src2(float %arg0, float %arg1) #0 {268; CHECK-LABEL: test_rewrite_mfma_imm_src2:269; CHECK: ; %bb.0: ; %bb270; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)271; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v0, v1, 2.0272; CHECK-NEXT: ;;#ASMSTART273; CHECK-NEXT: ; use a[0:31]274; CHECK-NEXT: ;;#ASMEND275; CHECK-NEXT: s_setpc_b64 s[30:31]276bb:277 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float %arg0, float %arg1, <32 x float> splat (float 2.0), i32 0, i32 0, i32 0)278 call void asm sideeffect "; use $0", "a"(<32 x float> %mai)279 ret void280}281 282define void @test_rewrite_mfma_subreg_extract0(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {283; CHECK-LABEL: test_rewrite_mfma_subreg_extract0:284; CHECK: ; %bb.0: ; %bb285; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)286; CHECK-NEXT: global_load_dwordx4 a[28:31], v[2:3], off offset:112287; CHECK-NEXT: global_load_dwordx4 a[24:27], v[2:3], off offset:96288; CHECK-NEXT: global_load_dwordx4 a[20:23], v[2:3], off offset:80289; CHECK-NEXT: global_load_dwordx4 a[16:19], v[2:3], off offset:64290; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:48291; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:32292; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:16293; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off294; CHECK-NEXT: s_waitcnt vmcnt(0)295; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v0, v1, a[0:31]296; CHECK-NEXT: ;;#ASMSTART297; CHECK-NEXT: ; use a[0:3]298; CHECK-NEXT: ;;#ASMEND299; CHECK-NEXT: s_setpc_b64 s[30:31]300bb:301 %src2 = load <32 x float>, ptr addrspace(1) %ptr302 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float %arg0, float %arg1, <32 x float> %src2, i32 0, i32 0, i32 0)303 %extract.sub4 = shufflevector <32 x float> %mai, <32 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>304 call void asm sideeffect "; use $0", "a"(<4 x float> %extract.sub4)305 ret void306}307 308define void @test_rewrite_mfma_subreg_extract1(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {309; CHECK-LABEL: test_rewrite_mfma_subreg_extract1:310; CHECK: ; %bb.0: ; %bb311; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)312; CHECK-NEXT: global_load_dwordx4 a[28:31], v[2:3], off offset:112313; CHECK-NEXT: global_load_dwordx4 a[24:27], v[2:3], off offset:96314; CHECK-NEXT: global_load_dwordx4 a[20:23], v[2:3], off offset:80315; CHECK-NEXT: global_load_dwordx4 a[16:19], v[2:3], off offset:64316; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:48317; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:32318; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:16319; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off320; CHECK-NEXT: s_waitcnt vmcnt(0)321; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v0, v1, a[0:31]322; CHECK-NEXT: ;;#ASMSTART323; CHECK-NEXT: ; use a[4:7]324; CHECK-NEXT: ;;#ASMEND325; CHECK-NEXT: s_setpc_b64 s[30:31]326bb:327 %src2 = load <32 x float>, ptr addrspace(1) %ptr328 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float %arg0, float %arg1, <32 x float> %src2, i32 0, i32 0, i32 0)329 %extract.sub4 = shufflevector <32 x float> %mai, <32 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>330 call void asm sideeffect "; use $0", "a"(<4 x float> %extract.sub4)331 ret void332}333 334; odd offset335define void @test_rewrite_mfma_subreg_extract2(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {336; CHECK-LABEL: test_rewrite_mfma_subreg_extract2:337; CHECK: ; %bb.0: ; %bb338; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)339; CHECK-NEXT: global_load_dwordx4 a[28:31], v[2:3], off offset:112340; CHECK-NEXT: global_load_dwordx4 a[24:27], v[2:3], off offset:96341; CHECK-NEXT: global_load_dwordx4 a[20:23], v[2:3], off offset:80342; CHECK-NEXT: global_load_dwordx4 a[16:19], v[2:3], off offset:64343; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:48344; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:32345; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:16346; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off347; CHECK-NEXT: s_waitcnt vmcnt(0)348; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v0, v1, a[0:31]349; CHECK-NEXT: s_nop 15350; CHECK-NEXT: s_nop 1351; CHECK-NEXT: v_accvgpr_mov_b32 a0, a1352; CHECK-NEXT: v_accvgpr_mov_b32 a1, a2353; CHECK-NEXT: v_accvgpr_mov_b32 a2, a3354; CHECK-NEXT: v_accvgpr_mov_b32 a3, a4355; CHECK-NEXT: ;;#ASMSTART356; CHECK-NEXT: ; use a[0:3]357; CHECK-NEXT: ;;#ASMEND358; CHECK-NEXT: s_setpc_b64 s[30:31]359bb:360 %src2 = load <32 x float>, ptr addrspace(1) %ptr361 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float %arg0, float %arg1, <32 x float> %src2, i32 0, i32 0, i32 0)362 %extract.sub4 = shufflevector <32 x float> %mai, <32 x float> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 4>363 call void asm sideeffect "; use $0", "a"(<4 x float> %extract.sub4)364 ret void365}366 367define amdgpu_kernel void @illegal_mfma_after_rewrite() #1 {368; CHECK-LABEL: illegal_mfma_after_rewrite:369; CHECK: ; %bb.0: ; %entry370; CHECK-NEXT: s_mov_b32 s4, 0371; CHECK-NEXT: s_mov_b32 s5, s4372; CHECK-NEXT: v_mov_b64_e32 v[26:27], s[4:5]373; CHECK-NEXT: ;;#ASMSTART374; CHECK-NEXT: ; def s[0:3]375; CHECK-NEXT: ;;#ASMEND376; CHECK-NEXT: ;;#ASMSTART377; CHECK-NEXT: ; def v[16:19]378; CHECK-NEXT: ;;#ASMEND379; CHECK-NEXT: s_nop 0380; CHECK-NEXT: v_mov_b64_e32 v[0:1], s[0:1]381; CHECK-NEXT: v_mov_b64_e32 v[2:3], s[2:3]382; CHECK-NEXT: s_mov_b32 s0, 0x3c003c00383; CHECK-NEXT: s_mov_b32 s1, s0384; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[4:7], v[26:27], v[26:27], v[0:3]385; CHECK-NEXT: v_mov_b64_e32 v[28:29], s[0:1]386; CHECK-NEXT: s_mov_b32 s0, 0x7e007e00387; CHECK-NEXT: s_mov_b32 s1, s0388; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[4:7], v[26:27], v[26:27], v[4:7]389; CHECK-NEXT: v_mov_b64_e32 v[30:31], s[0:1]390; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[6:9], v[26:27], v[28:29], v[0:3]391; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[6:9], v[26:27], v[26:27], v[6:9]392; CHECK-NEXT: s_nop 3393; CHECK-NEXT: v_cvt_f16_f32_e32 v24, v4394; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[12:15], v[26:27], v[30:31], v[0:3]395; CHECK-NEXT: s_nop 0396; CHECK-NEXT: v_mov_b32_e32 v8, 0x7fc00000397; CHECK-NEXT: v_mov_b32_e32 v9, v8398; CHECK-NEXT: v_mov_b32_e32 v10, v8399; CHECK-NEXT: v_mov_b32_e32 v11, v8400; CHECK-NEXT: v_cvt_f16_f32_e32 v2, v6401; CHECK-NEXT: v_mov_b64_e32 v[0:1], 0402; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[8:11], v[26:27], v[26:27], v[8:11]403; CHECK-NEXT: global_store_short v[0:1], v2, off404; CHECK-NEXT: buffer_wbl2 sc0 sc1405; CHECK-NEXT: s_waitcnt vmcnt(0)406; CHECK-NEXT: buffer_inv sc0 sc1407; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[2:5], v[26:27], v[28:29], v[16:19]408; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[6:9], v[26:27], v[26:27], v[8:11]409; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[20:23], v[26:27], v[26:27], v[16:19]410; CHECK-NEXT: s_nop 5411; CHECK-NEXT: v_cvt_f16_f32_e32 v10, v6412; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[6:9], v[26:27], v[26:27], v[12:15]413; CHECK-NEXT: global_store_short v[0:1], v10, off414; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[2:5], v[26:27], v[26:27], v[2:5]415; CHECK-NEXT: buffer_wbl2 sc0 sc1416; CHECK-NEXT: s_waitcnt vmcnt(0)417; CHECK-NEXT: buffer_inv sc0 sc1418; CHECK-NEXT: s_nop 1419; CHECK-NEXT: v_cvt_f16_f32_e32 v6, v6420; CHECK-NEXT: global_store_short v[0:1], v6, off421; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[16:19], v[26:27], v[26:27], v[20:23]422; CHECK-NEXT: buffer_wbl2 sc0 sc1423; CHECK-NEXT: s_waitcnt vmcnt(0)424; CHECK-NEXT: buffer_inv sc0 sc1425; CHECK-NEXT: global_store_short v[0:1], v24, off426; CHECK-NEXT: buffer_wbl2 sc0 sc1427; CHECK-NEXT: s_waitcnt vmcnt(0)428; CHECK-NEXT: buffer_inv sc0 sc1429; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[2:5], v[28:29], v[26:27], v[2:5]430; CHECK-NEXT: s_nop 6431; CHECK-NEXT: v_cvt_f16_f32_e32 v6, v2432; CHECK-NEXT: v_mfma_f32_16x16x16_f16 v[2:5], v[30:31], v[26:27], v[16:19]433; CHECK-NEXT: global_store_short v[0:1], v6, off434; CHECK-NEXT: buffer_wbl2 sc0 sc1435; CHECK-NEXT: s_waitcnt vmcnt(0)436; CHECK-NEXT: buffer_inv sc0 sc1437; CHECK-NEXT: s_nop 2438; CHECK-NEXT: v_cvt_f16_f32_e32 v2, v2439; CHECK-NEXT: global_store_short v[0:1], v2, off440; CHECK-NEXT: s_endpgm441entry:442 %k0 = call <4 x float> asm sideeffect "; def $0", "=s"()443 %i2 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %k0, i32 0, i32 0, i32 0)444 %i4 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> splat (half 0xH3C00), <4 x float> %k0, i32 0, i32 0, i32 0)445 %i6 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> splat (half 0xH7E00), <4 x float> %k0, i32 0, i32 0, i32 0)446 %i5 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> splat (float 0x7FF8000000000000), i32 0, i32 0, i32 0)447 %k = call <4 x float> asm sideeffect "; def $0", "=v"()448 %i1 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %k, i32 0, i32 0, i32 0)449 %i7 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> splat (half 0xH3C00), <4 x float> %k, i32 0, i32 0, i32 0)450 %i17 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %i1, i32 0, i32 0, i32 0)451 %i19 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %i4, i32 0, i32 0, i32 0)452 %c_thread_buf.0 = extractelement <4 x float> %i19, i64 0453 %conv.0 = fptrunc float %c_thread_buf.0 to half454 store half %conv.0, ptr addrspace(1) null, align 2455 fence seq_cst456 %i22 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %i5, i32 0, i32 0, i32 0)457 %c_thread_buf.1 = extractelement <4 x float> %i22, i64 0458 %conv1 = fptrunc float %c_thread_buf.1 to half459 store half %conv1, ptr addrspace(1) null, align 2460 fence seq_cst461 %i23 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %i6, i32 0, i32 0, i32 0)462 %c_thread_buf.2 = extractelement <4 x float> %i23, i64 0463 %conv2 = fptrunc float %c_thread_buf.2 to half464 store half %conv2, ptr addrspace(1) null, align 2465 fence seq_cst466 %i25 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %i2, i32 0, i32 0, i32 0)467 %c_thread_buf.3 = extractelement <4 x float> %i25, i64 0468 %conv3 = fptrunc float %c_thread_buf.3 to half469 store half %conv3, ptr addrspace(1) null, align 2470 fence seq_cst471 %i26 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> zeroinitializer, <4 x half> zeroinitializer, <4 x float> %i7, i32 0, i32 0, i32 0)472 %i27 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> splat (half 0xH3C00), <4 x half> zeroinitializer, <4 x float> %i26, i32 0, i32 0, i32 0)473 %c_thread_buf.4 = extractelement <4 x float> %i27, i64 0474 %conv4 = fptrunc float %c_thread_buf.4 to half475 store half %conv4, ptr addrspace(1) null, align 2476 fence seq_cst477 %i31 = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> splat (half 0xH7E00), <4 x half> zeroinitializer, <4 x float> %i17, i32 0, i32 0, i32 0)478 %c_thread_buf.5 = extractelement <4 x float> %i31, i64 0479 %conv5 = fptrunc float %c_thread_buf.5 to half480 store half %conv5, ptr addrspace(1) null, align 2481 ret void482}483 484define void @test_rewrite_mfma_subreg_insert0(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {485; CHECK-LABEL: test_rewrite_mfma_subreg_insert0:486; CHECK: ; %bb.0:487; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)488; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off489; CHECK-NEXT: s_waitcnt vmcnt(0)490; CHECK-NEXT: v_mfma_f32_4x4x1_16b_f32 a[0:3], v0, v1, a[0:3]491; CHECK-NEXT: ;;#ASMSTART492; CHECK-NEXT: ; use a[0:7]493; CHECK-NEXT: ;;#ASMEND494; CHECK-NEXT: s_setpc_b64 s[30:31]495 %src2 = load <4 x float>, ptr addrspace(1) %ptr496 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.4x4x1f32(float %arg0, float %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)497 %insert.sub0 = shufflevector <4 x float> %mai, <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>498 call void asm sideeffect "; use $0", "a"(<8 x float> %insert.sub0)499 ret void500}501 502; odd offset503define void @test_rewrite_mfma_subreg_insert1(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {504; CHECK-LABEL: test_rewrite_mfma_subreg_insert1:505; CHECK: ; %bb.0:506; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)507; CHECK-NEXT: global_load_dwordx4 v[2:5], v[2:3], off508; CHECK-NEXT: s_waitcnt vmcnt(0)509; CHECK-NEXT: v_mfma_f32_4x4x1_16b_f32 v[0:3], v0, v1, v[2:5]510; CHECK-NEXT: s_nop 3511; CHECK-NEXT: v_pk_mov_b32 v[0:1], v[0:1], v[2:3] op_sel:[1,0]512; CHECK-NEXT: s_nop 0513; CHECK-NEXT: v_accvgpr_write_b32 a0, v0514; CHECK-NEXT: v_accvgpr_write_b32 a1, v1515; CHECK-NEXT: v_accvgpr_write_b32 a2, v3516; CHECK-NEXT: ;;#ASMSTART517; CHECK-NEXT: ; use a[0:7]518; CHECK-NEXT: ;;#ASMEND519; CHECK-NEXT: s_setpc_b64 s[30:31]520 %src2 = load <4 x float>, ptr addrspace(1) %ptr521 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.4x4x1f32(float %arg0, float %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)522 %insert.sub0 = shufflevector <4 x float> %mai, <4 x float> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 poison, i32 poison, i32 poison, i32 poison>523 call void asm sideeffect "; use $0", "a"(<8 x float> %insert.sub0)524 ret void525}526 527define void @test_rewrite_mfma_subreg_insert2(double %arg0, double %arg1, ptr addrspace(1) %ptr) #0 {528; CHECK-LABEL: test_rewrite_mfma_subreg_insert2:529; CHECK: ; %bb.0:530; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)531; CHECK-NEXT: global_load_dwordx2 a[0:1], v[4:5], off532; CHECK-NEXT: s_waitcnt vmcnt(0)533; CHECK-NEXT: v_mfma_f64_4x4x4_4b_f64 a[0:1], v[0:1], v[2:3], a[0:1]534; CHECK-NEXT: ;;#ASMSTART535; CHECK-NEXT: ; use a[0:3]536; CHECK-NEXT: ;;#ASMEND537; CHECK-NEXT: s_setpc_b64 s[30:31]538 %src2 = load double, ptr addrspace(1) %ptr539 %mai = call double @llvm.amdgcn.mfma.f64.4x4x4f64(double %arg0, double %arg1, double %src2, i32 0, i32 0, i32 0)540 %insert.sub0 = insertelement <2 x double> poison, double %mai, i32 0541 call void asm sideeffect "; use $0", "a"(<2 x double> %insert.sub0)542 ret void543}544 545define amdgpu_kernel void @test_rewrite_mfma_direct_copy_from_agpr_class(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) #0 {546; CHECK-LABEL: test_rewrite_mfma_direct_copy_from_agpr_class:547; CHECK: ; %bb.0:548; CHECK-NEXT: v_accvgpr_write_b32 a34, 2.0549; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v0550; CHECK-NEXT: v_lshlrev_b32_e32 v0, 7, v0551; CHECK-NEXT: ;;#ASMSTART552; CHECK-NEXT: ; def a[0:31]553; CHECK-NEXT: ;;#ASMEND554; CHECK-NEXT: v_accvgpr_write_b32 a32, v0555; CHECK-NEXT: v_accvgpr_read_b32 v0, a0556; CHECK-NEXT: v_accvgpr_read_b32 v1, a1557; CHECK-NEXT: v_accvgpr_read_b32 v2, a2558; CHECK-NEXT: v_accvgpr_read_b32 v3, a3559; CHECK-NEXT: v_accvgpr_read_b32 v4, a4560; CHECK-NEXT: v_accvgpr_read_b32 v5, a5561; CHECK-NEXT: v_accvgpr_read_b32 v6, a6562; CHECK-NEXT: v_accvgpr_read_b32 v7, a7563; CHECK-NEXT: v_accvgpr_read_b32 v8, a8564; CHECK-NEXT: v_accvgpr_read_b32 v9, a9565; CHECK-NEXT: v_accvgpr_read_b32 v10, a10566; CHECK-NEXT: v_accvgpr_read_b32 v11, a11567; CHECK-NEXT: v_accvgpr_read_b32 v12, a12568; CHECK-NEXT: v_accvgpr_read_b32 v13, a13569; CHECK-NEXT: v_accvgpr_read_b32 v14, a14570; CHECK-NEXT: v_accvgpr_read_b32 v15, a15571; CHECK-NEXT: v_accvgpr_read_b32 v16, a16572; CHECK-NEXT: v_accvgpr_read_b32 v17, a17573; CHECK-NEXT: v_accvgpr_read_b32 v18, a18574; CHECK-NEXT: v_accvgpr_read_b32 v19, a19575; CHECK-NEXT: v_accvgpr_read_b32 v20, a20576; CHECK-NEXT: v_accvgpr_read_b32 v21, a21577; CHECK-NEXT: v_accvgpr_read_b32 v22, a22578; CHECK-NEXT: v_accvgpr_read_b32 v23, a23579; CHECK-NEXT: v_accvgpr_read_b32 v24, a24580; CHECK-NEXT: v_accvgpr_read_b32 v25, a25581; CHECK-NEXT: v_accvgpr_read_b32 v26, a26582; CHECK-NEXT: v_accvgpr_read_b32 v27, a27583; CHECK-NEXT: v_accvgpr_read_b32 v28, a28584; CHECK-NEXT: v_accvgpr_read_b32 v29, a29585; CHECK-NEXT: v_accvgpr_read_b32 v30, a30586; CHECK-NEXT: v_accvgpr_read_b32 v31, a31587; CHECK-NEXT: v_accvgpr_write_b32 a33, 4.0588; CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0589; CHECK-NEXT: s_nop 0590; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 v[32:63], a34, a33, v[0:31]591; CHECK-NEXT: v_mov_b32_e32 v1, 0x41000000592; CHECK-NEXT: v_accvgpr_read_b32 v0, a32593; CHECK-NEXT: s_nop 15594; CHECK-NEXT: v_mov_b64_e32 v[2:3], v[32:33]595; CHECK-NEXT: v_mov_b64_e32 v[4:5], v[34:35]596; CHECK-NEXT: v_mov_b64_e32 v[6:7], v[36:37]597; CHECK-NEXT: v_mov_b64_e32 v[8:9], v[38:39]598; CHECK-NEXT: v_mov_b64_e32 v[10:11], v[40:41]599; CHECK-NEXT: v_mov_b64_e32 v[12:13], v[42:43]600; CHECK-NEXT: v_mov_b64_e32 v[14:15], v[44:45]601; CHECK-NEXT: v_mov_b64_e32 v[16:17], v[46:47]602; CHECK-NEXT: v_mov_b64_e32 v[18:19], v[48:49]603; CHECK-NEXT: v_mov_b64_e32 v[20:21], v[50:51]604; CHECK-NEXT: v_mov_b64_e32 v[22:23], v[52:53]605; CHECK-NEXT: v_mov_b64_e32 v[24:25], v[54:55]606; CHECK-NEXT: v_mov_b64_e32 v[26:27], v[56:57]607; CHECK-NEXT: v_mov_b64_e32 v[28:29], v[58:59]608; CHECK-NEXT: v_mov_b64_e32 v[30:31], v[60:61]609; CHECK-NEXT: v_mov_b64_e32 v[32:33], v[62:63]610; CHECK-NEXT: s_waitcnt lgkmcnt(0)611; CHECK-NEXT: global_store_dwordx4 v0, v[30:33], s[0:1] offset:112612; CHECK-NEXT: global_store_dwordx4 v0, v[26:29], s[0:1] offset:96613; CHECK-NEXT: global_store_dwordx4 v0, v[22:25], s[0:1] offset:80614; CHECK-NEXT: global_store_dwordx4 v0, v[18:21], s[0:1] offset:64615; CHECK-NEXT: global_store_dwordx4 v0, v[14:17], s[0:1] offset:48616; CHECK-NEXT: global_store_dwordx4 v0, v[10:13], s[0:1] offset:32617; CHECK-NEXT: global_store_dwordx4 v0, v[6:9], s[0:1] offset:16618; CHECK-NEXT: global_store_dwordx4 v0, v[2:5], s[0:1]619; CHECK-NEXT: s_nop 1620; CHECK-NEXT: v_mov_b32_e32 v2, 0x41800000621; CHECK-NEXT: s_nop 1622; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v1, v2, a[0:31]623; CHECK-NEXT: s_nop 15624; CHECK-NEXT: s_nop 1625; CHECK-NEXT: global_store_dwordx4 v0, a[24:27], s[2:3] offset:96626; CHECK-NEXT: global_store_dwordx4 v0, a[28:31], s[2:3] offset:112627; CHECK-NEXT: global_store_dwordx4 v0, a[16:19], s[2:3] offset:64628; CHECK-NEXT: global_store_dwordx4 v0, a[20:23], s[2:3] offset:80629; CHECK-NEXT: global_store_dwordx4 v0, a[8:11], s[2:3] offset:32630; CHECK-NEXT: global_store_dwordx4 v0, a[12:15], s[2:3] offset:48631; CHECK-NEXT: global_store_dwordx4 v0, a[0:3], s[2:3]632; CHECK-NEXT: global_store_dwordx4 v0, a[4:7], s[2:3] offset:16633; CHECK-NEXT: s_endpgm634 %src2 = call <32 x float> asm sideeffect "; def $0", "=a"()635 %mai0 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 2.0, float 4.0, <32 x float> %src2, i32 0, i32 0, i32 0)636 %mai1 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 8.0, float 16.0, <32 x float> %src2, i32 0, i32 0, i32 0)637 %id = call i32 @llvm.amdgcn.workitem.id.x()638 %gep0 = getelementptr <32 x float>, ptr addrspace(1) %arg0, i32 %id639 store <32 x float> %mai0, ptr addrspace(1) %gep0, align 128640 %gep1 = getelementptr <32 x float>, ptr addrspace(1) %arg1, i32 %id641 store <32 x float> %mai1, ptr addrspace(1) %gep1, align 128642 ret void643}644 645define amdgpu_kernel void @test_rewrite_mfma_direct_copy_from_agpr_class_chain(ptr addrspace(1) %arg0) #0 {646; CHECK-LABEL: test_rewrite_mfma_direct_copy_from_agpr_class_chain:647; CHECK: ; %bb.0:648; CHECK-NEXT: v_mov_b32_e32 v1, 2.0649; CHECK-NEXT: ;;#ASMSTART650; CHECK-NEXT: ; def a[0:31]651; CHECK-NEXT: ;;#ASMEND652; CHECK-NEXT: v_mov_b32_e32 v34, 4.0653; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0654; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v0655; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v1, v34, a[0:31]656; CHECK-NEXT: v_mov_b32_e32 v1, 0x41000000657; CHECK-NEXT: v_mov_b32_e32 v34, 0x41800000658; CHECK-NEXT: v_lshlrev_b32_e32 v0, 7, v0659; CHECK-NEXT: s_nop 0660; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v1, v34, a[0:31]661; CHECK-NEXT: s_waitcnt lgkmcnt(0)662; CHECK-NEXT: s_nop 15663; CHECK-NEXT: s_nop 0664; CHECK-NEXT: global_store_dwordx4 v0, a[28:31], s[0:1] offset:112665; CHECK-NEXT: global_store_dwordx4 v0, a[24:27], s[0:1] offset:96666; CHECK-NEXT: global_store_dwordx4 v0, a[20:23], s[0:1] offset:80667; CHECK-NEXT: global_store_dwordx4 v0, a[16:19], s[0:1] offset:64668; CHECK-NEXT: global_store_dwordx4 v0, a[12:15], s[0:1] offset:48669; CHECK-NEXT: global_store_dwordx4 v0, a[8:11], s[0:1] offset:32670; CHECK-NEXT: global_store_dwordx4 v0, a[4:7], s[0:1] offset:16671; CHECK-NEXT: global_store_dwordx4 v0, a[0:3], s[0:1]672; CHECK-NEXT: s_endpgm673 %src2 = call <32 x float> asm sideeffect "; def $0", "=a"()674 %mai0 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 2.0, float 4.0, <32 x float> %src2, i32 0, i32 0, i32 0)675 %mai1 = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 8.0, float 16.0, <32 x float> %mai0, i32 0, i32 0, i32 0)676 %id = call i32 @llvm.amdgcn.workitem.id.x()677 %gep0 = getelementptr <32 x float>, ptr addrspace(1) %arg0, i32 %id678 store <32 x float> %mai1, ptr addrspace(1) %gep0, align 128679 ret void680}681 682; Untied case683define void @test_rewrite_mfma_copy_from_agpr_class_f64_4x4x4f64(double %arg0, double %arg1, ptr addrspace(1) %ptr) #0 {684; CHECK-LABEL: test_rewrite_mfma_copy_from_agpr_class_f64_4x4x4f64:685; CHECK: ; %bb.0:686; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)687; CHECK-NEXT: ;;#ASMSTART688; CHECK-NEXT: ; def a[0:1]689; CHECK-NEXT: ;;#ASMEND690; CHECK-NEXT: v_and_b32_e32 v8, 0x3ff, v31691; CHECK-NEXT: v_mfma_f64_4x4x4_4b_f64 a[0:1], v[0:1], v[2:3], a[0:1]692; CHECK-NEXT: v_lshlrev_b32_e32 v2, 3, v8693; CHECK-NEXT: v_mov_b32_e32 v3, 0694; CHECK-NEXT: v_lshl_add_u64 v[2:3], v[4:5], 0, v[2:3]695; CHECK-NEXT: s_nop 5696; CHECK-NEXT: global_store_dwordx2 v[2:3], a[0:1], off697; CHECK-NEXT: s_waitcnt vmcnt(0)698; CHECK-NEXT: s_setpc_b64 s[30:31]699 %src2 = call double asm sideeffect "; def $0", "=a"()700 %mai = call double @llvm.amdgcn.mfma.f64.4x4x4f64(double %arg0, double %arg1, double %src2, i32 0, i32 0, i32 0)701 %id = call i32 @llvm.amdgcn.workitem.id.x()702 %gep0 = getelementptr double, ptr addrspace(1) %ptr, i32 %id703 store double %mai, ptr addrspace(1) %gep0, align 8704 ret void705}706 707define void @test_rewrite_mfma_copy_from_agpr_class_f64_4x4x4f64_chain(double %arg0, double %arg1, double %arg2, double %arg3, ptr addrspace(1) %ptr) #0 {708; CHECK-LABEL: test_rewrite_mfma_copy_from_agpr_class_f64_4x4x4f64_chain:709; CHECK: ; %bb.0:710; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)711; CHECK-NEXT: ;;#ASMSTART712; CHECK-NEXT: ; def a[0:1]713; CHECK-NEXT: ;;#ASMEND714; CHECK-NEXT: s_nop 0715; CHECK-NEXT: v_mfma_f64_4x4x4_4b_f64 a[0:1], v[0:1], v[2:3], a[0:1]716; CHECK-NEXT: v_and_b32_e32 v2, 0x3ff, v31717; CHECK-NEXT: v_lshlrev_b32_e32 v2, 3, v2718; CHECK-NEXT: v_mov_b32_e32 v3, 0719; CHECK-NEXT: v_lshl_add_u64 v[2:3], v[8:9], 0, v[2:3]720; CHECK-NEXT: v_mfma_f64_4x4x4_4b_f64 a[0:1], v[4:5], v[6:7], a[0:1]721; CHECK-NEXT: s_nop 8722; CHECK-NEXT: global_store_dwordx2 v[2:3], a[0:1], off723; CHECK-NEXT: s_waitcnt vmcnt(0)724; CHECK-NEXT: s_setpc_b64 s[30:31]725 %src2 = call double asm sideeffect "; def $0", "=a"()726 %mai0 = call double @llvm.amdgcn.mfma.f64.4x4x4f64(double %arg0, double %arg1, double %src2, i32 0, i32 0, i32 0)727 %mai1 = call double @llvm.amdgcn.mfma.f64.4x4x4f64(double %arg2, double %arg3, double %mai0, i32 0, i32 0, i32 0)728 %id = call i32 @llvm.amdgcn.workitem.id.x()729 %gep0 = getelementptr double, ptr addrspace(1) %ptr, i32 %id730 store double %mai1, ptr addrspace(1) %gep0, align 8731 ret void732}733 734define amdgpu_kernel void @test_rewrite_mfma_direct_copy_from_agpr_class_subreg(ptr addrspace(1) %arg) #0 {735; CHECK-LABEL: test_rewrite_mfma_direct_copy_from_agpr_class_subreg:736; CHECK: ; %bb.0:737; CHECK-NEXT: v_mov_b32_e32 v1, 2.0738; CHECK-NEXT: ;;#ASMSTART739; CHECK-NEXT: ; def a[0:31]740; CHECK-NEXT: ;;#ASMEND741; CHECK-NEXT: v_mov_b32_e32 v18, 4.0742; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0743; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v0744; CHECK-NEXT: v_mfma_f32_16x16x1_4b_f32 a[0:15], v1, v18, a[0:15]745; CHECK-NEXT: v_lshlrev_b32_e32 v0, 6, v0746; CHECK-NEXT: s_waitcnt lgkmcnt(0)747; CHECK-NEXT: s_nop 7748; CHECK-NEXT: global_store_dwordx4 v0, a[12:15], s[0:1] offset:48749; CHECK-NEXT: global_store_dwordx4 v0, a[8:11], s[0:1] offset:32750; CHECK-NEXT: global_store_dwordx4 v0, a[4:7], s[0:1] offset:16751; CHECK-NEXT: global_store_dwordx4 v0, a[0:3], s[0:1]752; CHECK-NEXT: s_endpgm753 %def = call <32 x float> asm sideeffect "; def $0", "=a"()754 %src2 = shufflevector <32 x float> %def, <32 x float> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>755 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.16x16x1f32(float 2.0, float 4.0, <16 x float> %src2, i32 0, i32 0, i32 0)756 %id = call i32 @llvm.amdgcn.workitem.id.x()757 %gep = getelementptr <16 x float>, ptr addrspace(1) %arg, i32 %id758 store <16 x float> %mai, ptr addrspace(1) %gep, align 64759 ret void760}761 762define amdgpu_kernel void @test_rewrite_mfma_direct_copy_from_agpr_class_subreg_odd(ptr addrspace(1) %arg) #0 {763; CHECK-LABEL: test_rewrite_mfma_direct_copy_from_agpr_class_subreg_odd:764; CHECK: ; %bb.0:765; CHECK-NEXT: v_mov_b32_e32 v1, 2.0766; CHECK-NEXT: ;;#ASMSTART767; CHECK-NEXT: ; def a[0:31]768; CHECK-NEXT: ;;#ASMEND769; CHECK-NEXT: v_mov_b32_e32 v18, 4.0770; CHECK-NEXT: v_accvgpr_mov_b32 a0, a1771; CHECK-NEXT: v_accvgpr_mov_b32 a1, a2772; CHECK-NEXT: v_accvgpr_mov_b32 a2, a3773; CHECK-NEXT: v_accvgpr_mov_b32 a3, a4774; CHECK-NEXT: v_accvgpr_mov_b32 a4, a5775; CHECK-NEXT: v_accvgpr_mov_b32 a5, a6776; CHECK-NEXT: v_accvgpr_mov_b32 a6, a7777; CHECK-NEXT: v_accvgpr_mov_b32 a7, a8778; CHECK-NEXT: v_accvgpr_mov_b32 a8, a9779; CHECK-NEXT: v_accvgpr_mov_b32 a9, a10780; CHECK-NEXT: v_accvgpr_mov_b32 a10, a11781; CHECK-NEXT: v_accvgpr_mov_b32 a11, a12782; CHECK-NEXT: v_accvgpr_mov_b32 a12, a13783; CHECK-NEXT: v_accvgpr_mov_b32 a13, a14784; CHECK-NEXT: v_accvgpr_mov_b32 a14, a15785; CHECK-NEXT: v_accvgpr_mov_b32 a15, a16786; CHECK-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0787; CHECK-NEXT: v_and_b32_e32 v0, 0x3ff, v0788; CHECK-NEXT: v_mfma_f32_16x16x1_4b_f32 a[0:15], v1, v18, a[0:15]789; CHECK-NEXT: v_lshlrev_b32_e32 v0, 6, v0790; CHECK-NEXT: s_waitcnt lgkmcnt(0)791; CHECK-NEXT: s_nop 7792; CHECK-NEXT: global_store_dwordx4 v0, a[12:15], s[0:1] offset:48793; CHECK-NEXT: global_store_dwordx4 v0, a[8:11], s[0:1] offset:32794; CHECK-NEXT: global_store_dwordx4 v0, a[4:7], s[0:1] offset:16795; CHECK-NEXT: global_store_dwordx4 v0, a[0:3], s[0:1]796; CHECK-NEXT: s_endpgm797 %def = call <32 x float> asm sideeffect "; def $0", "=a"()798 %src2 = shufflevector <32 x float> %def, <32 x float> poison, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16>799 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.16x16x1f32(float 2.0, float 4.0, <16 x float> %src2, i32 0, i32 0, i32 0)800 %id = call i32 @llvm.amdgcn.workitem.id.x()801 %gep = getelementptr <16 x float>, ptr addrspace(1) %arg, i32 %id802 store <16 x float> %mai, ptr addrspace(1) %gep, align 64803 ret void804}805 806; a->v->mfma->a807define amdgpu_kernel void @test_rewrite_mfma_direct_copy_from_agpr_class_copy_back() #0 {808; CHECK-LABEL: test_rewrite_mfma_direct_copy_from_agpr_class_copy_back:809; CHECK: ; %bb.0:810; CHECK-NEXT: v_mov_b32_e32 v32, 2.0811; CHECK-NEXT: ;;#ASMSTART812; CHECK-NEXT: ; def a[0:31]813; CHECK-NEXT: ;;#ASMEND814; CHECK-NEXT: v_mov_b32_e32 v33, 4.0815; CHECK-NEXT: s_nop 1816; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v32, v33, a[0:31]817; CHECK-NEXT: ;;#ASMSTART818; CHECK-NEXT: ; use a[0:31]819; CHECK-NEXT: ;;#ASMEND820; CHECK-NEXT: s_endpgm821 %src2 = call <32 x float> asm sideeffect "; def $0", "=a"()822 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float 2.0, float 4.0, <32 x float> %src2, i32 0, i32 0, i32 0)823 call void asm sideeffect "; use $0", "a"(<32 x float> %mai)824 ret void825}826 827;---------------------------------------------------------------------828; Comprehensively test all MFMA intrinsics are in the rewrite table829;---------------------------------------------------------------------830 831define void @test_rewrite_mfma_f32_32x32x1f32(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {832; CHECK-LABEL: test_rewrite_mfma_f32_32x32x1f32:833; CHECK: ; %bb.0:834; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)835; CHECK-NEXT: global_load_dwordx4 a[28:31], v[2:3], off offset:112836; CHECK-NEXT: global_load_dwordx4 a[24:27], v[2:3], off offset:96837; CHECK-NEXT: global_load_dwordx4 a[20:23], v[2:3], off offset:80838; CHECK-NEXT: global_load_dwordx4 a[16:19], v[2:3], off offset:64839; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:48840; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:32841; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:16842; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off843; CHECK-NEXT: s_waitcnt vmcnt(0)844; CHECK-NEXT: v_mfma_f32_32x32x1_2b_f32 a[0:31], v0, v1, a[0:31]845; CHECK-NEXT: ;;#ASMSTART846; CHECK-NEXT: ; use a[0:31]847; CHECK-NEXT: ;;#ASMEND848; CHECK-NEXT: s_setpc_b64 s[30:31]849 %src2 = load <32 x float>, ptr addrspace(1) %ptr850 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float %arg0, float %arg1, <32 x float> %src2, i32 0, i32 0, i32 0)851 call void asm sideeffect "; use $0", "a"(<32 x float> %mai)852 ret void853}854 855define void @test_rewrite_mfma_f32_16x16x1f32(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {856; CHECK-LABEL: test_rewrite_mfma_f32_16x16x1f32:857; CHECK: ; %bb.0:858; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)859; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:48860; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:32861; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:16862; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off863; CHECK-NEXT: s_waitcnt vmcnt(0)864; CHECK-NEXT: v_mfma_f32_16x16x1_4b_f32 a[0:15], v0, v1, a[0:15]865; CHECK-NEXT: ;;#ASMSTART866; CHECK-NEXT: ; use a[0:15]867; CHECK-NEXT: ;;#ASMEND868; CHECK-NEXT: s_setpc_b64 s[30:31]869 %src2 = load <16 x float>, ptr addrspace(1) %ptr870 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.16x16x1f32(float %arg0, float %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)871 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)872 ret void873}874 875define void @test_rewrite_mfma_f32_4x4x1f32(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {876; CHECK-LABEL: test_rewrite_mfma_f32_4x4x1f32:877; CHECK: ; %bb.0:878; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)879; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off880; CHECK-NEXT: s_waitcnt vmcnt(0)881; CHECK-NEXT: v_mfma_f32_4x4x1_16b_f32 a[0:3], v0, v1, a[0:3]882; CHECK-NEXT: ;;#ASMSTART883; CHECK-NEXT: ; use a[0:3]884; CHECK-NEXT: ;;#ASMEND885; CHECK-NEXT: s_setpc_b64 s[30:31]886 %src2 = load <4 x float>, ptr addrspace(1) %ptr887 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.4x4x1f32(float %arg0, float %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)888 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)889 ret void890}891 892define void @test_rewrite_mfma_f32_32x32x2f32(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {893; CHECK-LABEL: test_rewrite_mfma_f32_32x32x2f32:894; CHECK: ; %bb.0:895; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)896; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:48897; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:32898; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:16899; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off900; CHECK-NEXT: s_waitcnt vmcnt(0)901; CHECK-NEXT: v_mfma_f32_32x32x2_f32 a[0:15], v0, v1, a[0:15]902; CHECK-NEXT: ;;#ASMSTART903; CHECK-NEXT: ; use a[0:15]904; CHECK-NEXT: ;;#ASMEND905; CHECK-NEXT: s_setpc_b64 s[30:31]906 %src2 = load <16 x float>, ptr addrspace(1) %ptr907 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x2f32(float %arg0, float %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)908 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)909 ret void910}911 912define void @test_rewrite_mfma_f32_16x16x4f32(float %arg0, float %arg1, ptr addrspace(1) %ptr) #0 {913; CHECK-LABEL: test_rewrite_mfma_f32_16x16x4f32:914; CHECK: ; %bb.0:915; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off917; CHECK-NEXT: s_waitcnt vmcnt(0)918; CHECK-NEXT: v_mfma_f32_16x16x4_f32 a[0:3], v0, v1, a[0:3]919; CHECK-NEXT: ;;#ASMSTART920; CHECK-NEXT: ; use a[0:3]921; CHECK-NEXT: ;;#ASMEND922; CHECK-NEXT: s_setpc_b64 s[30:31]923 %src2 = load <4 x float>, ptr addrspace(1) %ptr924 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x4f32(float %arg0, float %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)925 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)926 ret void927}928 929define void @test_rewrite_mfma_f32_32x32x4f16(<4 x half> %arg0, <4 x half> %arg1, ptr addrspace(1) %ptr) #0 {930; CHECK-LABEL: test_rewrite_mfma_f32_32x32x4f16:931; CHECK: ; %bb.0:932; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)933; CHECK-NEXT: global_load_dwordx4 a[28:31], v[4:5], off offset:112934; CHECK-NEXT: global_load_dwordx4 a[24:27], v[4:5], off offset:96935; CHECK-NEXT: global_load_dwordx4 a[20:23], v[4:5], off offset:80936; CHECK-NEXT: global_load_dwordx4 a[16:19], v[4:5], off offset:64937; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:48938; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:32939; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:16940; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off941; CHECK-NEXT: s_waitcnt vmcnt(0)942; CHECK-NEXT: v_mfma_f32_32x32x4_2b_f16 a[0:31], v[0:1], v[2:3], a[0:31]943; CHECK-NEXT: ;;#ASMSTART944; CHECK-NEXT: ; use a[0:31]945; CHECK-NEXT: ;;#ASMEND946; CHECK-NEXT: s_setpc_b64 s[30:31]947 %src2 = load <32 x float>, ptr addrspace(1) %ptr948 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x4f16(<4 x half> %arg0, <4 x half> %arg1, <32 x float> %src2, i32 0, i32 0, i32 0)949 call void asm sideeffect "; use $0", "a"(<32 x float> %mai)950 ret void951}952 953define void @test_rewrite_mfma_f32_16x16x4f16(<4 x half> %arg0, <4 x half> %arg1, ptr addrspace(1) %ptr) #0 {954; CHECK-LABEL: test_rewrite_mfma_f32_16x16x4f16:955; CHECK: ; %bb.0:956; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)957; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:48958; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:32959; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:16960; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off961; CHECK-NEXT: s_waitcnt vmcnt(0)962; CHECK-NEXT: v_mfma_f32_16x16x4_4b_f16 a[0:15], v[0:1], v[2:3], a[0:15]963; CHECK-NEXT: ;;#ASMSTART964; CHECK-NEXT: ; use a[0:15]965; CHECK-NEXT: ;;#ASMEND966; CHECK-NEXT: s_setpc_b64 s[30:31]967 %src2 = load <16 x float>, ptr addrspace(1) %ptr968 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.16x16x4f16(<4 x half> %arg0, <4 x half> %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)969 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)970 ret void971}972 973define void @test_rewrite_mfma_f32_4x4x4f16(<4 x half> %arg0, <4 x half> %arg1, ptr addrspace(1) %ptr) #0 {974; CHECK-LABEL: test_rewrite_mfma_f32_4x4x4f16:975; CHECK: ; %bb.0:976; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)977; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off978; CHECK-NEXT: s_waitcnt vmcnt(0)979; CHECK-NEXT: v_mfma_f32_4x4x4_16b_f16 a[0:3], v[0:1], v[2:3], a[0:3]980; CHECK-NEXT: ;;#ASMSTART981; CHECK-NEXT: ; use a[0:3]982; CHECK-NEXT: ;;#ASMEND983; CHECK-NEXT: s_setpc_b64 s[30:31]984 %src2 = load <4 x float>, ptr addrspace(1) %ptr985 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.4x4x4f16(<4 x half> %arg0, <4 x half> %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)986 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)987 ret void988}989 990define void @test_rewrite_mfma_f32_32x32x8f16(<4 x half> %arg0, <4 x half> %arg1, ptr addrspace(1) %ptr) #0 {991; CHECK-LABEL: test_rewrite_mfma_f32_32x32x8f16:992; CHECK: ; %bb.0:993; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)994; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:48995; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:32996; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:16997; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off998; CHECK-NEXT: s_waitcnt vmcnt(0)999; CHECK-NEXT: v_mfma_f32_32x32x8_f16 a[0:15], v[0:1], v[2:3], a[0:15]1000; CHECK-NEXT: ;;#ASMSTART1001; CHECK-NEXT: ; use a[0:15]1002; CHECK-NEXT: ;;#ASMEND1003; CHECK-NEXT: s_setpc_b64 s[30:31]1004 %src2 = load <16 x float>, ptr addrspace(1) %ptr1005 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x8f16(<4 x half> %arg0, <4 x half> %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1006 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1007 ret void1008}1009 1010define void @test_rewrite_mfma_f32_16x16x16f16(<4 x half> %arg0, <4 x half> %arg1, ptr addrspace(1) %ptr) #0 {1011; CHECK-LABEL: test_rewrite_mfma_f32_16x16x16f16:1012; CHECK: ; %bb.0:1013; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1014; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1015; CHECK-NEXT: s_waitcnt vmcnt(0)1016; CHECK-NEXT: v_mfma_f32_16x16x16_f16 a[0:3], v[0:1], v[2:3], a[0:3]1017; CHECK-NEXT: ;;#ASMSTART1018; CHECK-NEXT: ; use a[0:3]1019; CHECK-NEXT: ;;#ASMEND1020; CHECK-NEXT: s_setpc_b64 s[30:31]1021 %src2 = load <4 x float>, ptr addrspace(1) %ptr1022 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half> %arg0, <4 x half> %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1023 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1024 ret void1025}1026 1027define void @test_rewrite_mfma_i32_32x32x4i8(i32 %arg0, i32 %arg1, ptr addrspace(1) %ptr) #0 {1028; CHECK-LABEL: test_rewrite_mfma_i32_32x32x4i8:1029; CHECK: ; %bb.0:1030; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1031; CHECK-NEXT: global_load_dwordx4 a[28:31], v[2:3], off offset:1121032; CHECK-NEXT: global_load_dwordx4 a[24:27], v[2:3], off offset:961033; CHECK-NEXT: global_load_dwordx4 a[20:23], v[2:3], off offset:801034; CHECK-NEXT: global_load_dwordx4 a[16:19], v[2:3], off offset:641035; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:481036; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:321037; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:161038; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off1039; CHECK-NEXT: s_waitcnt vmcnt(0)1040; CHECK-NEXT: v_mfma_i32_32x32x4_2b_i8 a[0:31], v0, v1, a[0:31]1041; CHECK-NEXT: ;;#ASMSTART1042; CHECK-NEXT: ; use a[0:31]1043; CHECK-NEXT: ;;#ASMEND1044; CHECK-NEXT: s_setpc_b64 s[30:31]1045 %src2 = load <32 x i32>, ptr addrspace(1) %ptr1046 %mai = call <32 x i32> @llvm.amdgcn.mfma.i32.32x32x4i8(i32 %arg0, i32 %arg1, <32 x i32> %src2, i32 0, i32 0, i32 0)1047 call void asm sideeffect "; use $0", "a"(<32 x i32> %mai)1048 ret void1049}1050 1051define void @test_rewrite_mfma_i32_16x16x4i8(i32 %arg0, i32 %arg1, ptr addrspace(1) %ptr) #0 {1052; CHECK-LABEL: test_rewrite_mfma_i32_16x16x4i8:1053; CHECK: ; %bb.0:1054; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1055; CHECK-NEXT: global_load_dwordx4 a[12:15], v[2:3], off offset:481056; CHECK-NEXT: global_load_dwordx4 a[8:11], v[2:3], off offset:321057; CHECK-NEXT: global_load_dwordx4 a[4:7], v[2:3], off offset:161058; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off1059; CHECK-NEXT: s_waitcnt vmcnt(0)1060; CHECK-NEXT: v_mfma_i32_16x16x4_4b_i8 a[0:15], v0, v1, a[0:15]1061; CHECK-NEXT: ;;#ASMSTART1062; CHECK-NEXT: ; use a[0:15]1063; CHECK-NEXT: ;;#ASMEND1064; CHECK-NEXT: s_setpc_b64 s[30:31]1065 %src2 = load <16 x i32>, ptr addrspace(1) %ptr1066 %mai = call <16 x i32> @llvm.amdgcn.mfma.i32.16x16x4i8(i32 %arg0, i32 %arg1, <16 x i32> %src2, i32 0, i32 0, i32 0)1067 call void asm sideeffect "; use $0", "a"(<16 x i32> %mai)1068 ret void1069}1070 1071define void @test_rewrite_mfma_i32_4x4x4i8(i32 %arg0, i32 %arg1, ptr addrspace(1) %ptr) #0 {1072; CHECK-LABEL: test_rewrite_mfma_i32_4x4x4i8:1073; CHECK: ; %bb.0:1074; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1075; CHECK-NEXT: global_load_dwordx4 a[0:3], v[2:3], off1076; CHECK-NEXT: s_waitcnt vmcnt(0)1077; CHECK-NEXT: v_mfma_i32_4x4x4_16b_i8 a[0:3], v0, v1, a[0:3]1078; CHECK-NEXT: ;;#ASMSTART1079; CHECK-NEXT: ; use a[0:3]1080; CHECK-NEXT: ;;#ASMEND1081; CHECK-NEXT: s_setpc_b64 s[30:31]1082 %src2 = load <4 x i32>, ptr addrspace(1) %ptr1083 %mai = call <4 x i32> @llvm.amdgcn.mfma.i32.4x4x4i8(i32 %arg0, i32 %arg1, <4 x i32> %src2, i32 0, i32 0, i32 0)1084 call void asm sideeffect "; use $0", "a"(<4 x i32> %mai)1085 ret void1086}1087 1088;---------------------------------------------------------------------1089; gfx90a intrinsics1090;---------------------------------------------------------------------1091 1092define void @test_rewrite_mfma_f32_32x32x4bf16_1k(<4 x i16> %arg0, <4 x i16> %arg1, ptr addrspace(1) %ptr) #0 {1093; CHECK-LABEL: test_rewrite_mfma_f32_32x32x4bf16_1k:1094; CHECK: ; %bb.0:1095; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1096; CHECK-NEXT: global_load_dwordx4 a[28:31], v[4:5], off offset:1121097; CHECK-NEXT: global_load_dwordx4 a[24:27], v[4:5], off offset:961098; CHECK-NEXT: global_load_dwordx4 a[20:23], v[4:5], off offset:801099; CHECK-NEXT: global_load_dwordx4 a[16:19], v[4:5], off offset:641100; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481101; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321102; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161103; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1104; CHECK-NEXT: s_waitcnt vmcnt(0)1105; CHECK-NEXT: v_mfma_f32_32x32x4_2b_bf16 a[0:31], v[0:1], v[2:3], a[0:31]1106; CHECK-NEXT: ;;#ASMSTART1107; CHECK-NEXT: ; use a[0:31]1108; CHECK-NEXT: ;;#ASMEND1109; CHECK-NEXT: s_setpc_b64 s[30:31]1110 %src2 = load <32 x float>, ptr addrspace(1) %ptr1111 %mai = call <32 x float> @llvm.amdgcn.mfma.f32.32x32x4bf16.1k(<4 x i16> %arg0, <4 x i16> %arg1, <32 x float> %src2, i32 0, i32 0, i32 0)1112 call void asm sideeffect "; use $0", "a"(<32 x float> %mai)1113 ret void1114}1115 1116define void @test_rewrite_mfma_f32_16x16x4bf16_1k(<4 x i16> %arg0, <4 x i16> %arg1, ptr addrspace(1) %ptr) #0 {1117; CHECK-LABEL: test_rewrite_mfma_f32_16x16x4bf16_1k:1118; CHECK: ; %bb.0:1119; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1120; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481121; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321122; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161123; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1124; CHECK-NEXT: s_waitcnt vmcnt(0)1125; CHECK-NEXT: v_mfma_f32_16x16x4_4b_bf16 a[0:15], v[0:1], v[2:3], a[0:15]1126; CHECK-NEXT: ;;#ASMSTART1127; CHECK-NEXT: ; use a[0:15]1128; CHECK-NEXT: ;;#ASMEND1129; CHECK-NEXT: s_setpc_b64 s[30:31]1130 %src2 = load <16 x float>, ptr addrspace(1) %ptr1131 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.16x16x4bf16.1k(<4 x i16> %arg0, <4 x i16> %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1132 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1133 ret void1134}1135 1136define void @test_rewrite_mfma_f32_4x4x4bf16_1k(<4 x i16> %arg0, <4 x i16> %arg1, ptr addrspace(1) %ptr) #0 {1137; CHECK-LABEL: test_rewrite_mfma_f32_4x4x4bf16_1k:1138; CHECK: ; %bb.0:1139; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1140; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1141; CHECK-NEXT: s_waitcnt vmcnt(0)1142; CHECK-NEXT: v_mfma_f32_4x4x4_16b_bf16 a[0:3], v[0:1], v[2:3], a[0:3]1143; CHECK-NEXT: ;;#ASMSTART1144; CHECK-NEXT: ; use a[0:3]1145; CHECK-NEXT: ;;#ASMEND1146; CHECK-NEXT: s_setpc_b64 s[30:31]1147 %src2 = load <4 x float>, ptr addrspace(1) %ptr1148 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.4x4x4bf16.1k(<4 x i16> %arg0, <4 x i16> %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1149 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1150 ret void1151}1152 1153define void @test_rewrite_mfma_f32_32x32x8bf16_1k(<4 x i16> %arg0, <4 x i16> %arg1, ptr addrspace(1) %ptr) #0 {1154; CHECK-LABEL: test_rewrite_mfma_f32_32x32x8bf16_1k:1155; CHECK: ; %bb.0:1156; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1157; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481158; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321159; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161160; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1161; CHECK-NEXT: s_waitcnt vmcnt(0)1162; CHECK-NEXT: v_mfma_f32_32x32x8_bf16 a[0:15], v[0:1], v[2:3], a[0:15]1163; CHECK-NEXT: ;;#ASMSTART1164; CHECK-NEXT: ; use a[0:15]1165; CHECK-NEXT: ;;#ASMEND1166; CHECK-NEXT: s_setpc_b64 s[30:31]1167 %src2 = load <16 x float>, ptr addrspace(1) %ptr1168 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x8bf16.1k(<4 x i16> %arg0, <4 x i16> %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1169 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1170 ret void1171}1172 1173define void @test_rewrite_mfma_f32_16x16x16bf16_1k(<4 x i16> %arg0, <4 x i16> %arg1, ptr addrspace(1) %ptr) #0 {1174; CHECK-LABEL: test_rewrite_mfma_f32_16x16x16bf16_1k:1175; CHECK: ; %bb.0:1176; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1177; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1178; CHECK-NEXT: s_waitcnt vmcnt(0)1179; CHECK-NEXT: v_mfma_f32_16x16x16_bf16 a[0:3], v[0:1], v[2:3], a[0:3]1180; CHECK-NEXT: ;;#ASMSTART1181; CHECK-NEXT: ; use a[0:3]1182; CHECK-NEXT: ;;#ASMEND1183; CHECK-NEXT: s_setpc_b64 s[30:31]1184 %src2 = load <4 x float>, ptr addrspace(1) %ptr1185 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x16bf16.1k(<4 x i16> %arg0, <4 x i16> %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1186 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1187 ret void1188}1189 1190define void @test_rewrite_mfma_f64_16x16x4f64(double %arg0, double %arg1, ptr addrspace(1) %ptr) #0 {1191; CHECK-LABEL: test_rewrite_mfma_f64_16x16x4f64:1192; CHECK: ; %bb.0:1193; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1194; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161195; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1196; CHECK-NEXT: s_waitcnt vmcnt(0)1197; CHECK-NEXT: v_mfma_f64_16x16x4_f64 a[0:7], v[0:1], v[2:3], a[0:7]1198; CHECK-NEXT: ;;#ASMSTART1199; CHECK-NEXT: ; use a[0:7]1200; CHECK-NEXT: ;;#ASMEND1201; CHECK-NEXT: s_setpc_b64 s[30:31]1202 %src2 = load <4 x double>, ptr addrspace(1) %ptr1203 %mai = call <4 x double> @llvm.amdgcn.mfma.f64.16x16x4f64(double %arg0, double %arg1, <4 x double> %src2, i32 0, i32 0, i32 0)1204 call void asm sideeffect "; use $0", "a"(<4 x double> %mai)1205 ret void1206}1207 1208define void @test_rewrite_mfma_f64_4x4xf64(double %arg0, double %arg1, ptr addrspace(1) %ptr) #0 {1209; CHECK-LABEL: test_rewrite_mfma_f64_4x4xf64:1210; CHECK: ; %bb.0:1211; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1212; CHECK-NEXT: global_load_dwordx2 a[0:1], v[4:5], off1213; CHECK-NEXT: s_waitcnt vmcnt(0)1214; CHECK-NEXT: v_mfma_f64_4x4x4_4b_f64 a[0:1], v[0:1], v[2:3], a[0:1]1215; CHECK-NEXT: ;;#ASMSTART1216; CHECK-NEXT: ; use a[0:1]1217; CHECK-NEXT: ;;#ASMEND1218; CHECK-NEXT: s_setpc_b64 s[30:31]1219 %src2 = load double, ptr addrspace(1) %ptr1220 %mai = call double @llvm.amdgcn.mfma.f64.4x4x4f64(double %arg0, double %arg1, double %src2, i32 0, i32 0, i32 0)1221 call void asm sideeffect "; use $0", "a"(double %mai)1222 ret void1223}1224 1225;---------------------------------------------------------------------1226; gfx942 intrinsics1227;---------------------------------------------------------------------1228 1229define void @test_rewrite_mfma_i32_16x16x32_i8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1230; CHECK-LABEL: test_rewrite_mfma_i32_16x16x32_i8:1231; CHECK: ; %bb.0:1232; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1233; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1234; CHECK-NEXT: s_waitcnt vmcnt(0)1235; CHECK-NEXT: v_mfma_i32_16x16x32_i8 a[0:3], v[0:1], v[2:3], a[0:3]1236; CHECK-NEXT: ;;#ASMSTART1237; CHECK-NEXT: ; use a[0:3]1238; CHECK-NEXT: ;;#ASMEND1239; CHECK-NEXT: s_setpc_b64 s[30:31]1240 %src2 = load <4 x i32>, ptr addrspace(1) %ptr1241 %mai = call <4 x i32> @llvm.amdgcn.mfma.i32.16x16x32.i8(i64 %arg0, i64 %arg1, <4 x i32> %src2, i32 0, i32 0, i32 0)1242 call void asm sideeffect "; use $0", "a"(<4 x i32> %mai)1243 ret void1244}1245 1246define void @test_rewrite_mfma_i32_32x32x16_i8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1247; CHECK-LABEL: test_rewrite_mfma_i32_32x32x16_i8:1248; CHECK: ; %bb.0:1249; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1250; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481251; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321252; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161253; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1254; CHECK-NEXT: s_waitcnt vmcnt(0)1255; CHECK-NEXT: v_mfma_i32_32x32x16_i8 a[0:15], v[0:1], v[2:3], a[0:15]1256; CHECK-NEXT: ;;#ASMSTART1257; CHECK-NEXT: ; use a[0:15]1258; CHECK-NEXT: ;;#ASMEND1259; CHECK-NEXT: s_setpc_b64 s[30:31]1260 %src2 = load <16 x i32>, ptr addrspace(1) %ptr1261 %mai = call <16 x i32> @llvm.amdgcn.mfma.i32.32x32x16.i8(i64 %arg0, i64 %arg1, <16 x i32> %src2, i32 0, i32 0, i32 0)1262 call void asm sideeffect "; use $0", "a"(<16 x i32> %mai)1263 ret void1264}1265 1266define void @test_rewrite_mfma_f32_16x16x8_xf32(<2 x float> %arg0, <2 x float> %arg1, ptr addrspace(1) %ptr) #0 {1267; CHECK-LABEL: test_rewrite_mfma_f32_16x16x8_xf32:1268; CHECK: ; %bb.0:1269; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1270; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1271; CHECK-NEXT: s_waitcnt vmcnt(0)1272; CHECK-NEXT: v_mfma_f32_16x16x8_xf32 a[0:3], v[0:1], v[2:3], a[0:3]1273; CHECK-NEXT: ;;#ASMSTART1274; CHECK-NEXT: ; use a[0:3]1275; CHECK-NEXT: ;;#ASMEND1276; CHECK-NEXT: s_setpc_b64 s[30:31]1277 %src2 = load <4 x float>, ptr addrspace(1) %ptr1278 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x8.xf32(<2 x float> %arg0, <2 x float> %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1279 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1280 ret void1281}1282 1283define void @test_rewrite_mfma_f32_32x32x4_xf32(<2 x float> %arg0, <2 x float> %arg1, ptr addrspace(1) %ptr) #0 {1284; CHECK-LABEL: test_rewrite_mfma_f32_32x32x4_xf32:1285; CHECK: ; %bb.0:1286; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1287; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481288; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321289; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161290; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1291; CHECK-NEXT: s_waitcnt vmcnt(0)1292; CHECK-NEXT: v_mfma_f32_32x32x4_xf32 a[0:15], v[0:1], v[2:3], a[0:15]1293; CHECK-NEXT: ;;#ASMSTART1294; CHECK-NEXT: ; use a[0:15]1295; CHECK-NEXT: ;;#ASMEND1296; CHECK-NEXT: s_setpc_b64 s[30:31]1297 %src2 = load <16 x float>, ptr addrspace(1) %ptr1298 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x4.xf32(<2 x float> %arg0, <2 x float> %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1299 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1300 ret void1301}1302 1303define void @test_rewrite_mfma_f32_16x16x32_bf8_bf8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1304; CHECK-LABEL: test_rewrite_mfma_f32_16x16x32_bf8_bf8:1305; CHECK: ; %bb.0:1306; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1307; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1308; CHECK-NEXT: s_waitcnt vmcnt(0)1309; CHECK-NEXT: v_mfma_f32_16x16x32_bf8_bf8 a[0:3], v[0:1], v[2:3], a[0:3]1310; CHECK-NEXT: ;;#ASMSTART1311; CHECK-NEXT: ; use a[0:3]1312; CHECK-NEXT: ;;#ASMEND1313; CHECK-NEXT: s_setpc_b64 s[30:31]1314 %src2 = load <4 x float>, ptr addrspace(1) %ptr1315 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x32.bf8.bf8(i64 %arg0, i64 %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1316 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1317 ret void1318}1319 1320define void @test_rewrite_mfma_f32_16x16x32_bf8_fp8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1321; CHECK-LABEL: test_rewrite_mfma_f32_16x16x32_bf8_fp8:1322; CHECK: ; %bb.0:1323; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1324; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1325; CHECK-NEXT: s_waitcnt vmcnt(0)1326; CHECK-NEXT: v_mfma_f32_16x16x32_bf8_fp8 a[0:3], v[0:1], v[2:3], a[0:3]1327; CHECK-NEXT: ;;#ASMSTART1328; CHECK-NEXT: ; use a[0:3]1329; CHECK-NEXT: ;;#ASMEND1330; CHECK-NEXT: s_setpc_b64 s[30:31]1331 %src2 = load <4 x float>, ptr addrspace(1) %ptr1332 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x32.bf8.fp8(i64 %arg0, i64 %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1333 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1334 ret void1335}1336 1337define void @test_rewrite_mfma_f32_16x16x32_fp8_bf8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1338; CHECK-LABEL: test_rewrite_mfma_f32_16x16x32_fp8_bf8:1339; CHECK: ; %bb.0:1340; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1341; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1342; CHECK-NEXT: s_waitcnt vmcnt(0)1343; CHECK-NEXT: v_mfma_f32_16x16x32_fp8_bf8 a[0:3], v[0:1], v[2:3], a[0:3]1344; CHECK-NEXT: ;;#ASMSTART1345; CHECK-NEXT: ; use a[0:3]1346; CHECK-NEXT: ;;#ASMEND1347; CHECK-NEXT: s_setpc_b64 s[30:31]1348 %src2 = load <4 x float>, ptr addrspace(1) %ptr1349 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x32.fp8.bf8(i64 %arg0, i64 %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1350 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1351 ret void1352}1353 1354define void @test_rewrite_mfma_f32_16x16x32_fp8_fp8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1355; CHECK-LABEL: test_rewrite_mfma_f32_16x16x32_fp8_fp8:1356; CHECK: ; %bb.0:1357; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1358; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1359; CHECK-NEXT: s_waitcnt vmcnt(0)1360; CHECK-NEXT: v_mfma_f32_16x16x32_fp8_fp8 a[0:3], v[0:1], v[2:3], a[0:3]1361; CHECK-NEXT: ;;#ASMSTART1362; CHECK-NEXT: ; use a[0:3]1363; CHECK-NEXT: ;;#ASMEND1364; CHECK-NEXT: s_setpc_b64 s[30:31]1365 %src2 = load <4 x float>, ptr addrspace(1) %ptr1366 %mai = call <4 x float> @llvm.amdgcn.mfma.f32.16x16x32.fp8.fp8(i64 %arg0, i64 %arg1, <4 x float> %src2, i32 0, i32 0, i32 0)1367 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1368 ret void1369}1370 1371define void @test_rewrite_mfma_f32_32x32x16_bf8_bf8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1372; CHECK-LABEL: test_rewrite_mfma_f32_32x32x16_bf8_bf8:1373; CHECK: ; %bb.0:1374; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1375; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481376; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321377; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161378; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1379; CHECK-NEXT: s_waitcnt vmcnt(0)1380; CHECK-NEXT: v_mfma_f32_32x32x16_bf8_bf8 a[0:15], v[0:1], v[2:3], a[0:15]1381; CHECK-NEXT: ;;#ASMSTART1382; CHECK-NEXT: ; use a[0:15]1383; CHECK-NEXT: ;;#ASMEND1384; CHECK-NEXT: s_setpc_b64 s[30:31]1385 %src2 = load <16 x float>, ptr addrspace(1) %ptr1386 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x16.bf8.bf8(i64 %arg0, i64 %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1387 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1388 ret void1389}1390 1391define void @test_rewrite_mfma_f32_32x32x16_bf8_fp8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1392; CHECK-LABEL: test_rewrite_mfma_f32_32x32x16_bf8_fp8:1393; CHECK: ; %bb.0:1394; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1395; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481396; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321397; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161398; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1399; CHECK-NEXT: s_waitcnt vmcnt(0)1400; CHECK-NEXT: v_mfma_f32_32x32x16_bf8_fp8 a[0:15], v[0:1], v[2:3], a[0:15]1401; CHECK-NEXT: ;;#ASMSTART1402; CHECK-NEXT: ; use a[0:15]1403; CHECK-NEXT: ;;#ASMEND1404; CHECK-NEXT: s_setpc_b64 s[30:31]1405 %src2 = load <16 x float>, ptr addrspace(1) %ptr1406 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x16.bf8.fp8(i64 %arg0, i64 %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1407 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1408 ret void1409}1410 1411define void @test_rewrite_mfma_f32_32x32x16_fp8_bf8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1412; CHECK-LABEL: test_rewrite_mfma_f32_32x32x16_fp8_bf8:1413; CHECK: ; %bb.0:1414; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1415; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481416; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321417; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161418; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1419; CHECK-NEXT: s_waitcnt vmcnt(0)1420; CHECK-NEXT: v_mfma_f32_32x32x16_fp8_bf8 a[0:15], v[0:1], v[2:3], a[0:15]1421; CHECK-NEXT: ;;#ASMSTART1422; CHECK-NEXT: ; use a[0:15]1423; CHECK-NEXT: ;;#ASMEND1424; CHECK-NEXT: s_setpc_b64 s[30:31]1425 %src2 = load <16 x float>, ptr addrspace(1) %ptr1426 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x16.fp8.bf8(i64 %arg0, i64 %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1427 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1428 ret void1429}1430 1431define void @test_rewrite_mfma_f32_32x32x16_fp8_fp8(i64 %arg0, i64 %arg1, ptr addrspace(1) %ptr) #0 {1432; CHECK-LABEL: test_rewrite_mfma_f32_32x32x16_fp8_fp8:1433; CHECK: ; %bb.0:1434; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1435; CHECK-NEXT: global_load_dwordx4 a[12:15], v[4:5], off offset:481436; CHECK-NEXT: global_load_dwordx4 a[8:11], v[4:5], off offset:321437; CHECK-NEXT: global_load_dwordx4 a[4:7], v[4:5], off offset:161438; CHECK-NEXT: global_load_dwordx4 a[0:3], v[4:5], off1439; CHECK-NEXT: s_waitcnt vmcnt(0)1440; CHECK-NEXT: v_mfma_f32_32x32x16_fp8_fp8 a[0:15], v[0:1], v[2:3], a[0:15]1441; CHECK-NEXT: ;;#ASMSTART1442; CHECK-NEXT: ; use a[0:15]1443; CHECK-NEXT: ;;#ASMEND1444; CHECK-NEXT: s_setpc_b64 s[30:31]1445 %src2 = load <16 x float>, ptr addrspace(1) %ptr1446 %mai = call <16 x float> @llvm.amdgcn.mfma.f32.32x32x16.fp8.fp8(i64 %arg0, i64 %arg1, <16 x float> %src2, i32 0, i32 0, i32 0)1447 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1448 ret void1449}1450 1451define void @test_rewrite_smfmac_f32_16x16x32_f16(<4 x half> %arg0, <8 x half> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1452; CHECK-LABEL: test_rewrite_smfmac_f32_16x16x32_f16:1453; CHECK: ; %bb.0:1454; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1455; CHECK-NEXT: v_mov_b32_e32 v9, v81456; CHECK-NEXT: v_mov_b32_e32 v8, v71457; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1458; CHECK-NEXT: s_waitcnt vmcnt(0)1459; CHECK-NEXT: v_smfmac_f32_16x16x32_f16 a[0:3], v[0:1], v[2:5], v61460; CHECK-NEXT: ;;#ASMSTART1461; CHECK-NEXT: ; use a[0:3]1462; CHECK-NEXT: ;;#ASMEND1463; CHECK-NEXT: s_setpc_b64 s[30:31]1464 %src2 = load <4 x float>, ptr addrspace(1) %ptr1465 %mai = call <4 x float> @llvm.amdgcn.smfmac.f32.16x16x32.f16(<4 x half> %arg0, <8 x half> %arg1, <4 x float> %src2, i32 %arg2, i32 0, i32 0)1466 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1467 ret void1468}1469 1470define void @test_rewrite_smfmac_f32_32x32x16_f16(<4 x half> %arg0, <8 x half> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1471; CHECK-LABEL: test_rewrite_smfmac_f32_32x32x16_f16:1472; CHECK: ; %bb.0:1473; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1474; CHECK-NEXT: v_mov_b32_e32 v9, v81475; CHECK-NEXT: v_mov_b32_e32 v8, v71476; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481477; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321478; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161479; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1480; CHECK-NEXT: s_waitcnt vmcnt(0)1481; CHECK-NEXT: v_smfmac_f32_32x32x16_f16 a[0:15], v[0:1], v[2:5], v61482; CHECK-NEXT: ;;#ASMSTART1483; CHECK-NEXT: ; use a[0:15]1484; CHECK-NEXT: ;;#ASMEND1485; CHECK-NEXT: s_setpc_b64 s[30:31]1486 %src2 = load <16 x float>, ptr addrspace(1) %ptr1487 %mai = call <16 x float> @llvm.amdgcn.smfmac.f32.32x32x16.f16(<4 x half> %arg0, <8 x half> %arg1, <16 x float> %src2, i32 %arg2, i32 0, i32 0)1488 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1489 ret void1490}1491 1492define void @test_rewrite_smfmac_f32_16x16x32_bf16(<4 x i16> %arg0, <8 x i16> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1493; CHECK-LABEL: test_rewrite_smfmac_f32_16x16x32_bf16:1494; CHECK: ; %bb.0:1495; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1496; CHECK-NEXT: v_mov_b32_e32 v9, v81497; CHECK-NEXT: v_mov_b32_e32 v8, v71498; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1499; CHECK-NEXT: s_waitcnt vmcnt(0)1500; CHECK-NEXT: v_smfmac_f32_16x16x32_bf16 a[0:3], v[0:1], v[2:5], v61501; CHECK-NEXT: ;;#ASMSTART1502; CHECK-NEXT: ; use a[0:3]1503; CHECK-NEXT: ;;#ASMEND1504; CHECK-NEXT: s_setpc_b64 s[30:31]1505 %src2 = load <4 x float>, ptr addrspace(1) %ptr1506 %mai = call <4 x float> @llvm.amdgcn.smfmac.f32.16x16x32.bf16(<4 x i16> %arg0, <8 x i16> %arg1, <4 x float> %src2, i32 %arg2, i32 0, i32 0)1507 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1508 ret void1509}1510 1511define void @test_rewrite_smfmac_f32_32x32x16_bf16(<4 x i16> %arg0, <8 x i16> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1512; CHECK-LABEL: test_rewrite_smfmac_f32_32x32x16_bf16:1513; CHECK: ; %bb.0:1514; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1515; CHECK-NEXT: v_mov_b32_e32 v9, v81516; CHECK-NEXT: v_mov_b32_e32 v8, v71517; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481518; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321519; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161520; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1521; CHECK-NEXT: s_waitcnt vmcnt(0)1522; CHECK-NEXT: v_smfmac_f32_32x32x16_bf16 a[0:15], v[0:1], v[2:5], v61523; CHECK-NEXT: ;;#ASMSTART1524; CHECK-NEXT: ; use a[0:15]1525; CHECK-NEXT: ;;#ASMEND1526; CHECK-NEXT: s_setpc_b64 s[30:31]1527 %src2 = load <16 x float>, ptr addrspace(1) %ptr1528 %mai = call <16 x float> @llvm.amdgcn.smfmac.f32.32x32x16.bf16(<4 x i16> %arg0, <8 x i16> %arg1, <16 x float> %src2, i32 %arg2, i32 0, i32 0)1529 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1530 ret void1531}1532 1533define void @test_rewrite_smfmac_i32_16x16x64_i8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1534; CHECK-LABEL: test_rewrite_smfmac_i32_16x16x64_i8:1535; CHECK: ; %bb.0:1536; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1537; CHECK-NEXT: v_mov_b32_e32 v9, v81538; CHECK-NEXT: v_mov_b32_e32 v8, v71539; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1540; CHECK-NEXT: s_waitcnt vmcnt(0)1541; CHECK-NEXT: v_smfmac_i32_16x16x64_i8 a[0:3], v[0:1], v[2:5], v61542; CHECK-NEXT: ;;#ASMSTART1543; CHECK-NEXT: ; use a[0:3]1544; CHECK-NEXT: ;;#ASMEND1545; CHECK-NEXT: s_setpc_b64 s[30:31]1546 %src2 = load <4 x i32>, ptr addrspace(1) %ptr1547 %mai = call <4 x i32> @llvm.amdgcn.smfmac.i32.16x16x64.i8(<2 x i32> %arg0, <4 x i32> %arg1, <4 x i32> %src2, i32 %arg2, i32 0, i32 0)1548 call void asm sideeffect "; use $0", "a"(<4 x i32> %mai)1549 ret void1550}1551 1552define void @test_rewrite_smfmac_i32_32x32x32_i8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1553; CHECK-LABEL: test_rewrite_smfmac_i32_32x32x32_i8:1554; CHECK: ; %bb.0:1555; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1556; CHECK-NEXT: v_mov_b32_e32 v9, v81557; CHECK-NEXT: v_mov_b32_e32 v8, v71558; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481559; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321560; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161561; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1562; CHECK-NEXT: s_waitcnt vmcnt(0)1563; CHECK-NEXT: v_smfmac_i32_32x32x32_i8 a[0:15], v[0:1], v[2:5], v61564; CHECK-NEXT: ;;#ASMSTART1565; CHECK-NEXT: ; use a[0:15]1566; CHECK-NEXT: ;;#ASMEND1567; CHECK-NEXT: s_setpc_b64 s[30:31]1568 %src2 = load <16 x i32>, ptr addrspace(1) %ptr1569 %mai = call <16 x i32> @llvm.amdgcn.smfmac.i32.32x32x32.i8(<2 x i32> %arg0, <4 x i32> %arg1, <16 x i32> %src2, i32 %arg2, i32 0, i32 0)1570 call void asm sideeffect "; use $0", "a"(<16 x i32> %mai)1571 ret void1572}1573 1574define void @test_rewrite_smfmac_16x16x64_bf8_bf8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1575; CHECK-LABEL: test_rewrite_smfmac_16x16x64_bf8_bf8:1576; CHECK: ; %bb.0:1577; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1578; CHECK-NEXT: v_mov_b32_e32 v9, v81579; CHECK-NEXT: v_mov_b32_e32 v8, v71580; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1581; CHECK-NEXT: s_waitcnt vmcnt(0)1582; CHECK-NEXT: v_smfmac_f32_16x16x64_bf8_bf8 a[0:3], v[0:1], v[2:5], v61583; CHECK-NEXT: ;;#ASMSTART1584; CHECK-NEXT: ; use a[0:3]1585; CHECK-NEXT: ;;#ASMEND1586; CHECK-NEXT: s_setpc_b64 s[30:31]1587 %src2 = load <4 x float>, ptr addrspace(1) %ptr1588 %mai = tail call <4 x float> @llvm.amdgcn.smfmac.f32.16x16x64.bf8.bf8(<2 x i32> %arg0, <4 x i32> %arg1, <4 x float> %src2, i32 %arg2, i32 0, i32 0)1589 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1590 ret void1591}1592 1593define void @test_rewrite_smfmac_16x16x64_bf8_fp8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1594; CHECK-LABEL: test_rewrite_smfmac_16x16x64_bf8_fp8:1595; CHECK: ; %bb.0:1596; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1597; CHECK-NEXT: v_mov_b32_e32 v9, v81598; CHECK-NEXT: v_mov_b32_e32 v8, v71599; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1600; CHECK-NEXT: s_waitcnt vmcnt(0)1601; CHECK-NEXT: v_smfmac_f32_16x16x64_bf8_fp8 a[0:3], v[0:1], v[2:5], v61602; CHECK-NEXT: ;;#ASMSTART1603; CHECK-NEXT: ; use a[0:3]1604; CHECK-NEXT: ;;#ASMEND1605; CHECK-NEXT: s_setpc_b64 s[30:31]1606 %src2 = load <4 x float>, ptr addrspace(1) %ptr1607 %mai = tail call <4 x float> @llvm.amdgcn.smfmac.f32.16x16x64.bf8.fp8(<2 x i32> %arg0, <4 x i32> %arg1, <4 x float> %src2, i32 %arg2, i32 0, i32 0)1608 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1609 ret void1610}1611 1612define void @test_rewrite_smfmac_16x16x64_fp8_bf8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1613; CHECK-LABEL: test_rewrite_smfmac_16x16x64_fp8_bf8:1614; CHECK: ; %bb.0:1615; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1616; CHECK-NEXT: v_mov_b32_e32 v9, v81617; CHECK-NEXT: v_mov_b32_e32 v8, v71618; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1619; CHECK-NEXT: s_waitcnt vmcnt(0)1620; CHECK-NEXT: v_smfmac_f32_16x16x64_fp8_bf8 a[0:3], v[0:1], v[2:5], v61621; CHECK-NEXT: ;;#ASMSTART1622; CHECK-NEXT: ; use a[0:3]1623; CHECK-NEXT: ;;#ASMEND1624; CHECK-NEXT: s_setpc_b64 s[30:31]1625 %src2 = load <4 x float>, ptr addrspace(1) %ptr1626 %mai = tail call <4 x float> @llvm.amdgcn.smfmac.f32.16x16x64.fp8.bf8(<2 x i32> %arg0, <4 x i32> %arg1, <4 x float> %src2, i32 %arg2, i32 0, i32 0)1627 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1628 ret void1629}1630 1631define void @test_rewrite_smfmac_16x16x64_fp8_fp8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1632; CHECK-LABEL: test_rewrite_smfmac_16x16x64_fp8_fp8:1633; CHECK: ; %bb.0:1634; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1635; CHECK-NEXT: v_mov_b32_e32 v9, v81636; CHECK-NEXT: v_mov_b32_e32 v8, v71637; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1638; CHECK-NEXT: s_waitcnt vmcnt(0)1639; CHECK-NEXT: v_smfmac_f32_16x16x64_fp8_fp8 a[0:3], v[0:1], v[2:5], v61640; CHECK-NEXT: ;;#ASMSTART1641; CHECK-NEXT: ; use a[0:3]1642; CHECK-NEXT: ;;#ASMEND1643; CHECK-NEXT: s_setpc_b64 s[30:31]1644 %src2 = load <4 x float>, ptr addrspace(1) %ptr1645 %mai = tail call <4 x float> @llvm.amdgcn.smfmac.f32.16x16x64.fp8.fp8(<2 x i32> %arg0, <4 x i32> %arg1, <4 x float> %src2, i32 %arg2, i32 0, i32 0)1646 call void asm sideeffect "; use $0", "a"(<4 x float> %mai)1647 ret void1648}1649 1650define void @test_rewrite_smfmac_32x32x32_bf8_bf8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1651; CHECK-LABEL: test_rewrite_smfmac_32x32x32_bf8_bf8:1652; CHECK: ; %bb.0:1653; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1654; CHECK-NEXT: v_mov_b32_e32 v9, v81655; CHECK-NEXT: v_mov_b32_e32 v8, v71656; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481657; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321658; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161659; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1660; CHECK-NEXT: s_waitcnt vmcnt(0)1661; CHECK-NEXT: v_smfmac_f32_32x32x32_bf8_bf8 a[0:15], v[0:1], v[2:5], v61662; CHECK-NEXT: ;;#ASMSTART1663; CHECK-NEXT: ; use a[0:15]1664; CHECK-NEXT: ;;#ASMEND1665; CHECK-NEXT: s_setpc_b64 s[30:31]1666 %src2 = load <16 x float>, ptr addrspace(1) %ptr1667 %mai = tail call <16 x float> @llvm.amdgcn.smfmac.f32.32x32x32.bf8.bf8(<2 x i32> %arg0, <4 x i32> %arg1, <16 x float> %src2, i32 %arg2, i32 0, i32 0)1668 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1669 ret void1670}1671 1672define void @test_rewrite_smfmac_32x32x32_bf8_fp8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1673; CHECK-LABEL: test_rewrite_smfmac_32x32x32_bf8_fp8:1674; CHECK: ; %bb.0:1675; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1676; CHECK-NEXT: v_mov_b32_e32 v9, v81677; CHECK-NEXT: v_mov_b32_e32 v8, v71678; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481679; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321680; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161681; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1682; CHECK-NEXT: s_waitcnt vmcnt(0)1683; CHECK-NEXT: v_smfmac_f32_32x32x32_bf8_fp8 a[0:15], v[0:1], v[2:5], v61684; CHECK-NEXT: ;;#ASMSTART1685; CHECK-NEXT: ; use a[0:15]1686; CHECK-NEXT: ;;#ASMEND1687; CHECK-NEXT: s_setpc_b64 s[30:31]1688 %src2 = load <16 x float>, ptr addrspace(1) %ptr1689 %mai = tail call <16 x float> @llvm.amdgcn.smfmac.f32.32x32x32.bf8.fp8(<2 x i32> %arg0, <4 x i32> %arg1, <16 x float> %src2, i32 %arg2, i32 0, i32 0)1690 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1691 ret void1692}1693 1694define void @test_rewrite_smfmac_32x32x32_fp8_bf8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1695; CHECK-LABEL: test_rewrite_smfmac_32x32x32_fp8_bf8:1696; CHECK: ; %bb.0:1697; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1698; CHECK-NEXT: v_mov_b32_e32 v9, v81699; CHECK-NEXT: v_mov_b32_e32 v8, v71700; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481701; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321702; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161703; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1704; CHECK-NEXT: s_waitcnt vmcnt(0)1705; CHECK-NEXT: v_smfmac_f32_32x32x32_fp8_bf8 a[0:15], v[0:1], v[2:5], v61706; CHECK-NEXT: ;;#ASMSTART1707; CHECK-NEXT: ; use a[0:15]1708; CHECK-NEXT: ;;#ASMEND1709; CHECK-NEXT: s_setpc_b64 s[30:31]1710 %src2 = load <16 x float>, ptr addrspace(1) %ptr1711 %mai = tail call <16 x float> @llvm.amdgcn.smfmac.f32.32x32x32.fp8.bf8(<2 x i32> %arg0, <4 x i32> %arg1, <16 x float> %src2, i32 %arg2, i32 0, i32 0)1712 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1713 ret void1714}1715 1716define void @test_rewrite_smfmac_32x32x32_fp8_fp8(<2 x i32> %arg0, <4 x i32> %arg1, i32 %arg2, ptr addrspace(1) %ptr) #0 {1717; CHECK-LABEL: test_rewrite_smfmac_32x32x32_fp8_fp8:1718; CHECK: ; %bb.0:1719; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1720; CHECK-NEXT: v_mov_b32_e32 v9, v81721; CHECK-NEXT: v_mov_b32_e32 v8, v71722; CHECK-NEXT: global_load_dwordx4 a[12:15], v[8:9], off offset:481723; CHECK-NEXT: global_load_dwordx4 a[8:11], v[8:9], off offset:321724; CHECK-NEXT: global_load_dwordx4 a[4:7], v[8:9], off offset:161725; CHECK-NEXT: global_load_dwordx4 a[0:3], v[8:9], off1726; CHECK-NEXT: s_waitcnt vmcnt(0)1727; CHECK-NEXT: v_smfmac_f32_32x32x32_fp8_fp8 a[0:15], v[0:1], v[2:5], v61728; CHECK-NEXT: ;;#ASMSTART1729; CHECK-NEXT: ; use a[0:15]1730; CHECK-NEXT: ;;#ASMEND1731; CHECK-NEXT: s_setpc_b64 s[30:31]1732 %src2 = load <16 x float>, ptr addrspace(1) %ptr1733 %mai = tail call <16 x float> @llvm.amdgcn.smfmac.f32.32x32x32.fp8.fp8(<2 x i32> %arg0, <4 x i32> %arg1, <16 x float> %src2, i32 %arg2, i32 0, i32 0)1734 call void asm sideeffect "; use $0", "a"(<16 x float> %mai)1735 ret void1736}1737 1738declare <4 x float> @llvm.amdgcn.mfma.f32.16x16x16f16(<4 x half>, <4 x half>, <4 x float>, i32 immarg, i32 immarg, i32 immarg) #21739declare <16 x float> @llvm.amdgcn.mfma.f32.16x16x1f32(float, float, <16 x float>, i32 immarg, i32 immarg, i32 immarg) #21740declare <32 x float> @llvm.amdgcn.mfma.f32.32x32x1f32(float, float, <32 x float>, i32 immarg, i32 immarg, i32 immarg) #21741declare noundef range(i32 0, 1024) i32 @llvm.amdgcn.workitem.id.x() #31742 1743attributes #0 = { nounwind "amdgpu-flat-work-group-size"="1,256" "amdgpu-waves-per-eu"="4,4" }1744attributes #1 = { mustprogress nofree norecurse nounwind willreturn "amdgpu-waves-per-eu"="8,8" }1745attributes #2 = { convergent nocallback nofree nosync nounwind willreturn memory(none) }1746attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }1747attributes #4 = { nounwind noinline optnone }1748