brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.1 KiB · 27cf49a Raw
867 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri < %s | FileCheck -enable-var-scope -check-prefixes=CI %s3; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=tonga < %s | FileCheck -enable-var-scope -check-prefixes=VI %s4; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx900 < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s5; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-FAKE16 %s7 8; DAGCombiner will transform:9; (fabs (f16 bitcast (i16 a))) => (f16 bitcast (and (i16 a), 0x7FFFFFFF))10; unless isFabsFree returns true11 12define amdgpu_kernel void @s_fabs_free_f16(ptr addrspace(1) %out, i16 %in) {13; CI-LABEL: s_fabs_free_f16:14; CI:       ; %bb.0:15; CI-NEXT:    s_load_dword s2, s[8:9], 0x216; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x017; CI-NEXT:    s_add_i32 s12, s12, s1718; CI-NEXT:    s_mov_b32 flat_scratch_lo, s1319; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 820; CI-NEXT:    s_waitcnt lgkmcnt(0)21; CI-NEXT:    s_and_b32 s2, s2, 0x7fff22; CI-NEXT:    v_mov_b32_e32 v0, s023; CI-NEXT:    v_mov_b32_e32 v1, s124; CI-NEXT:    v_mov_b32_e32 v2, s225; CI-NEXT:    flat_store_short v[0:1], v226; CI-NEXT:    s_endpgm27;28; VI-LABEL: s_fabs_free_f16:29; VI:       ; %bb.0:30; VI-NEXT:    s_load_dword s2, s[8:9], 0x831; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x032; VI-NEXT:    s_add_i32 s12, s12, s1733; VI-NEXT:    s_mov_b32 flat_scratch_lo, s1334; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 835; VI-NEXT:    s_waitcnt lgkmcnt(0)36; VI-NEXT:    s_and_b32 s2, s2, 0x7fff37; VI-NEXT:    v_mov_b32_e32 v0, s038; VI-NEXT:    v_mov_b32_e32 v1, s139; VI-NEXT:    v_mov_b32_e32 v2, s240; VI-NEXT:    flat_store_short v[0:1], v241; VI-NEXT:    s_endpgm42;43; GFX9-LABEL: s_fabs_free_f16:44; GFX9:       ; %bb.0:45; GFX9-NEXT:    s_load_dword s2, s[8:9], 0x846; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x047; GFX9-NEXT:    v_mov_b32_e32 v0, 048; GFX9-NEXT:    s_waitcnt lgkmcnt(0)49; GFX9-NEXT:    s_and_b32 s2, s2, 0x7fff50; GFX9-NEXT:    v_mov_b32_e32 v1, s251; GFX9-NEXT:    global_store_short v0, v1, s[0:1]52; GFX9-NEXT:    s_endpgm53;54; GFX11-TRUE16-LABEL: s_fabs_free_f16:55; GFX11-TRUE16:       ; %bb.0:56; GFX11-TRUE16-NEXT:    s_clause 0x157; GFX11-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x858; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x059; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v1, 060; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)61; GFX11-TRUE16-NEXT:    s_and_b32 s2, s2, 0x7fff62; GFX11-TRUE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)63; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.l, s264; GFX11-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1]65; GFX11-TRUE16-NEXT:    s_endpgm66;67; GFX11-FAKE16-LABEL: s_fabs_free_f16:68; GFX11-FAKE16:       ; %bb.0:69; GFX11-FAKE16-NEXT:    s_clause 0x170; GFX11-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x871; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x072; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)73; GFX11-FAKE16-NEXT:    s_and_b32 s2, s2, 0x7fff74; GFX11-FAKE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)75; GFX11-FAKE16-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s276; GFX11-FAKE16-NEXT:    global_store_b16 v0, v1, s[0:1]77; GFX11-FAKE16-NEXT:    s_endpgm78  %bc= bitcast i16 %in to half79  %fabs = call half @llvm.fabs.f16(half %bc)80  store half %fabs, ptr addrspace(1) %out81  ret void82}83 84define amdgpu_kernel void @s_fabs_f16(ptr addrspace(1) %out, half %in) {85; CI-LABEL: s_fabs_f16:86; CI:       ; %bb.0:87; CI-NEXT:    s_load_dword s2, s[8:9], 0x288; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x089; CI-NEXT:    s_add_i32 s12, s12, s1790; CI-NEXT:    s_mov_b32 flat_scratch_lo, s1391; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 892; CI-NEXT:    s_waitcnt lgkmcnt(0)93; CI-NEXT:    s_and_b32 s2, s2, 0x7fff94; CI-NEXT:    v_mov_b32_e32 v0, s095; CI-NEXT:    v_mov_b32_e32 v1, s196; CI-NEXT:    v_mov_b32_e32 v2, s297; CI-NEXT:    flat_store_short v[0:1], v298; CI-NEXT:    s_endpgm99;100; VI-LABEL: s_fabs_f16:101; VI:       ; %bb.0:102; VI-NEXT:    s_load_dword s2, s[8:9], 0x8103; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0104; VI-NEXT:    s_add_i32 s12, s12, s17105; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13106; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8107; VI-NEXT:    s_waitcnt lgkmcnt(0)108; VI-NEXT:    s_and_b32 s2, s2, 0x7fff109; VI-NEXT:    v_mov_b32_e32 v0, s0110; VI-NEXT:    v_mov_b32_e32 v1, s1111; VI-NEXT:    v_mov_b32_e32 v2, s2112; VI-NEXT:    flat_store_short v[0:1], v2113; VI-NEXT:    s_endpgm114;115; GFX9-LABEL: s_fabs_f16:116; GFX9:       ; %bb.0:117; GFX9-NEXT:    s_load_dword s2, s[8:9], 0x8118; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0119; GFX9-NEXT:    v_mov_b32_e32 v0, 0120; GFX9-NEXT:    s_waitcnt lgkmcnt(0)121; GFX9-NEXT:    s_and_b32 s2, s2, 0x7fff122; GFX9-NEXT:    v_mov_b32_e32 v1, s2123; GFX9-NEXT:    global_store_short v0, v1, s[0:1]124; GFX9-NEXT:    s_endpgm125;126; GFX11-TRUE16-LABEL: s_fabs_f16:127; GFX11-TRUE16:       ; %bb.0:128; GFX11-TRUE16-NEXT:    s_clause 0x1129; GFX11-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x8130; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0131; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v1, 0132; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)133; GFX11-TRUE16-NEXT:    s_and_b32 s2, s2, 0x7fff134; GFX11-TRUE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)135; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.l, s2136; GFX11-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1]137; GFX11-TRUE16-NEXT:    s_endpgm138;139; GFX11-FAKE16-LABEL: s_fabs_f16:140; GFX11-FAKE16:       ; %bb.0:141; GFX11-FAKE16-NEXT:    s_clause 0x1142; GFX11-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x8143; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0144; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)145; GFX11-FAKE16-NEXT:    s_and_b32 s2, s2, 0x7fff146; GFX11-FAKE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)147; GFX11-FAKE16-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2148; GFX11-FAKE16-NEXT:    global_store_b16 v0, v1, s[0:1]149; GFX11-FAKE16-NEXT:    s_endpgm150  %fabs = call half @llvm.fabs.f16(half %in)151  store half %fabs, ptr addrspace(1) %out152  ret void153}154 155define amdgpu_kernel void @s_fabs_v2f16(ptr addrspace(1) %out, <2 x half> %in) {156; CI-LABEL: s_fabs_v2f16:157; CI:       ; %bb.0:158; CI-NEXT:    s_load_dword s2, s[8:9], 0x2159; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0160; CI-NEXT:    s_add_i32 s12, s12, s17161; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13162; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8163; CI-NEXT:    s_waitcnt lgkmcnt(0)164; CI-NEXT:    s_and_b32 s2, s2, 0x7fff7fff165; CI-NEXT:    v_mov_b32_e32 v0, s0166; CI-NEXT:    v_mov_b32_e32 v1, s1167; CI-NEXT:    v_mov_b32_e32 v2, s2168; CI-NEXT:    flat_store_dword v[0:1], v2169; CI-NEXT:    s_endpgm170;171; VI-LABEL: s_fabs_v2f16:172; VI:       ; %bb.0:173; VI-NEXT:    s_load_dword s2, s[8:9], 0x8174; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0175; VI-NEXT:    s_add_i32 s12, s12, s17176; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13177; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8178; VI-NEXT:    s_waitcnt lgkmcnt(0)179; VI-NEXT:    s_and_b32 s2, s2, 0x7fff7fff180; VI-NEXT:    v_mov_b32_e32 v0, s0181; VI-NEXT:    v_mov_b32_e32 v1, s1182; VI-NEXT:    v_mov_b32_e32 v2, s2183; VI-NEXT:    flat_store_dword v[0:1], v2184; VI-NEXT:    s_endpgm185;186; GFX9-LABEL: s_fabs_v2f16:187; GFX9:       ; %bb.0:188; GFX9-NEXT:    s_load_dword s2, s[8:9], 0x8189; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0190; GFX9-NEXT:    v_mov_b32_e32 v0, 0191; GFX9-NEXT:    s_waitcnt lgkmcnt(0)192; GFX9-NEXT:    s_and_b32 s2, s2, 0x7fff7fff193; GFX9-NEXT:    v_mov_b32_e32 v1, s2194; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]195; GFX9-NEXT:    s_endpgm196;197; GFX11-LABEL: s_fabs_v2f16:198; GFX11:       ; %bb.0:199; GFX11-NEXT:    s_clause 0x1200; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x8201; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0202; GFX11-NEXT:    s_waitcnt lgkmcnt(0)203; GFX11-NEXT:    s_and_b32 s2, s2, 0x7fff7fff204; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)205; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2206; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]207; GFX11-NEXT:    s_endpgm208  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %in)209  store <2 x half> %fabs, ptr addrspace(1) %out210  ret void211}212 213define amdgpu_kernel void @s_fabs_v4f16(ptr addrspace(1) %out, <4 x half> %in) {214; CI-LABEL: s_fabs_v4f16:215; CI:       ; %bb.0:216; CI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0217; CI-NEXT:    s_add_i32 s12, s12, s17218; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13219; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8220; CI-NEXT:    s_waitcnt lgkmcnt(0)221; CI-NEXT:    s_and_b32 s3, s3, 0x7fff7fff222; CI-NEXT:    s_and_b32 s2, s2, 0x7fff7fff223; CI-NEXT:    v_mov_b32_e32 v3, s1224; CI-NEXT:    v_mov_b32_e32 v0, s2225; CI-NEXT:    v_mov_b32_e32 v1, s3226; CI-NEXT:    v_mov_b32_e32 v2, s0227; CI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]228; CI-NEXT:    s_endpgm229;230; VI-LABEL: s_fabs_v4f16:231; VI:       ; %bb.0:232; VI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0233; VI-NEXT:    s_add_i32 s12, s12, s17234; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13235; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8236; VI-NEXT:    s_waitcnt lgkmcnt(0)237; VI-NEXT:    s_and_b32 s3, s3, 0x7fff7fff238; VI-NEXT:    s_and_b32 s2, s2, 0x7fff7fff239; VI-NEXT:    v_mov_b32_e32 v3, s1240; VI-NEXT:    v_mov_b32_e32 v0, s2241; VI-NEXT:    v_mov_b32_e32 v1, s3242; VI-NEXT:    v_mov_b32_e32 v2, s0243; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]244; VI-NEXT:    s_endpgm245;246; GFX9-LABEL: s_fabs_v4f16:247; GFX9:       ; %bb.0:248; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0249; GFX9-NEXT:    v_mov_b32_e32 v2, 0250; GFX9-NEXT:    s_waitcnt lgkmcnt(0)251; GFX9-NEXT:    s_and_b32 s3, s3, 0x7fff7fff252; GFX9-NEXT:    s_and_b32 s2, s2, 0x7fff7fff253; GFX9-NEXT:    v_mov_b32_e32 v0, s2254; GFX9-NEXT:    v_mov_b32_e32 v1, s3255; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]256; GFX9-NEXT:    s_endpgm257;258; GFX11-LABEL: s_fabs_v4f16:259; GFX11:       ; %bb.0:260; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0261; GFX11-NEXT:    s_waitcnt lgkmcnt(0)262; GFX11-NEXT:    s_and_b32 s2, s2, 0x7fff7fff263; GFX11-NEXT:    s_and_b32 s3, s3, 0x7fff7fff264; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)265; GFX11-NEXT:    v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, s3266; GFX11-NEXT:    v_mov_b32_e32 v0, s2267; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]268; GFX11-NEXT:    s_endpgm269  %fabs = call <4 x half> @llvm.fabs.v4f16(<4 x half> %in)270  store <4 x half> %fabs, ptr addrspace(1) %out271  ret void272}273 274define amdgpu_kernel void @fabs_fold_f16(ptr addrspace(1) %out, half %in0, half %in1) {275; CI-LABEL: fabs_fold_f16:276; CI:       ; %bb.0:277; CI-NEXT:    s_load_dword s0, s[8:9], 0x2278; CI-NEXT:    s_add_i32 s12, s12, s17279; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13280; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8281; CI-NEXT:    s_waitcnt lgkmcnt(0)282; CI-NEXT:    v_cvt_f32_f16_e64 v0, |s0|283; CI-NEXT:    s_lshr_b32 s0, s0, 16284; CI-NEXT:    v_cvt_f32_f16_e32 v1, s0285; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0286; CI-NEXT:    v_mul_f32_e32 v0, v0, v1287; CI-NEXT:    v_cvt_f16_f32_e32 v2, v0288; CI-NEXT:    s_waitcnt lgkmcnt(0)289; CI-NEXT:    v_mov_b32_e32 v0, s0290; CI-NEXT:    v_mov_b32_e32 v1, s1291; CI-NEXT:    flat_store_short v[0:1], v2292; CI-NEXT:    s_endpgm293;294; VI-LABEL: fabs_fold_f16:295; VI:       ; %bb.0:296; VI-NEXT:    s_load_dword s2, s[8:9], 0x8297; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0298; VI-NEXT:    s_add_i32 s12, s12, s17299; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13300; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8301; VI-NEXT:    s_waitcnt lgkmcnt(0)302; VI-NEXT:    s_lshr_b32 s3, s2, 16303; VI-NEXT:    v_mov_b32_e32 v0, s3304; VI-NEXT:    v_mul_f16_e64 v2, |s2|, v0305; VI-NEXT:    v_mov_b32_e32 v0, s0306; VI-NEXT:    v_mov_b32_e32 v1, s1307; VI-NEXT:    flat_store_short v[0:1], v2308; VI-NEXT:    s_endpgm309;310; GFX9-LABEL: fabs_fold_f16:311; GFX9:       ; %bb.0:312; GFX9-NEXT:    s_load_dword s2, s[8:9], 0x8313; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0314; GFX9-NEXT:    v_mov_b32_e32 v0, 0315; GFX9-NEXT:    s_waitcnt lgkmcnt(0)316; GFX9-NEXT:    s_lshr_b32 s3, s2, 16317; GFX9-NEXT:    v_mov_b32_e32 v1, s3318; GFX9-NEXT:    v_mul_f16_e64 v1, |s2|, v1319; GFX9-NEXT:    global_store_short v0, v1, s[0:1]320; GFX9-NEXT:    s_endpgm321;322; GFX11-TRUE16-LABEL: fabs_fold_f16:323; GFX11-TRUE16:       ; %bb.0:324; GFX11-TRUE16-NEXT:    s_clause 0x1325; GFX11-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x8326; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0327; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v1, 0328; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)329; GFX11-TRUE16-NEXT:    s_lshr_b32 s3, s2, 16330; GFX11-TRUE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)331; GFX11-TRUE16-NEXT:    v_mul_f16_e64 v0.l, |s2|, s3332; GFX11-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1]333; GFX11-TRUE16-NEXT:    s_endpgm334;335; GFX11-FAKE16-LABEL: fabs_fold_f16:336; GFX11-FAKE16:       ; %bb.0:337; GFX11-FAKE16-NEXT:    s_clause 0x1338; GFX11-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x8339; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0340; GFX11-FAKE16-NEXT:    v_mov_b32_e32 v0, 0341; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)342; GFX11-FAKE16-NEXT:    s_lshr_b32 s3, s2, 16343; GFX11-FAKE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)344; GFX11-FAKE16-NEXT:    v_mul_f16_e64 v1, |s2|, s3345; GFX11-FAKE16-NEXT:    global_store_b16 v0, v1, s[0:1]346; GFX11-FAKE16-NEXT:    s_endpgm347  %fabs = call half @llvm.fabs.f16(half %in0)348  %fmul = fmul half %fabs, %in1349  store half %fmul, ptr addrspace(1) %out350  ret void351}352 353define amdgpu_kernel void @v_fabs_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {354; CI-LABEL: v_fabs_v2f16:355; CI:       ; %bb.0:356; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x2357; CI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0358; CI-NEXT:    s_add_i32 s12, s12, s17359; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13360; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8361; CI-NEXT:    s_waitcnt lgkmcnt(0)362; CI-NEXT:    v_mov_b32_e32 v1, s1363; CI-NEXT:    v_add_i32_e32 v0, vcc, s0, v0364; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc365; CI-NEXT:    flat_load_dword v2, v[0:1]366; CI-NEXT:    s_waitcnt vmcnt(0)367; CI-NEXT:    v_and_b32_e32 v2, 0x7fff7fff, v2368; CI-NEXT:    flat_store_dword v[0:1], v2369; CI-NEXT:    s_endpgm370;371; VI-LABEL: v_fabs_v2f16:372; VI:       ; %bb.0:373; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x8374; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0375; VI-NEXT:    s_add_i32 s12, s12, s17376; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13377; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8378; VI-NEXT:    s_waitcnt lgkmcnt(0)379; VI-NEXT:    v_mov_b32_e32 v1, s1380; VI-NEXT:    v_add_u32_e32 v0, vcc, s0, v0381; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc382; VI-NEXT:    flat_load_dword v2, v[0:1]383; VI-NEXT:    s_waitcnt vmcnt(0)384; VI-NEXT:    v_and_b32_e32 v2, 0x7fff7fff, v2385; VI-NEXT:    flat_store_dword v[0:1], v2386; VI-NEXT:    s_endpgm387;388; GFX9-LABEL: v_fabs_v2f16:389; GFX9:       ; %bb.0:390; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x8391; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0392; GFX9-NEXT:    s_waitcnt lgkmcnt(0)393; GFX9-NEXT:    global_load_dword v1, v0, s[0:1]394; GFX9-NEXT:    s_waitcnt vmcnt(0)395; GFX9-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1396; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]397; GFX9-NEXT:    s_endpgm398;399; GFX11-LABEL: v_fabs_v2f16:400; GFX11:       ; %bb.0:401; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8402; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0403; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)404; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0405; GFX11-NEXT:    s_waitcnt lgkmcnt(0)406; GFX11-NEXT:    global_load_b32 v1, v0, s[0:1]407; GFX11-NEXT:    s_waitcnt vmcnt(0)408; GFX11-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1409; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]410; GFX11-NEXT:    s_endpgm411  %tid = call i32 @llvm.amdgcn.workitem.id.x()412  %gep.in = getelementptr inbounds <2 x half>, ptr addrspace(1) %in, i32 %tid413  %gep.out = getelementptr inbounds <2 x half>, ptr addrspace(1) %in, i32 %tid414  %val = load <2 x half>, ptr addrspace(1) %gep.in, align 2415  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %val)416  store <2 x half> %fabs, ptr addrspace(1) %gep.out417  ret void418}419 420define amdgpu_kernel void @fabs_free_v2f16(ptr addrspace(1) %out, i32 %in) #0 {421; CI-LABEL: fabs_free_v2f16:422; CI:       ; %bb.0:423; CI-NEXT:    s_load_dword s2, s[8:9], 0x2424; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0425; CI-NEXT:    s_add_i32 s12, s12, s17426; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13427; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8428; CI-NEXT:    s_waitcnt lgkmcnt(0)429; CI-NEXT:    s_and_b32 s2, s2, 0x7fff7fff430; CI-NEXT:    v_mov_b32_e32 v0, s0431; CI-NEXT:    v_mov_b32_e32 v1, s1432; CI-NEXT:    v_mov_b32_e32 v2, s2433; CI-NEXT:    flat_store_dword v[0:1], v2434; CI-NEXT:    s_endpgm435;436; VI-LABEL: fabs_free_v2f16:437; VI:       ; %bb.0:438; VI-NEXT:    s_load_dword s2, s[8:9], 0x8439; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0440; VI-NEXT:    s_add_i32 s12, s12, s17441; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13442; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8443; VI-NEXT:    s_waitcnt lgkmcnt(0)444; VI-NEXT:    s_and_b32 s2, s2, 0x7fff7fff445; VI-NEXT:    v_mov_b32_e32 v0, s0446; VI-NEXT:    v_mov_b32_e32 v1, s1447; VI-NEXT:    v_mov_b32_e32 v2, s2448; VI-NEXT:    flat_store_dword v[0:1], v2449; VI-NEXT:    s_endpgm450;451; GFX9-LABEL: fabs_free_v2f16:452; GFX9:       ; %bb.0:453; GFX9-NEXT:    s_load_dword s2, s[8:9], 0x8454; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0455; GFX9-NEXT:    v_mov_b32_e32 v0, 0456; GFX9-NEXT:    s_waitcnt lgkmcnt(0)457; GFX9-NEXT:    s_and_b32 s2, s2, 0x7fff7fff458; GFX9-NEXT:    v_mov_b32_e32 v1, s2459; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]460; GFX9-NEXT:    s_endpgm461;462; GFX11-LABEL: fabs_free_v2f16:463; GFX11:       ; %bb.0:464; GFX11-NEXT:    s_clause 0x1465; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x8466; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0467; GFX11-NEXT:    s_waitcnt lgkmcnt(0)468; GFX11-NEXT:    s_and_b32 s2, s2, 0x7fff7fff469; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)470; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2471; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]472; GFX11-NEXT:    s_endpgm473  %bc = bitcast i32 %in to <2 x half>474  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %bc)475  store <2 x half> %fabs, ptr addrspace(1) %out476  ret void477}478 479; FIXME: Should do fabs after conversion to avoid converting multiple480; times in this particular case.481define amdgpu_kernel void @v_fabs_fold_self_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {482; CI-LABEL: v_fabs_fold_self_v2f16:483; CI:       ; %bb.0:484; CI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0485; CI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0486; CI-NEXT:    s_add_i32 s12, s12, s17487; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13488; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8489; CI-NEXT:    s_waitcnt lgkmcnt(0)490; CI-NEXT:    v_mov_b32_e32 v1, s3491; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v0492; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc493; CI-NEXT:    flat_load_dword v0, v[0:1]494; CI-NEXT:    s_waitcnt vmcnt(0)495; CI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0496; CI-NEXT:    v_cvt_f32_f16_e32 v2, v1497; CI-NEXT:    v_cvt_f32_f16_e64 v1, |v1|498; CI-NEXT:    v_cvt_f32_f16_e32 v3, v0499; CI-NEXT:    v_cvt_f32_f16_e64 v0, |v0|500; CI-NEXT:    v_mul_f32_e32 v1, v1, v2501; CI-NEXT:    v_cvt_f16_f32_e32 v2, v1502; CI-NEXT:    v_mul_f32_e32 v0, v0, v3503; CI-NEXT:    v_cvt_f16_f32_e32 v3, v0504; CI-NEXT:    v_mov_b32_e32 v0, s0505; CI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2506; CI-NEXT:    v_mov_b32_e32 v1, s1507; CI-NEXT:    v_or_b32_e32 v2, v3, v2508; CI-NEXT:    flat_store_dword v[0:1], v2509; CI-NEXT:    s_endpgm510;511; VI-LABEL: v_fabs_fold_self_v2f16:512; VI:       ; %bb.0:513; VI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0514; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0515; VI-NEXT:    s_add_i32 s12, s12, s17516; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13517; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8518; VI-NEXT:    s_waitcnt lgkmcnt(0)519; VI-NEXT:    v_mov_b32_e32 v1, s3520; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v0521; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc522; VI-NEXT:    flat_load_dword v2, v[0:1]523; VI-NEXT:    v_mov_b32_e32 v0, s0524; VI-NEXT:    v_mov_b32_e32 v1, s1525; VI-NEXT:    s_waitcnt vmcnt(0)526; VI-NEXT:    v_mul_f16_sdwa v3, |v2|, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1527; VI-NEXT:    v_mul_f16_e64 v2, |v2|, v2528; VI-NEXT:    v_or_b32_e32 v2, v2, v3529; VI-NEXT:    flat_store_dword v[0:1], v2530; VI-NEXT:    s_endpgm531;532; GFX9-LABEL: v_fabs_fold_self_v2f16:533; GFX9:       ; %bb.0:534; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0535; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0536; GFX9-NEXT:    v_mov_b32_e32 v1, 0537; GFX9-NEXT:    s_waitcnt lgkmcnt(0)538; GFX9-NEXT:    global_load_dword v0, v0, s[2:3]539; GFX9-NEXT:    s_waitcnt vmcnt(0)540; GFX9-NEXT:    v_and_b32_e32 v2, 0x7fff7fff, v0541; GFX9-NEXT:    v_pk_mul_f16 v0, v2, v0542; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]543; GFX9-NEXT:    s_endpgm544;545; GFX11-LABEL: v_fabs_fold_self_v2f16:546; GFX11:       ; %bb.0:547; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0548; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0549; GFX11-NEXT:    v_mov_b32_e32 v2, 0550; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_4) | instid1(VALU_DEP_1)551; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0552; GFX11-NEXT:    s_waitcnt lgkmcnt(0)553; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3]554; GFX11-NEXT:    s_waitcnt vmcnt(0)555; GFX11-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v0556; GFX11-NEXT:    v_pk_mul_f16 v0, v1, v0557; GFX11-NEXT:    global_store_b32 v2, v0, s[0:1]558; GFX11-NEXT:    s_endpgm559  %tid = call i32 @llvm.amdgcn.workitem.id.x()560  %gep = getelementptr <2 x half>, ptr addrspace(1) %in, i32 %tid561  %val = load <2 x half>, ptr addrspace(1) %gep562  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %val)563  %fmul = fmul <2 x half> %fabs, %val564  store <2 x half> %fmul, ptr addrspace(1) %out565  ret void566}567 568define amdgpu_kernel void @v_fabs_fold_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %in, i32 %other.val) #0 {569; CI-LABEL: v_fabs_fold_v2f16:570; CI:       ; %bb.0:571; CI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0572; CI-NEXT:    s_load_dword s4, s[8:9], 0x4573; CI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0574; CI-NEXT:    s_add_i32 s12, s12, s17575; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13576; CI-NEXT:    s_waitcnt lgkmcnt(0)577; CI-NEXT:    v_mov_b32_e32 v1, s3578; CI-NEXT:    v_add_i32_e32 v0, vcc, s2, v0579; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8580; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc581; CI-NEXT:    flat_load_dword v0, v[0:1]582; CI-NEXT:    s_lshr_b32 s2, s4, 16583; CI-NEXT:    v_cvt_f32_f16_e32 v1, s2584; CI-NEXT:    v_cvt_f32_f16_e32 v3, s4585; CI-NEXT:    s_waitcnt vmcnt(0)586; CI-NEXT:    v_lshrrev_b32_e32 v2, 16, v0587; CI-NEXT:    v_cvt_f32_f16_e64 v2, |v2|588; CI-NEXT:    v_cvt_f32_f16_e64 v0, |v0|589; CI-NEXT:    v_mul_f32_e32 v1, v2, v1590; CI-NEXT:    v_cvt_f16_f32_e32 v2, v1591; CI-NEXT:    v_mul_f32_e32 v0, v0, v3592; CI-NEXT:    v_cvt_f16_f32_e32 v3, v0593; CI-NEXT:    v_mov_b32_e32 v0, s0594; CI-NEXT:    v_lshlrev_b32_e32 v2, 16, v2595; CI-NEXT:    v_mov_b32_e32 v1, s1596; CI-NEXT:    v_or_b32_e32 v2, v3, v2597; CI-NEXT:    flat_store_dword v[0:1], v2598; CI-NEXT:    s_endpgm599;600; VI-LABEL: v_fabs_fold_v2f16:601; VI:       ; %bb.0:602; VI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0603; VI-NEXT:    s_load_dword s4, s[8:9], 0x10604; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0605; VI-NEXT:    s_add_i32 s12, s12, s17606; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13607; VI-NEXT:    s_waitcnt lgkmcnt(0)608; VI-NEXT:    v_mov_b32_e32 v1, s3609; VI-NEXT:    v_add_u32_e32 v0, vcc, s2, v0610; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8611; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc612; VI-NEXT:    flat_load_dword v2, v[0:1]613; VI-NEXT:    v_mov_b32_e32 v0, s0614; VI-NEXT:    s_lshr_b32 s0, s4, 16615; VI-NEXT:    v_mov_b32_e32 v3, s0616; VI-NEXT:    v_mov_b32_e32 v1, s1617; VI-NEXT:    s_waitcnt vmcnt(0)618; VI-NEXT:    v_mul_f16_sdwa v3, |v2|, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD619; VI-NEXT:    v_mul_f16_e64 v2, |v2|, s4620; VI-NEXT:    v_or_b32_e32 v2, v2, v3621; VI-NEXT:    flat_store_dword v[0:1], v2622; VI-NEXT:    s_endpgm623;624; GFX9-LABEL: v_fabs_fold_v2f16:625; GFX9:       ; %bb.0:626; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0627; GFX9-NEXT:    s_load_dword s4, s[8:9], 0x10628; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0629; GFX9-NEXT:    v_mov_b32_e32 v1, 0630; GFX9-NEXT:    s_waitcnt lgkmcnt(0)631; GFX9-NEXT:    global_load_dword v0, v0, s[2:3]632; GFX9-NEXT:    s_waitcnt vmcnt(0)633; GFX9-NEXT:    v_and_b32_e32 v0, 0x7fff7fff, v0634; GFX9-NEXT:    v_pk_mul_f16 v0, v0, s4635; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]636; GFX9-NEXT:    s_endpgm637;638; GFX11-LABEL: v_fabs_fold_v2f16:639; GFX11:       ; %bb.0:640; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0641; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0642; GFX11-NEXT:    s_load_b32 s4, s[4:5], 0x10643; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)644; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0645; GFX11-NEXT:    s_waitcnt lgkmcnt(0)646; GFX11-NEXT:    global_load_b32 v0, v0, s[2:3]647; GFX11-NEXT:    s_waitcnt vmcnt(0)648; GFX11-NEXT:    v_and_b32_e32 v0, 0x7fff7fff, v0649; GFX11-NEXT:    v_pk_mul_f16 v0, v0, s4650; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]651; GFX11-NEXT:    s_endpgm652  %tid = call i32 @llvm.amdgcn.workitem.id.x()653  %gep = getelementptr <2 x half>, ptr addrspace(1) %in, i32 %tid654  %val = load <2 x half>, ptr addrspace(1) %gep655  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %val)656  %other.val.cvt = bitcast i32 %other.val to <2 x half>657  %fmul = fmul <2 x half> %fabs, %other.val.cvt658  store <2 x half> %fmul, ptr addrspace(1) %out659  ret void660}661 662define amdgpu_kernel void @v_extract_fabs_fold_v2f16(ptr addrspace(1) %in) #0 {663; CI-LABEL: v_extract_fabs_fold_v2f16:664; CI:       ; %bb.0:665; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0666; CI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0667; CI-NEXT:    s_add_i32 s12, s12, s17668; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13669; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8670; CI-NEXT:    s_waitcnt lgkmcnt(0)671; CI-NEXT:    v_mov_b32_e32 v1, s1672; CI-NEXT:    v_add_i32_e32 v0, vcc, s0, v0673; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc674; CI-NEXT:    flat_load_dword v0, v[0:1]675; CI-NEXT:    s_waitcnt vmcnt(0)676; CI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0677; CI-NEXT:    v_cvt_f32_f16_e64 v0, |v0|678; CI-NEXT:    v_cvt_f32_f16_e64 v1, |v1|679; CI-NEXT:    v_mul_f32_e32 v0, 4.0, v0680; CI-NEXT:    v_add_f32_e32 v1, 2.0, v1681; CI-NEXT:    v_cvt_f16_f32_e32 v0, v0682; CI-NEXT:    v_cvt_f16_f32_e32 v1, v1683; CI-NEXT:    flat_store_short v[0:1], v0684; CI-NEXT:    s_waitcnt vmcnt(0)685; CI-NEXT:    flat_store_short v[0:1], v1686; CI-NEXT:    s_waitcnt vmcnt(0)687; CI-NEXT:    s_endpgm688;689; VI-LABEL: v_extract_fabs_fold_v2f16:690; VI:       ; %bb.0:691; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0692; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0693; VI-NEXT:    s_add_i32 s12, s12, s17694; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13695; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8696; VI-NEXT:    s_waitcnt lgkmcnt(0)697; VI-NEXT:    v_mov_b32_e32 v1, s1698; VI-NEXT:    v_add_u32_e32 v0, vcc, s0, v0699; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc700; VI-NEXT:    flat_load_dword v0, v[0:1]701; VI-NEXT:    v_mov_b32_e32 v1, 0x4000702; VI-NEXT:    s_waitcnt vmcnt(0)703; VI-NEXT:    v_mul_f16_e64 v2, |v0|, 4.0704; VI-NEXT:    v_add_f16_sdwa v0, |v0|, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD705; VI-NEXT:    flat_store_short v[0:1], v2706; VI-NEXT:    s_waitcnt vmcnt(0)707; VI-NEXT:    flat_store_short v[0:1], v0708; VI-NEXT:    s_waitcnt vmcnt(0)709; VI-NEXT:    s_endpgm710;711; GFX9-LABEL: v_extract_fabs_fold_v2f16:712; GFX9:       ; %bb.0:713; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0714; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0715; GFX9-NEXT:    v_mov_b32_e32 v1, 0x4000716; GFX9-NEXT:    s_waitcnt lgkmcnt(0)717; GFX9-NEXT:    global_load_dword v0, v0, s[0:1]718; GFX9-NEXT:    s_waitcnt vmcnt(0)719; GFX9-NEXT:    v_mul_f16_e64 v2, |v0|, 4.0720; GFX9-NEXT:    v_add_f16_sdwa v0, |v0|, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD721; GFX9-NEXT:    global_store_short v[0:1], v2, off722; GFX9-NEXT:    s_waitcnt vmcnt(0)723; GFX9-NEXT:    global_store_short v[0:1], v0, off724; GFX9-NEXT:    s_waitcnt vmcnt(0)725; GFX9-NEXT:    s_endpgm726;727; GFX11-TRUE16-LABEL: v_extract_fabs_fold_v2f16:728; GFX11-TRUE16:       ; %bb.0:729; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0730; GFX11-TRUE16-NEXT:    v_and_b32_e32 v0, 0x3ff, v0731; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)732; GFX11-TRUE16-NEXT:    v_lshlrev_b32_e32 v0, 2, v0733; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)734; GFX11-TRUE16-NEXT:    global_load_b32 v0, v0, s[0:1]735; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)736; GFX11-TRUE16-NEXT:    v_mul_f16_e64 v0.l, |v0.l|, 4.0737; GFX11-TRUE16-NEXT:    v_add_f16_e64 v0.h, |v0.h|, 2.0738; GFX11-TRUE16-NEXT:    global_store_b16 v[0:1], v0, off dlc739; GFX11-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0740; GFX11-TRUE16-NEXT:    global_store_d16_hi_b16 v[0:1], v0, off dlc741; GFX11-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0742; GFX11-TRUE16-NEXT:    s_endpgm743;744; GFX11-FAKE16-LABEL: v_extract_fabs_fold_v2f16:745; GFX11-FAKE16:       ; %bb.0:746; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0747; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0x3ff, v0748; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)749; GFX11-FAKE16-NEXT:    v_lshlrev_b32_e32 v0, 2, v0750; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)751; GFX11-FAKE16-NEXT:    global_load_b32 v0, v0, s[0:1]752; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)753; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0754; GFX11-FAKE16-NEXT:    v_mul_f16_e64 v0, |v0|, 4.0755; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)756; GFX11-FAKE16-NEXT:    v_add_f16_e64 v1, |v1|, 2.0757; GFX11-FAKE16-NEXT:    global_store_b16 v[0:1], v0, off dlc758; GFX11-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0759; GFX11-FAKE16-NEXT:    global_store_b16 v[0:1], v1, off dlc760; GFX11-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0761; GFX11-FAKE16-NEXT:    s_endpgm762  %tid = call i32 @llvm.amdgcn.workitem.id.x()763  %gep.in = getelementptr inbounds <2 x half>, ptr addrspace(1) %in, i32 %tid764  %val = load <2 x half>, ptr addrspace(1) %gep.in765  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %val)766  %elt0 = extractelement <2 x half> %fabs, i32 0767  %elt1 = extractelement <2 x half> %fabs, i32 1768 769  %fmul0 = fmul half %elt0, 4.0770  %fadd1 = fadd half %elt1, 2.0771  store volatile half %fmul0, ptr addrspace(1) poison772  store volatile half %fadd1, ptr addrspace(1) poison773  ret void774}775 776define amdgpu_kernel void @v_extract_fabs_no_fold_v2f16(ptr addrspace(1) %in) #0 {777; CI-LABEL: v_extract_fabs_no_fold_v2f16:778; CI:       ; %bb.0:779; CI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0780; CI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0781; CI-NEXT:    s_add_i32 s12, s12, s17782; CI-NEXT:    s_mov_b32 flat_scratch_lo, s13783; CI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8784; CI-NEXT:    s_waitcnt lgkmcnt(0)785; CI-NEXT:    v_mov_b32_e32 v1, s1786; CI-NEXT:    v_add_i32_e32 v0, vcc, s0, v0787; CI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc788; CI-NEXT:    flat_load_dword v0, v[0:1]789; CI-NEXT:    s_waitcnt vmcnt(0)790; CI-NEXT:    v_bfe_u32 v1, v0, 16, 15791; CI-NEXT:    v_and_b32_e32 v0, 0x7fff, v0792; CI-NEXT:    flat_store_short v[0:1], v0793; CI-NEXT:    s_waitcnt vmcnt(0)794; CI-NEXT:    flat_store_short v[0:1], v1795; CI-NEXT:    s_waitcnt vmcnt(0)796; CI-NEXT:    s_endpgm797;798; VI-LABEL: v_extract_fabs_no_fold_v2f16:799; VI:       ; %bb.0:800; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0801; VI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0802; VI-NEXT:    s_add_i32 s12, s12, s17803; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13804; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8805; VI-NEXT:    s_waitcnt lgkmcnt(0)806; VI-NEXT:    v_mov_b32_e32 v1, s1807; VI-NEXT:    v_add_u32_e32 v0, vcc, s0, v0808; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc809; VI-NEXT:    flat_load_dword v0, v[0:1]810; VI-NEXT:    s_waitcnt vmcnt(0)811; VI-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v0812; VI-NEXT:    v_bfe_u32 v0, v0, 16, 15813; VI-NEXT:    flat_store_short v[0:1], v1814; VI-NEXT:    s_waitcnt vmcnt(0)815; VI-NEXT:    flat_store_short v[0:1], v0816; VI-NEXT:    s_waitcnt vmcnt(0)817; VI-NEXT:    s_endpgm818;819; GFX9-LABEL: v_extract_fabs_no_fold_v2f16:820; GFX9:       ; %bb.0:821; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0822; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0823; GFX9-NEXT:    s_waitcnt lgkmcnt(0)824; GFX9-NEXT:    global_load_dword v0, v0, s[0:1]825; GFX9-NEXT:    s_waitcnt vmcnt(0)826; GFX9-NEXT:    v_and_b32_e32 v0, 0x7fff7fff, v0827; GFX9-NEXT:    global_store_short v[0:1], v0, off828; GFX9-NEXT:    s_waitcnt vmcnt(0)829; GFX9-NEXT:    global_store_short_d16_hi v[0:1], v0, off830; GFX9-NEXT:    s_waitcnt vmcnt(0)831; GFX9-NEXT:    s_endpgm832;833; GFX11-LABEL: v_extract_fabs_no_fold_v2f16:834; GFX11:       ; %bb.0:835; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0836; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0837; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)838; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0839; GFX11-NEXT:    s_waitcnt lgkmcnt(0)840; GFX11-NEXT:    global_load_b32 v0, v0, s[0:1]841; GFX11-NEXT:    s_waitcnt vmcnt(0)842; GFX11-NEXT:    v_and_b32_e32 v0, 0x7fff7fff, v0843; GFX11-NEXT:    global_store_b16 v[0:1], v0, off dlc844; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0845; GFX11-NEXT:    global_store_d16_hi_b16 v[0:1], v0, off dlc846; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0847; GFX11-NEXT:    s_endpgm848  %tid = call i32 @llvm.amdgcn.workitem.id.x()849  %gep.in = getelementptr inbounds <2 x half>, ptr addrspace(1) %in, i32 %tid850  %val = load <2 x half>, ptr addrspace(1) %gep.in851  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %val)852  %elt0 = extractelement <2 x half> %fabs, i32 0853  %elt1 = extractelement <2 x half> %fabs, i32 1854  store volatile half %elt0, ptr addrspace(1) poison855  store volatile half %elt1, ptr addrspace(1) poison856  ret void857}858 859declare half @llvm.fabs.f16(half) #1860declare <2 x half> @llvm.fabs.v2f16(<2 x half>) #1861declare <4 x half> @llvm.fabs.v4f16(<4 x half>) #1862declare i32 @llvm.amdgcn.workitem.id.x() #1863 864attributes #0 = { nounwind }865attributes #1 = { nounwind readnone }866 867