1286 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -allow-deprecated-dag-overlap -enable-var-scope --check-prefixes=SI %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck -allow-deprecated-dag-overlap -enable-var-scope --check-prefixes=GFX89,VI %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx900 -mattr=-flat-for-global < %s | FileCheck -allow-deprecated-dag-overlap -enable-var-scope --check-prefixes=GFX89,GFX9 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck -allow-deprecated-dag-overlap -enable-var-scope --check-prefixes=GFX11-TRUE16 %s6; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck -allow-deprecated-dag-overlap -enable-var-scope --check-prefixes=GFX11-FAKE16 %s7 8define amdgpu_kernel void @fpext_f16_to_f32(9; SI-LABEL: fpext_f16_to_f32:10; SI: ; %bb.0: ; %entry11; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x912; SI-NEXT: s_mov_b32 s7, 0xf00013; SI-NEXT: s_mov_b32 s6, -114; SI-NEXT: s_mov_b32 s10, s615; SI-NEXT: s_mov_b32 s11, s716; SI-NEXT: s_waitcnt lgkmcnt(0)17; SI-NEXT: s_mov_b32 s8, s218; SI-NEXT: s_mov_b32 s9, s319; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 020; SI-NEXT: s_mov_b32 s4, s021; SI-NEXT: s_mov_b32 s5, s122; SI-NEXT: s_waitcnt vmcnt(0)23; SI-NEXT: v_cvt_f32_f16_e32 v0, v024; SI-NEXT: buffer_store_dword v0, off, s[4:7], 025; SI-NEXT: s_endpgm26;27; GFX89-LABEL: fpext_f16_to_f32:28; GFX89: ; %bb.0: ; %entry29; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2430; GFX89-NEXT: s_mov_b32 s7, 0xf00031; GFX89-NEXT: s_mov_b32 s6, -132; GFX89-NEXT: s_mov_b32 s10, s633; GFX89-NEXT: s_mov_b32 s11, s734; GFX89-NEXT: s_waitcnt lgkmcnt(0)35; GFX89-NEXT: s_mov_b32 s8, s236; GFX89-NEXT: s_mov_b32 s9, s337; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 038; GFX89-NEXT: s_mov_b32 s4, s039; GFX89-NEXT: s_mov_b32 s5, s140; GFX89-NEXT: s_waitcnt vmcnt(0)41; GFX89-NEXT: v_cvt_f32_f16_e32 v0, v042; GFX89-NEXT: buffer_store_dword v0, off, s[4:7], 043; GFX89-NEXT: s_endpgm44;45; GFX11-TRUE16-LABEL: fpext_f16_to_f32:46; GFX11-TRUE16: ; %bb.0: ; %entry47; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2448; GFX11-TRUE16-NEXT: s_mov_b32 s6, -149; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x3101600050; GFX11-TRUE16-NEXT: s_mov_b32 s10, s651; GFX11-TRUE16-NEXT: s_mov_b32 s11, s752; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)53; GFX11-TRUE16-NEXT: s_mov_b32 s8, s254; GFX11-TRUE16-NEXT: s_mov_b32 s9, s355; GFX11-TRUE16-NEXT: s_mov_b32 s4, s056; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 057; GFX11-TRUE16-NEXT: s_mov_b32 s5, s158; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)59; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l60; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 061; GFX11-TRUE16-NEXT: s_endpgm62;63; GFX11-FAKE16-LABEL: fpext_f16_to_f32:64; GFX11-FAKE16: ; %bb.0: ; %entry65; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2466; GFX11-FAKE16-NEXT: s_mov_b32 s6, -167; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x3101600068; GFX11-FAKE16-NEXT: s_mov_b32 s10, s669; GFX11-FAKE16-NEXT: s_mov_b32 s11, s770; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)71; GFX11-FAKE16-NEXT: s_mov_b32 s8, s272; GFX11-FAKE16-NEXT: s_mov_b32 s9, s373; GFX11-FAKE16-NEXT: s_mov_b32 s4, s074; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 075; GFX11-FAKE16-NEXT: s_mov_b32 s5, s176; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)77; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v078; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 079; GFX11-FAKE16-NEXT: s_endpgm80 ptr addrspace(1) %r,81 ptr addrspace(1) %a) #0 {82entry:83 %a.val = load half, ptr addrspace(1) %a84 %r.val = fpext half %a.val to float85 store float %r.val, ptr addrspace(1) %r86 ret void87}88 89define amdgpu_kernel void @fpext_f16_to_f64(90; SI-LABEL: fpext_f16_to_f64:91; SI: ; %bb.0: ; %entry92; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x993; SI-NEXT: s_mov_b32 s7, 0xf00094; SI-NEXT: s_mov_b32 s6, -195; SI-NEXT: s_mov_b32 s10, s696; SI-NEXT: s_mov_b32 s11, s797; SI-NEXT: s_waitcnt lgkmcnt(0)98; SI-NEXT: s_mov_b32 s8, s299; SI-NEXT: s_mov_b32 s9, s3100; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0101; SI-NEXT: s_mov_b32 s4, s0102; SI-NEXT: s_mov_b32 s5, s1103; SI-NEXT: s_waitcnt vmcnt(0)104; SI-NEXT: v_cvt_f32_f16_e32 v0, v0105; SI-NEXT: v_cvt_f64_f32_e32 v[0:1], v0106; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0107; SI-NEXT: s_endpgm108;109; GFX89-LABEL: fpext_f16_to_f64:110; GFX89: ; %bb.0: ; %entry111; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24112; GFX89-NEXT: s_mov_b32 s7, 0xf000113; GFX89-NEXT: s_mov_b32 s6, -1114; GFX89-NEXT: s_mov_b32 s10, s6115; GFX89-NEXT: s_mov_b32 s11, s7116; GFX89-NEXT: s_waitcnt lgkmcnt(0)117; GFX89-NEXT: s_mov_b32 s8, s2118; GFX89-NEXT: s_mov_b32 s9, s3119; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0120; GFX89-NEXT: s_mov_b32 s4, s0121; GFX89-NEXT: s_mov_b32 s5, s1122; GFX89-NEXT: s_waitcnt vmcnt(0)123; GFX89-NEXT: v_cvt_f32_f16_e32 v0, v0124; GFX89-NEXT: v_cvt_f64_f32_e32 v[0:1], v0125; GFX89-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0126; GFX89-NEXT: s_endpgm127;128; GFX11-TRUE16-LABEL: fpext_f16_to_f64:129; GFX11-TRUE16: ; %bb.0: ; %entry130; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24131; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1132; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000133; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6134; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7135; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)136; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2137; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3138; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0139; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0140; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1141; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)142; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l143; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)144; GFX11-TRUE16-NEXT: v_cvt_f64_f32_e32 v[0:1], v0145; GFX11-TRUE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0146; GFX11-TRUE16-NEXT: s_endpgm147;148; GFX11-FAKE16-LABEL: fpext_f16_to_f64:149; GFX11-FAKE16: ; %bb.0: ; %entry150; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24151; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1152; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000153; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6154; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7155; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)156; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2157; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3158; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0159; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0160; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1161; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)162; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0163; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)164; GFX11-FAKE16-NEXT: v_cvt_f64_f32_e32 v[0:1], v0165; GFX11-FAKE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0166; GFX11-FAKE16-NEXT: s_endpgm167 ptr addrspace(1) %r,168 ptr addrspace(1) %a) #0 {169entry:170 %a.val = load half, ptr addrspace(1) %a171 %r.val = fpext half %a.val to double172 store double %r.val, ptr addrspace(1) %r173 ret void174}175 176define amdgpu_kernel void @fpext_v2f16_to_v2f32(177; SI-LABEL: fpext_v2f16_to_v2f32:178; SI: ; %bb.0: ; %entry179; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9180; SI-NEXT: s_mov_b32 s7, 0xf000181; SI-NEXT: s_mov_b32 s6, -1182; SI-NEXT: s_mov_b32 s10, s6183; SI-NEXT: s_mov_b32 s11, s7184; SI-NEXT: s_waitcnt lgkmcnt(0)185; SI-NEXT: s_mov_b32 s8, s2186; SI-NEXT: s_mov_b32 s9, s3187; SI-NEXT: buffer_load_dword v1, off, s[8:11], 0188; SI-NEXT: s_mov_b32 s4, s0189; SI-NEXT: s_mov_b32 s5, s1190; SI-NEXT: s_waitcnt vmcnt(0)191; SI-NEXT: v_cvt_f32_f16_e32 v0, v1192; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v1193; SI-NEXT: v_cvt_f32_f16_e32 v1, v1194; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0195; SI-NEXT: s_endpgm196;197; GFX89-LABEL: fpext_v2f16_to_v2f32:198; GFX89: ; %bb.0: ; %entry199; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24200; GFX89-NEXT: s_mov_b32 s7, 0xf000201; GFX89-NEXT: s_mov_b32 s6, -1202; GFX89-NEXT: s_mov_b32 s10, s6203; GFX89-NEXT: s_mov_b32 s11, s7204; GFX89-NEXT: s_waitcnt lgkmcnt(0)205; GFX89-NEXT: s_mov_b32 s8, s2206; GFX89-NEXT: s_mov_b32 s9, s3207; GFX89-NEXT: buffer_load_dword v1, off, s[8:11], 0208; GFX89-NEXT: s_mov_b32 s4, s0209; GFX89-NEXT: s_mov_b32 s5, s1210; GFX89-NEXT: s_waitcnt vmcnt(0)211; GFX89-NEXT: v_cvt_f32_f16_e32 v0, v1212; GFX89-NEXT: v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1213; GFX89-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0214; GFX89-NEXT: s_endpgm215;216; GFX11-TRUE16-LABEL: fpext_v2f16_to_v2f32:217; GFX11-TRUE16: ; %bb.0: ; %entry218; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24219; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1220; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000221; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6222; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7223; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)224; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2225; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3226; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0227; GFX11-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0228; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1229; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)230; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0231; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l232; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)233; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v1, v1.l234; GFX11-TRUE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0235; GFX11-TRUE16-NEXT: s_endpgm236;237; GFX11-FAKE16-LABEL: fpext_v2f16_to_v2f32:238; GFX11-FAKE16: ; %bb.0: ; %entry239; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24240; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1241; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000242; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6243; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7244; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)245; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2246; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3247; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0248; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0249; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1250; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)251; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0252; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0253; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)254; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v1, v1255; GFX11-FAKE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0256; GFX11-FAKE16-NEXT: s_endpgm257 ptr addrspace(1) %r,258 ptr addrspace(1) %a) #0 {259entry:260 %a.val = load <2 x half>, ptr addrspace(1) %a261 %r.val = fpext <2 x half> %a.val to <2 x float>262 store <2 x float> %r.val, ptr addrspace(1) %r263 ret void264}265 266define amdgpu_kernel void @fpext_v2f16_to_v2f64(267; SI-LABEL: fpext_v2f16_to_v2f64:268; SI: ; %bb.0: ; %entry269; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9270; SI-NEXT: s_mov_b32 s7, 0xf000271; SI-NEXT: s_mov_b32 s6, -1272; SI-NEXT: s_mov_b32 s10, s6273; SI-NEXT: s_mov_b32 s11, s7274; SI-NEXT: s_waitcnt lgkmcnt(0)275; SI-NEXT: s_mov_b32 s8, s2276; SI-NEXT: s_mov_b32 s9, s3277; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0278; SI-NEXT: s_mov_b32 s4, s0279; SI-NEXT: s_mov_b32 s5, s1280; SI-NEXT: s_waitcnt vmcnt(0)281; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v0282; SI-NEXT: v_cvt_f32_f16_e32 v0, v0283; SI-NEXT: v_cvt_f32_f16_e32 v2, v1284; SI-NEXT: v_cvt_f64_f32_e32 v[0:1], v0285; SI-NEXT: v_cvt_f64_f32_e32 v[2:3], v2286; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0287; SI-NEXT: s_endpgm288;289; GFX89-LABEL: fpext_v2f16_to_v2f64:290; GFX89: ; %bb.0: ; %entry291; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24292; GFX89-NEXT: s_mov_b32 s7, 0xf000293; GFX89-NEXT: s_mov_b32 s6, -1294; GFX89-NEXT: s_mov_b32 s10, s6295; GFX89-NEXT: s_mov_b32 s11, s7296; GFX89-NEXT: s_waitcnt lgkmcnt(0)297; GFX89-NEXT: s_mov_b32 s8, s2298; GFX89-NEXT: s_mov_b32 s9, s3299; GFX89-NEXT: buffer_load_dword v0, off, s[8:11], 0300; GFX89-NEXT: s_mov_b32 s4, s0301; GFX89-NEXT: s_mov_b32 s5, s1302; GFX89-NEXT: s_waitcnt vmcnt(0)303; GFX89-NEXT: v_cvt_f32_f16_e32 v1, v0304; GFX89-NEXT: v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1305; GFX89-NEXT: v_cvt_f64_f32_e32 v[0:1], v1306; GFX89-NEXT: v_cvt_f64_f32_e32 v[2:3], v2307; GFX89-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0308; GFX89-NEXT: s_endpgm309;310; GFX11-TRUE16-LABEL: fpext_v2f16_to_v2f64:311; GFX11-TRUE16: ; %bb.0: ; %entry312; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24313; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1314; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000315; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6316; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7317; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)318; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2319; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3320; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0321; GFX11-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0322; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1323; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)324; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0325; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l326; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)327; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v2, v1.l328; GFX11-TRUE16-NEXT: v_cvt_f64_f32_e32 v[0:1], v0329; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)330; GFX11-TRUE16-NEXT: v_cvt_f64_f32_e32 v[2:3], v2331; GFX11-TRUE16-NEXT: buffer_store_b128 v[0:3], off, s[4:7], 0332; GFX11-TRUE16-NEXT: s_endpgm333;334; GFX11-FAKE16-LABEL: fpext_v2f16_to_v2f64:335; GFX11-FAKE16: ; %bb.0: ; %entry336; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24337; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1338; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000339; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6340; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7341; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)342; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2343; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3344; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0345; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0346; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1347; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)348; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0349; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0350; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)351; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v2, v1352; GFX11-FAKE16-NEXT: v_cvt_f64_f32_e32 v[0:1], v0353; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)354; GFX11-FAKE16-NEXT: v_cvt_f64_f32_e32 v[2:3], v2355; GFX11-FAKE16-NEXT: buffer_store_b128 v[0:3], off, s[4:7], 0356; GFX11-FAKE16-NEXT: s_endpgm357 ptr addrspace(1) %r,358 ptr addrspace(1) %a) {359entry:360 %a.val = load <2 x half>, ptr addrspace(1) %a361 %r.val = fpext <2 x half> %a.val to <2 x double>362 store <2 x double> %r.val, ptr addrspace(1) %r363 ret void364}365 366define amdgpu_kernel void @s_fneg_fpext_f16_to_f32(ptr addrspace(1) %r, i32 %a) {367; SI-LABEL: s_fneg_fpext_f16_to_f32:368; SI: ; %bb.0: ; %entry369; SI-NEXT: s_load_dword s2, s[4:5], 0xb370; SI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9371; SI-NEXT: s_mov_b32 s3, 0xf000372; SI-NEXT: s_waitcnt lgkmcnt(0)373; SI-NEXT: v_cvt_f32_f16_e32 v0, s2374; SI-NEXT: s_mov_b32 s2, -1375; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0376; SI-NEXT: s_endpgm377;378; GFX89-LABEL: s_fneg_fpext_f16_to_f32:379; GFX89: ; %bb.0: ; %entry380; GFX89-NEXT: s_load_dword s2, s[4:5], 0x2c381; GFX89-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24382; GFX89-NEXT: s_mov_b32 s3, 0xf000383; GFX89-NEXT: s_waitcnt lgkmcnt(0)384; GFX89-NEXT: v_cvt_f32_f16_e32 v0, s2385; GFX89-NEXT: s_mov_b32 s2, -1386; GFX89-NEXT: buffer_store_dword v0, off, s[0:3], 0387; GFX89-NEXT: s_endpgm388;389; GFX11-TRUE16-LABEL: s_fneg_fpext_f16_to_f32:390; GFX11-TRUE16: ; %bb.0: ; %entry391; GFX11-TRUE16-NEXT: s_clause 0x1392; GFX11-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x2c393; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24394; GFX11-TRUE16-NEXT: s_mov_b32 s3, 0x31016000395; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)396; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, s2397; GFX11-TRUE16-NEXT: s_mov_b32 s2, -1398; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[0:3], 0399; GFX11-TRUE16-NEXT: s_endpgm400;401; GFX11-FAKE16-LABEL: s_fneg_fpext_f16_to_f32:402; GFX11-FAKE16: ; %bb.0: ; %entry403; GFX11-FAKE16-NEXT: s_clause 0x1404; GFX11-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x2c405; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24406; GFX11-FAKE16-NEXT: s_mov_b32 s3, 0x31016000407; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)408; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, s2409; GFX11-FAKE16-NEXT: s_mov_b32 s2, -1410; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[0:3], 0411; GFX11-FAKE16-NEXT: s_endpgm412entry:413 %a.trunc = trunc i32 %a to i16414 %a.val = bitcast i16 %a.trunc to half415 %r.val = fpext half %a.val to float416 store float %r.val, ptr addrspace(1) %r417 ret void418}419 420define amdgpu_kernel void @fneg_fpext_f16_to_f32(421; SI-LABEL: fneg_fpext_f16_to_f32:422; SI: ; %bb.0: ; %entry423; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9424; SI-NEXT: s_mov_b32 s7, 0xf000425; SI-NEXT: s_mov_b32 s6, -1426; SI-NEXT: s_mov_b32 s10, s6427; SI-NEXT: s_mov_b32 s11, s7428; SI-NEXT: s_waitcnt lgkmcnt(0)429; SI-NEXT: s_mov_b32 s8, s2430; SI-NEXT: s_mov_b32 s9, s3431; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0432; SI-NEXT: s_mov_b32 s4, s0433; SI-NEXT: s_mov_b32 s5, s1434; SI-NEXT: s_waitcnt vmcnt(0)435; SI-NEXT: v_cvt_f32_f16_e64 v0, -v0436; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0437; SI-NEXT: s_endpgm438;439; GFX89-LABEL: fneg_fpext_f16_to_f32:440; GFX89: ; %bb.0: ; %entry441; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24442; GFX89-NEXT: s_mov_b32 s7, 0xf000443; GFX89-NEXT: s_mov_b32 s6, -1444; GFX89-NEXT: s_mov_b32 s10, s6445; GFX89-NEXT: s_mov_b32 s11, s7446; GFX89-NEXT: s_waitcnt lgkmcnt(0)447; GFX89-NEXT: s_mov_b32 s8, s2448; GFX89-NEXT: s_mov_b32 s9, s3449; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0450; GFX89-NEXT: s_mov_b32 s4, s0451; GFX89-NEXT: s_mov_b32 s5, s1452; GFX89-NEXT: s_waitcnt vmcnt(0)453; GFX89-NEXT: v_cvt_f32_f16_e64 v0, -v0454; GFX89-NEXT: buffer_store_dword v0, off, s[4:7], 0455; GFX89-NEXT: s_endpgm456;457; GFX11-TRUE16-LABEL: fneg_fpext_f16_to_f32:458; GFX11-TRUE16: ; %bb.0: ; %entry459; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24460; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1461; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000462; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6463; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7464; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)465; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2466; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3467; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0468; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0469; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1470; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)471; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, -v0.l472; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0473; GFX11-TRUE16-NEXT: s_endpgm474;475; GFX11-FAKE16-LABEL: fneg_fpext_f16_to_f32:476; GFX11-FAKE16: ; %bb.0: ; %entry477; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24478; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1479; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000480; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6481; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7482; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)483; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2484; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3485; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0486; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0487; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1488; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)489; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v0, -v0490; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0491; GFX11-FAKE16-NEXT: s_endpgm492 ptr addrspace(1) %r,493 ptr addrspace(1) %a) {494entry:495 %a.val = load half, ptr addrspace(1) %a496 %a.neg = fsub half -0.0, %a.val497 %r.val = fpext half %a.neg to float498 store float %r.val, ptr addrspace(1) %r499 ret void500}501 502define amdgpu_kernel void @fabs_fpext_f16_to_f32(503; SI-LABEL: fabs_fpext_f16_to_f32:504; SI: ; %bb.0: ; %entry505; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9506; SI-NEXT: s_mov_b32 s7, 0xf000507; SI-NEXT: s_mov_b32 s6, -1508; SI-NEXT: s_mov_b32 s10, s6509; SI-NEXT: s_mov_b32 s11, s7510; SI-NEXT: s_waitcnt lgkmcnt(0)511; SI-NEXT: s_mov_b32 s8, s2512; SI-NEXT: s_mov_b32 s9, s3513; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0514; SI-NEXT: s_mov_b32 s4, s0515; SI-NEXT: s_mov_b32 s5, s1516; SI-NEXT: s_waitcnt vmcnt(0)517; SI-NEXT: v_cvt_f32_f16_e64 v0, |v0|518; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0519; SI-NEXT: s_endpgm520;521; GFX89-LABEL: fabs_fpext_f16_to_f32:522; GFX89: ; %bb.0: ; %entry523; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24524; GFX89-NEXT: s_mov_b32 s7, 0xf000525; GFX89-NEXT: s_mov_b32 s6, -1526; GFX89-NEXT: s_mov_b32 s10, s6527; GFX89-NEXT: s_mov_b32 s11, s7528; GFX89-NEXT: s_waitcnt lgkmcnt(0)529; GFX89-NEXT: s_mov_b32 s8, s2530; GFX89-NEXT: s_mov_b32 s9, s3531; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0532; GFX89-NEXT: s_mov_b32 s4, s0533; GFX89-NEXT: s_mov_b32 s5, s1534; GFX89-NEXT: s_waitcnt vmcnt(0)535; GFX89-NEXT: v_cvt_f32_f16_e64 v0, |v0|536; GFX89-NEXT: buffer_store_dword v0, off, s[4:7], 0537; GFX89-NEXT: s_endpgm538;539; GFX11-TRUE16-LABEL: fabs_fpext_f16_to_f32:540; GFX11-TRUE16: ; %bb.0: ; %entry541; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24542; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1543; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000544; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6545; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7546; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)547; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2548; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3549; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0550; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0551; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1552; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)553; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, |v0.l|554; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0555; GFX11-TRUE16-NEXT: s_endpgm556;557; GFX11-FAKE16-LABEL: fabs_fpext_f16_to_f32:558; GFX11-FAKE16: ; %bb.0: ; %entry559; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24560; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1561; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000562; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6563; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7564; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)565; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2566; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3567; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0568; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0569; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1570; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)571; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v0, |v0|572; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0573; GFX11-FAKE16-NEXT: s_endpgm574 ptr addrspace(1) %r,575 ptr addrspace(1) %a) {576entry:577 %a.val = load half, ptr addrspace(1) %a578 %a.fabs = call half @llvm.fabs.f16(half %a.val)579 %r.val = fpext half %a.fabs to float580 store float %r.val, ptr addrspace(1) %r581 ret void582}583 584define amdgpu_kernel void @fneg_fabs_fpext_f16_to_f32(585; SI-LABEL: fneg_fabs_fpext_f16_to_f32:586; SI: ; %bb.0: ; %entry587; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9588; SI-NEXT: s_mov_b32 s7, 0xf000589; SI-NEXT: s_mov_b32 s6, -1590; SI-NEXT: s_mov_b32 s10, s6591; SI-NEXT: s_mov_b32 s11, s7592; SI-NEXT: s_waitcnt lgkmcnt(0)593; SI-NEXT: s_mov_b32 s8, s2594; SI-NEXT: s_mov_b32 s9, s3595; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0596; SI-NEXT: s_mov_b32 s4, s0597; SI-NEXT: s_mov_b32 s5, s1598; SI-NEXT: s_waitcnt vmcnt(0)599; SI-NEXT: v_cvt_f32_f16_e64 v0, -|v0|600; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0601; SI-NEXT: s_endpgm602;603; GFX89-LABEL: fneg_fabs_fpext_f16_to_f32:604; GFX89: ; %bb.0: ; %entry605; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24606; GFX89-NEXT: s_mov_b32 s7, 0xf000607; GFX89-NEXT: s_mov_b32 s6, -1608; GFX89-NEXT: s_mov_b32 s10, s6609; GFX89-NEXT: s_mov_b32 s11, s7610; GFX89-NEXT: s_waitcnt lgkmcnt(0)611; GFX89-NEXT: s_mov_b32 s8, s2612; GFX89-NEXT: s_mov_b32 s9, s3613; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0614; GFX89-NEXT: s_mov_b32 s4, s0615; GFX89-NEXT: s_mov_b32 s5, s1616; GFX89-NEXT: s_waitcnt vmcnt(0)617; GFX89-NEXT: v_cvt_f32_f16_e64 v0, -|v0|618; GFX89-NEXT: buffer_store_dword v0, off, s[4:7], 0619; GFX89-NEXT: s_endpgm620;621; GFX11-TRUE16-LABEL: fneg_fabs_fpext_f16_to_f32:622; GFX11-TRUE16: ; %bb.0: ; %entry623; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24624; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1625; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000626; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6627; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7628; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)629; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2630; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3631; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0632; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0633; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1634; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)635; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, -|v0.l|636; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0637; GFX11-TRUE16-NEXT: s_endpgm638;639; GFX11-FAKE16-LABEL: fneg_fabs_fpext_f16_to_f32:640; GFX11-FAKE16: ; %bb.0: ; %entry641; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24642; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1643; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000644; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6645; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7646; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)647; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2648; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3649; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0650; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0651; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1652; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)653; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v0, -|v0|654; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0655; GFX11-FAKE16-NEXT: s_endpgm656 ptr addrspace(1) %r,657 ptr addrspace(1) %a) {658entry:659 %a.val = load half, ptr addrspace(1) %a660 %a.fabs = call half @llvm.fabs.f16(half %a.val)661 %a.fneg.fabs = fsub half -0.0, %a.fabs662 %r.val = fpext half %a.fneg.fabs to float663 store float %r.val, ptr addrspace(1) %r664 ret void665}666 667; FIXME: Using the source modifier here only wastes code size668 669define amdgpu_kernel void @fneg_multi_use_fpext_f16_to_f32(670; SI-LABEL: fneg_multi_use_fpext_f16_to_f32:671; SI: ; %bb.0: ; %entry672; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9673; SI-NEXT: s_mov_b32 s7, 0xf000674; SI-NEXT: s_mov_b32 s6, -1675; SI-NEXT: s_mov_b32 s10, s6676; SI-NEXT: s_mov_b32 s11, s7677; SI-NEXT: s_waitcnt lgkmcnt(0)678; SI-NEXT: s_mov_b32 s8, s2679; SI-NEXT: s_mov_b32 s9, s3680; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0681; SI-NEXT: s_mov_b32 s4, s0682; SI-NEXT: s_mov_b32 s5, s1683; SI-NEXT: s_waitcnt vmcnt(0)684; SI-NEXT: v_xor_b32_e32 v0, 0x8000, v0685; SI-NEXT: v_cvt_f32_f16_e32 v1, v0686; SI-NEXT: buffer_store_dword v1, off, s[4:7], 0687; SI-NEXT: s_waitcnt vmcnt(0)688; SI-NEXT: buffer_store_short v0, off, s[4:7], 0689; SI-NEXT: s_waitcnt vmcnt(0)690; SI-NEXT: s_endpgm691;692; GFX89-LABEL: fneg_multi_use_fpext_f16_to_f32:693; GFX89: ; %bb.0: ; %entry694; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24695; GFX89-NEXT: s_mov_b32 s7, 0xf000696; GFX89-NEXT: s_mov_b32 s6, -1697; GFX89-NEXT: s_mov_b32 s10, s6698; GFX89-NEXT: s_mov_b32 s11, s7699; GFX89-NEXT: s_waitcnt lgkmcnt(0)700; GFX89-NEXT: s_mov_b32 s8, s2701; GFX89-NEXT: s_mov_b32 s9, s3702; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0703; GFX89-NEXT: s_mov_b32 s4, s0704; GFX89-NEXT: s_mov_b32 s5, s1705; GFX89-NEXT: s_waitcnt vmcnt(0)706; GFX89-NEXT: v_cvt_f32_f16_e64 v1, -v0707; GFX89-NEXT: v_xor_b32_e32 v0, 0x8000, v0708; GFX89-NEXT: buffer_store_dword v1, off, s[4:7], 0709; GFX89-NEXT: s_waitcnt vmcnt(0)710; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0711; GFX89-NEXT: s_waitcnt vmcnt(0)712; GFX89-NEXT: s_endpgm713;714; GFX11-TRUE16-LABEL: fneg_multi_use_fpext_f16_to_f32:715; GFX11-TRUE16: ; %bb.0: ; %entry716; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24717; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1718; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000719; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6720; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7721; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)722; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2723; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3724; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0725; GFX11-TRUE16-NEXT: buffer_load_u16 v1, off, s[8:11], 0726; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1727; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)728; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, v1.l729; GFX11-TRUE16-NEXT: v_xor_b32_e32 v1, 0x8000, v1730; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)731; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, -v0.l732; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0 dlc733; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0734; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0 dlc735; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0736; GFX11-TRUE16-NEXT: s_endpgm737;738; GFX11-FAKE16-LABEL: fneg_multi_use_fpext_f16_to_f32:739; GFX11-FAKE16: ; %bb.0: ; %entry740; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24741; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1742; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000743; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6744; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7745; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)746; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2747; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3748; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0749; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0750; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1751; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)752; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v1, -v0753; GFX11-FAKE16-NEXT: v_xor_b32_e32 v0, 0x8000, v0754; GFX11-FAKE16-NEXT: buffer_store_b32 v1, off, s[4:7], 0 dlc755; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0756; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 0 dlc757; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0758; GFX11-FAKE16-NEXT: s_endpgm759 ptr addrspace(1) %r,760 ptr addrspace(1) %a) {761entry:762 %a.val = load half, ptr addrspace(1) %a763 %a.neg = fsub half -0.0, %a.val764 %r.val = fpext half %a.neg to float765 store volatile float %r.val, ptr addrspace(1) %r766 store volatile half %a.neg, ptr addrspace(1) poison767 ret void768}769 770define amdgpu_kernel void @fneg_multi_foldable_use_fpext_f16_to_f32(771; SI-LABEL: fneg_multi_foldable_use_fpext_f16_to_f32:772; SI: ; %bb.0: ; %entry773; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9774; SI-NEXT: s_mov_b32 s7, 0xf000775; SI-NEXT: s_mov_b32 s6, -1776; SI-NEXT: s_mov_b32 s10, s6777; SI-NEXT: s_mov_b32 s11, s7778; SI-NEXT: s_waitcnt lgkmcnt(0)779; SI-NEXT: s_mov_b32 s8, s2780; SI-NEXT: s_mov_b32 s9, s3781; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0782; SI-NEXT: s_mov_b32 s4, s0783; SI-NEXT: s_mov_b32 s5, s1784; SI-NEXT: s_waitcnt vmcnt(0)785; SI-NEXT: v_cvt_f32_f16_e32 v1, v0786; SI-NEXT: v_cvt_f32_f16_e64 v0, -v0787; SI-NEXT: v_mul_f32_e32 v1, v0, v1788; SI-NEXT: v_cvt_f16_f32_e32 v1, v1789; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0790; SI-NEXT: s_waitcnt vmcnt(0)791; SI-NEXT: buffer_store_short v1, off, s[4:7], 0792; SI-NEXT: s_waitcnt vmcnt(0)793; SI-NEXT: s_endpgm794;795; GFX89-LABEL: fneg_multi_foldable_use_fpext_f16_to_f32:796; GFX89: ; %bb.0: ; %entry797; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24798; GFX89-NEXT: s_mov_b32 s7, 0xf000799; GFX89-NEXT: s_mov_b32 s6, -1800; GFX89-NEXT: s_mov_b32 s10, s6801; GFX89-NEXT: s_mov_b32 s11, s7802; GFX89-NEXT: s_waitcnt lgkmcnt(0)803; GFX89-NEXT: s_mov_b32 s8, s2804; GFX89-NEXT: s_mov_b32 s9, s3805; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0806; GFX89-NEXT: s_mov_b32 s4, s0807; GFX89-NEXT: s_mov_b32 s5, s1808; GFX89-NEXT: s_waitcnt vmcnt(0)809; GFX89-NEXT: v_cvt_f32_f16_e64 v1, -v0810; GFX89-NEXT: v_mul_f16_e64 v0, -v0, v0811; GFX89-NEXT: buffer_store_dword v1, off, s[4:7], 0812; GFX89-NEXT: s_waitcnt vmcnt(0)813; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0814; GFX89-NEXT: s_waitcnt vmcnt(0)815; GFX89-NEXT: s_endpgm816;817; GFX11-TRUE16-LABEL: fneg_multi_foldable_use_fpext_f16_to_f32:818; GFX11-TRUE16: ; %bb.0: ; %entry819; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24820; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1821; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000822; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6823; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7824; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)825; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2826; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3827; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0828; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0829; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1830; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)831; GFX11-TRUE16-NEXT: v_mul_f16_e64 v1.l, -v0.l, v0.l832; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, -v0.l833; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0 dlc834; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0835; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0 dlc836; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0837; GFX11-TRUE16-NEXT: s_endpgm838;839; GFX11-FAKE16-LABEL: fneg_multi_foldable_use_fpext_f16_to_f32:840; GFX11-FAKE16: ; %bb.0: ; %entry841; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24842; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1843; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000844; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6845; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7846; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)847; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2848; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3849; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0850; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0851; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1852; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)853; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v1, -v0854; GFX11-FAKE16-NEXT: v_mul_f16_e64 v0, -v0, v0855; GFX11-FAKE16-NEXT: buffer_store_b32 v1, off, s[4:7], 0 dlc856; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0857; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 0 dlc858; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0859; GFX11-FAKE16-NEXT: s_endpgm860 ptr addrspace(1) %r,861 ptr addrspace(1) %a) {862entry:863 %a.val = load half, ptr addrspace(1) %a864 %a.neg = fsub half -0.0, %a.val865 %r.val = fpext half %a.neg to float866 %mul = fmul half %a.neg, %a.val867 store volatile float %r.val, ptr addrspace(1) %r868 store volatile half %mul, ptr addrspace(1) poison869 ret void870}871 872define amdgpu_kernel void @fabs_multi_use_fpext_f16_to_f32(873; SI-LABEL: fabs_multi_use_fpext_f16_to_f32:874; SI: ; %bb.0: ; %entry875; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9876; SI-NEXT: s_mov_b32 s7, 0xf000877; SI-NEXT: s_mov_b32 s6, -1878; SI-NEXT: s_mov_b32 s10, s6879; SI-NEXT: s_mov_b32 s11, s7880; SI-NEXT: s_waitcnt lgkmcnt(0)881; SI-NEXT: s_mov_b32 s8, s2882; SI-NEXT: s_mov_b32 s9, s3883; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0884; SI-NEXT: s_mov_b32 s4, s0885; SI-NEXT: s_mov_b32 s5, s1886; SI-NEXT: s_waitcnt vmcnt(0)887; SI-NEXT: v_and_b32_e32 v0, 0x7fff, v0888; SI-NEXT: v_cvt_f32_f16_e32 v1, v0889; SI-NEXT: buffer_store_dword v1, off, s[4:7], 0890; SI-NEXT: s_waitcnt vmcnt(0)891; SI-NEXT: buffer_store_short v0, off, s[4:7], 0892; SI-NEXT: s_waitcnt vmcnt(0)893; SI-NEXT: s_endpgm894;895; GFX89-LABEL: fabs_multi_use_fpext_f16_to_f32:896; GFX89: ; %bb.0: ; %entry897; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24898; GFX89-NEXT: s_mov_b32 s7, 0xf000899; GFX89-NEXT: s_mov_b32 s6, -1900; GFX89-NEXT: s_mov_b32 s10, s6901; GFX89-NEXT: s_mov_b32 s11, s7902; GFX89-NEXT: s_waitcnt lgkmcnt(0)903; GFX89-NEXT: s_mov_b32 s8, s2904; GFX89-NEXT: s_mov_b32 s9, s3905; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 0906; GFX89-NEXT: s_mov_b32 s4, s0907; GFX89-NEXT: s_mov_b32 s5, s1908; GFX89-NEXT: s_waitcnt vmcnt(0)909; GFX89-NEXT: v_cvt_f32_f16_e64 v1, |v0|910; GFX89-NEXT: v_and_b32_e32 v0, 0x7fff, v0911; GFX89-NEXT: buffer_store_dword v1, off, s[4:7], 0912; GFX89-NEXT: s_waitcnt vmcnt(0)913; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 0914; GFX89-NEXT: s_waitcnt vmcnt(0)915; GFX89-NEXT: s_endpgm916;917; GFX11-TRUE16-LABEL: fabs_multi_use_fpext_f16_to_f32:918; GFX11-TRUE16: ; %bb.0: ; %entry919; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24920; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1921; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000922; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6923; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7924; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)925; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2926; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3927; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0928; GFX11-TRUE16-NEXT: buffer_load_u16 v1, off, s[8:11], 0929; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1930; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)931; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, v1.l932; GFX11-TRUE16-NEXT: v_and_b32_e32 v1, 0x7fff, v1933; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)934; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, |v0.l|935; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0 dlc936; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0937; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0 dlc938; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x0939; GFX11-TRUE16-NEXT: s_endpgm940;941; GFX11-FAKE16-LABEL: fabs_multi_use_fpext_f16_to_f32:942; GFX11-FAKE16: ; %bb.0: ; %entry943; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24944; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1945; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000946; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6947; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7948; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)949; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2950; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3951; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0952; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0953; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1954; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)955; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v1, |v0|956; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x7fff, v0957; GFX11-FAKE16-NEXT: buffer_store_b32 v1, off, s[4:7], 0 dlc958; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0959; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 0 dlc960; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x0961; GFX11-FAKE16-NEXT: s_endpgm962 ptr addrspace(1) %r,963 ptr addrspace(1) %a) {964entry:965 %a.val = load half, ptr addrspace(1) %a966 %a.fabs = call half @llvm.fabs.f16(half %a.val)967 %r.val = fpext half %a.fabs to float968 store volatile float %r.val, ptr addrspace(1) %r969 store volatile half %a.fabs, ptr addrspace(1) poison970 ret void971}972 973define amdgpu_kernel void @fabs_multi_foldable_use_fpext_f16_to_f32(974; SI-LABEL: fabs_multi_foldable_use_fpext_f16_to_f32:975; SI: ; %bb.0: ; %entry976; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9977; SI-NEXT: s_mov_b32 s7, 0xf000978; SI-NEXT: s_mov_b32 s6, -1979; SI-NEXT: s_mov_b32 s10, s6980; SI-NEXT: s_mov_b32 s11, s7981; SI-NEXT: s_waitcnt lgkmcnt(0)982; SI-NEXT: s_mov_b32 s8, s2983; SI-NEXT: s_mov_b32 s9, s3984; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0985; SI-NEXT: s_mov_b32 s4, s0986; SI-NEXT: s_mov_b32 s5, s1987; SI-NEXT: s_waitcnt vmcnt(0)988; SI-NEXT: v_cvt_f32_f16_e32 v0, v0989; SI-NEXT: v_mul_f32_e64 v1, |v0|, v0990; SI-NEXT: v_cvt_f16_f32_e32 v1, v1991; SI-NEXT: v_and_b32_e32 v0, 0x7fffffff, v0992; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0993; SI-NEXT: s_waitcnt vmcnt(0)994; SI-NEXT: buffer_store_short v1, off, s[4:7], 0995; SI-NEXT: s_waitcnt vmcnt(0)996; SI-NEXT: s_endpgm997;998; GFX89-LABEL: fabs_multi_foldable_use_fpext_f16_to_f32:999; GFX89: ; %bb.0: ; %entry1000; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241001; GFX89-NEXT: s_mov_b32 s7, 0xf0001002; GFX89-NEXT: s_mov_b32 s6, -11003; GFX89-NEXT: s_mov_b32 s10, s61004; GFX89-NEXT: s_mov_b32 s11, s71005; GFX89-NEXT: s_waitcnt lgkmcnt(0)1006; GFX89-NEXT: s_mov_b32 s8, s21007; GFX89-NEXT: s_mov_b32 s9, s31008; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 01009; GFX89-NEXT: s_mov_b32 s4, s01010; GFX89-NEXT: s_mov_b32 s5, s11011; GFX89-NEXT: s_waitcnt vmcnt(0)1012; GFX89-NEXT: v_cvt_f32_f16_e64 v1, |v0|1013; GFX89-NEXT: v_mul_f16_e64 v0, |v0|, v01014; GFX89-NEXT: buffer_store_dword v1, off, s[4:7], 01015; GFX89-NEXT: s_waitcnt vmcnt(0)1016; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 01017; GFX89-NEXT: s_waitcnt vmcnt(0)1018; GFX89-NEXT: s_endpgm1019;1020; GFX11-TRUE16-LABEL: fabs_multi_foldable_use_fpext_f16_to_f32:1021; GFX11-TRUE16: ; %bb.0: ; %entry1022; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241023; GFX11-TRUE16-NEXT: s_mov_b32 s6, -11024; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x310160001025; GFX11-TRUE16-NEXT: s_mov_b32 s10, s61026; GFX11-TRUE16-NEXT: s_mov_b32 s11, s71027; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1028; GFX11-TRUE16-NEXT: s_mov_b32 s8, s21029; GFX11-TRUE16-NEXT: s_mov_b32 s9, s31030; GFX11-TRUE16-NEXT: s_mov_b32 s4, s01031; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 01032; GFX11-TRUE16-NEXT: s_mov_b32 s5, s11033; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)1034; GFX11-TRUE16-NEXT: v_mul_f16_e64 v1.l, |v0.l|, v0.l1035; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, |v0.l|1036; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0 dlc1037; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x01038; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0 dlc1039; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x01040; GFX11-TRUE16-NEXT: s_endpgm1041;1042; GFX11-FAKE16-LABEL: fabs_multi_foldable_use_fpext_f16_to_f32:1043; GFX11-FAKE16: ; %bb.0: ; %entry1044; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241045; GFX11-FAKE16-NEXT: s_mov_b32 s6, -11046; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x310160001047; GFX11-FAKE16-NEXT: s_mov_b32 s10, s61048; GFX11-FAKE16-NEXT: s_mov_b32 s11, s71049; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1050; GFX11-FAKE16-NEXT: s_mov_b32 s8, s21051; GFX11-FAKE16-NEXT: s_mov_b32 s9, s31052; GFX11-FAKE16-NEXT: s_mov_b32 s4, s01053; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 01054; GFX11-FAKE16-NEXT: s_mov_b32 s5, s11055; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)1056; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v1, |v0|1057; GFX11-FAKE16-NEXT: v_mul_f16_e64 v0, |v0|, v01058; GFX11-FAKE16-NEXT: buffer_store_b32 v1, off, s[4:7], 0 dlc1059; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x01060; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 0 dlc1061; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x01062; GFX11-FAKE16-NEXT: s_endpgm1063 ptr addrspace(1) %r,1064 ptr addrspace(1) %a) {1065entry:1066 %a.val = load half, ptr addrspace(1) %a1067 %a.fabs = call half @llvm.fabs.f16(half %a.val)1068 %r.val = fpext half %a.fabs to float1069 %mul = fmul half %a.fabs, %a.val1070 store volatile float %r.val, ptr addrspace(1) %r1071 store volatile half %mul, ptr addrspace(1) poison1072 ret void1073}1074 1075define amdgpu_kernel void @fabs_fneg_multi_use_fpext_f16_to_f32(1076; SI-LABEL: fabs_fneg_multi_use_fpext_f16_to_f32:1077; SI: ; %bb.0: ; %entry1078; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91079; SI-NEXT: s_mov_b32 s7, 0xf0001080; SI-NEXT: s_mov_b32 s6, -11081; SI-NEXT: s_mov_b32 s10, s61082; SI-NEXT: s_mov_b32 s11, s71083; SI-NEXT: s_waitcnt lgkmcnt(0)1084; SI-NEXT: s_mov_b32 s8, s21085; SI-NEXT: s_mov_b32 s9, s31086; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 01087; SI-NEXT: s_mov_b32 s4, s01088; SI-NEXT: s_mov_b32 s5, s11089; SI-NEXT: s_waitcnt vmcnt(0)1090; SI-NEXT: v_or_b32_e32 v0, 0x8000, v01091; SI-NEXT: v_cvt_f32_f16_e32 v1, v01092; SI-NEXT: buffer_store_dword v1, off, s[4:7], 01093; SI-NEXT: s_waitcnt vmcnt(0)1094; SI-NEXT: buffer_store_short v0, off, s[4:7], 01095; SI-NEXT: s_waitcnt vmcnt(0)1096; SI-NEXT: s_endpgm1097;1098; GFX89-LABEL: fabs_fneg_multi_use_fpext_f16_to_f32:1099; GFX89: ; %bb.0: ; %entry1100; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241101; GFX89-NEXT: s_mov_b32 s7, 0xf0001102; GFX89-NEXT: s_mov_b32 s6, -11103; GFX89-NEXT: s_mov_b32 s10, s61104; GFX89-NEXT: s_mov_b32 s11, s71105; GFX89-NEXT: s_waitcnt lgkmcnt(0)1106; GFX89-NEXT: s_mov_b32 s8, s21107; GFX89-NEXT: s_mov_b32 s9, s31108; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 01109; GFX89-NEXT: s_mov_b32 s4, s01110; GFX89-NEXT: s_mov_b32 s5, s11111; GFX89-NEXT: s_waitcnt vmcnt(0)1112; GFX89-NEXT: v_cvt_f32_f16_e64 v1, -|v0|1113; GFX89-NEXT: v_or_b32_e32 v0, 0x8000, v01114; GFX89-NEXT: buffer_store_dword v1, off, s[4:7], 01115; GFX89-NEXT: s_waitcnt vmcnt(0)1116; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 01117; GFX89-NEXT: s_waitcnt vmcnt(0)1118; GFX89-NEXT: s_endpgm1119;1120; GFX11-TRUE16-LABEL: fabs_fneg_multi_use_fpext_f16_to_f32:1121; GFX11-TRUE16: ; %bb.0: ; %entry1122; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241123; GFX11-TRUE16-NEXT: s_mov_b32 s6, -11124; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x310160001125; GFX11-TRUE16-NEXT: s_mov_b32 s10, s61126; GFX11-TRUE16-NEXT: s_mov_b32 s11, s71127; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1128; GFX11-TRUE16-NEXT: s_mov_b32 s8, s21129; GFX11-TRUE16-NEXT: s_mov_b32 s9, s31130; GFX11-TRUE16-NEXT: s_mov_b32 s4, s01131; GFX11-TRUE16-NEXT: buffer_load_u16 v1, off, s[8:11], 01132; GFX11-TRUE16-NEXT: s_mov_b32 s5, s11133; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)1134; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.l, v1.l1135; GFX11-TRUE16-NEXT: v_or_b32_e32 v1, 0x8000, v11136; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)1137; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, -|v0.l|1138; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0 dlc1139; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x01140; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0 dlc1141; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x01142; GFX11-TRUE16-NEXT: s_endpgm1143;1144; GFX11-FAKE16-LABEL: fabs_fneg_multi_use_fpext_f16_to_f32:1145; GFX11-FAKE16: ; %bb.0: ; %entry1146; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241147; GFX11-FAKE16-NEXT: s_mov_b32 s6, -11148; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x310160001149; GFX11-FAKE16-NEXT: s_mov_b32 s10, s61150; GFX11-FAKE16-NEXT: s_mov_b32 s11, s71151; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1152; GFX11-FAKE16-NEXT: s_mov_b32 s8, s21153; GFX11-FAKE16-NEXT: s_mov_b32 s9, s31154; GFX11-FAKE16-NEXT: s_mov_b32 s4, s01155; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 01156; GFX11-FAKE16-NEXT: s_mov_b32 s5, s11157; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)1158; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v1, -|v0|1159; GFX11-FAKE16-NEXT: v_or_b32_e32 v0, 0x8000, v01160; GFX11-FAKE16-NEXT: buffer_store_b32 v1, off, s[4:7], 0 dlc1161; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x01162; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 0 dlc1163; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x01164; GFX11-FAKE16-NEXT: s_endpgm1165 ptr addrspace(1) %r,1166 ptr addrspace(1) %a) {1167entry:1168 %a.val = load half, ptr addrspace(1) %a1169 %a.fabs = call half @llvm.fabs.f16(half %a.val)1170 %a.fneg.fabs = fsub half -0.0, %a.fabs1171 %r.val = fpext half %a.fneg.fabs to float1172 store volatile float %r.val, ptr addrspace(1) %r1173 store volatile half %a.fneg.fabs, ptr addrspace(1) poison1174 ret void1175}1176 1177define amdgpu_kernel void @fabs_fneg_multi_foldable_use_fpext_f16_to_f32(1178; SI-LABEL: fabs_fneg_multi_foldable_use_fpext_f16_to_f32:1179; SI: ; %bb.0: ; %entry1180; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91181; SI-NEXT: s_mov_b32 s7, 0xf0001182; SI-NEXT: s_mov_b32 s6, -11183; SI-NEXT: s_mov_b32 s10, s61184; SI-NEXT: s_mov_b32 s11, s71185; SI-NEXT: s_waitcnt lgkmcnt(0)1186; SI-NEXT: s_mov_b32 s8, s21187; SI-NEXT: s_mov_b32 s9, s31188; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 01189; SI-NEXT: s_mov_b32 s4, s01190; SI-NEXT: s_mov_b32 s5, s11191; SI-NEXT: s_waitcnt vmcnt(0)1192; SI-NEXT: v_cvt_f32_f16_e32 v0, v01193; SI-NEXT: v_mul_f32_e64 v1, -|v0|, v01194; SI-NEXT: v_cvt_f16_f32_e32 v1, v11195; SI-NEXT: v_or_b32_e32 v0, 0x80000000, v01196; SI-NEXT: buffer_store_dword v0, off, s[4:7], 01197; SI-NEXT: s_waitcnt vmcnt(0)1198; SI-NEXT: buffer_store_short v1, off, s[4:7], 01199; SI-NEXT: s_waitcnt vmcnt(0)1200; SI-NEXT: s_endpgm1201;1202; GFX89-LABEL: fabs_fneg_multi_foldable_use_fpext_f16_to_f32:1203; GFX89: ; %bb.0: ; %entry1204; GFX89-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241205; GFX89-NEXT: s_mov_b32 s7, 0xf0001206; GFX89-NEXT: s_mov_b32 s6, -11207; GFX89-NEXT: s_mov_b32 s10, s61208; GFX89-NEXT: s_mov_b32 s11, s71209; GFX89-NEXT: s_waitcnt lgkmcnt(0)1210; GFX89-NEXT: s_mov_b32 s8, s21211; GFX89-NEXT: s_mov_b32 s9, s31212; GFX89-NEXT: buffer_load_ushort v0, off, s[8:11], 01213; GFX89-NEXT: s_mov_b32 s4, s01214; GFX89-NEXT: s_mov_b32 s5, s11215; GFX89-NEXT: s_waitcnt vmcnt(0)1216; GFX89-NEXT: v_cvt_f32_f16_e64 v1, -|v0|1217; GFX89-NEXT: v_mul_f16_e64 v0, -|v0|, v01218; GFX89-NEXT: buffer_store_dword v1, off, s[4:7], 01219; GFX89-NEXT: s_waitcnt vmcnt(0)1220; GFX89-NEXT: buffer_store_short v0, off, s[4:7], 01221; GFX89-NEXT: s_waitcnt vmcnt(0)1222; GFX89-NEXT: s_endpgm1223;1224; GFX11-TRUE16-LABEL: fabs_fneg_multi_foldable_use_fpext_f16_to_f32:1225; GFX11-TRUE16: ; %bb.0: ; %entry1226; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241227; GFX11-TRUE16-NEXT: s_mov_b32 s6, -11228; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x310160001229; GFX11-TRUE16-NEXT: s_mov_b32 s10, s61230; GFX11-TRUE16-NEXT: s_mov_b32 s11, s71231; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1232; GFX11-TRUE16-NEXT: s_mov_b32 s8, s21233; GFX11-TRUE16-NEXT: s_mov_b32 s9, s31234; GFX11-TRUE16-NEXT: s_mov_b32 s4, s01235; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 01236; GFX11-TRUE16-NEXT: s_mov_b32 s5, s11237; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)1238; GFX11-TRUE16-NEXT: v_mul_f16_e64 v1.l, -|v0.l|, v0.l1239; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e64 v0, -|v0.l|1240; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0 dlc1241; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x01242; GFX11-TRUE16-NEXT: buffer_store_b16 v1, off, s[4:7], 0 dlc1243; GFX11-TRUE16-NEXT: s_waitcnt_vscnt null, 0x01244; GFX11-TRUE16-NEXT: s_endpgm1245;1246; GFX11-FAKE16-LABEL: fabs_fneg_multi_foldable_use_fpext_f16_to_f32:1247; GFX11-FAKE16: ; %bb.0: ; %entry1248; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241249; GFX11-FAKE16-NEXT: s_mov_b32 s6, -11250; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x310160001251; GFX11-FAKE16-NEXT: s_mov_b32 s10, s61252; GFX11-FAKE16-NEXT: s_mov_b32 s11, s71253; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1254; GFX11-FAKE16-NEXT: s_mov_b32 s8, s21255; GFX11-FAKE16-NEXT: s_mov_b32 s9, s31256; GFX11-FAKE16-NEXT: s_mov_b32 s4, s01257; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 01258; GFX11-FAKE16-NEXT: s_mov_b32 s5, s11259; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)1260; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e64 v1, -|v0|1261; GFX11-FAKE16-NEXT: v_mul_f16_e64 v0, -|v0|, v01262; GFX11-FAKE16-NEXT: buffer_store_b32 v1, off, s[4:7], 0 dlc1263; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x01264; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 0 dlc1265; GFX11-FAKE16-NEXT: s_waitcnt_vscnt null, 0x01266; GFX11-FAKE16-NEXT: s_endpgm1267 ptr addrspace(1) %r,1268 ptr addrspace(1) %a) {1269entry:1270 %a.val = load half, ptr addrspace(1) %a1271 %a.fabs = call half @llvm.fabs.f16(half %a.val)1272 %a.fneg.fabs = fsub half -0.0, %a.fabs1273 %r.val = fpext half %a.fneg.fabs to float1274 %mul = fmul half %a.fneg.fabs, %a.val1275 store volatile float %r.val, ptr addrspace(1) %r1276 store volatile half %mul, ptr addrspace(1) poison1277 ret void1278}1279 1280declare half @llvm.fabs.f16(half) #11281 1282attributes #1 = { nounwind readnone }1283;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1284; GFX9: {{.*}}1285; VI: {{.*}}1286