brintos

brintos / llvm-project-archived public Read only

0
0
Text · 168.5 KiB · 833be20 Raw
4522 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=hawaii -mattr=+flat-for-global < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GCN-SAFE,SI,SI-SAFE %s3; RUN: llc -enable-no-signed-zeros-fp-math -mtriple=amdgcn -mcpu=hawaii -mattr=+flat-for-global -fp-contract=fast < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GCN-NSZ,SI,SI-NSZ %s4 5; RUN: llc -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GCN-SAFE,VI,VI-SAFE %s6; RUN: llc -enable-no-signed-zeros-fp-math -mtriple=amdgcn -mcpu=fiji -fp-contract=fast < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GCN-NSZ,VI,VI-NSZ %s7 8; --------------------------------------------------------------------------------9; fadd tests10; --------------------------------------------------------------------------------11 12define float @v_fneg_add_f32(float %a, float %b) #0 {13; GCN-SAFE-LABEL: v_fneg_add_f32:14; GCN-SAFE:       ; %bb.0:15; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)16; GCN-SAFE-NEXT:    v_add_f32_e32 v0, v0, v117; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v018; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]19;20; GCN-NSZ-LABEL: v_fneg_add_f32:21; GCN-NSZ:       ; %bb.0:22; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)23; GCN-NSZ-NEXT:    v_sub_f32_e64 v0, -v0, v124; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]25  %add = fadd float %a, %b26  %fneg = fneg float %add27  ret float %fneg28}29 30define { float, float } @v_fneg_add_store_use_add_f32(float %a, float %b) #0 {31; GCN-LABEL: v_fneg_add_store_use_add_f32:32; GCN:       ; %bb.0:33; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)34; GCN-NEXT:    v_add_f32_e32 v1, v0, v135; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v136; GCN-NEXT:    s_setpc_b64 s[30:31]37  %add = fadd float %a, %b38  %fneg = fneg float %add39  %insert.0 = insertvalue { float, float } poison, float %fneg, 040  %insert.1 = insertvalue { float, float } %insert.0, float %add, 141  ret { float, float } %insert.142}43 44define { float, float } @v_fneg_add_multi_use_add_f32(float %a, float %b) #0 {45; GCN-SAFE-LABEL: v_fneg_add_multi_use_add_f32:46; GCN-SAFE:       ; %bb.0:47; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)48; GCN-SAFE-NEXT:    v_add_f32_e32 v1, v0, v149; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v150; GCN-SAFE-NEXT:    v_mul_f32_e32 v1, 4.0, v151; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]52;53; GCN-NSZ-LABEL: v_fneg_add_multi_use_add_f32:54; GCN-NSZ:       ; %bb.0:55; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)56; GCN-NSZ-NEXT:    v_sub_f32_e64 v0, -v0, v157; GCN-NSZ-NEXT:    v_mul_f32_e32 v1, -4.0, v058; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]59  %add = fadd float %a, %b60  %fneg = fneg float %add61  %use1 = fmul float %add, 4.062 63  %insert.0 = insertvalue { float, float } poison, float %fneg, 064  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 165  ret { float, float } %insert.166}67 68define float @v_fneg_add_fneg_x_f32(float %a, float %b) #0 {69; GCN-SAFE-LABEL: v_fneg_add_fneg_x_f32:70; GCN-SAFE:       ; %bb.0:71; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)72; GCN-SAFE-NEXT:    v_sub_f32_e32 v0, v1, v073; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v074; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]75;76; GCN-NSZ-LABEL: v_fneg_add_fneg_x_f32:77; GCN-NSZ:       ; %bb.0:78; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)79; GCN-NSZ-NEXT:    v_sub_f32_e32 v0, v0, v180; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]81  %fneg.a = fneg float %a82  %add = fadd float %fneg.a, %b83  %fneg = fneg float %add84  ret float %fneg85}86 87define float @v_fneg_add_x_fneg_f32(float %a, float %b) #0 {88; GCN-SAFE-LABEL: v_fneg_add_x_fneg_f32:89; GCN-SAFE:       ; %bb.0:90; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)91; GCN-SAFE-NEXT:    v_sub_f32_e32 v0, v0, v192; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v093; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]94;95; GCN-NSZ-LABEL: v_fneg_add_x_fneg_f32:96; GCN-NSZ:       ; %bb.0:97; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)98; GCN-NSZ-NEXT:    v_sub_f32_e32 v0, v1, v099; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]100  %fneg.b = fneg float %b101  %add = fadd float %a, %fneg.b102  %fneg = fneg float %add103  ret float %fneg104}105 106define float @v_fneg_add_fneg_fneg_f32(float %a, float %b) #0 {107; GCN-SAFE-LABEL: v_fneg_add_fneg_fneg_f32:108; GCN-SAFE:       ; %bb.0:109; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)110; GCN-SAFE-NEXT:    v_sub_f32_e64 v0, -v0, v1111; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0112; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]113;114; GCN-NSZ-LABEL: v_fneg_add_fneg_fneg_f32:115; GCN-NSZ:       ; %bb.0:116; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)117; GCN-NSZ-NEXT:    v_add_f32_e32 v0, v0, v1118; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]119  %fneg.a = fneg float %a120  %fneg.b = fneg float %b121  %add = fadd float %fneg.a, %fneg.b122  %fneg = fneg float %add123  ret float %fneg124}125 126define { float, float } @v_fneg_add_store_use_fneg_x_f32(float %a, float %b) #0 {127; GCN-SAFE-LABEL: v_fneg_add_store_use_fneg_x_f32:128; GCN-SAFE:       ; %bb.0:129; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)130; GCN-SAFE-NEXT:    v_xor_b32_e32 v2, 0x80000000, v0131; GCN-SAFE-NEXT:    v_sub_f32_e32 v0, v1, v0132; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0133; GCN-SAFE-NEXT:    v_mov_b32_e32 v1, v2134; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]135;136; GCN-NSZ-LABEL: v_fneg_add_store_use_fneg_x_f32:137; GCN-NSZ:       ; %bb.0:138; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)139; GCN-NSZ-NEXT:    v_xor_b32_e32 v2, 0x80000000, v0140; GCN-NSZ-NEXT:    v_sub_f32_e32 v0, v0, v1141; GCN-NSZ-NEXT:    v_mov_b32_e32 v1, v2142; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]143  %fneg.a = fneg float %a144  %add = fadd float %fneg.a, %b145  %fneg = fneg float %add146  %insert.0 = insertvalue { float, float } poison, float %fneg, 0147  %insert.1 = insertvalue { float, float } %insert.0, float %fneg.a, 1148  ret { float, float } %insert.1149}150 151define { float, float } @v_fneg_add_multi_use_fneg_x_f32(float %a, float %b, float %c) #0 {152; GCN-SAFE-LABEL: v_fneg_add_multi_use_fneg_x_f32:153; GCN-SAFE:       ; %bb.0:154; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)155; GCN-SAFE-NEXT:    v_sub_f32_e32 v1, v1, v0156; GCN-SAFE-NEXT:    v_xor_b32_e32 v3, 0x80000000, v1157; GCN-SAFE-NEXT:    v_mul_f32_e64 v1, -v0, v2158; GCN-SAFE-NEXT:    v_mov_b32_e32 v0, v3159; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]160;161; GCN-NSZ-LABEL: v_fneg_add_multi_use_fneg_x_f32:162; GCN-NSZ:       ; %bb.0:163; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)164; GCN-NSZ-NEXT:    v_sub_f32_e32 v3, v0, v1165; GCN-NSZ-NEXT:    v_mul_f32_e64 v1, -v0, v2166; GCN-NSZ-NEXT:    v_mov_b32_e32 v0, v3167; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]168  %fneg.a = fneg float %a169  %add = fadd float %fneg.a, %b170  %fneg = fneg float %add171  %use1 = fmul float %fneg.a, %c172 173  %insert.0 = insertvalue { float, float } poison, float %fneg, 0174  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 1175  ret { float, float } %insert.1176}177 178define amdgpu_ps float @fneg_fadd_0_safe_f32(float inreg %tmp2, float inreg %tmp6, <4 x i32> %arg) #0 {179; SI-LABEL: fneg_fadd_0_safe_f32:180; SI:       ; %bb.0: ; %.entry181; SI-NEXT:    v_div_scale_f32 v0, s[2:3], s1, s1, 1.0182; SI-NEXT:    v_rcp_f32_e32 v1, v0183; SI-NEXT:    v_div_scale_f32 v2, vcc, 1.0, s1, 1.0184; SI-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3185; SI-NEXT:    v_fma_f32 v3, -v0, v1, 1.0186; SI-NEXT:    v_fma_f32 v1, v3, v1, v1187; SI-NEXT:    v_mul_f32_e32 v3, v2, v1188; SI-NEXT:    v_fma_f32 v4, -v0, v3, v2189; SI-NEXT:    v_fma_f32 v3, v4, v1, v3190; SI-NEXT:    v_fma_f32 v0, -v0, v3, v2191; SI-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0192; SI-NEXT:    v_div_fmas_f32 v0, v0, v1, v3193; SI-NEXT:    v_div_fixup_f32 v0, v0, s1, 1.0194; SI-NEXT:    v_mad_f32 v0, v0, 0, 0195; SI-NEXT:    v_mov_b32_e32 v1, s0196; SI-NEXT:    v_cmp_ngt_f32_e32 vcc, s0, v0197; SI-NEXT:    v_cndmask_b32_e64 v0, -v0, v1, vcc198; SI-NEXT:    v_mov_b32_e32 v1, 0x7fc00000199; SI-NEXT:    v_cmp_nlt_f32_e32 vcc, 0, v0200; SI-NEXT:    v_cndmask_b32_e64 v0, v1, 0, vcc201; SI-NEXT:    ; return to shader part epilog202;203; VI-LABEL: fneg_fadd_0_safe_f32:204; VI:       ; %bb.0: ; %.entry205; VI-NEXT:    v_div_scale_f32 v0, s[2:3], s1, s1, 1.0206; VI-NEXT:    v_div_scale_f32 v1, vcc, 1.0, s1, 1.0207; VI-NEXT:    v_rcp_f32_e32 v2, v0208; VI-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 3209; VI-NEXT:    v_fma_f32 v3, -v0, v2, 1.0210; VI-NEXT:    v_fma_f32 v2, v3, v2, v2211; VI-NEXT:    v_mul_f32_e32 v3, v1, v2212; VI-NEXT:    v_fma_f32 v4, -v0, v3, v1213; VI-NEXT:    v_fma_f32 v3, v4, v2, v3214; VI-NEXT:    v_fma_f32 v0, -v0, v3, v1215; VI-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 4, 2), 0216; VI-NEXT:    v_div_fmas_f32 v0, v0, v2, v3217; VI-NEXT:    v_mov_b32_e32 v2, s0218; VI-NEXT:    v_mov_b32_e32 v1, 0x7fc00000219; VI-NEXT:    v_div_fixup_f32 v0, v0, s1, 1.0220; VI-NEXT:    v_mad_f32 v0, v0, 0, 0221; VI-NEXT:    v_cmp_ngt_f32_e32 vcc, s0, v0222; VI-NEXT:    v_cndmask_b32_e64 v0, -v0, v2, vcc223; VI-NEXT:    v_cmp_nlt_f32_e32 vcc, 0, v0224; VI-NEXT:    v_cndmask_b32_e64 v0, v1, 0, vcc225; VI-NEXT:    ; return to shader part epilog226.entry:227  %tmp7 = fdiv float 1.000000e+00, %tmp6228  %tmp8 = fmul float 0.000000e+00, %tmp7229  %tmp9 = fmul reassoc nnan arcp contract float 0.000000e+00, %tmp8230  %.i188 = fadd float %tmp9, 0.000000e+00231  %tmp10 = fcmp uge float %.i188, %tmp2232  %tmp11 = fneg float %.i188233  %.i092 = select i1 %tmp10, float %tmp2, float %tmp11234  %tmp12 = fcmp ule float %.i092, 0.000000e+00235  %.i198 = select i1 %tmp12, float 0.000000e+00, float 0x7FF8000000000000236  ret float %.i198237}238 239; This is a workaround because -enable-no-signed-zeros-fp-math does not set up240; function attribute unsafe-fp-math automatically. Combine with the previous test241; when that is done.242define amdgpu_ps float @fneg_fadd_0_nsz_f32(float inreg %tmp2, float inreg %tmp6, <4 x i32> %arg) #2 {243; GCN-LABEL: fneg_fadd_0_nsz_f32:244; GCN:       ; %bb.0: ; %.entry245; GCN-NEXT:    v_rcp_f32_e32 v0, s1246; GCN-NEXT:    v_mov_b32_e32 v1, s0247; GCN-NEXT:    v_mul_f32_e32 v0, 0, v0248; GCN-NEXT:    v_cmp_ngt_f32_e32 vcc, s0, v0249; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, v1, vcc250; GCN-NEXT:    v_mov_b32_e32 v1, 0x7fc00000251; GCN-NEXT:    v_cmp_nlt_f32_e32 vcc, 0, v0252; GCN-NEXT:    v_cndmask_b32_e64 v0, v1, 0, vcc253; GCN-NEXT:    ; return to shader part epilog254.entry:255  %tmp7 = fdiv afn float 1.000000e+00, %tmp6256  %tmp8 = fmul float 0.000000e+00, %tmp7257  %tmp9 = fmul reassoc nnan arcp contract float 0.000000e+00, %tmp8258  %.i188 = fadd nsz float %tmp9, 0.000000e+00259  %tmp10 = fcmp uge float %.i188, %tmp2260  %tmp11 = fneg float %.i188261  %.i092 = select i1 %tmp10, float %tmp2, float %tmp11262  %tmp12 = fcmp ule float %.i092, 0.000000e+00263  %.i198 = select i1 %tmp12, float 0.000000e+00, float 0x7FF8000000000000264  ret float %.i198265}266 267define double @v_fneg_add_f64(double %a, double %b) #0 {268; GCN-SAFE-LABEL: v_fneg_add_f64:269; GCN-SAFE:       ; %bb.0:270; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)271; GCN-SAFE-NEXT:    v_add_f64 v[0:1], v[0:1], v[2:3]272; GCN-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1273; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]274;275; GCN-NSZ-LABEL: v_fneg_add_f64:276; GCN-NSZ:       ; %bb.0:277; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)278; GCN-NSZ-NEXT:    v_add_f64 v[0:1], -v[0:1], -v[2:3]279; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]280  %add = fadd double %a, %b281  %fneg = fneg double %add282  ret double %fneg283}284 285define { double, double } @v_fneg_add_store_use_add_f64(double %a, double %b) #0 {286; GCN-LABEL: v_fneg_add_store_use_add_f64:287; GCN:       ; %bb.0:288; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)289; GCN-NEXT:    v_add_f64 v[2:3], v[0:1], v[2:3]290; GCN-NEXT:    v_xor_b32_e32 v1, 0x80000000, v3291; GCN-NEXT:    v_mov_b32_e32 v0, v2292; GCN-NEXT:    s_setpc_b64 s[30:31]293  %add = fadd double %a, %b294  %fneg = fneg double %add295  %insert.0 = insertvalue { double, double } poison, double %fneg, 0296  %insert.1 = insertvalue { double, double } %insert.0, double %add, 1297  ret { double, double } %insert.1298}299 300define { double, double } @v_fneg_add_multi_use_add_f64(double %a, double %b) #0 {301; SI-SAFE-LABEL: v_fneg_add_multi_use_add_f64:302; SI-SAFE:       ; %bb.0:303; SI-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)304; SI-SAFE-NEXT:    v_add_f64 v[0:1], v[0:1], v[2:3]305; SI-SAFE-NEXT:    v_xor_b32_e32 v4, 0x80000000, v1306; SI-SAFE-NEXT:    v_mul_f64 v[2:3], v[0:1], 4.0307; SI-SAFE-NEXT:    v_mov_b32_e32 v1, v4308; SI-SAFE-NEXT:    s_setpc_b64 s[30:31]309;310; GCN-NSZ-LABEL: v_fneg_add_multi_use_add_f64:311; GCN-NSZ:       ; %bb.0:312; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)313; GCN-NSZ-NEXT:    v_add_f64 v[0:1], -v[0:1], -v[2:3]314; GCN-NSZ-NEXT:    v_mul_f64 v[2:3], v[0:1], -4.0315; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]316;317; VI-SAFE-LABEL: v_fneg_add_multi_use_add_f64:318; VI-SAFE:       ; %bb.0:319; VI-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)320; VI-SAFE-NEXT:    v_add_f64 v[0:1], v[0:1], v[2:3]321; VI-SAFE-NEXT:    v_mul_f64 v[2:3], v[0:1], 4.0322; VI-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1323; VI-SAFE-NEXT:    s_setpc_b64 s[30:31]324  %add = fadd double %a, %b325  %fneg = fneg double %add326  %use1 = fmul double %add, 4.0327 328  %insert.0 = insertvalue { double, double } poison, double %fneg, 0329  %insert.1 = insertvalue { double, double } %insert.0, double %use1, 1330  ret { double, double } %insert.1331}332 333define double @v_fneg_add_fneg_x_f64(double %a, double %b) #0 {334; GCN-SAFE-LABEL: v_fneg_add_fneg_x_f64:335; GCN-SAFE:       ; %bb.0:336; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)337; GCN-SAFE-NEXT:    v_add_f64 v[0:1], v[2:3], -v[0:1]338; GCN-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1339; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]340;341; GCN-NSZ-LABEL: v_fneg_add_fneg_x_f64:342; GCN-NSZ:       ; %bb.0:343; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)344; GCN-NSZ-NEXT:    v_add_f64 v[0:1], v[0:1], -v[2:3]345; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]346  %fneg.a = fneg double %a347  %add = fadd double %fneg.a, %b348  %fneg = fneg double %add349  ret double %fneg350}351 352define double @v_fneg_add_x_fneg_f64(double %a, double %b) #0 {353; GCN-SAFE-LABEL: v_fneg_add_x_fneg_f64:354; GCN-SAFE:       ; %bb.0:355; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)356; GCN-SAFE-NEXT:    v_add_f64 v[0:1], v[0:1], -v[2:3]357; GCN-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1358; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]359;360; GCN-NSZ-LABEL: v_fneg_add_x_fneg_f64:361; GCN-NSZ:       ; %bb.0:362; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)363; GCN-NSZ-NEXT:    v_add_f64 v[0:1], v[2:3], -v[0:1]364; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]365  %fneg.b = fneg double %b366  %add = fadd double %a, %fneg.b367  %fneg = fneg double %add368  ret double %fneg369}370 371define double @v_fneg_add_fneg_fneg_f64(double %a, double %b) #0 {372; GCN-SAFE-LABEL: v_fneg_add_fneg_fneg_f64:373; GCN-SAFE:       ; %bb.0:374; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)375; GCN-SAFE-NEXT:    v_add_f64 v[0:1], -v[0:1], -v[2:3]376; GCN-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1377; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]378;379; GCN-NSZ-LABEL: v_fneg_add_fneg_fneg_f64:380; GCN-NSZ:       ; %bb.0:381; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)382; GCN-NSZ-NEXT:    v_add_f64 v[0:1], v[0:1], v[2:3]383; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]384  %fneg.a = fneg double %a385  %fneg.b = fneg double %b386  %add = fadd double %fneg.a, %fneg.b387  %fneg = fneg double %add388  ret double %fneg389}390 391define { double, double } @v_fneg_add_store_use_fneg_x_f64(double %a, double %b) #0 {392; SI-SAFE-LABEL: v_fneg_add_store_use_fneg_x_f64:393; SI-SAFE:       ; %bb.0:394; SI-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)395; SI-SAFE-NEXT:    v_mov_b32_e32 v5, v1396; SI-SAFE-NEXT:    v_mov_b32_e32 v4, v0397; SI-SAFE-NEXT:    v_add_f64 v[0:1], v[2:3], -v[4:5]398; SI-SAFE-NEXT:    v_xor_b32_e32 v3, 0x80000000, v5399; SI-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1400; SI-SAFE-NEXT:    v_mov_b32_e32 v2, v4401; SI-SAFE-NEXT:    s_setpc_b64 s[30:31]402;403; SI-NSZ-LABEL: v_fneg_add_store_use_fneg_x_f64:404; SI-NSZ:       ; %bb.0:405; SI-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)406; SI-NSZ-NEXT:    v_mov_b32_e32 v5, v1407; SI-NSZ-NEXT:    v_mov_b32_e32 v4, v0408; SI-NSZ-NEXT:    v_add_f64 v[0:1], v[4:5], -v[2:3]409; SI-NSZ-NEXT:    v_xor_b32_e32 v3, 0x80000000, v5410; SI-NSZ-NEXT:    v_mov_b32_e32 v2, v4411; SI-NSZ-NEXT:    s_setpc_b64 s[30:31]412;413; VI-SAFE-LABEL: v_fneg_add_store_use_fneg_x_f64:414; VI-SAFE:       ; %bb.0:415; VI-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)416; VI-SAFE-NEXT:    v_add_f64 v[4:5], v[2:3], -v[0:1]417; VI-SAFE-NEXT:    v_xor_b32_e32 v3, 0x80000000, v1418; VI-SAFE-NEXT:    v_mov_b32_e32 v2, v0419; VI-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v5420; VI-SAFE-NEXT:    v_mov_b32_e32 v0, v4421; VI-SAFE-NEXT:    s_setpc_b64 s[30:31]422;423; VI-NSZ-LABEL: v_fneg_add_store_use_fneg_x_f64:424; VI-NSZ:       ; %bb.0:425; VI-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)426; VI-NSZ-NEXT:    v_add_f64 v[4:5], v[0:1], -v[2:3]427; VI-NSZ-NEXT:    v_xor_b32_e32 v3, 0x80000000, v1428; VI-NSZ-NEXT:    v_mov_b32_e32 v2, v0429; VI-NSZ-NEXT:    v_mov_b32_e32 v0, v4430; VI-NSZ-NEXT:    v_mov_b32_e32 v1, v5431; VI-NSZ-NEXT:    s_setpc_b64 s[30:31]432  %fneg.a = fneg double %a433  %add = fadd double %fneg.a, %b434  %fneg = fneg double %add435  %insert.0 = insertvalue { double, double } poison, double %fneg, 0436  %insert.1 = insertvalue { double, double } %insert.0, double %fneg.a, 1437  ret { double, double } %insert.1438}439 440define { double, double } @v_fneg_add_multi_use_fneg_x_f64(double %a, double %b, double %c) #0 {441; SI-SAFE-LABEL: v_fneg_add_multi_use_fneg_x_f64:442; SI-SAFE:       ; %bb.0:443; SI-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)444; SI-SAFE-NEXT:    v_add_f64 v[6:7], v[2:3], -v[0:1]445; SI-SAFE-NEXT:    v_mul_f64 v[2:3], -v[0:1], v[4:5]446; SI-SAFE-NEXT:    v_xor_b32_e32 v7, 0x80000000, v7447; SI-SAFE-NEXT:    v_mov_b32_e32 v0, v6448; SI-SAFE-NEXT:    v_mov_b32_e32 v1, v7449; SI-SAFE-NEXT:    s_setpc_b64 s[30:31]450;451; GCN-NSZ-LABEL: v_fneg_add_multi_use_fneg_x_f64:452; GCN-NSZ:       ; %bb.0:453; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)454; GCN-NSZ-NEXT:    v_add_f64 v[6:7], v[0:1], -v[2:3]455; GCN-NSZ-NEXT:    v_mul_f64 v[2:3], -v[0:1], v[4:5]456; GCN-NSZ-NEXT:    v_mov_b32_e32 v0, v6457; GCN-NSZ-NEXT:    v_mov_b32_e32 v1, v7458; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]459;460; VI-SAFE-LABEL: v_fneg_add_multi_use_fneg_x_f64:461; VI-SAFE:       ; %bb.0:462; VI-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)463; VI-SAFE-NEXT:    v_add_f64 v[6:7], v[2:3], -v[0:1]464; VI-SAFE-NEXT:    v_mul_f64 v[2:3], -v[0:1], v[4:5]465; VI-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v7466; VI-SAFE-NEXT:    v_mov_b32_e32 v0, v6467; VI-SAFE-NEXT:    s_setpc_b64 s[30:31]468  %fneg.a = fneg double %a469  %add = fadd double %fneg.a, %b470  %fneg = fneg double %add471  %use1 = fmul double %fneg.a, %c472 473  %insert.0 = insertvalue { double, double } poison, double %fneg, 0474  %insert.1 = insertvalue { double, double } %insert.0, double %use1, 1475  ret { double, double } %insert.1476}477 478; This one asserted with -enable-no-signed-zeros-fp-math479define amdgpu_ps double @fneg_fadd_0_f64(double inreg %tmp2, double inreg %tmp6, <4 x i32> %arg) #0 {480; SI-SAFE-LABEL: fneg_fadd_0_f64:481; SI-SAFE:       ; %bb.0: ; %.entry482; SI-SAFE-NEXT:    v_div_scale_f64 v[0:1], s[4:5], s[2:3], s[2:3], 1.0483; SI-SAFE-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]484; SI-SAFE-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0485; SI-SAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[2:3]486; SI-SAFE-NEXT:    v_div_scale_f64 v[4:5], vcc, 1.0, s[2:3], 1.0487; SI-SAFE-NEXT:    v_fma_f64 v[6:7], -v[0:1], v[2:3], 1.0488; SI-SAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[2:3]489; SI-SAFE-NEXT:    v_mul_f64 v[6:7], v[4:5], v[2:3]490; SI-SAFE-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[6:7], v[4:5]491; SI-SAFE-NEXT:    v_div_fmas_f64 v[0:1], v[0:1], v[2:3], v[6:7]492; SI-SAFE-NEXT:    v_mov_b32_e32 v2, s1493; SI-SAFE-NEXT:    v_mov_b32_e32 v3, s0494; SI-SAFE-NEXT:    v_div_fixup_f64 v[0:1], v[0:1], s[2:3], 1.0495; SI-SAFE-NEXT:    v_mul_f64 v[0:1], v[0:1], 0496; SI-SAFE-NEXT:    v_add_f64 v[0:1], v[0:1], 0497; SI-SAFE-NEXT:    v_cmp_ngt_f64_e32 vcc, s[0:1], v[0:1]498; SI-SAFE-NEXT:    v_xor_b32_e32 v4, 0x80000000, v1499; SI-SAFE-NEXT:    v_cndmask_b32_e32 v1, v4, v2, vcc500; SI-SAFE-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc501; SI-SAFE-NEXT:    v_cmp_nlt_f64_e32 vcc, 0, v[0:1]502; SI-SAFE-NEXT:    s_and_b64 s[0:1], vcc, exec503; SI-SAFE-NEXT:    s_cselect_b32 s1, 0, 0x7ff80000504; SI-SAFE-NEXT:    s_mov_b32 s0, 0505; SI-SAFE-NEXT:    ; return to shader part epilog506;507; SI-NSZ-LABEL: fneg_fadd_0_f64:508; SI-NSZ:       ; %bb.0: ; %.entry509; SI-NSZ-NEXT:    v_div_scale_f64 v[0:1], s[4:5], s[2:3], s[2:3], 1.0510; SI-NSZ-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]511; SI-NSZ-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0512; SI-NSZ-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[2:3]513; SI-NSZ-NEXT:    v_div_scale_f64 v[4:5], vcc, 1.0, s[2:3], 1.0514; SI-NSZ-NEXT:    v_fma_f64 v[6:7], -v[0:1], v[2:3], 1.0515; SI-NSZ-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[2:3]516; SI-NSZ-NEXT:    v_mul_f64 v[6:7], v[4:5], v[2:3]517; SI-NSZ-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[6:7], v[4:5]518; SI-NSZ-NEXT:    v_div_fmas_f64 v[0:1], v[0:1], v[2:3], v[6:7]519; SI-NSZ-NEXT:    v_mov_b32_e32 v2, s1520; SI-NSZ-NEXT:    v_mov_b32_e32 v3, s0521; SI-NSZ-NEXT:    v_div_fixup_f64 v[0:1], v[0:1], s[2:3], 1.0522; SI-NSZ-NEXT:    s_mov_b32 s2, 0523; SI-NSZ-NEXT:    v_mul_f64 v[0:1], v[0:1], 0524; SI-NSZ-NEXT:    s_brev_b32 s3, 1525; SI-NSZ-NEXT:    v_fma_f64 v[0:1], v[0:1], s[2:3], s[2:3]526; SI-NSZ-NEXT:    v_cmp_nlt_f64_e64 vcc, -v[0:1], s[0:1]527; SI-NSZ-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc528; SI-NSZ-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc529; SI-NSZ-NEXT:    v_cmp_nlt_f64_e32 vcc, 0, v[0:1]530; SI-NSZ-NEXT:    s_and_b64 s[0:1], vcc, exec531; SI-NSZ-NEXT:    s_cselect_b32 s1, 0, 0x7ff80000532; SI-NSZ-NEXT:    s_mov_b32 s0, 0533; SI-NSZ-NEXT:    ; return to shader part epilog534;535; VI-SAFE-LABEL: fneg_fadd_0_f64:536; VI-SAFE:       ; %bb.0: ; %.entry537; VI-SAFE-NEXT:    v_div_scale_f64 v[0:1], s[4:5], s[2:3], s[2:3], 1.0538; VI-SAFE-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]539; VI-SAFE-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0540; VI-SAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[2:3]541; VI-SAFE-NEXT:    v_div_scale_f64 v[4:5], vcc, 1.0, s[2:3], 1.0542; VI-SAFE-NEXT:    v_fma_f64 v[6:7], -v[0:1], v[2:3], 1.0543; VI-SAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[2:3]544; VI-SAFE-NEXT:    v_mul_f64 v[6:7], v[4:5], v[2:3]545; VI-SAFE-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[6:7], v[4:5]546; VI-SAFE-NEXT:    v_mov_b32_e32 v4, s0547; VI-SAFE-NEXT:    v_div_fmas_f64 v[0:1], v[0:1], v[2:3], v[6:7]548; VI-SAFE-NEXT:    v_mov_b32_e32 v2, s1549; VI-SAFE-NEXT:    v_div_fixup_f64 v[0:1], v[0:1], s[2:3], 1.0550; VI-SAFE-NEXT:    v_mul_f64 v[0:1], v[0:1], 0551; VI-SAFE-NEXT:    v_add_f64 v[0:1], v[0:1], 0552; VI-SAFE-NEXT:    v_cmp_ngt_f64_e32 vcc, s[0:1], v[0:1]553; VI-SAFE-NEXT:    v_xor_b32_e32 v3, 0x80000000, v1554; VI-SAFE-NEXT:    v_cndmask_b32_e32 v1, v3, v2, vcc555; VI-SAFE-NEXT:    v_cndmask_b32_e32 v0, v0, v4, vcc556; VI-SAFE-NEXT:    v_cmp_nlt_f64_e32 vcc, 0, v[0:1]557; VI-SAFE-NEXT:    s_and_b64 s[0:1], vcc, exec558; VI-SAFE-NEXT:    s_cselect_b32 s1, 0, 0x7ff80000559; VI-SAFE-NEXT:    s_mov_b32 s0, 0560; VI-SAFE-NEXT:    ; return to shader part epilog561;562; VI-NSZ-LABEL: fneg_fadd_0_f64:563; VI-NSZ:       ; %bb.0: ; %.entry564; VI-NSZ-NEXT:    v_div_scale_f64 v[0:1], s[4:5], s[2:3], s[2:3], 1.0565; VI-NSZ-NEXT:    v_rcp_f64_e32 v[2:3], v[0:1]566; VI-NSZ-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0567; VI-NSZ-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[2:3]568; VI-NSZ-NEXT:    v_div_scale_f64 v[4:5], vcc, 1.0, s[2:3], 1.0569; VI-NSZ-NEXT:    v_fma_f64 v[6:7], -v[0:1], v[2:3], 1.0570; VI-NSZ-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[2:3]571; VI-NSZ-NEXT:    v_mul_f64 v[6:7], v[4:5], v[2:3]572; VI-NSZ-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[6:7], v[4:5]573; VI-NSZ-NEXT:    v_div_fmas_f64 v[0:1], v[0:1], v[2:3], v[6:7]574; VI-NSZ-NEXT:    v_mov_b32_e32 v2, s1575; VI-NSZ-NEXT:    v_mov_b32_e32 v3, s0576; VI-NSZ-NEXT:    v_div_fixup_f64 v[0:1], v[0:1], s[2:3], 1.0577; VI-NSZ-NEXT:    s_mov_b32 s2, 0578; VI-NSZ-NEXT:    s_brev_b32 s3, 1579; VI-NSZ-NEXT:    v_mul_f64 v[0:1], v[0:1], 0580; VI-NSZ-NEXT:    v_fma_f64 v[0:1], v[0:1], s[2:3], s[2:3]581; VI-NSZ-NEXT:    v_cmp_nlt_f64_e64 vcc, -v[0:1], s[0:1]582; VI-NSZ-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc583; VI-NSZ-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc584; VI-NSZ-NEXT:    v_cmp_nlt_f64_e32 vcc, 0, v[0:1]585; VI-NSZ-NEXT:    s_and_b64 s[0:1], vcc, exec586; VI-NSZ-NEXT:    s_cselect_b32 s1, 0, 0x7ff80000587; VI-NSZ-NEXT:    s_mov_b32 s0, 0588; VI-NSZ-NEXT:    ; return to shader part epilog589.entry:590  %tmp7 = fdiv double 1.000000e+00, %tmp6591  %tmp8 = fmul double 0.000000e+00, %tmp7592  %tmp9 = fmul reassoc nnan arcp contract double 0.000000e+00, %tmp8593  %.i188 = fadd double %tmp9, 0.000000e+00594  %tmp10 = fcmp uge double %.i188, %tmp2595  %tmp11 = fneg double %.i188596  %.i092 = select i1 %tmp10, double %tmp2, double %tmp11597  %tmp12 = fcmp ule double %.i092, 0.000000e+00598  %.i198 = select i1 %tmp12, double 0.000000e+00, double 0x7FF8000000000000599  ret double %.i198600}601 602; This is a workaround because -enable-no-signed-zeros-fp-math does not set up603; function attribute unsafe-fp-math automatically. Combine with the previous test604; when that is done.605define amdgpu_ps double @fneg_fadd_0_nsz_f64(double inreg %tmp2, double inreg %tmp6, <4 x i32> %arg) #2 {606; SI-LABEL: fneg_fadd_0_nsz_f64:607; SI:       ; %bb.0: ; %.entry608; SI-NEXT:    v_rcp_f64_e32 v[0:1], s[2:3]609; SI-NEXT:    v_fma_f64 v[2:3], -s[2:3], v[0:1], 1.0610; SI-NEXT:    v_fma_f64 v[0:1], v[2:3], v[0:1], v[0:1]611; SI-NEXT:    v_fma_f64 v[2:3], -s[2:3], v[0:1], 1.0612; SI-NEXT:    v_fma_f64 v[0:1], v[2:3], v[0:1], v[0:1]613; SI-NEXT:    v_fma_f64 v[2:3], -s[2:3], v[0:1], 1.0614; SI-NEXT:    s_mov_b32 s2, 0615; SI-NEXT:    v_fma_f64 v[0:1], v[2:3], v[0:1], v[0:1]616; SI-NEXT:    s_brev_b32 s3, 1617; SI-NEXT:    v_mul_f64 v[0:1], v[0:1], s[2:3]618; SI-NEXT:    v_mov_b32_e32 v2, s1619; SI-NEXT:    v_cmp_nlt_f64_e64 vcc, -v[0:1], s[0:1]620; SI-NEXT:    v_mov_b32_e32 v3, s0621; SI-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc622; SI-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc623; SI-NEXT:    v_cmp_nlt_f64_e32 vcc, 0, v[0:1]624; SI-NEXT:    s_and_b64 s[0:1], vcc, exec625; SI-NEXT:    s_cselect_b32 s1, 0, 0x7ff80000626; SI-NEXT:    s_mov_b32 s0, 0627; SI-NEXT:    ; return to shader part epilog628;629; VI-LABEL: fneg_fadd_0_nsz_f64:630; VI:       ; %bb.0: ; %.entry631; VI-NEXT:    v_rcp_f64_e32 v[0:1], s[2:3]632; VI-NEXT:    v_fma_f64 v[2:3], -s[2:3], v[0:1], 1.0633; VI-NEXT:    v_fma_f64 v[0:1], v[2:3], v[0:1], v[0:1]634; VI-NEXT:    v_fma_f64 v[2:3], -s[2:3], v[0:1], 1.0635; VI-NEXT:    v_fma_f64 v[0:1], v[2:3], v[0:1], v[0:1]636; VI-NEXT:    v_fma_f64 v[2:3], -s[2:3], v[0:1], 1.0637; VI-NEXT:    s_mov_b32 s2, 0638; VI-NEXT:    s_brev_b32 s3, 1639; VI-NEXT:    v_fma_f64 v[0:1], v[2:3], v[0:1], v[0:1]640; VI-NEXT:    v_mov_b32_e32 v2, s1641; VI-NEXT:    v_mov_b32_e32 v3, s0642; VI-NEXT:    v_mul_f64 v[0:1], v[0:1], s[2:3]643; VI-NEXT:    v_cmp_nlt_f64_e64 vcc, -v[0:1], s[0:1]644; VI-NEXT:    v_cndmask_b32_e32 v1, v1, v2, vcc645; VI-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc646; VI-NEXT:    v_cmp_nlt_f64_e32 vcc, 0, v[0:1]647; VI-NEXT:    s_and_b64 s[0:1], vcc, exec648; VI-NEXT:    s_cselect_b32 s1, 0, 0x7ff80000649; VI-NEXT:    s_mov_b32 s0, 0650; VI-NEXT:    ; return to shader part epilog651.entry:652  %tmp7 = fdiv afn double 1.000000e+00, %tmp6653  %tmp8 = fmul double 0.000000e+00, %tmp7654  %tmp9 = fmul reassoc nnan arcp contract double 0.000000e+00, %tmp8655  %.i188 = fadd nsz double %tmp9, 0.000000e+00656  %tmp10 = fcmp uge double %.i188, %tmp2657  %tmp11 = fneg double %.i188658  %.i092 = select i1 %tmp10, double %tmp2, double %tmp11659  %tmp12 = fcmp ule double %.i092, 0.000000e+00660  %.i198 = select i1 %tmp12, double 0.000000e+00, double 0x7FF8000000000000661  ret double %.i198662}663 664; --------------------------------------------------------------------------------665; fmul tests666; --------------------------------------------------------------------------------667 668define float @v_fneg_mul_f32(float %a, float %b) #0 {669; GCN-LABEL: v_fneg_mul_f32:670; GCN:       ; %bb.0:671; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)672; GCN-NEXT:    v_mul_f32_e64 v0, v0, -v1673; GCN-NEXT:    s_setpc_b64 s[30:31]674  %mul = fmul float %a, %b675  %fneg = fneg float %mul676  ret float %fneg677}678 679define { float, float } @v_fneg_mul_store_use_mul_f32(float %a, float %b) #0 {680; GCN-LABEL: v_fneg_mul_store_use_mul_f32:681; GCN:       ; %bb.0:682; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)683; GCN-NEXT:    v_mul_f32_e32 v1, v0, v1684; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v1685; GCN-NEXT:    s_setpc_b64 s[30:31]686  %mul = fmul float %a, %b687  %fneg = fneg float %mul688  %insert.0 = insertvalue { float, float } poison, float %fneg, 0689  %insert.1 = insertvalue { float, float } %insert.0, float %mul, 1690  ret { float, float } %insert.1691}692 693define { float, float } @v_fneg_mul_multi_use_mul_f32(float %a, float %b) #0 {694; GCN-LABEL: v_fneg_mul_multi_use_mul_f32:695; GCN:       ; %bb.0:696; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)697; GCN-NEXT:    v_mul_f32_e64 v0, v0, -v1698; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v0699; GCN-NEXT:    s_setpc_b64 s[30:31]700  %mul = fmul float %a, %b701  %fneg = fneg float %mul702  %use1 = fmul float %mul, 4.0703  %insert.0 = insertvalue { float, float } poison, float %fneg, 0704  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 1705  ret { float, float } %insert.1706}707 708define float @v_fneg_mul_fneg_x_f32(float %a, float %b) #0 {709; GCN-LABEL: v_fneg_mul_fneg_x_f32:710; GCN:       ; %bb.0:711; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)712; GCN-NEXT:    v_mul_f32_e32 v0, v0, v1713; GCN-NEXT:    s_setpc_b64 s[30:31]714  %fneg.a = fneg float %a715  %mul = fmul float %fneg.a, %b716  %fneg = fneg float %mul717  ret float %fneg718}719 720define float @v_fneg_mul_x_fneg_f32(float %a, float %b) #0 {721; GCN-LABEL: v_fneg_mul_x_fneg_f32:722; GCN:       ; %bb.0:723; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)724; GCN-NEXT:    v_mul_f32_e32 v0, v0, v1725; GCN-NEXT:    s_setpc_b64 s[30:31]726  %fneg.b = fneg float %b727  %mul = fmul float %a, %fneg.b728  %fneg = fneg float %mul729  ret float %fneg730}731 732define float @v_fneg_mul_fneg_fneg_f32(float %a, float %b) #0 {733; GCN-LABEL: v_fneg_mul_fneg_fneg_f32:734; GCN:       ; %bb.0:735; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)736; GCN-NEXT:    v_mul_f32_e64 v0, v0, -v1737; GCN-NEXT:    s_setpc_b64 s[30:31]738  %fneg.a = fneg float %a739  %fneg.b = fneg float %b740  %mul = fmul float %fneg.a, %fneg.b741  %fneg = fneg float %mul742  ret float %fneg743}744 745define { float, float } @v_fneg_mul_store_use_fneg_x_f32(float %a, float %b) #0 {746; GCN-LABEL: v_fneg_mul_store_use_fneg_x_f32:747; GCN:       ; %bb.0:748; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)749; GCN-NEXT:    v_xor_b32_e32 v2, 0x80000000, v0750; GCN-NEXT:    v_mul_f32_e32 v0, v0, v1751; GCN-NEXT:    v_mov_b32_e32 v1, v2752; GCN-NEXT:    s_setpc_b64 s[30:31]753  %fneg.a = fneg float %a754  %mul = fmul float %fneg.a, %b755  %fneg = fneg float %mul756  %insert.0 = insertvalue { float, float } poison, float %fneg, 0757  %insert.1 = insertvalue { float, float } %insert.0, float %fneg.a, 1758  ret { float, float } %insert.1759}760 761define { float, float } @v_fneg_mul_multi_use_fneg_x_f32(float %a, float %b, float %c) #0 {762; GCN-LABEL: v_fneg_mul_multi_use_fneg_x_f32:763; GCN:       ; %bb.0:764; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)765; GCN-NEXT:    v_mul_f32_e32 v3, v0, v1766; GCN-NEXT:    v_mul_f32_e64 v1, -v0, v2767; GCN-NEXT:    v_mov_b32_e32 v0, v3768; GCN-NEXT:    s_setpc_b64 s[30:31]769  %fneg.a = fneg float %a770  %mul = fmul float %fneg.a, %b771  %fneg = fneg float %mul772  %use1 = fmul float %fneg.a, %c773  %insert.0 = insertvalue { float, float } poison, float %fneg, 0774  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 1775  ret { float, float } %insert.1776}777 778; --------------------------------------------------------------------------------779; fminnum tests780; --------------------------------------------------------------------------------781 782define float @v_fneg_minnum_f32_ieee(float %a, float %b) #0 {783; GCN-LABEL: v_fneg_minnum_f32_ieee:784; GCN:       ; %bb.0:785; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)786; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v1787; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v0788; GCN-NEXT:    v_max_f32_e32 v0, v0, v1789; GCN-NEXT:    s_setpc_b64 s[30:31]790  %min = call float @llvm.minnum.f32(float %a, float %b)791  %fneg = fneg float %min792  ret float %fneg793}794 795define float @v_fneg_minnum_f32_no_ieee(float %a, float %b) #4 {796; GCN-LABEL: v_fneg_minnum_f32_no_ieee:797; GCN:       ; %bb.0:798; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)799; GCN-NEXT:    v_max_f32_e64 v0, -v0, -v1800; GCN-NEXT:    s_setpc_b64 s[30:31]801  %min = call float @llvm.minnum.f32(float %a, float %b)802  %fneg = fneg float %min803  ret float %fneg804}805 806define float @v_fneg_self_minnum_f32_ieee(float %a) #0 {807; GCN-LABEL: v_fneg_self_minnum_f32_ieee:808; GCN:       ; %bb.0:809; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)810; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0811; GCN-NEXT:    s_setpc_b64 s[30:31]812  %min = call float @llvm.minnum.f32(float %a, float %a)813  %min.fneg = fneg float %min814  ret float %min.fneg815}816 817define float @v_fneg_self_minnum_f32_no_ieee(float %a) #4 {818; GCN-LABEL: v_fneg_self_minnum_f32_no_ieee:819; GCN:       ; %bb.0:820; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)821; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0822; GCN-NEXT:    s_setpc_b64 s[30:31]823  %min = call float @llvm.minnum.f32(float %a, float %a)824  %min.fneg = fneg float %min825  ret float %min.fneg826}827 828define float @v_fneg_posk_minnum_f32_ieee(float %a) #0 {829; GCN-LABEL: v_fneg_posk_minnum_f32_ieee:830; GCN:       ; %bb.0:831; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)832; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v0833; GCN-NEXT:    v_max_f32_e32 v0, -4.0, v0834; GCN-NEXT:    s_setpc_b64 s[30:31]835  %min = call float @llvm.minnum.f32(float 4.0, float %a)836  %fneg = fneg float %min837  ret float %fneg838}839 840define float @v_fneg_posk_minnum_f32_no_ieee(float %a) #4 {841; GCN-LABEL: v_fneg_posk_minnum_f32_no_ieee:842; GCN:       ; %bb.0:843; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)844; GCN-NEXT:    v_max_f32_e64 v0, -v0, -4.0845; GCN-NEXT:    s_setpc_b64 s[30:31]846  %min = call float @llvm.minnum.f32(float 4.0, float %a)847  %fneg = fneg float %min848  ret float %fneg849}850 851define float @v_fneg_negk_minnum_f32_ieee(float %a) #0 {852; GCN-LABEL: v_fneg_negk_minnum_f32_ieee:853; GCN:       ; %bb.0:854; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)855; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v0856; GCN-NEXT:    v_max_f32_e32 v0, 4.0, v0857; GCN-NEXT:    s_setpc_b64 s[30:31]858  %min = call float @llvm.minnum.f32(float -4.0, float %a)859  %fneg = fneg float %min860  ret float %fneg861}862 863define float @v_fneg_negk_minnum_f32_no_ieee(float %a) #4 {864; GCN-LABEL: v_fneg_negk_minnum_f32_no_ieee:865; GCN:       ; %bb.0:866; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)867; GCN-NEXT:    v_max_f32_e64 v0, -v0, 4.0868; GCN-NEXT:    s_setpc_b64 s[30:31]869  %min = call float @llvm.minnum.f32(float -4.0, float %a)870  %fneg = fneg float %min871  ret float %fneg872}873 874define float @v_fneg_0_minnum_f32(float %a) #0 {875; GCN-LABEL: v_fneg_0_minnum_f32:876; GCN:       ; %bb.0:877; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)878; GCN-NEXT:    v_min_f32_e32 v0, 0, v0879; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0880; GCN-NEXT:    s_setpc_b64 s[30:31]881  %min = call nnan float @llvm.minnum.f32(float 0.0, float %a)882  %fneg = fneg float %min883  ret float %fneg884}885 886define float @v_fneg_neg0_minnum_f32_ieee(float %a) #0 {887; GCN-LABEL: v_fneg_neg0_minnum_f32_ieee:888; GCN:       ; %bb.0:889; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)890; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v0891; GCN-NEXT:    v_max_f32_e32 v0, 0, v0892; GCN-NEXT:    s_setpc_b64 s[30:31]893  %min = call float @llvm.minnum.f32(float -0.0, float %a)894  %fneg = fneg float %min895  ret float %fneg896}897 898define float @v_fneg_inv2pi_minnum_f32(float %a) #0 {899; SI-LABEL: v_fneg_inv2pi_minnum_f32:900; SI:       ; %bb.0:901; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)902; SI-NEXT:    v_mul_f32_e32 v0, -1.0, v0903; SI-NEXT:    v_max_f32_e32 v0, 0xbe22f983, v0904; SI-NEXT:    s_setpc_b64 s[30:31]905;906; VI-LABEL: v_fneg_inv2pi_minnum_f32:907; VI:       ; %bb.0:908; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)909; VI-NEXT:    v_mul_f32_e32 v0, 1.0, v0910; VI-NEXT:    v_min_f32_e32 v0, 0.15915494, v0911; VI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0912; VI-NEXT:    s_setpc_b64 s[30:31]913  %min = call float @llvm.minnum.f32(float 0x3FC45F3060000000, float %a)914  %fneg = fneg float %min915  ret float %fneg916}917 918define float @v_fneg_neg_inv2pi_minnum_f32(float %a) #0 {919; SI-LABEL: v_fneg_neg_inv2pi_minnum_f32:920; SI:       ; %bb.0:921; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)922; SI-NEXT:    v_mul_f32_e32 v0, -1.0, v0923; SI-NEXT:    v_max_f32_e32 v0, 0x3e22f983, v0924; SI-NEXT:    s_setpc_b64 s[30:31]925;926; VI-LABEL: v_fneg_neg_inv2pi_minnum_f32:927; VI:       ; %bb.0:928; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)929; VI-NEXT:    v_mul_f32_e32 v0, -1.0, v0930; VI-NEXT:    v_max_f32_e32 v0, 0.15915494, v0931; VI-NEXT:    s_setpc_b64 s[30:31]932  %min = call float @llvm.minnum.f32(float 0xBFC45F3060000000, float %a)933  %fneg = fneg float %min934  ret float %fneg935}936 937define half @v_fneg_inv2pi_minnum_f16(half %a) #0 {938; SI-LABEL: v_fneg_inv2pi_minnum_f16:939; SI:       ; %bb.0:940; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)941; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v0942; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0943; SI-NEXT:    v_max_f32_e32 v0, 0xbe230000, v0944; SI-NEXT:    s_setpc_b64 s[30:31]945;946; VI-LABEL: v_fneg_inv2pi_minnum_f16:947; VI:       ; %bb.0:948; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)949; VI-NEXT:    v_max_f16_e32 v0, v0, v0950; VI-NEXT:    v_min_f16_e32 v0, 0.15915494, v0951; VI-NEXT:    v_xor_b32_e32 v0, 0x8000, v0952; VI-NEXT:    s_setpc_b64 s[30:31]953  %min = call half @llvm.minnum.f16(half 0xH3118, half %a)954  %fneg = fneg half %min955  ret half %fneg956}957 958define half @v_fneg_neg_inv2pi_minnum_f16(half %a) #0 {959; SI-LABEL: v_fneg_neg_inv2pi_minnum_f16:960; SI:       ; %bb.0:961; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)962; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v0963; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0964; SI-NEXT:    v_max_f32_e32 v0, 0x3e230000, v0965; SI-NEXT:    s_setpc_b64 s[30:31]966;967; VI-LABEL: v_fneg_neg_inv2pi_minnum_f16:968; VI:       ; %bb.0:969; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)970; VI-NEXT:    v_max_f16_e64 v0, -v0, -v0971; VI-NEXT:    v_max_f16_e32 v0, 0.15915494, v0972; VI-NEXT:    s_setpc_b64 s[30:31]973  %min = call half @llvm.minnum.f16(half 0xHB118, half %a)974  %fneg = fneg half %min975  ret half %fneg976}977 978define double @v_fneg_inv2pi_minnum_f64(double %a) #0 {979; SI-LABEL: v_fneg_inv2pi_minnum_f64:980; SI:       ; %bb.0:981; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)982; SI-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1]983; SI-NEXT:    s_mov_b32 s4, 0x6dc9c882984; SI-NEXT:    s_mov_b32 s5, 0xbfc45f30985; SI-NEXT:    v_max_f64 v[0:1], v[0:1], s[4:5]986; SI-NEXT:    s_setpc_b64 s[30:31]987;988; VI-LABEL: v_fneg_inv2pi_minnum_f64:989; VI:       ; %bb.0:990; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)991; VI-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1]992; VI-NEXT:    v_min_f64 v[0:1], v[0:1], 0.15915494309189532993; VI-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1994; VI-NEXT:    s_setpc_b64 s[30:31]995  %min = call double @llvm.minnum.f64(double 0x3fc45f306dc9c882, double %a)996  %fneg = fneg double %min997  ret double %fneg998}999 1000define double @v_fneg_neg_inv2pi_minnum_f64(double %a) #0 {1001; SI-LABEL: v_fneg_neg_inv2pi_minnum_f64:1002; SI:       ; %bb.0:1003; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1004; SI-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1]1005; SI-NEXT:    s_mov_b32 s4, 0x6dc9c8821006; SI-NEXT:    s_mov_b32 s5, 0x3fc45f301007; SI-NEXT:    v_max_f64 v[0:1], v[0:1], s[4:5]1008; SI-NEXT:    s_setpc_b64 s[30:31]1009;1010; VI-LABEL: v_fneg_neg_inv2pi_minnum_f64:1011; VI:       ; %bb.0:1012; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1013; VI-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1]1014; VI-NEXT:    v_max_f64 v[0:1], v[0:1], 0.159154943091895321015; VI-NEXT:    s_setpc_b64 s[30:31]1016  %min = call double @llvm.minnum.f64(double 0xbfc45f306dc9c882, double %a)1017  %fneg = fneg double %min1018  ret double %fneg1019}1020 1021define float @v_fneg_neg0_minnum_f32_no_ieee(float %a) #4 {1022; GCN-LABEL: v_fneg_neg0_minnum_f32_no_ieee:1023; GCN:       ; %bb.0:1024; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1025; GCN-NEXT:    v_max_f32_e64 v0, -v0, 01026; GCN-NEXT:    s_setpc_b64 s[30:31]1027  %min = call float @llvm.minnum.f32(float -0.0, float %a)1028  %fneg = fneg float %min1029  ret float %fneg1030}1031 1032define float @v_fneg_0_minnum_foldable_use_f32_ieee(float %a, float %b) #0 {1033; GCN-LABEL: v_fneg_0_minnum_foldable_use_f32_ieee:1034; GCN:       ; %bb.0:1035; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1036; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v01037; GCN-NEXT:    v_min_f32_e32 v0, 0, v01038; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11039; GCN-NEXT:    s_setpc_b64 s[30:31]1040  %min = call float @llvm.minnum.f32(float 0.0, float %a)1041  %fneg = fneg float %min1042  %mul = fmul float %fneg, %b1043  ret float %mul1044}1045 1046define float @v_fneg_inv2pi_minnum_foldable_use_f32(float %a, float %b) #0 {1047; SI-LABEL: v_fneg_inv2pi_minnum_foldable_use_f32:1048; SI:       ; %bb.0:1049; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1050; SI-NEXT:    v_mul_f32_e32 v0, -1.0, v01051; SI-NEXT:    v_max_f32_e32 v0, 0xbe22f983, v01052; SI-NEXT:    v_mul_f32_e32 v0, v0, v11053; SI-NEXT:    s_setpc_b64 s[30:31]1054;1055; VI-LABEL: v_fneg_inv2pi_minnum_foldable_use_f32:1056; VI:       ; %bb.0:1057; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1058; VI-NEXT:    v_mul_f32_e32 v0, 1.0, v01059; VI-NEXT:    v_min_f32_e32 v0, 0.15915494, v01060; VI-NEXT:    v_mul_f32_e64 v0, -v0, v11061; VI-NEXT:    s_setpc_b64 s[30:31]1062  %min = call float @llvm.minnum.f32(float 0x3FC45F3060000000, float %a)1063  %fneg = fneg float %min1064  %mul = fmul float %fneg, %b1065  ret float %mul1066}1067 1068define float @v_fneg_0_minnum_foldable_use_f32_no_ieee(float %a, float %b) #4 {1069; GCN-LABEL: v_fneg_0_minnum_foldable_use_f32_no_ieee:1070; GCN:       ; %bb.0:1071; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1072; GCN-NEXT:    v_min_f32_e32 v0, 0, v01073; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11074; GCN-NEXT:    s_setpc_b64 s[30:31]1075  %min = call float @llvm.minnum.f32(float 0.0, float %a)1076  %fneg = fneg float %min1077  %mul = fmul float %fneg, %b1078  ret float %mul1079}1080 1081define { float, float } @v_fneg_minnum_multi_use_minnum_f32_ieee(float %a, float %b) #0 {1082; GCN-LABEL: v_fneg_minnum_multi_use_minnum_f32_ieee:1083; GCN:       ; %bb.0:1084; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1085; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v11086; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01087; GCN-NEXT:    v_max_f32_e32 v0, v0, v11088; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01089; GCN-NEXT:    s_setpc_b64 s[30:31]1090  %min = call float @llvm.minnum.f32(float %a, float %b)1091  %fneg = fneg float %min1092  %use1 = fmul float %min, 4.01093  %insert.0 = insertvalue { float, float } poison, float %fneg, 01094  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 11095  ret { float, float } %insert.11096}1097 1098define <2 x float> @v_fneg_minnum_multi_use_minnum_f32_no_ieee(float %a, float %b) #4 {1099; GCN-LABEL: v_fneg_minnum_multi_use_minnum_f32_no_ieee:1100; GCN:       ; %bb.0:1101; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1102; GCN-NEXT:    v_max_f32_e64 v0, -v0, -v11103; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01104; GCN-NEXT:    s_setpc_b64 s[30:31]1105  %min = call float @llvm.minnum.f32(float %a, float %b)1106  %fneg = fneg float %min1107  %use1 = fmul float %min, 4.01108  %ins0 = insertelement <2 x float> poison, float %fneg, i32 01109  %ins1 = insertelement <2 x float> %ins0, float %use1, i32 11110  ret <2 x float> %ins11111}1112 1113; --------------------------------------------------------------------------------1114; fmaxnum tests1115; --------------------------------------------------------------------------------1116 1117define float @v_fneg_maxnum_f32_ieee(float %a, float %b) #0 {1118; GCN-LABEL: v_fneg_maxnum_f32_ieee:1119; GCN:       ; %bb.0:1120; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1121; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v11122; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01123; GCN-NEXT:    v_min_f32_e32 v0, v0, v11124; GCN-NEXT:    s_setpc_b64 s[30:31]1125  %max = call float @llvm.maxnum.f32(float %a, float %b)1126  %fneg = fneg float %max1127  ret float %fneg1128}1129 1130define float @v_fneg_maxnum_f32_no_ieee(float %a, float %b) #4 {1131; GCN-LABEL: v_fneg_maxnum_f32_no_ieee:1132; GCN:       ; %bb.0:1133; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1134; GCN-NEXT:    v_min_f32_e64 v0, -v0, -v11135; GCN-NEXT:    s_setpc_b64 s[30:31]1136  %max = call float @llvm.maxnum.f32(float %a, float %b)1137  %fneg = fneg float %max1138  ret float %fneg1139}1140 1141define float @v_fneg_self_maxnum_f32_ieee(float %a) #0 {1142; GCN-LABEL: v_fneg_self_maxnum_f32_ieee:1143; GCN:       ; %bb.0:1144; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1145; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01146; GCN-NEXT:    s_setpc_b64 s[30:31]1147  %max = call float @llvm.maxnum.f32(float %a, float %a)1148  %max.fneg = fneg float %max1149  ret float %max.fneg1150}1151 1152define float @v_fneg_self_maxnum_f32_no_ieee(float %a) #4 {1153; GCN-LABEL: v_fneg_self_maxnum_f32_no_ieee:1154; GCN:       ; %bb.0:1155; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1156; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01157; GCN-NEXT:    s_setpc_b64 s[30:31]1158  %max = call float @llvm.maxnum.f32(float %a, float %a)1159  %max.fneg = fneg float %max1160  ret float %max.fneg1161}1162 1163define float @v_fneg_posk_maxnum_f32_ieee(float %a) #0 {1164; GCN-LABEL: v_fneg_posk_maxnum_f32_ieee:1165; GCN:       ; %bb.0:1166; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1167; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01168; GCN-NEXT:    v_min_f32_e32 v0, -4.0, v01169; GCN-NEXT:    s_setpc_b64 s[30:31]1170  %max = call float @llvm.maxnum.f32(float 4.0, float %a)1171  %fneg = fneg float %max1172  ret float %fneg1173}1174 1175define float @v_fneg_posk_maxnum_f32_no_ieee(float %a) #4 {1176; GCN-LABEL: v_fneg_posk_maxnum_f32_no_ieee:1177; GCN:       ; %bb.0:1178; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1179; GCN-NEXT:    v_min_f32_e64 v0, -v0, -4.01180; GCN-NEXT:    s_setpc_b64 s[30:31]1181  %max = call float @llvm.maxnum.f32(float 4.0, float %a)1182  %fneg = fneg float %max1183  ret float %fneg1184}1185 1186define float @v_fneg_negk_maxnum_f32_ieee(float %a) #0 {1187; GCN-LABEL: v_fneg_negk_maxnum_f32_ieee:1188; GCN:       ; %bb.0:1189; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1190; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01191; GCN-NEXT:    v_min_f32_e32 v0, 4.0, v01192; GCN-NEXT:    s_setpc_b64 s[30:31]1193  %max = call float @llvm.maxnum.f32(float -4.0, float %a)1194  %fneg = fneg float %max1195  ret float %fneg1196}1197 1198define float @v_fneg_negk_maxnum_f32_no_ieee(float %a) #4 {1199; GCN-LABEL: v_fneg_negk_maxnum_f32_no_ieee:1200; GCN:       ; %bb.0:1201; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1202; GCN-NEXT:    v_min_f32_e64 v0, -v0, 4.01203; GCN-NEXT:    s_setpc_b64 s[30:31]1204  %max = call float @llvm.maxnum.f32(float -4.0, float %a)1205  %fneg = fneg float %max1206  ret float %fneg1207}1208 1209define float @v_fneg_0_maxnum_f32(float %a) #0 {1210; GCN-LABEL: v_fneg_0_maxnum_f32:1211; GCN:       ; %bb.0:1212; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1213; GCN-NEXT:    v_max_f32_e32 v0, 0, v01214; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01215; GCN-NEXT:    s_setpc_b64 s[30:31]1216  %max = call nnan float @llvm.maxnum.f32(float 0.0, float %a)1217  %fneg = fneg float %max1218  ret float %fneg1219}1220 1221define float @v_fneg_neg0_maxnum_f32_ieee(float %a) #0 {1222; GCN-LABEL: v_fneg_neg0_maxnum_f32_ieee:1223; GCN:       ; %bb.0:1224; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1225; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01226; GCN-NEXT:    v_min_f32_e32 v0, 0, v01227; GCN-NEXT:    s_setpc_b64 s[30:31]1228  %max = call float @llvm.maxnum.f32(float -0.0, float %a)1229  %fneg = fneg float %max1230  ret float %fneg1231}1232 1233define float @v_fneg_neg0_maxnum_f32_no_ieee(float %a) #4 {1234; GCN-LABEL: v_fneg_neg0_maxnum_f32_no_ieee:1235; GCN:       ; %bb.0:1236; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1237; GCN-NEXT:    v_min_f32_e64 v0, -v0, 01238; GCN-NEXT:    s_setpc_b64 s[30:31]1239  %max = call float @llvm.maxnum.f32(float -0.0, float %a)1240  %fneg = fneg float %max1241  ret float %fneg1242}1243 1244define float @v_fneg_0_maxnum_foldable_use_f32_ieee(float %a, float %b) #0 {1245; GCN-LABEL: v_fneg_0_maxnum_foldable_use_f32_ieee:1246; GCN:       ; %bb.0:1247; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1248; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v01249; GCN-NEXT:    v_max_f32_e32 v0, 0, v01250; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11251; GCN-NEXT:    s_setpc_b64 s[30:31]1252  %max = call float @llvm.maxnum.f32(float 0.0, float %a)1253  %fneg = fneg float %max1254  %mul = fmul float %fneg, %b1255  ret float %mul1256}1257 1258define float @v_fneg_0_maxnum_foldable_use_f32_no_ieee(float %a, float %b) #4 {1259; GCN-LABEL: v_fneg_0_maxnum_foldable_use_f32_no_ieee:1260; GCN:       ; %bb.0:1261; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1262; GCN-NEXT:    v_max_f32_e32 v0, 0, v01263; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11264; GCN-NEXT:    s_setpc_b64 s[30:31]1265  %max = call float @llvm.maxnum.f32(float 0.0, float %a)1266  %fneg = fneg float %max1267  %mul = fmul float %fneg, %b1268  ret float %mul1269}1270 1271define { float, float } @v_fneg_maxnum_multi_use_maxnum_f32_ieee(float %a, float %b) #0 {1272; GCN-LABEL: v_fneg_maxnum_multi_use_maxnum_f32_ieee:1273; GCN:       ; %bb.0:1274; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1275; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v11276; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01277; GCN-NEXT:    v_min_f32_e32 v0, v0, v11278; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01279; GCN-NEXT:    s_setpc_b64 s[30:31]1280  %max = call float @llvm.maxnum.f32(float %a, float %b)1281  %fneg = fneg float %max1282  %use1 = fmul float %max, 4.01283  %insert.0 = insertvalue { float, float } poison, float %fneg, 01284  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 11285  ret { float, float } %insert.11286}1287 1288define <2 x float> @v_fneg_maxnum_multi_use_maxnum_f32_no_ieee(float %a, float %b) #4 {1289; GCN-LABEL: v_fneg_maxnum_multi_use_maxnum_f32_no_ieee:1290; GCN:       ; %bb.0:1291; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1292; GCN-NEXT:    v_min_f32_e64 v0, -v0, -v11293; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01294; GCN-NEXT:    s_setpc_b64 s[30:31]1295  %max = call float @llvm.maxnum.f32(float %a, float %b)1296  %fneg = fneg float %max1297  %use1 = fmul float %max, 4.01298  %ins0 = insertelement <2 x float> poison, float %fneg, i32 01299  %ins1 = insertelement <2 x float> %ins0, float %use1, i32 11300  ret <2 x float> %ins11301}1302 1303; --------------------------------------------------------------------------------1304; fminimum tests1305; --------------------------------------------------------------------------------1306 1307define float @v_fneg_minimum_f32_ieee(float %a, float %b) #0 {1308; GCN-LABEL: v_fneg_minimum_f32_ieee:1309; GCN:       ; %bb.0:1310; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1311; GCN-NEXT:    v_max_f32_e64 v2, -v0, -v11312; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001313; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11314; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1315; GCN-NEXT:    s_setpc_b64 s[30:31]1316  %min = call float @llvm.minimum.f32(float %a, float %b)1317  %fneg = fneg float %min1318  ret float %fneg1319}1320 1321define float @v_fneg_minimum_f32_no_ieee(float %a, float %b) #4 {1322; GCN-LABEL: v_fneg_minimum_f32_no_ieee:1323; GCN:       ; %bb.0:1324; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1325; GCN-NEXT:    v_max_f32_e64 v2, -v0, -v11326; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001327; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11328; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1329; GCN-NEXT:    s_setpc_b64 s[30:31]1330  %min = call float @llvm.minimum.f32(float %a, float %b)1331  %fneg = fneg float %min1332  ret float %fneg1333}1334 1335define float @v_fneg_self_minimum_f32_ieee(float %a) #0 {1336; GCN-LABEL: v_fneg_self_minimum_f32_ieee:1337; GCN:       ; %bb.0:1338; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1339; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01340; GCN-NEXT:    s_setpc_b64 s[30:31]1341  %min = call float @llvm.minimum.f32(float %a, float %a)1342  %min.fneg = fneg float %min1343  ret float %min.fneg1344}1345 1346define float @v_fneg_self_minimum_f32_no_ieee(float %a) #4 {1347; GCN-LABEL: v_fneg_self_minimum_f32_no_ieee:1348; GCN:       ; %bb.0:1349; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1350; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01351; GCN-NEXT:    s_setpc_b64 s[30:31]1352  %min = call float @llvm.minimum.f32(float %a, float %a)1353  %min.fneg = fneg float %min1354  ret float %min.fneg1355}1356 1357define float @v_fneg_posk_minimum_f32_ieee(float %a) #0 {1358; GCN-LABEL: v_fneg_posk_minimum_f32_ieee:1359; GCN:       ; %bb.0:1360; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1361; GCN-NEXT:    v_max_f32_e64 v1, -v0, -4.01362; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001363; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01364; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1365; GCN-NEXT:    s_setpc_b64 s[30:31]1366  %min = call float @llvm.minimum.f32(float 4.0, float %a)1367  %fneg = fneg float %min1368  ret float %fneg1369}1370 1371define float @v_fneg_posk_minimum_f32_no_ieee(float %a) #4 {1372; GCN-LABEL: v_fneg_posk_minimum_f32_no_ieee:1373; GCN:       ; %bb.0:1374; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1375; GCN-NEXT:    v_max_f32_e64 v1, -v0, -4.01376; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001377; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01378; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1379; GCN-NEXT:    s_setpc_b64 s[30:31]1380  %min = call float @llvm.minimum.f32(float 4.0, float %a)1381  %fneg = fneg float %min1382  ret float %fneg1383}1384 1385define float @v_fneg_negk_minimum_f32_ieee(float %a) #0 {1386; GCN-LABEL: v_fneg_negk_minimum_f32_ieee:1387; GCN:       ; %bb.0:1388; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1389; GCN-NEXT:    v_max_f32_e64 v1, -v0, 4.01390; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001391; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01392; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1393; GCN-NEXT:    s_setpc_b64 s[30:31]1394  %min = call float @llvm.minimum.f32(float -4.0, float %a)1395  %fneg = fneg float %min1396  ret float %fneg1397}1398 1399define float @v_fneg_negk_minimum_f32_no_ieee(float %a) #4 {1400; GCN-LABEL: v_fneg_negk_minimum_f32_no_ieee:1401; GCN:       ; %bb.0:1402; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1403; GCN-NEXT:    v_max_f32_e64 v1, -v0, 4.01404; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001405; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01406; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1407; GCN-NEXT:    s_setpc_b64 s[30:31]1408  %min = call float @llvm.minimum.f32(float -4.0, float %a)1409  %fneg = fneg float %min1410  ret float %fneg1411}1412 1413define float @v_fneg_0_minimum_f32(float %a) #0 {1414; GCN-LABEL: v_fneg_0_minimum_f32:1415; GCN:       ; %bb.0:1416; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1417; GCN-NEXT:    v_min_f32_e32 v0, 0, v01418; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01419; GCN-NEXT:    s_setpc_b64 s[30:31]1420  %min = call nnan float @llvm.minimum.f32(float 0.0, float %a)1421  %fneg = fneg float %min1422  ret float %fneg1423}1424 1425define float @v_fneg_neg0_minimum_f32_ieee(float %a) #0 {1426; GCN-LABEL: v_fneg_neg0_minimum_f32_ieee:1427; GCN:       ; %bb.0:1428; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1429; GCN-NEXT:    v_max_f32_e64 v1, -v0, 01430; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001431; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01432; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1433; GCN-NEXT:    s_setpc_b64 s[30:31]1434  %min = call float @llvm.minimum.f32(float -0.0, float %a)1435  %fneg = fneg float %min1436  ret float %fneg1437}1438 1439define float @v_fneg_inv2pi_minimum_f32(float %a) #0 {1440; SI-LABEL: v_fneg_inv2pi_minimum_f32:1441; SI:       ; %bb.0:1442; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1443; SI-NEXT:    s_mov_b32 s4, 0xbe22f9831444; SI-NEXT:    v_max_f32_e64 v1, -v0, s41445; SI-NEXT:    v_mov_b32_e32 v2, 0x7fc000001446; SI-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01447; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1448; SI-NEXT:    s_setpc_b64 s[30:31]1449;1450; VI-LABEL: v_fneg_inv2pi_minimum_f32:1451; VI:       ; %bb.0:1452; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1453; VI-NEXT:    v_min_f32_e32 v1, 0.15915494, v01454; VI-NEXT:    v_mov_b32_e32 v2, 0x7fc000001455; VI-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01456; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1457; VI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01458; VI-NEXT:    s_setpc_b64 s[30:31]1459  %min = call float @llvm.minimum.f32(float 0x3FC45F3060000000, float %a)1460  %fneg = fneg float %min1461  ret float %fneg1462}1463 1464define float @v_fneg_neg_inv2pi_minimum_f32(float %a) #0 {1465; SI-LABEL: v_fneg_neg_inv2pi_minimum_f32:1466; SI:       ; %bb.0:1467; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1468; SI-NEXT:    s_mov_b32 s4, 0x3e22f9831469; SI-NEXT:    v_max_f32_e64 v1, -v0, s41470; SI-NEXT:    v_mov_b32_e32 v2, 0x7fc000001471; SI-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01472; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1473; SI-NEXT:    s_setpc_b64 s[30:31]1474;1475; VI-LABEL: v_fneg_neg_inv2pi_minimum_f32:1476; VI:       ; %bb.0:1477; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1478; VI-NEXT:    v_max_f32_e64 v1, -v0, 0.159154941479; VI-NEXT:    v_mov_b32_e32 v2, 0x7fc000001480; VI-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01481; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1482; VI-NEXT:    s_setpc_b64 s[30:31]1483  %min = call float @llvm.minimum.f32(float 0xBFC45F3060000000, float %a)1484  %fneg = fneg float %min1485  ret float %fneg1486}1487 1488define half @v_fneg_inv2pi_minimum_f16(half %a) #0 {1489; SI-LABEL: v_fneg_inv2pi_minimum_f16:1490; SI:       ; %bb.0:1491; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1492; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v01493; SI-NEXT:    v_mov_b32_e32 v1, 0x7fc000001494; SI-NEXT:    v_cvt_f32_f16_e32 v0, v01495; SI-NEXT:    v_max_f32_e32 v2, 0xbe230000, v01496; SI-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01497; SI-NEXT:    v_cndmask_b32_e32 v0, v1, v2, vcc1498; SI-NEXT:    s_setpc_b64 s[30:31]1499;1500; VI-LABEL: v_fneg_inv2pi_minimum_f16:1501; VI:       ; %bb.0:1502; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1503; VI-NEXT:    v_min_f16_e32 v1, 0.15915494, v01504; VI-NEXT:    v_mov_b32_e32 v2, 0x7e001505; VI-NEXT:    v_cmp_o_f16_e32 vcc, v0, v01506; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1507; VI-NEXT:    v_xor_b32_e32 v0, 0x8000, v01508; VI-NEXT:    s_setpc_b64 s[30:31]1509  %min = call half @llvm.minimum.f16(half 0xH3118, half %a)1510  %fneg = fneg half %min1511  ret half %fneg1512}1513 1514define half @v_fneg_neg_inv2pi_minimum_f16(half %a) #0 {1515; SI-LABEL: v_fneg_neg_inv2pi_minimum_f16:1516; SI:       ; %bb.0:1517; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1518; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v01519; SI-NEXT:    v_mov_b32_e32 v1, 0x7fc000001520; SI-NEXT:    v_cvt_f32_f16_e32 v0, v01521; SI-NEXT:    v_max_f32_e32 v2, 0x3e230000, v01522; SI-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01523; SI-NEXT:    v_cndmask_b32_e32 v0, v1, v2, vcc1524; SI-NEXT:    s_setpc_b64 s[30:31]1525;1526; VI-LABEL: v_fneg_neg_inv2pi_minimum_f16:1527; VI:       ; %bb.0:1528; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1529; VI-NEXT:    v_max_f16_e64 v1, -v0, 0.159154941530; VI-NEXT:    v_mov_b32_e32 v2, 0x7e001531; VI-NEXT:    v_cmp_o_f16_e64 vcc, -v0, -v01532; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1533; VI-NEXT:    s_setpc_b64 s[30:31]1534  %min = call half @llvm.minimum.f16(half 0xHB118, half %a)1535  %fneg = fneg half %min1536  ret half %fneg1537}1538 1539define double @v_fneg_inv2pi_minimum_f64(double %a) #0 {1540; SI-LABEL: v_fneg_inv2pi_minimum_f64:1541; SI:       ; %bb.0:1542; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1543; SI-NEXT:    s_mov_b32 s4, 0x6dc9c8821544; SI-NEXT:    s_mov_b32 s5, 0xbfc45f301545; SI-NEXT:    v_max_f64 v[2:3], -v[0:1], s[4:5]1546; SI-NEXT:    v_cmp_u_f64_e64 vcc, -v[0:1], -v[0:1]1547; SI-NEXT:    v_mov_b32_e32 v1, 0x7ff800001548; SI-NEXT:    v_cndmask_b32_e64 v0, v2, 0, vcc1549; SI-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc1550; SI-NEXT:    s_setpc_b64 s[30:31]1551;1552; VI-LABEL: v_fneg_inv2pi_minimum_f64:1553; VI:       ; %bb.0:1554; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1555; VI-NEXT:    v_min_f64 v[2:3], v[0:1], 0.159154943091895321556; VI-NEXT:    v_cmp_u_f64_e32 vcc, v[0:1], v[0:1]1557; VI-NEXT:    v_mov_b32_e32 v1, 0xfff800001558; VI-NEXT:    v_cndmask_b32_e64 v0, v2, 0, vcc1559; VI-NEXT:    v_cndmask_b32_e64 v1, -v3, v1, vcc1560; VI-NEXT:    s_setpc_b64 s[30:31]1561  %min = call double @llvm.minimum.f64(double 0x3fc45f306dc9c882, double %a)1562  %fneg = fneg double %min1563  ret double %fneg1564}1565 1566define double @v_fneg_neg_inv2pi_minimum_f64(double %a) #0 {1567; SI-LABEL: v_fneg_neg_inv2pi_minimum_f64:1568; SI:       ; %bb.0:1569; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1570; SI-NEXT:    s_mov_b32 s4, 0x6dc9c8821571; SI-NEXT:    s_mov_b32 s5, 0x3fc45f301572; SI-NEXT:    v_max_f64 v[2:3], -v[0:1], s[4:5]1573; SI-NEXT:    v_cmp_u_f64_e64 vcc, -v[0:1], -v[0:1]1574; SI-NEXT:    v_mov_b32_e32 v1, 0x7ff800001575; SI-NEXT:    v_cndmask_b32_e64 v0, v2, 0, vcc1576; SI-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc1577; SI-NEXT:    s_setpc_b64 s[30:31]1578;1579; VI-LABEL: v_fneg_neg_inv2pi_minimum_f64:1580; VI:       ; %bb.0:1581; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1582; VI-NEXT:    v_max_f64 v[2:3], -v[0:1], 0.159154943091895321583; VI-NEXT:    v_cmp_u_f64_e64 vcc, -v[0:1], -v[0:1]1584; VI-NEXT:    v_mov_b32_e32 v1, 0x7ff800001585; VI-NEXT:    v_cndmask_b32_e64 v0, v2, 0, vcc1586; VI-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc1587; VI-NEXT:    s_setpc_b64 s[30:31]1588  %min = call double @llvm.minimum.f64(double 0xbfc45f306dc9c882, double %a)1589  %fneg = fneg double %min1590  ret double %fneg1591}1592 1593define float @v_fneg_neg0_minimum_f32_no_ieee(float %a) #4 {1594; GCN-LABEL: v_fneg_neg0_minimum_f32_no_ieee:1595; GCN:       ; %bb.0:1596; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1597; GCN-NEXT:    v_max_f32_e64 v1, -v0, 01598; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001599; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01600; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1601; GCN-NEXT:    s_setpc_b64 s[30:31]1602  %min = call float @llvm.minimum.f32(float -0.0, float %a)1603  %fneg = fneg float %min1604  ret float %fneg1605}1606 1607define float @v_fneg_0_minimum_foldable_use_f32_ieee(float %a, float %b) #0 {1608; GCN-LABEL: v_fneg_0_minimum_foldable_use_f32_ieee:1609; GCN:       ; %bb.0:1610; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1611; GCN-NEXT:    v_min_f32_e32 v2, 0, v01612; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001613; GCN-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01614; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1615; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11616; GCN-NEXT:    s_setpc_b64 s[30:31]1617  %min = call float @llvm.minimum.f32(float 0.0, float %a)1618  %fneg = fneg float %min1619  %mul = fmul float %fneg, %b1620  ret float %mul1621}1622 1623define float @v_fneg_inv2pi_minimum_foldable_use_f32(float %a, float %b) #0 {1624; SI-LABEL: v_fneg_inv2pi_minimum_foldable_use_f32:1625; SI:       ; %bb.0:1626; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1627; SI-NEXT:    s_mov_b32 s4, 0xbe22f9831628; SI-NEXT:    v_max_f32_e64 v2, -v0, s41629; SI-NEXT:    v_mov_b32_e32 v3, 0x7fc000001630; SI-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01631; SI-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1632; SI-NEXT:    v_mul_f32_e32 v0, v0, v11633; SI-NEXT:    s_setpc_b64 s[30:31]1634;1635; VI-LABEL: v_fneg_inv2pi_minimum_foldable_use_f32:1636; VI:       ; %bb.0:1637; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1638; VI-NEXT:    v_min_f32_e32 v2, 0.15915494, v01639; VI-NEXT:    v_mov_b32_e32 v3, 0x7fc000001640; VI-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01641; VI-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1642; VI-NEXT:    v_mul_f32_e64 v0, -v0, v11643; VI-NEXT:    s_setpc_b64 s[30:31]1644  %min = call float @llvm.minimum.f32(float 0x3FC45F3060000000, float %a)1645  %fneg = fneg float %min1646  %mul = fmul float %fneg, %b1647  ret float %mul1648}1649 1650define float @v_fneg_0_minimum_foldable_use_f32_no_ieee(float %a, float %b) #4 {1651; GCN-LABEL: v_fneg_0_minimum_foldable_use_f32_no_ieee:1652; GCN:       ; %bb.0:1653; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1654; GCN-NEXT:    v_min_f32_e32 v2, 0, v01655; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001656; GCN-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01657; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1658; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11659; GCN-NEXT:    s_setpc_b64 s[30:31]1660  %min = call float @llvm.minimum.f32(float 0.0, float %a)1661  %fneg = fneg float %min1662  %mul = fmul float %fneg, %b1663  ret float %mul1664}1665 1666define { float, float } @v_fneg_minimum_multi_use_minimum_f32_ieee(float %a, float %b) #0 {1667; GCN-LABEL: v_fneg_minimum_multi_use_minimum_f32_ieee:1668; GCN:       ; %bb.0:1669; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1670; GCN-NEXT:    v_max_f32_e64 v2, -v0, -v11671; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001672; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11673; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1674; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01675; GCN-NEXT:    s_setpc_b64 s[30:31]1676  %min = call float @llvm.minimum.f32(float %a, float %b)1677  %fneg = fneg float %min1678  %use1 = fmul float %min, 4.01679  %insert.0 = insertvalue { float, float } poison, float %fneg, 01680  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 11681  ret { float, float } %insert.11682}1683 1684define <2 x float> @v_fneg_minimum_multi_use_minimum_f32_no_ieee(float %a, float %b) #4 {1685; GCN-LABEL: v_fneg_minimum_multi_use_minimum_f32_no_ieee:1686; GCN:       ; %bb.0:1687; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1688; GCN-NEXT:    v_max_f32_e64 v2, -v0, -v11689; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001690; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11691; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1692; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01693; GCN-NEXT:    s_setpc_b64 s[30:31]1694  %min = call float @llvm.minimum.f32(float %a, float %b)1695  %fneg = fneg float %min1696  %use1 = fmul float %min, 4.01697  %ins0 = insertelement <2 x float> poison, float %fneg, i32 01698  %ins1 = insertelement <2 x float> %ins0, float %use1, i32 11699  ret <2 x float> %ins11700}1701 1702; --------------------------------------------------------------------------------1703; fmaximum tests1704; --------------------------------------------------------------------------------1705 1706define float @v_fneg_maximum_f32_ieee(float %a, float %b) #0 {1707; GCN-LABEL: v_fneg_maximum_f32_ieee:1708; GCN:       ; %bb.0:1709; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1710; GCN-NEXT:    v_min_f32_e64 v2, -v0, -v11711; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001712; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11713; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1714; GCN-NEXT:    s_setpc_b64 s[30:31]1715  %max = call float @llvm.maximum.f32(float %a, float %b)1716  %fneg = fneg float %max1717  ret float %fneg1718}1719 1720define float @v_fneg_maximum_f32_no_ieee(float %a, float %b) #4 {1721; GCN-LABEL: v_fneg_maximum_f32_no_ieee:1722; GCN:       ; %bb.0:1723; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1724; GCN-NEXT:    v_min_f32_e64 v2, -v0, -v11725; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001726; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11727; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1728; GCN-NEXT:    s_setpc_b64 s[30:31]1729  %max = call float @llvm.maximum.f32(float %a, float %b)1730  %fneg = fneg float %max1731  ret float %fneg1732}1733 1734define float @v_fneg_self_maximum_f32_ieee(float %a) #0 {1735; GCN-LABEL: v_fneg_self_maximum_f32_ieee:1736; GCN:       ; %bb.0:1737; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1738; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01739; GCN-NEXT:    s_setpc_b64 s[30:31]1740  %max = call float @llvm.maximum.f32(float %a, float %a)1741  %max.fneg = fneg float %max1742  ret float %max.fneg1743}1744 1745define float @v_fneg_self_maximum_f32_no_ieee(float %a) #4 {1746; GCN-LABEL: v_fneg_self_maximum_f32_no_ieee:1747; GCN:       ; %bb.0:1748; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1749; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01750; GCN-NEXT:    s_setpc_b64 s[30:31]1751  %max = call float @llvm.maximum.f32(float %a, float %a)1752  %max.fneg = fneg float %max1753  ret float %max.fneg1754}1755 1756define float @v_fneg_posk_maximum_f32_ieee(float %a) #0 {1757; GCN-LABEL: v_fneg_posk_maximum_f32_ieee:1758; GCN:       ; %bb.0:1759; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1760; GCN-NEXT:    v_min_f32_e64 v1, -v0, -4.01761; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001762; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01763; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1764; GCN-NEXT:    s_setpc_b64 s[30:31]1765  %max = call float @llvm.maximum.f32(float 4.0, float %a)1766  %fneg = fneg float %max1767  ret float %fneg1768}1769 1770define float @v_fneg_posk_maximum_f32_no_ieee(float %a) #4 {1771; GCN-LABEL: v_fneg_posk_maximum_f32_no_ieee:1772; GCN:       ; %bb.0:1773; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1774; GCN-NEXT:    v_min_f32_e64 v1, -v0, -4.01775; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001776; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01777; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1778; GCN-NEXT:    s_setpc_b64 s[30:31]1779  %max = call float @llvm.maximum.f32(float 4.0, float %a)1780  %fneg = fneg float %max1781  ret float %fneg1782}1783 1784define float @v_fneg_negk_maximum_f32_ieee(float %a) #0 {1785; GCN-LABEL: v_fneg_negk_maximum_f32_ieee:1786; GCN:       ; %bb.0:1787; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1788; GCN-NEXT:    v_min_f32_e64 v1, -v0, 4.01789; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001790; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01791; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1792; GCN-NEXT:    s_setpc_b64 s[30:31]1793  %max = call float @llvm.maximum.f32(float -4.0, float %a)1794  %fneg = fneg float %max1795  ret float %fneg1796}1797 1798define float @v_fneg_negk_maximum_f32_no_ieee(float %a) #4 {1799; GCN-LABEL: v_fneg_negk_maximum_f32_no_ieee:1800; GCN:       ; %bb.0:1801; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1802; GCN-NEXT:    v_min_f32_e64 v1, -v0, 4.01803; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001804; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01805; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1806; GCN-NEXT:    s_setpc_b64 s[30:31]1807  %max = call float @llvm.maximum.f32(float -4.0, float %a)1808  %fneg = fneg float %max1809  ret float %fneg1810}1811 1812define float @v_fneg_0_maximum_f32(float %a) #0 {1813; GCN-LABEL: v_fneg_0_maximum_f32:1814; GCN:       ; %bb.0:1815; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1816; GCN-NEXT:    v_max_f32_e32 v0, 0, v01817; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01818; GCN-NEXT:    s_setpc_b64 s[30:31]1819  %max = call nnan float @llvm.maximum.f32(float 0.0, float %a)1820  %fneg = fneg float %max1821  ret float %fneg1822}1823 1824define float @v_fneg_neg0_maximum_f32_ieee(float %a) #0 {1825; GCN-LABEL: v_fneg_neg0_maximum_f32_ieee:1826; GCN:       ; %bb.0:1827; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1828; GCN-NEXT:    v_min_f32_e64 v1, -v0, 01829; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001830; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01831; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1832; GCN-NEXT:    s_setpc_b64 s[30:31]1833  %max = call float @llvm.maximum.f32(float -0.0, float %a)1834  %fneg = fneg float %max1835  ret float %fneg1836}1837 1838define float @v_fneg_neg0_maximum_f32_no_ieee(float %a) #4 {1839; GCN-LABEL: v_fneg_neg0_maximum_f32_no_ieee:1840; GCN:       ; %bb.0:1841; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1842; GCN-NEXT:    v_min_f32_e64 v1, -v0, 01843; GCN-NEXT:    v_mov_b32_e32 v2, 0x7fc000001844; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v01845; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc1846; GCN-NEXT:    s_setpc_b64 s[30:31]1847  %max = call float @llvm.maximum.f32(float -0.0, float %a)1848  %fneg = fneg float %max1849  ret float %fneg1850}1851 1852define float @v_fneg_0_maximum_foldable_use_f32_ieee(float %a, float %b) #0 {1853; GCN-LABEL: v_fneg_0_maximum_foldable_use_f32_ieee:1854; GCN:       ; %bb.0:1855; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1856; GCN-NEXT:    v_max_f32_e32 v2, 0, v01857; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001858; GCN-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01859; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1860; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11861; GCN-NEXT:    s_setpc_b64 s[30:31]1862  %max = call float @llvm.maximum.f32(float 0.0, float %a)1863  %fneg = fneg float %max1864  %mul = fmul float %fneg, %b1865  ret float %mul1866}1867 1868define float @v_fneg_0_maximum_foldable_use_f32_no_ieee(float %a, float %b) #4 {1869; GCN-LABEL: v_fneg_0_maximum_foldable_use_f32_no_ieee:1870; GCN:       ; %bb.0:1871; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1872; GCN-NEXT:    v_max_f32_e32 v2, 0, v01873; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001874; GCN-NEXT:    v_cmp_o_f32_e32 vcc, v0, v01875; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1876; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v11877; GCN-NEXT:    s_setpc_b64 s[30:31]1878  %max = call float @llvm.maximum.f32(float 0.0, float %a)1879  %fneg = fneg float %max1880  %mul = fmul float %fneg, %b1881  ret float %mul1882}1883 1884define { float, float } @v_fneg_maximum_multi_use_maximum_f32_ieee(float %a, float %b) #0 {1885; GCN-LABEL: v_fneg_maximum_multi_use_maximum_f32_ieee:1886; GCN:       ; %bb.0:1887; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1888; GCN-NEXT:    v_min_f32_e64 v2, -v0, -v11889; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001890; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11891; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1892; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01893; GCN-NEXT:    s_setpc_b64 s[30:31]1894  %max = call float @llvm.maximum.f32(float %a, float %b)1895  %fneg = fneg float %max1896  %use1 = fmul float %max, 4.01897  %insert.0 = insertvalue { float, float } poison, float %fneg, 01898  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 11899  ret { float, float } %insert.11900}1901 1902define <2 x float> @v_fneg_maximum_multi_use_maximum_f32_no_ieee(float %a, float %b) #4 {1903; GCN-LABEL: v_fneg_maximum_multi_use_maximum_f32_no_ieee:1904; GCN:       ; %bb.0:1905; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1906; GCN-NEXT:    v_min_f32_e64 v2, -v0, -v11907; GCN-NEXT:    v_mov_b32_e32 v3, 0x7fc000001908; GCN-NEXT:    v_cmp_o_f32_e64 vcc, -v0, -v11909; GCN-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc1910; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v01911; GCN-NEXT:    s_setpc_b64 s[30:31]1912  %max = call float @llvm.maximum.f32(float %a, float %b)1913  %fneg = fneg float %max1914  %use1 = fmul float %max, 4.01915  %ins0 = insertelement <2 x float> poison, float %fneg, i32 01916  %ins1 = insertelement <2 x float> %ins0, float %use1, i32 11917  ret <2 x float> %ins11918}1919 1920; --------------------------------------------------------------------------------1921; fminimumnum tests1922; --------------------------------------------------------------------------------1923 1924define float @v_fneg_minimumnum_f32_ieee(float %a, float %b) #0 {1925; GCN-LABEL: v_fneg_minimumnum_f32_ieee:1926; GCN:       ; %bb.0:1927; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1928; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v11929; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01930; GCN-NEXT:    v_max_f32_e32 v0, v0, v11931; GCN-NEXT:    s_setpc_b64 s[30:31]1932  %min = call float @llvm.minimumnum.f32(float %a, float %b)1933  %fneg = fneg float %min1934  ret float %fneg1935}1936 1937define float @v_fneg_minimumnum_f32_no_ieee(float %a, float %b) #4 {1938; GCN-LABEL: v_fneg_minimumnum_f32_no_ieee:1939; GCN:       ; %bb.0:1940; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1941; GCN-NEXT:    v_max_f32_e64 v0, -v0, -v11942; GCN-NEXT:    s_setpc_b64 s[30:31]1943  %min = call float @llvm.minimumnum.f32(float %a, float %b)1944  %fneg = fneg float %min1945  ret float %fneg1946}1947 1948define float @v_fneg_self_minimumnum_f32_ieee(float %a) #0 {1949; GCN-LABEL: v_fneg_self_minimumnum_f32_ieee:1950; GCN:       ; %bb.0:1951; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1952; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01953; GCN-NEXT:    s_setpc_b64 s[30:31]1954  %min = call float @llvm.minimumnum.f32(float %a, float %a)1955  %min.fneg = fneg float %min1956  ret float %min.fneg1957}1958 1959define float @v_fneg_self_minimumnum_f32_no_ieee(float %a) #4 {1960; GCN-LABEL: v_fneg_self_minimumnum_f32_no_ieee:1961; GCN:       ; %bb.0:1962; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1963; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v01964; GCN-NEXT:    s_setpc_b64 s[30:31]1965  %min = call float @llvm.minimumnum.f32(float %a, float %a)1966  %min.fneg = fneg float %min1967  ret float %min.fneg1968}1969 1970define float @v_fneg_posk_minimumnum_f32_ieee(float %a) #0 {1971; GCN-LABEL: v_fneg_posk_minimumnum_f32_ieee:1972; GCN:       ; %bb.0:1973; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1974; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01975; GCN-NEXT:    v_max_f32_e32 v0, -4.0, v01976; GCN-NEXT:    s_setpc_b64 s[30:31]1977  %min = call float @llvm.minimumnum.f32(float 4.0, float %a)1978  %fneg = fneg float %min1979  ret float %fneg1980}1981 1982define float @v_fneg_posk_minimumnum_f32_no_ieee(float %a) #4 {1983; GCN-LABEL: v_fneg_posk_minimumnum_f32_no_ieee:1984; GCN:       ; %bb.0:1985; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1986; GCN-NEXT:    v_max_f32_e64 v0, -v0, -4.01987; GCN-NEXT:    s_setpc_b64 s[30:31]1988  %min = call float @llvm.minimumnum.f32(float 4.0, float %a)1989  %fneg = fneg float %min1990  ret float %fneg1991}1992 1993define float @v_fneg_negk_minimumnum_f32_ieee(float %a) #0 {1994; GCN-LABEL: v_fneg_negk_minimumnum_f32_ieee:1995; GCN:       ; %bb.0:1996; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1997; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v01998; GCN-NEXT:    v_max_f32_e32 v0, 4.0, v01999; GCN-NEXT:    s_setpc_b64 s[30:31]2000  %min = call float @llvm.minimumnum.f32(float -4.0, float %a)2001  %fneg = fneg float %min2002  ret float %fneg2003}2004 2005define float @v_fneg_negk_minimumnum_f32_no_ieee(float %a) #4 {2006; GCN-LABEL: v_fneg_negk_minimumnum_f32_no_ieee:2007; GCN:       ; %bb.0:2008; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2009; GCN-NEXT:    v_max_f32_e64 v0, -v0, 4.02010; GCN-NEXT:    s_setpc_b64 s[30:31]2011  %min = call float @llvm.minimumnum.f32(float -4.0, float %a)2012  %fneg = fneg float %min2013  ret float %fneg2014}2015 2016define float @v_fneg_0_minimumnum_f32(float %a) #0 {2017; GCN-LABEL: v_fneg_0_minimumnum_f32:2018; GCN:       ; %bb.0:2019; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2020; GCN-NEXT:    v_min_f32_e32 v0, 0, v02021; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02022; GCN-NEXT:    s_setpc_b64 s[30:31]2023  %min = call nnan float @llvm.minimumnum.f32(float 0.0, float %a)2024  %fneg = fneg float %min2025  ret float %fneg2026}2027 2028define float @v_fneg_neg0_minimumnum_f32_ieee(float %a) #0 {2029; GCN-LABEL: v_fneg_neg0_minimumnum_f32_ieee:2030; GCN:       ; %bb.0:2031; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2032; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02033; GCN-NEXT:    v_max_f32_e32 v0, 0, v02034; GCN-NEXT:    s_setpc_b64 s[30:31]2035  %min = call float @llvm.minimumnum.f32(float -0.0, float %a)2036  %fneg = fneg float %min2037  ret float %fneg2038}2039 2040define float @v_fneg_inv2pi_minimumnum_f32(float %a) #0 {2041; SI-LABEL: v_fneg_inv2pi_minimumnum_f32:2042; SI:       ; %bb.0:2043; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2044; SI-NEXT:    v_mul_f32_e32 v0, -1.0, v02045; SI-NEXT:    v_max_f32_e32 v0, 0xbe22f983, v02046; SI-NEXT:    s_setpc_b64 s[30:31]2047;2048; VI-LABEL: v_fneg_inv2pi_minimumnum_f32:2049; VI:       ; %bb.0:2050; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2051; VI-NEXT:    v_mul_f32_e32 v0, 1.0, v02052; VI-NEXT:    v_min_f32_e32 v0, 0.15915494, v02053; VI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02054; VI-NEXT:    s_setpc_b64 s[30:31]2055  %min = call float @llvm.minimumnum.f32(float 0x3FC45F3060000000, float %a)2056  %fneg = fneg float %min2057  ret float %fneg2058}2059 2060define float @v_fneg_neg_inv2pi_minimumnum_f32(float %a) #0 {2061; SI-LABEL: v_fneg_neg_inv2pi_minimumnum_f32:2062; SI:       ; %bb.0:2063; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2064; SI-NEXT:    v_mul_f32_e32 v0, -1.0, v02065; SI-NEXT:    v_max_f32_e32 v0, 0x3e22f983, v02066; SI-NEXT:    s_setpc_b64 s[30:31]2067;2068; VI-LABEL: v_fneg_neg_inv2pi_minimumnum_f32:2069; VI:       ; %bb.0:2070; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2071; VI-NEXT:    v_mul_f32_e32 v0, -1.0, v02072; VI-NEXT:    v_max_f32_e32 v0, 0.15915494, v02073; VI-NEXT:    s_setpc_b64 s[30:31]2074  %min = call float @llvm.minimumnum.f32(float 0xBFC45F3060000000, float %a)2075  %fneg = fneg float %min2076  ret float %fneg2077}2078 2079define half @v_fneg_inv2pi_minimumnum_f16(half %a) #0 {2080; SI-LABEL: v_fneg_inv2pi_minimumnum_f16:2081; SI:       ; %bb.0:2082; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2083; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v02084; SI-NEXT:    v_cvt_f32_f16_e32 v0, v02085; SI-NEXT:    v_max_f32_e32 v0, 0xbe230000, v02086; SI-NEXT:    s_setpc_b64 s[30:31]2087;2088; VI-LABEL: v_fneg_inv2pi_minimumnum_f16:2089; VI:       ; %bb.0:2090; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2091; VI-NEXT:    v_max_f16_e32 v0, v0, v02092; VI-NEXT:    v_min_f16_e32 v0, 0.15915494, v02093; VI-NEXT:    v_xor_b32_e32 v0, 0x8000, v02094; VI-NEXT:    s_setpc_b64 s[30:31]2095  %min = call half @llvm.minimumnum.f16(half 0xH3118, half %a)2096  %fneg = fneg half %min2097  ret half %fneg2098}2099 2100define half @v_fneg_neg_inv2pi_minimumnum_f16(half %a) #0 {2101; SI-LABEL: v_fneg_neg_inv2pi_minimumnum_f16:2102; SI:       ; %bb.0:2103; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2104; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v02105; SI-NEXT:    v_cvt_f32_f16_e32 v0, v02106; SI-NEXT:    v_max_f32_e32 v0, 0x3e230000, v02107; SI-NEXT:    s_setpc_b64 s[30:31]2108;2109; VI-LABEL: v_fneg_neg_inv2pi_minimumnum_f16:2110; VI:       ; %bb.0:2111; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2112; VI-NEXT:    v_max_f16_e64 v0, -v0, -v02113; VI-NEXT:    v_max_f16_e32 v0, 0.15915494, v02114; VI-NEXT:    s_setpc_b64 s[30:31]2115  %min = call half @llvm.minimumnum.f16(half 0xHB118, half %a)2116  %fneg = fneg half %min2117  ret half %fneg2118}2119 2120define double @v_fneg_inv2pi_minimumnum_f64(double %a) #0 {2121; SI-LABEL: v_fneg_inv2pi_minimumnum_f64:2122; SI:       ; %bb.0:2123; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2124; SI-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1]2125; SI-NEXT:    s_mov_b32 s4, 0x6dc9c8822126; SI-NEXT:    s_mov_b32 s5, 0xbfc45f302127; SI-NEXT:    v_max_f64 v[0:1], v[0:1], s[4:5]2128; SI-NEXT:    s_setpc_b64 s[30:31]2129;2130; VI-LABEL: v_fneg_inv2pi_minimumnum_f64:2131; VI:       ; %bb.0:2132; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2133; VI-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1]2134; VI-NEXT:    v_min_f64 v[0:1], v[0:1], 0.159154943091895322135; VI-NEXT:    v_xor_b32_e32 v1, 0x80000000, v12136; VI-NEXT:    s_setpc_b64 s[30:31]2137  %min = call double @llvm.minimumnum.f64(double 0x3fc45f306dc9c882, double %a)2138  %fneg = fneg double %min2139  ret double %fneg2140}2141 2142define double @v_fneg_neg_inv2pi_minimumnum_f64(double %a) #0 {2143; SI-LABEL: v_fneg_neg_inv2pi_minimumnum_f64:2144; SI:       ; %bb.0:2145; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2146; SI-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1]2147; SI-NEXT:    s_mov_b32 s4, 0x6dc9c8822148; SI-NEXT:    s_mov_b32 s5, 0x3fc45f302149; SI-NEXT:    v_max_f64 v[0:1], v[0:1], s[4:5]2150; SI-NEXT:    s_setpc_b64 s[30:31]2151;2152; VI-LABEL: v_fneg_neg_inv2pi_minimumnum_f64:2153; VI:       ; %bb.0:2154; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2155; VI-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1]2156; VI-NEXT:    v_max_f64 v[0:1], v[0:1], 0.159154943091895322157; VI-NEXT:    s_setpc_b64 s[30:31]2158  %min = call double @llvm.minimumnum.f64(double 0xbfc45f306dc9c882, double %a)2159  %fneg = fneg double %min2160  ret double %fneg2161}2162 2163define float @v_fneg_neg0_minimumnum_f32_no_ieee(float %a) #4 {2164; GCN-LABEL: v_fneg_neg0_minimumnum_f32_no_ieee:2165; GCN:       ; %bb.0:2166; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2167; GCN-NEXT:    v_max_f32_e64 v0, -v0, 02168; GCN-NEXT:    s_setpc_b64 s[30:31]2169  %min = call float @llvm.minimumnum.f32(float -0.0, float %a)2170  %fneg = fneg float %min2171  ret float %fneg2172}2173 2174define float @v_fneg_0_minimumnum_foldable_use_f32_ieee(float %a, float %b) #0 {2175; GCN-LABEL: v_fneg_0_minimumnum_foldable_use_f32_ieee:2176; GCN:       ; %bb.0:2177; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2178; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v02179; GCN-NEXT:    v_min_f32_e32 v0, 0, v02180; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v12181; GCN-NEXT:    s_setpc_b64 s[30:31]2182  %min = call float @llvm.minimumnum.f32(float 0.0, float %a)2183  %fneg = fneg float %min2184  %mul = fmul float %fneg, %b2185  ret float %mul2186}2187 2188define float @v_fneg_inv2pi_minimumnum_foldable_use_f32(float %a, float %b) #0 {2189; SI-LABEL: v_fneg_inv2pi_minimumnum_foldable_use_f32:2190; SI:       ; %bb.0:2191; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2192; SI-NEXT:    v_mul_f32_e32 v0, -1.0, v02193; SI-NEXT:    v_max_f32_e32 v0, 0xbe22f983, v02194; SI-NEXT:    v_mul_f32_e32 v0, v0, v12195; SI-NEXT:    s_setpc_b64 s[30:31]2196;2197; VI-LABEL: v_fneg_inv2pi_minimumnum_foldable_use_f32:2198; VI:       ; %bb.0:2199; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2200; VI-NEXT:    v_mul_f32_e32 v0, 1.0, v02201; VI-NEXT:    v_min_f32_e32 v0, 0.15915494, v02202; VI-NEXT:    v_mul_f32_e64 v0, -v0, v12203; VI-NEXT:    s_setpc_b64 s[30:31]2204  %min = call float @llvm.minimumnum.f32(float 0x3FC45F3060000000, float %a)2205  %fneg = fneg float %min2206  %mul = fmul float %fneg, %b2207  ret float %mul2208}2209 2210define float @v_fneg_0_minimumnum_foldable_use_f32_no_ieee(float %a, float %b) #4 {2211; GCN-LABEL: v_fneg_0_minimumnum_foldable_use_f32_no_ieee:2212; GCN:       ; %bb.0:2213; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2214; GCN-NEXT:    v_min_f32_e32 v0, 0, v02215; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v12216; GCN-NEXT:    s_setpc_b64 s[30:31]2217  %min = call float @llvm.minimumnum.f32(float 0.0, float %a)2218  %fneg = fneg float %min2219  %mul = fmul float %fneg, %b2220  ret float %mul2221}2222 2223define { float, float } @v_fneg_minimumnum_multi_use_minimumnum_f32_ieee(float %a, float %b) #0 {2224; GCN-LABEL: v_fneg_minimumnum_multi_use_minimumnum_f32_ieee:2225; GCN:       ; %bb.0:2226; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2227; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v12228; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02229; GCN-NEXT:    v_max_f32_e32 v0, v0, v12230; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v02231; GCN-NEXT:    s_setpc_b64 s[30:31]2232  %min = call float @llvm.minimumnum.f32(float %a, float %b)2233  %fneg = fneg float %min2234  %use1 = fmul float %min, 4.02235  %insert.0 = insertvalue { float, float } poison, float %fneg, 02236  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 12237  ret { float, float } %insert.12238}2239 2240define <2 x float> @v_fneg_minimumnum_multi_use_minimumnum_f32_no_ieee(float %a, float %b) #4 {2241; GCN-LABEL: v_fneg_minimumnum_multi_use_minimumnum_f32_no_ieee:2242; GCN:       ; %bb.0:2243; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2244; GCN-NEXT:    v_max_f32_e64 v0, -v0, -v12245; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v02246; GCN-NEXT:    s_setpc_b64 s[30:31]2247  %min = call float @llvm.minimumnum.f32(float %a, float %b)2248  %fneg = fneg float %min2249  %use1 = fmul float %min, 4.02250  %ins0 = insertelement <2 x float> poison, float %fneg, i32 02251  %ins1 = insertelement <2 x float> %ins0, float %use1, i32 12252  ret <2 x float> %ins12253}2254 2255; --------------------------------------------------------------------------------2256; fmaximumnum tests2257; --------------------------------------------------------------------------------2258 2259define float @v_fneg_maximumnum_f32_ieee(float %a, float %b) #0 {2260; GCN-LABEL: v_fneg_maximumnum_f32_ieee:2261; GCN:       ; %bb.0:2262; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2263; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v12264; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02265; GCN-NEXT:    v_min_f32_e32 v0, v0, v12266; GCN-NEXT:    s_setpc_b64 s[30:31]2267  %max = call float @llvm.maximumnum.f32(float %a, float %b)2268  %fneg = fneg float %max2269  ret float %fneg2270}2271 2272define float @v_fneg_maximumnum_f32_no_ieee(float %a, float %b) #4 {2273; GCN-LABEL: v_fneg_maximumnum_f32_no_ieee:2274; GCN:       ; %bb.0:2275; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2276; GCN-NEXT:    v_min_f32_e64 v0, -v0, -v12277; GCN-NEXT:    s_setpc_b64 s[30:31]2278  %max = call float @llvm.maximumnum.f32(float %a, float %b)2279  %fneg = fneg float %max2280  ret float %fneg2281}2282 2283define float @v_fneg_self_maximumnum_f32_ieee(float %a) #0 {2284; GCN-LABEL: v_fneg_self_maximumnum_f32_ieee:2285; GCN:       ; %bb.0:2286; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2287; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02288; GCN-NEXT:    s_setpc_b64 s[30:31]2289  %max = call float @llvm.maximumnum.f32(float %a, float %a)2290  %max.fneg = fneg float %max2291  ret float %max.fneg2292}2293 2294define float @v_fneg_self_maximumnum_f32_no_ieee(float %a) #4 {2295; GCN-LABEL: v_fneg_self_maximumnum_f32_no_ieee:2296; GCN:       ; %bb.0:2297; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2298; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02299; GCN-NEXT:    s_setpc_b64 s[30:31]2300  %max = call float @llvm.maximumnum.f32(float %a, float %a)2301  %max.fneg = fneg float %max2302  ret float %max.fneg2303}2304 2305define float @v_fneg_posk_maximumnum_f32_ieee(float %a) #0 {2306; GCN-LABEL: v_fneg_posk_maximumnum_f32_ieee:2307; GCN:       ; %bb.0:2308; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2309; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02310; GCN-NEXT:    v_min_f32_e32 v0, -4.0, v02311; GCN-NEXT:    s_setpc_b64 s[30:31]2312  %max = call float @llvm.maximumnum.f32(float 4.0, float %a)2313  %fneg = fneg float %max2314  ret float %fneg2315}2316 2317define float @v_fneg_posk_maximumnum_f32_no_ieee(float %a) #4 {2318; GCN-LABEL: v_fneg_posk_maximumnum_f32_no_ieee:2319; GCN:       ; %bb.0:2320; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2321; GCN-NEXT:    v_min_f32_e64 v0, -v0, -4.02322; GCN-NEXT:    s_setpc_b64 s[30:31]2323  %max = call float @llvm.maximumnum.f32(float 4.0, float %a)2324  %fneg = fneg float %max2325  ret float %fneg2326}2327 2328define float @v_fneg_negk_maximumnum_f32_ieee(float %a) #0 {2329; GCN-LABEL: v_fneg_negk_maximumnum_f32_ieee:2330; GCN:       ; %bb.0:2331; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2332; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02333; GCN-NEXT:    v_min_f32_e32 v0, 4.0, v02334; GCN-NEXT:    s_setpc_b64 s[30:31]2335  %max = call float @llvm.maximumnum.f32(float -4.0, float %a)2336  %fneg = fneg float %max2337  ret float %fneg2338}2339 2340define float @v_fneg_negk_maximumnum_f32_no_ieee(float %a) #4 {2341; GCN-LABEL: v_fneg_negk_maximumnum_f32_no_ieee:2342; GCN:       ; %bb.0:2343; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2344; GCN-NEXT:    v_min_f32_e64 v0, -v0, 4.02345; GCN-NEXT:    s_setpc_b64 s[30:31]2346  %max = call float @llvm.maximumnum.f32(float -4.0, float %a)2347  %fneg = fneg float %max2348  ret float %fneg2349}2350 2351define float @v_fneg_0_maximumnum_f32(float %a) #0 {2352; GCN-LABEL: v_fneg_0_maximumnum_f32:2353; GCN:       ; %bb.0:2354; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2355; GCN-NEXT:    v_max_f32_e32 v0, 0, v02356; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02357; GCN-NEXT:    s_setpc_b64 s[30:31]2358  %max = call nnan float @llvm.maximumnum.f32(float 0.0, float %a)2359  %fneg = fneg float %max2360  ret float %fneg2361}2362 2363define float @v_fneg_neg0_maximumnum_f32_ieee(float %a) #0 {2364; GCN-LABEL: v_fneg_neg0_maximumnum_f32_ieee:2365; GCN:       ; %bb.0:2366; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2367; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02368; GCN-NEXT:    v_min_f32_e32 v0, 0, v02369; GCN-NEXT:    s_setpc_b64 s[30:31]2370  %max = call float @llvm.maximumnum.f32(float -0.0, float %a)2371  %fneg = fneg float %max2372  ret float %fneg2373}2374 2375define float @v_fneg_neg0_maximumnum_f32_no_ieee(float %a) #4 {2376; GCN-LABEL: v_fneg_neg0_maximumnum_f32_no_ieee:2377; GCN:       ; %bb.0:2378; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2379; GCN-NEXT:    v_min_f32_e64 v0, -v0, 02380; GCN-NEXT:    s_setpc_b64 s[30:31]2381  %max = call float @llvm.maximumnum.f32(float -0.0, float %a)2382  %fneg = fneg float %max2383  ret float %fneg2384}2385 2386define float @v_fneg_0_maximumnum_foldable_use_f32_ieee(float %a, float %b) #0 {2387; GCN-LABEL: v_fneg_0_maximumnum_foldable_use_f32_ieee:2388; GCN:       ; %bb.0:2389; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2390; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v02391; GCN-NEXT:    v_max_f32_e32 v0, 0, v02392; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v12393; GCN-NEXT:    s_setpc_b64 s[30:31]2394  %max = call float @llvm.maximumnum.f32(float 0.0, float %a)2395  %fneg = fneg float %max2396  %mul = fmul float %fneg, %b2397  ret float %mul2398}2399 2400define float @v_fneg_0_maximumnum_foldable_use_f32_no_ieee(float %a, float %b) #4 {2401; GCN-LABEL: v_fneg_0_maximumnum_foldable_use_f32_no_ieee:2402; GCN:       ; %bb.0:2403; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2404; GCN-NEXT:    v_max_f32_e32 v0, 0, v02405; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v12406; GCN-NEXT:    s_setpc_b64 s[30:31]2407  %max = call float @llvm.maximumnum.f32(float 0.0, float %a)2408  %fneg = fneg float %max2409  %mul = fmul float %fneg, %b2410  ret float %mul2411}2412 2413define { float, float } @v_fneg_maximumnum_multi_use_maximumnum_f32_ieee(float %a, float %b) #0 {2414; GCN-LABEL: v_fneg_maximumnum_multi_use_maximumnum_f32_ieee:2415; GCN:       ; %bb.0:2416; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2417; GCN-NEXT:    v_mul_f32_e32 v1, -1.0, v12418; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v02419; GCN-NEXT:    v_min_f32_e32 v0, v0, v12420; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v02421; GCN-NEXT:    s_setpc_b64 s[30:31]2422  %max = call float @llvm.maximumnum.f32(float %a, float %b)2423  %fneg = fneg float %max2424  %use1 = fmul float %max, 4.02425  %insert.0 = insertvalue { float, float } poison, float %fneg, 02426  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 12427  ret { float, float } %insert.12428}2429 2430define <2 x float> @v_fneg_maximumnum_multi_use_maximumnum_f32_no_ieee(float %a, float %b) #4 {2431; GCN-LABEL: v_fneg_maximumnum_multi_use_maximumnum_f32_no_ieee:2432; GCN:       ; %bb.0:2433; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2434; GCN-NEXT:    v_min_f32_e64 v0, -v0, -v12435; GCN-NEXT:    v_mul_f32_e32 v1, -4.0, v02436; GCN-NEXT:    s_setpc_b64 s[30:31]2437  %max = call float @llvm.maximumnum.f32(float %a, float %b)2438  %fneg = fneg float %max2439  %use1 = fmul float %max, 4.02440  %ins0 = insertelement <2 x float> poison, float %fneg, i32 02441  %ins1 = insertelement <2 x float> %ins0, float %use1, i32 12442  ret <2 x float> %ins12443}2444 2445; --------------------------------------------------------------------------------2446; fma tests2447; --------------------------------------------------------------------------------2448 2449define float @v_fneg_fma_f32(float %a, float %b, float %c) #0 {2450; GCN-SAFE-LABEL: v_fneg_fma_f32:2451; GCN-SAFE:       ; %bb.0:2452; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2453; GCN-SAFE-NEXT:    v_fma_f32 v0, v0, v1, v22454; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02455; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2456;2457; GCN-NSZ-LABEL: v_fneg_fma_f32:2458; GCN-NSZ:       ; %bb.0:2459; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2460; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, -v1, -v22461; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2462  %fma = call float @llvm.fma.f32(float %a, float %b, float %c)2463  %fneg = fneg float %fma2464  ret float %fneg2465}2466 2467define { float, float } @v_fneg_fma_store_use_fma_f32(float %a, float %b, float %c) #0 {2468; GCN-LABEL: v_fneg_fma_store_use_fma_f32:2469; GCN:       ; %bb.0:2470; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2471; GCN-NEXT:    v_fma_f32 v1, v0, v1, v22472; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v12473; GCN-NEXT:    s_setpc_b64 s[30:31]2474  %fma = call float @llvm.fma.f32(float %a, float %b, float %c)2475  %fneg = fneg float %fma2476  %insert.0 = insertvalue { float, float } poison, float %fneg, 02477  %insert.1 = insertvalue { float, float } %insert.0, float %fma, 12478  ret { float, float } %insert.12479}2480 2481define { float, float } @v_fneg_fma_multi_use_fma_f32(float %a, float %b, float %c) #0 {2482; GCN-SAFE-LABEL: v_fneg_fma_multi_use_fma_f32:2483; GCN-SAFE:       ; %bb.0:2484; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2485; GCN-SAFE-NEXT:    v_fma_f32 v1, v0, v1, v22486; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v12487; GCN-SAFE-NEXT:    v_mul_f32_e32 v1, 4.0, v12488; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2489;2490; GCN-NSZ-LABEL: v_fneg_fma_multi_use_fma_f32:2491; GCN-NSZ:       ; %bb.0:2492; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2493; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, -v1, -v22494; GCN-NSZ-NEXT:    v_mul_f32_e32 v1, -4.0, v02495; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2496  %fma = call float @llvm.fma.f32(float %a, float %b, float %c)2497  %fneg = fneg float %fma2498  %use1 = fmul float %fma, 4.02499  %insert.0 = insertvalue { float, float } poison, float %fneg, 02500  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 12501  ret { float, float } %insert.12502}2503 2504define float @v_fneg_fma_fneg_x_y_f32(float %a, float %b, float %c) #0 {2505; GCN-SAFE-LABEL: v_fneg_fma_fneg_x_y_f32:2506; GCN-SAFE:       ; %bb.0:2507; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2508; GCN-SAFE-NEXT:    v_fma_f32 v0, -v0, v1, v22509; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02510; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2511;2512; GCN-NSZ-LABEL: v_fneg_fma_fneg_x_y_f32:2513; GCN-NSZ:       ; %bb.0:2514; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2515; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, v1, -v22516; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2517  %fneg.a = fneg float %a2518  %fma = call float @llvm.fma.f32(float %fneg.a, float %b, float %c)2519  %fneg = fneg float %fma2520  ret float %fneg2521}2522 2523define float @v_fneg_fma_x_fneg_y_f32(float %a, float %b, float %c) #0 {2524; GCN-SAFE-LABEL: v_fneg_fma_x_fneg_y_f32:2525; GCN-SAFE:       ; %bb.0:2526; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2527; GCN-SAFE-NEXT:    v_fma_f32 v0, v0, -v1, v22528; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02529; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2530;2531; GCN-NSZ-LABEL: v_fneg_fma_x_fneg_y_f32:2532; GCN-NSZ:       ; %bb.0:2533; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2534; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, v1, -v22535; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2536  %fneg.b = fneg float %b2537  %fma = call float @llvm.fma.f32(float %a, float %fneg.b, float %c)2538  %fneg = fneg float %fma2539  ret float %fneg2540}2541 2542define float @v_fneg_fma_fneg_fneg_y_f32(float %a, float %b, float %c) #0 {2543; GCN-SAFE-LABEL: v_fneg_fma_fneg_fneg_y_f32:2544; GCN-SAFE:       ; %bb.0:2545; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2546; GCN-SAFE-NEXT:    v_fma_f32 v0, v0, v1, v22547; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02548; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2549;2550; GCN-NSZ-LABEL: v_fneg_fma_fneg_fneg_y_f32:2551; GCN-NSZ:       ; %bb.0:2552; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2553; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, -v1, -v22554; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2555  %fneg.a = fneg float %a2556  %fneg.b = fneg float %b2557  %fma = call float @llvm.fma.f32(float %fneg.a, float %fneg.b, float %c)2558  %fneg = fneg float %fma2559  ret float %fneg2560}2561 2562define float @v_fneg_fma_fneg_x_fneg_f32(float %a, float %b, float %c) #0 {2563; GCN-SAFE-LABEL: v_fneg_fma_fneg_x_fneg_f32:2564; GCN-SAFE:       ; %bb.0:2565; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2566; GCN-SAFE-NEXT:    v_fma_f32 v0, -v0, v1, -v22567; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02568; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2569;2570; GCN-NSZ-LABEL: v_fneg_fma_fneg_x_fneg_f32:2571; GCN-NSZ:       ; %bb.0:2572; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2573; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, v1, v22574; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2575  %fneg.a = fneg float %a2576  %fneg.c = fneg float %c2577  %fma = call float @llvm.fma.f32(float %fneg.a, float %b, float %fneg.c)2578  %fneg = fneg float %fma2579  ret float %fneg2580}2581 2582define float @v_fneg_fma_x_y_fneg_f32(float %a, float %b, float %c) #0 {2583; GCN-SAFE-LABEL: v_fneg_fma_x_y_fneg_f32:2584; GCN-SAFE:       ; %bb.0:2585; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2586; GCN-SAFE-NEXT:    v_fma_f32 v0, v0, v1, -v22587; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02588; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2589;2590; GCN-NSZ-LABEL: v_fneg_fma_x_y_fneg_f32:2591; GCN-NSZ:       ; %bb.0:2592; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2593; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, -v1, v22594; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2595  %fneg.c = fneg float %c2596  %fma = call float @llvm.fma.f32(float %a, float %b, float %fneg.c)2597  %fneg = fneg float %fma2598  ret float %fneg2599}2600 2601define { float, float } @v_fneg_fma_store_use_fneg_x_y_f32(float %a, float %b, float %c) #0 {2602; GCN-SAFE-LABEL: v_fneg_fma_store_use_fneg_x_y_f32:2603; GCN-SAFE:       ; %bb.0:2604; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2605; GCN-SAFE-NEXT:    v_xor_b32_e32 v3, 0x80000000, v02606; GCN-SAFE-NEXT:    v_fma_f32 v0, -v0, v1, v22607; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v02608; GCN-SAFE-NEXT:    v_mov_b32_e32 v1, v32609; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2610;2611; GCN-NSZ-LABEL: v_fneg_fma_store_use_fneg_x_y_f32:2612; GCN-NSZ:       ; %bb.0:2613; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2614; GCN-NSZ-NEXT:    v_xor_b32_e32 v3, 0x80000000, v02615; GCN-NSZ-NEXT:    v_fma_f32 v0, v0, v1, -v22616; GCN-NSZ-NEXT:    v_mov_b32_e32 v1, v32617; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2618  %fneg.a = fneg float %a2619  %fma = call float @llvm.fma.f32(float %fneg.a, float %b, float %c)2620  %fneg = fneg float %fma2621  %insert.0 = insertvalue { float, float } poison, float %fneg, 02622  %insert.1 = insertvalue { float, float } %insert.0, float %fneg.a, 12623  ret { float, float } %insert.12624}2625 2626define { float, float } @v_fneg_fma_multi_use_fneg_x_y_f32(float %a, float %b, float %c, float %d) #0 {2627; GCN-SAFE-LABEL: v_fneg_fma_multi_use_fneg_x_y_f32:2628; GCN-SAFE:       ; %bb.0:2629; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2630; GCN-SAFE-NEXT:    v_fma_f32 v1, -v0, v1, v22631; GCN-SAFE-NEXT:    v_xor_b32_e32 v2, 0x80000000, v12632; GCN-SAFE-NEXT:    v_mul_f32_e64 v1, -v0, v32633; GCN-SAFE-NEXT:    v_mov_b32_e32 v0, v22634; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2635;2636; GCN-NSZ-LABEL: v_fneg_fma_multi_use_fneg_x_y_f32:2637; GCN-NSZ:       ; %bb.0:2638; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2639; GCN-NSZ-NEXT:    v_fma_f32 v2, v0, v1, -v22640; GCN-NSZ-NEXT:    v_mul_f32_e64 v1, -v0, v32641; GCN-NSZ-NEXT:    v_mov_b32_e32 v0, v22642; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2643  %fneg.a = fneg float %a2644  %fma = call float @llvm.fma.f32(float %fneg.a, float %b, float %c)2645  %fneg = fneg float %fma2646  %use1 = fmul float %fneg.a, %d2647  %insert.0 = insertvalue { float, float } poison, float %fneg, 02648  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 12649  ret { float, float } %insert.12650}2651 2652; --------------------------------------------------------------------------------2653; fmad tests2654; --------------------------------------------------------------------------------2655 2656define float @v_fneg_fmad_f32(float %a, float %b, float %c) #0 {2657; GCN-SAFE-LABEL: v_fneg_fmad_f32:2658; GCN-SAFE:       ; %bb.0:2659; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2660; GCN-SAFE-NEXT:    v_mac_f32_e32 v2, v0, v12661; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v22662; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2663;2664; GCN-NSZ-LABEL: v_fneg_fmad_f32:2665; GCN-NSZ:       ; %bb.0:2666; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2667; GCN-NSZ-NEXT:    v_mad_f32 v0, v0, -v1, -v22668; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2669  %fma = call float @llvm.fmuladd.f32(float %a, float %b, float %c)2670  %fneg = fneg float %fma2671  ret float %fneg2672}2673 2674define <4 x float> @v_fneg_fmad_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 {2675; GCN-SAFE-LABEL: v_fneg_fmad_v4f32:2676; GCN-SAFE:       ; %bb.0:2677; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2678; GCN-SAFE-NEXT:    v_mac_f32_e32 v11, v3, v72679; GCN-SAFE-NEXT:    v_mac_f32_e32 v10, v2, v62680; GCN-SAFE-NEXT:    v_mac_f32_e32 v9, v1, v52681; GCN-SAFE-NEXT:    v_mac_f32_e32 v8, v0, v42682; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v82683; GCN-SAFE-NEXT:    v_xor_b32_e32 v1, 0x80000000, v92684; GCN-SAFE-NEXT:    v_xor_b32_e32 v2, 0x80000000, v102685; GCN-SAFE-NEXT:    v_xor_b32_e32 v3, 0x80000000, v112686; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2687;2688; GCN-NSZ-LABEL: v_fneg_fmad_v4f32:2689; GCN-NSZ:       ; %bb.0:2690; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2691; GCN-NSZ-NEXT:    v_mad_f32 v0, v0, -v4, -v82692; GCN-NSZ-NEXT:    v_mad_f32 v1, v1, -v5, -v92693; GCN-NSZ-NEXT:    v_mad_f32 v2, v2, -v6, -v102694; GCN-NSZ-NEXT:    v_mad_f32 v3, v3, -v7, -v112695; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2696  %fma = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c)2697  %fneg = fneg <4 x float> %fma2698  ret <4 x float> %fneg2699}2700 2701define { float, float } @v_fneg_fmad_multi_use_fmad_f32(float %a, float %b, float %c) #0 {2702; GCN-SAFE-LABEL: v_fneg_fmad_multi_use_fmad_f32:2703; GCN-SAFE:       ; %bb.0:2704; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2705; GCN-SAFE-NEXT:    v_mac_f32_e32 v2, v0, v12706; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v22707; GCN-SAFE-NEXT:    v_mul_f32_e32 v1, 4.0, v22708; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]2709;2710; GCN-NSZ-LABEL: v_fneg_fmad_multi_use_fmad_f32:2711; GCN-NSZ:       ; %bb.0:2712; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2713; GCN-NSZ-NEXT:    v_mad_f32 v0, v0, -v1, -v22714; GCN-NSZ-NEXT:    v_mul_f32_e32 v1, -4.0, v02715; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]2716  %fma = call float @llvm.fmuladd.f32(float %a, float %b, float %c)2717  %fneg = fneg float %fma2718  %use1 = fmul float %fma, 4.02719  %insert.0 = insertvalue { float, float } poison, float %fneg, 02720  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 12721  ret { float, float } %insert.12722}2723 2724; --------------------------------------------------------------------------------2725; fp_extend tests2726; --------------------------------------------------------------------------------2727 2728define double @v_fneg_fp_extend_f32_to_f64(float %a) #0 {2729; GCN-LABEL: v_fneg_fp_extend_f32_to_f64:2730; GCN:       ; %bb.0:2731; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2732; GCN-NEXT:    v_cvt_f64_f32_e64 v[0:1], -v02733; GCN-NEXT:    s_setpc_b64 s[30:31]2734  %fpext = fpext float %a to double2735  %fneg = fneg double %fpext2736  ret double %fneg2737}2738 2739define double @v_fneg_fp_extend_fneg_f32_to_f64(float %a) #0 {2740; GCN-LABEL: v_fneg_fp_extend_fneg_f32_to_f64:2741; GCN:       ; %bb.0:2742; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2743; GCN-NEXT:    v_cvt_f64_f32_e32 v[0:1], v02744; GCN-NEXT:    s_setpc_b64 s[30:31]2745  %fneg.a = fneg float %a2746  %fpext = fpext float %fneg.a to double2747  %fneg = fneg double %fpext2748  ret double %fneg2749}2750 2751define { double, float } @v_fneg_fp_extend_store_use_fneg_f32_to_f64(float %a) #0 {2752; GCN-LABEL: v_fneg_fp_extend_store_use_fneg_f32_to_f64:2753; GCN:       ; %bb.0:2754; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2755; GCN-NEXT:    v_mov_b32_e32 v2, v02756; GCN-NEXT:    v_cvt_f64_f32_e32 v[0:1], v22757; GCN-NEXT:    v_xor_b32_e32 v2, 0x80000000, v22758; GCN-NEXT:    s_setpc_b64 s[30:31]2759  %fneg.a = fneg float %a2760  %fpext = fpext float %fneg.a to double2761  %fneg = fneg double %fpext2762  %insert.0 = insertvalue { double, float } poison, double %fneg, 02763  %insert.1 = insertvalue { double, float } %insert.0, float %fneg.a, 12764  ret { double, float } %insert.12765}2766 2767define { double, double } @v_fneg_multi_use_fp_extend_fneg_f32_to_f64(float %a) #0 {2768; GCN-LABEL: v_fneg_multi_use_fp_extend_fneg_f32_to_f64:2769; GCN:       ; %bb.0:2770; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2771; GCN-NEXT:    v_cvt_f64_f32_e32 v[2:3], v02772; GCN-NEXT:    v_xor_b32_e32 v1, 0x80000000, v32773; GCN-NEXT:    v_mov_b32_e32 v0, v22774; GCN-NEXT:    s_setpc_b64 s[30:31]2775  %fpext = fpext float %a to double2776  %fneg = fneg double %fpext2777  %insert.0 = insertvalue { double, double } poison, double %fneg, 02778  %insert.1 = insertvalue { double, double } %insert.0, double %fpext, 12779  ret { double, double } %insert.12780}2781 2782define { double, double } @v_fneg_multi_foldable_use_fp_extend_fneg_f32_to_f64(float %a) #0 {2783; SI-LABEL: v_fneg_multi_foldable_use_fp_extend_fneg_f32_to_f64:2784; SI:       ; %bb.0:2785; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2786; SI-NEXT:    v_cvt_f64_f32_e32 v[0:1], v02787; SI-NEXT:    v_xor_b32_e32 v4, 0x80000000, v12788; SI-NEXT:    v_mul_f64 v[2:3], v[0:1], 4.02789; SI-NEXT:    v_mov_b32_e32 v1, v42790; SI-NEXT:    s_setpc_b64 s[30:31]2791;2792; VI-LABEL: v_fneg_multi_foldable_use_fp_extend_fneg_f32_to_f64:2793; VI:       ; %bb.0:2794; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2795; VI-NEXT:    v_cvt_f64_f32_e32 v[0:1], v02796; VI-NEXT:    v_mul_f64 v[2:3], v[0:1], 4.02797; VI-NEXT:    v_xor_b32_e32 v1, 0x80000000, v12798; VI-NEXT:    s_setpc_b64 s[30:31]2799  %fpext = fpext float %a to double2800  %fneg = fneg double %fpext2801  %mul = fmul double %fpext, 4.02802  %insert.0 = insertvalue { double, double } poison, double %fneg, 02803  %insert.1 = insertvalue { double, double } %insert.0, double %mul, 12804  ret { double, double } %insert.12805}2806 2807; FIXME: Source modifiers not folded for f16->f322808define { float, float } @v_fneg_multi_use_fp_extend_fneg_f16_to_f32(half %a) #0 {2809; SI-LABEL: v_fneg_multi_use_fp_extend_fneg_f16_to_f32:2810; SI:       ; %bb.0:2811; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2812; SI-NEXT:    v_mov_b32_e32 v1, v02813; SI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v12814; SI-NEXT:    s_setpc_b64 s[30:31]2815;2816; VI-LABEL: v_fneg_multi_use_fp_extend_fneg_f16_to_f32:2817; VI:       ; %bb.0:2818; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2819; VI-NEXT:    v_cvt_f32_f16_e32 v1, v02820; VI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v12821; VI-NEXT:    s_setpc_b64 s[30:31]2822  %fpext = fpext half %a to float2823  %fneg = fneg float %fpext2824  %insert.0 = insertvalue { float, float } poison, float %fneg, 02825  %insert.1 = insertvalue { float, float } %insert.0, float %fpext, 12826  ret { float, float } %insert.12827}2828 2829define { float, float } @v_fneg_multi_foldable_use_fp_extend_fneg_f16_to_f32(half %a) #0 {2830; SI-LABEL: v_fneg_multi_foldable_use_fp_extend_fneg_f16_to_f32:2831; SI:       ; %bb.0:2832; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2833; SI-NEXT:    v_xor_b32_e32 v2, 0x80000000, v02834; SI-NEXT:    v_mul_f32_e32 v1, 4.0, v02835; SI-NEXT:    v_mov_b32_e32 v0, v22836; SI-NEXT:    s_setpc_b64 s[30:31]2837;2838; VI-LABEL: v_fneg_multi_foldable_use_fp_extend_fneg_f16_to_f32:2839; VI:       ; %bb.0:2840; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2841; VI-NEXT:    v_cvt_f32_f16_e32 v1, v02842; VI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v12843; VI-NEXT:    v_mul_f32_e32 v1, 4.0, v12844; VI-NEXT:    s_setpc_b64 s[30:31]2845  %fpext = fpext half %a to float2846  %fneg = fneg float %fpext2847  %mul = fmul float %fpext, 4.02848  %insert.0 = insertvalue { float, float } poison, float %fneg, 02849  %insert.1 = insertvalue { float, float } %insert.0, float %mul, 12850  ret { float, float } %insert.12851}2852 2853; --------------------------------------------------------------------------------2854; fp_round tests2855; --------------------------------------------------------------------------------2856 2857define float @v_fneg_fp_round_f64_to_f32(double %a) #0 {2858; GCN-LABEL: v_fneg_fp_round_f64_to_f32:2859; GCN:       ; %bb.0:2860; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2861; GCN-NEXT:    v_cvt_f32_f64_e64 v0, -v[0:1]2862; GCN-NEXT:    s_setpc_b64 s[30:31]2863  %fpround = fptrunc double %a to float2864  %fneg = fneg float %fpround2865  ret float %fneg2866}2867 2868define float @v_fneg_fp_round_fneg_f64_to_f32(double %a) #0 {2869; GCN-LABEL: v_fneg_fp_round_fneg_f64_to_f32:2870; GCN:       ; %bb.0:2871; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2872; GCN-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]2873; GCN-NEXT:    s_setpc_b64 s[30:31]2874  %fneg.a = fneg double %a2875  %fpround = fptrunc double %fneg.a to float2876  %fneg = fneg float %fpround2877  ret float %fneg2878}2879 2880define { float, double } @v_fneg_fp_round_store_use_fneg_f64_to_f32(double %a) #0 {2881; GCN-LABEL: v_fneg_fp_round_store_use_fneg_f64_to_f32:2882; GCN:       ; %bb.0:2883; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2884; GCN-NEXT:    v_cvt_f32_f64_e32 v3, v[0:1]2885; GCN-NEXT:    v_xor_b32_e32 v2, 0x80000000, v12886; GCN-NEXT:    v_mov_b32_e32 v1, v02887; GCN-NEXT:    v_mov_b32_e32 v0, v32888; GCN-NEXT:    s_setpc_b64 s[30:31]2889  %fneg.a = fneg double %a2890  %fpround = fptrunc double %fneg.a to float2891  %fneg = fneg float %fpround2892  %insert.0 = insertvalue { float, double } poison, float %fneg, 02893  %insert.1 = insertvalue { float, double } %insert.0, double %fneg.a, 12894  ret { float, double } %insert.12895}2896 2897define { float, double } @v_fneg_fp_round_multi_use_fneg_f64_to_f32(double %a, double %c) #0 {2898; SI-LABEL: v_fneg_fp_round_multi_use_fneg_f64_to_f32:2899; SI:       ; %bb.0:2900; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2901; SI-NEXT:    v_cvt_f32_f64_e32 v4, v[0:1]2902; SI-NEXT:    v_mul_f64 v[1:2], -v[0:1], v[2:3]2903; SI-NEXT:    v_mov_b32_e32 v0, v42904; SI-NEXT:    s_setpc_b64 s[30:31]2905;2906; VI-LABEL: v_fneg_fp_round_multi_use_fneg_f64_to_f32:2907; VI:       ; %bb.0:2908; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2909; VI-NEXT:    v_mul_f64 v[2:3], -v[0:1], v[2:3]2910; VI-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]2911; VI-NEXT:    v_mov_b32_e32 v1, v22912; VI-NEXT:    v_mov_b32_e32 v2, v32913; VI-NEXT:    s_setpc_b64 s[30:31]2914  %fneg.a = fneg double %a2915  %fpround = fptrunc double %fneg.a to float2916  %fneg = fneg float %fpround2917  %use1 = fmul double %fneg.a, %c2918  %insert.0 = insertvalue { float, double } poison, float %fneg, 02919  %insert.1 = insertvalue { float, double } %insert.0, double %use1, 12920  ret { float, double } %insert.12921}2922 2923define half @v_fneg_fp_round_f32_to_f16(float %a) #0 {2924; SI-LABEL: v_fneg_fp_round_f32_to_f16:2925; SI:       ; %bb.0:2926; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2927; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v02928; SI-NEXT:    v_cvt_f32_f16_e32 v0, v02929; SI-NEXT:    s_setpc_b64 s[30:31]2930;2931; VI-LABEL: v_fneg_fp_round_f32_to_f16:2932; VI:       ; %bb.0:2933; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2934; VI-NEXT:    v_cvt_f16_f32_e64 v0, -v02935; VI-NEXT:    s_setpc_b64 s[30:31]2936  %fpround = fptrunc float %a to half2937  %fneg = fneg half %fpround2938  ret half %fneg2939}2940 2941define half @v_fneg_fp_round_fneg_f32_to_f16(float %a) #0 {2942; SI-LABEL: v_fneg_fp_round_fneg_f32_to_f16:2943; SI:       ; %bb.0:2944; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2945; SI-NEXT:    v_cvt_f16_f32_e32 v0, v02946; SI-NEXT:    v_cvt_f32_f16_e32 v0, v02947; SI-NEXT:    s_setpc_b64 s[30:31]2948;2949; VI-LABEL: v_fneg_fp_round_fneg_f32_to_f16:2950; VI:       ; %bb.0:2951; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2952; VI-NEXT:    v_cvt_f16_f32_e32 v0, v02953; VI-NEXT:    s_setpc_b64 s[30:31]2954  %fneg.a = fneg float %a2955  %fpround = fptrunc float %fneg.a to half2956  %fneg = fneg half %fpround2957  ret half %fneg2958}2959 2960define { float, float } @v_fneg_multi_use_fp_round_fneg_f64_to_f32(double %a) #0 {2961; GCN-LABEL: v_fneg_multi_use_fp_round_fneg_f64_to_f32:2962; GCN:       ; %bb.0:2963; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2964; GCN-NEXT:    v_cvt_f32_f64_e32 v1, v[0:1]2965; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v12966; GCN-NEXT:    s_setpc_b64 s[30:31]2967  %fpround = fptrunc double %a to float2968  %fneg = fneg float %fpround2969  %insert.0 = insertvalue { float, float } poison, float %fneg, 02970  %insert.1 = insertvalue { float, float } %insert.0, float %fpround, 12971  ret { float, float } %insert.12972}2973 2974define { half, float } @v_fneg_fp_round_store_use_fneg_f32_to_f16(float %a) #0 {2975; SI-LABEL: v_fneg_fp_round_store_use_fneg_f32_to_f16:2976; SI:       ; %bb.0:2977; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2978; SI-NEXT:    v_cvt_f16_f32_e32 v1, v02979; SI-NEXT:    v_cvt_f32_f16_e32 v2, v12980; SI-NEXT:    v_xor_b32_e32 v1, 0x80000000, v02981; SI-NEXT:    v_mov_b32_e32 v0, v22982; SI-NEXT:    s_setpc_b64 s[30:31]2983;2984; VI-LABEL: v_fneg_fp_round_store_use_fneg_f32_to_f16:2985; VI:       ; %bb.0:2986; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2987; VI-NEXT:    v_cvt_f16_f32_e32 v2, v02988; VI-NEXT:    v_xor_b32_e32 v1, 0x80000000, v02989; VI-NEXT:    v_mov_b32_e32 v0, v22990; VI-NEXT:    s_setpc_b64 s[30:31]2991  %fneg.a = fneg float %a2992  %fpround = fptrunc float %fneg.a to half2993  %fneg = fneg half %fpround2994  %insert.0 = insertvalue { half, float } poison, half %fneg, 02995  %insert.1 = insertvalue { half, float } %insert.0, float %fneg.a, 12996  ret { half, float } %insert.12997}2998 2999define { half, float } @v_fneg_fp_round_multi_use_fneg_f32_to_f16(float %a, float %c) #0 {3000; SI-LABEL: v_fneg_fp_round_multi_use_fneg_f32_to_f16:3001; SI:       ; %bb.0:3002; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3003; SI-NEXT:    v_cvt_f16_f32_e32 v2, v03004; SI-NEXT:    v_mul_f32_e64 v1, -v0, v13005; SI-NEXT:    v_cvt_f32_f16_e32 v2, v23006; SI-NEXT:    v_mov_b32_e32 v0, v23007; SI-NEXT:    s_setpc_b64 s[30:31]3008;3009; VI-LABEL: v_fneg_fp_round_multi_use_fneg_f32_to_f16:3010; VI:       ; %bb.0:3011; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3012; VI-NEXT:    v_cvt_f16_f32_e32 v2, v03013; VI-NEXT:    v_mul_f32_e64 v1, -v0, v13014; VI-NEXT:    v_mov_b32_e32 v0, v23015; VI-NEXT:    s_setpc_b64 s[30:31]3016  %fneg.a = fneg float %a3017  %fpround = fptrunc float %fneg.a to half3018  %fneg = fneg half %fpround3019  %use1 = fmul float %fneg.a, %c3020  %insert.0 = insertvalue { half, float } poison, half %fneg, 03021  %insert.1 = insertvalue { half, float } %insert.0, float %use1, 13022  ret { half, float } %insert.13023}3024 3025; --------------------------------------------------------------------------------3026; rcp tests3027; --------------------------------------------------------------------------------3028 3029define float @v_fneg_rcp_f32(float %a) #0 {3030; GCN-LABEL: v_fneg_rcp_f32:3031; GCN:       ; %bb.0:3032; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3033; GCN-NEXT:    v_rcp_f32_e64 v0, -v03034; GCN-NEXT:    s_setpc_b64 s[30:31]3035  %rcp = call float @llvm.amdgcn.rcp.f32(float %a)3036  %fneg = fneg float %rcp3037  ret float %fneg3038}3039 3040define float @v_fneg_rcp_fneg_f32(float %a) #0 {3041; GCN-LABEL: v_fneg_rcp_fneg_f32:3042; GCN:       ; %bb.0:3043; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3044; GCN-NEXT:    v_rcp_f32_e32 v0, v03045; GCN-NEXT:    s_setpc_b64 s[30:31]3046  %fneg.a = fneg float %a3047  %rcp = call float @llvm.amdgcn.rcp.f32(float %fneg.a)3048  %fneg = fneg float %rcp3049  ret float %fneg3050}3051 3052define void @v_fneg_rcp_store_use_fneg_f32(float %a, ptr addrspace(1) %ptr0, ptr addrspace(1) %ptr1) #0 {3053; GCN-LABEL: v_fneg_rcp_store_use_fneg_f32:3054; GCN:       ; %bb.0:3055; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3056; GCN-NEXT:    v_rcp_f32_e32 v5, v03057; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v03058; GCN-NEXT:    flat_store_dword v[1:2], v53059; GCN-NEXT:    flat_store_dword v[3:4], v03060; GCN-NEXT:    s_waitcnt vmcnt(0)3061; GCN-NEXT:    s_setpc_b64 s[30:31]3062  %fneg.a = fneg float %a3063  %rcp = call float @llvm.amdgcn.rcp.f32(float %fneg.a)3064  %fneg = fneg float %rcp3065  store float %fneg, ptr addrspace(1) %ptr03066  store float %fneg.a, ptr addrspace(1) %ptr13067  ret void3068}3069 3070define { float, float } @v_fneg_rcp_multi_use_fneg_f32(float %a, float %c) #0 {3071; GCN-LABEL: v_fneg_rcp_multi_use_fneg_f32:3072; GCN:       ; %bb.0:3073; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3074; GCN-NEXT:    v_rcp_f32_e32 v2, v03075; GCN-NEXT:    v_mul_f32_e64 v1, -v0, v13076; GCN-NEXT:    v_mov_b32_e32 v0, v23077; GCN-NEXT:    s_setpc_b64 s[30:31]3078  %fneg.a = fneg float %a3079  %rcp = call float @llvm.amdgcn.rcp.f32(float %fneg.a)3080  %fneg = fneg float %rcp3081  %use1 = fmul float %fneg.a, %c3082  %insert.0 = insertvalue { float, float } poison, float %fneg, 03083  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 13084  ret { float, float } %insert.13085}3086 3087; Test getNegatedExpression works for rcp nodes3088define float @v_negated_rcp_f32(float %arg0, float %arg1) #1 {3089; GCN-LABEL: v_negated_rcp_f32:3090; GCN:       ; %bb.0:3091; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3092; GCN-NEXT:    v_fma_f32 v0, v0, v1, 2.03093; GCN-NEXT:    v_rcp_f32_e32 v0, v03094; GCN-NEXT:    v_add_f32_e32 v0, v1, v03095; GCN-NEXT:    s_setpc_b64 s[30:31]3096  %neg.arg0 = fneg float %arg03097  %fma = call nsz float @llvm.fma.f32(float %neg.arg0, float %arg1, float -2.0)3098  %rcp0 = call float @llvm.amdgcn.rcp.f32(float %fma)3099  %mul = fsub nsz float %arg1, %rcp03100  ret float %mul3101}3102 3103; --------------------------------------------------------------------------------3104; fmul_legacy tests3105; --------------------------------------------------------------------------------3106 3107define float @v_fneg_mul_legacy_f32(float %a, float %b) #0 {3108; GCN-LABEL: v_fneg_mul_legacy_f32:3109; GCN:       ; %bb.0:3110; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3111; GCN-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v13112; GCN-NEXT:    s_setpc_b64 s[30:31]3113  %mul = call float @llvm.amdgcn.fmul.legacy(float %a, float %b)3114  %fneg = fneg float %mul3115  ret float %fneg3116}3117 3118define { float, float } @v_fneg_mul_legacy_store_use_mul_legacy_f32(float %a, float %b) #0 {3119; GCN-LABEL: v_fneg_mul_legacy_store_use_mul_legacy_f32:3120; GCN:       ; %bb.0:3121; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3122; GCN-NEXT:    v_mul_legacy_f32_e32 v1, v0, v13123; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v13124; GCN-NEXT:    s_setpc_b64 s[30:31]3125  %mul = call float @llvm.amdgcn.fmul.legacy(float %a, float %b)3126  %fneg = fneg float %mul3127  %insert.0 = insertvalue { float, float } poison, float %fneg, 03128  %insert.1 = insertvalue { float, float } %insert.0, float %mul, 13129  ret { float, float } %insert.13130}3131 3132define { float, float } @v_fneg_mul_legacy_multi_use_mul_legacy_f32(float %a, float %b) #0 {3133; GCN-LABEL: v_fneg_mul_legacy_multi_use_mul_legacy_f32:3134; GCN:       ; %bb.0:3135; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3136; GCN-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v13137; GCN-NEXT:    v_mul_legacy_f32_e64 v1, -v0, 4.03138; GCN-NEXT:    s_setpc_b64 s[30:31]3139  %mul = call float @llvm.amdgcn.fmul.legacy(float %a, float %b)3140  %fneg = fneg float %mul3141  %use1 = call float @llvm.amdgcn.fmul.legacy(float %mul, float 4.0)3142  %insert.0 = insertvalue { float, float } poison, float %fneg, 03143  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 13144  ret { float, float } %insert.13145}3146 3147define float @v_fneg_mul_legacy_fneg_x_f32(float %a, float %b) #0 {3148; GCN-LABEL: v_fneg_mul_legacy_fneg_x_f32:3149; GCN:       ; %bb.0:3150; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3151; GCN-NEXT:    v_mul_legacy_f32_e32 v0, v0, v13152; GCN-NEXT:    s_setpc_b64 s[30:31]3153  %fneg.a = fneg float %a3154  %mul = call float @llvm.amdgcn.fmul.legacy(float %fneg.a, float %b)3155  %fneg = fneg float %mul3156  ret float %fneg3157}3158 3159define float @v_fneg_mul_legacy_x_fneg_f32(float %a, float %b) #0 {3160; GCN-LABEL: v_fneg_mul_legacy_x_fneg_f32:3161; GCN:       ; %bb.0:3162; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3163; GCN-NEXT:    v_mul_legacy_f32_e32 v0, v0, v13164; GCN-NEXT:    s_setpc_b64 s[30:31]3165  %fneg.b = fneg float %b3166  %mul = call float @llvm.amdgcn.fmul.legacy(float %a, float %fneg.b)3167  %fneg = fneg float %mul3168  ret float %fneg3169}3170 3171define float @v_fneg_mul_legacy_fneg_fneg_f32(float %a, float %b) #0 {3172; GCN-LABEL: v_fneg_mul_legacy_fneg_fneg_f32:3173; GCN:       ; %bb.0:3174; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3175; GCN-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v13176; GCN-NEXT:    s_setpc_b64 s[30:31]3177  %fneg.a = fneg float %a3178  %fneg.b = fneg float %b3179  %mul = call float @llvm.amdgcn.fmul.legacy(float %fneg.a, float %fneg.b)3180  %fneg = fneg float %mul3181  ret float %fneg3182}3183 3184define { float, float } @v_fneg_mul_legacy_store_use_fneg_x_f32(float %a, float %b) #0 {3185; GCN-LABEL: v_fneg_mul_legacy_store_use_fneg_x_f32:3186; GCN:       ; %bb.0:3187; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3188; GCN-NEXT:    v_xor_b32_e32 v2, 0x80000000, v03189; GCN-NEXT:    v_mul_legacy_f32_e32 v0, v0, v13190; GCN-NEXT:    v_mov_b32_e32 v1, v23191; GCN-NEXT:    s_setpc_b64 s[30:31]3192  %fneg.a = fneg float %a3193  %mul = call float @llvm.amdgcn.fmul.legacy(float %fneg.a, float %b)3194  %fneg = fneg float %mul3195 3196  %insert.0 = insertvalue { float, float } poison, float %fneg, 03197  %insert.1 = insertvalue { float, float } %insert.0, float %fneg.a, 13198  ret { float, float } %insert.13199}3200 3201define { float, float } @v_fneg_mul_legacy_multi_use_fneg_x_f32(float %a, float %b, float %c) #0 {3202; GCN-LABEL: v_fneg_mul_legacy_multi_use_fneg_x_f32:3203; GCN:       ; %bb.0:3204; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3205; GCN-NEXT:    v_mul_legacy_f32_e32 v3, v0, v13206; GCN-NEXT:    v_mul_legacy_f32_e64 v1, -v0, v23207; GCN-NEXT:    v_mov_b32_e32 v0, v33208; GCN-NEXT:    s_setpc_b64 s[30:31]3209  %fneg.a = fneg float %a3210  %mul = call float @llvm.amdgcn.fmul.legacy(float %fneg.a, float %b)3211  %fneg = fneg float %mul3212  %use1 = call float @llvm.amdgcn.fmul.legacy(float %fneg.a, float %c)3213  %insert.0 = insertvalue { float, float } poison, float %fneg, 03214  %insert.1 = insertvalue { float, float } %insert.0, float %use1, 13215  ret { float, float } %insert.13216}3217 3218; --------------------------------------------------------------------------------3219; sin tests3220; --------------------------------------------------------------------------------3221 3222define float @v_fneg_sin_f32(float %a) #0 {3223; GCN-LABEL: v_fneg_sin_f32:3224; GCN:       ; %bb.0:3225; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3226; GCN-NEXT:    v_mul_f32_e32 v0, 0xbe22f983, v03227; GCN-NEXT:    v_fract_f32_e32 v0, v03228; GCN-NEXT:    v_sin_f32_e32 v0, v03229; GCN-NEXT:    s_setpc_b64 s[30:31]3230  %sin = call float @llvm.sin.f32(float %a)3231  %fneg = fneg float %sin3232  ret float %fneg3233}3234 3235define float @v_fneg_amdgcn_sin_f32(float %a) #0 {3236; GCN-LABEL: v_fneg_amdgcn_sin_f32:3237; GCN:       ; %bb.0:3238; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3239; GCN-NEXT:    v_sin_f32_e64 v0, -v03240; GCN-NEXT:    s_setpc_b64 s[30:31]3241  %sin = call float @llvm.amdgcn.sin.f32(float %a)3242  %fneg = fneg float %sin3243  ret float %fneg3244}3245 3246; --------------------------------------------------------------------------------3247; ftrunc tests3248; --------------------------------------------------------------------------------3249 3250define float @v_fneg_trunc_f32(float %a) #0 {3251; GCN-LABEL: v_fneg_trunc_f32:3252; GCN:       ; %bb.0:3253; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3254; GCN-NEXT:    v_trunc_f32_e64 v0, -v03255; GCN-NEXT:    s_setpc_b64 s[30:31]3256  %trunc = call float @llvm.trunc.f32(float %a)3257  %fneg = fneg float %trunc3258  ret float %fneg3259}3260 3261; --------------------------------------------------------------------------------3262; fround tests3263; --------------------------------------------------------------------------------3264 3265define float @v_fneg_round_f32(float %a) #0 {3266; GCN-SAFE-LABEL: v_fneg_round_f32:3267; GCN-SAFE:       ; %bb.0:3268; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3269; GCN-SAFE-NEXT:    v_trunc_f32_e32 v1, v03270; GCN-SAFE-NEXT:    v_sub_f32_e32 v2, v0, v13271; GCN-SAFE-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v2|, 0.53272; GCN-SAFE-NEXT:    v_cndmask_b32_e64 v2, 0, 1.0, s[4:5]3273; GCN-SAFE-NEXT:    s_brev_b32 s4, -23274; GCN-SAFE-NEXT:    v_bfi_b32 v0, s4, v2, v03275; GCN-SAFE-NEXT:    v_add_f32_e32 v0, v1, v03276; GCN-SAFE-NEXT:    v_xor_b32_e32 v0, 0x80000000, v03277; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]3278;3279; GCN-NSZ-LABEL: v_fneg_round_f32:3280; GCN-NSZ:       ; %bb.0:3281; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3282; GCN-NSZ-NEXT:    v_trunc_f32_e32 v1, v03283; GCN-NSZ-NEXT:    v_sub_f32_e32 v2, v0, v13284; GCN-NSZ-NEXT:    v_cmp_ge_f32_e64 s[4:5], |v2|, 0.53285; GCN-NSZ-NEXT:    v_cndmask_b32_e64 v2, 0, 1.0, s[4:5]3286; GCN-NSZ-NEXT:    s_brev_b32 s4, -23287; GCN-NSZ-NEXT:    v_bfi_b32 v0, s4, v2, v03288; GCN-NSZ-NEXT:    v_sub_f32_e64 v0, -v1, v03289; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]3290  %round = call float @llvm.round.f32(float %a)3291  %fneg = fneg float %round3292  ret float %fneg3293}3294 3295; --------------------------------------------------------------------------------3296; rint tests3297; --------------------------------------------------------------------------------3298 3299define float @v_fneg_rint_f32(float %a) #0 {3300; GCN-LABEL: v_fneg_rint_f32:3301; GCN:       ; %bb.0:3302; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3303; GCN-NEXT:    v_rndne_f32_e64 v0, -v03304; GCN-NEXT:    s_setpc_b64 s[30:31]3305  %rint = call float @llvm.rint.f32(float %a)3306  %fneg = fneg float %rint3307  ret float %fneg3308}3309 3310; --------------------------------------------------------------------------------3311; nearbyint tests3312; --------------------------------------------------------------------------------3313 3314define float @v_fneg_nearbyint_f32(float %a) #0 {3315; GCN-LABEL: v_fneg_nearbyint_f32:3316; GCN:       ; %bb.0:3317; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3318; GCN-NEXT:    v_rndne_f32_e64 v0, -v03319; GCN-NEXT:    s_setpc_b64 s[30:31]3320  %nearbyint = call float @llvm.nearbyint.f32(float %a)3321  %fneg = fneg float %nearbyint3322  ret float %fneg3323}3324 3325; --------------------------------------------------------------------------------3326; fcanonicalize tests3327; --------------------------------------------------------------------------------3328 3329define float @v_fneg_canonicalize_f32(float %a) #0 {3330; GCN-LABEL: v_fneg_canonicalize_f32:3331; GCN:       ; %bb.0:3332; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3333; GCN-NEXT:    v_mul_f32_e32 v0, -1.0, v03334; GCN-NEXT:    s_setpc_b64 s[30:31]3335  %trunc = call float @llvm.canonicalize.f32(float %a)3336  %fneg = fneg float %trunc3337  ret float %fneg3338}3339 3340; --------------------------------------------------------------------------------3341; arithmetic.fence tests3342; --------------------------------------------------------------------------------3343 3344define float @v_fneg_arithmetic_fence_f32(float %a) #0 {3345; GCN-LABEL: v_fneg_arithmetic_fence_f32:3346; GCN:       ; %bb.0:3347; GCN-NEXT:    ;ARITH_FENCE3348; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3349; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v03350; GCN-NEXT:    s_setpc_b64 s[30:31]3351  %fence = call float @llvm.arithmetic.fence.f32(float %a)3352  %fneg = fneg float %fence3353  ret float %fneg3354}3355 3356define float @v_fneg_arithmetic_fence_fmul_f32(float %a, float %b) #0 {3357; GCN-LABEL: v_fneg_arithmetic_fence_fmul_f32:3358; GCN:       ; %bb.0:3359; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3360; GCN-NEXT:    v_mul_f32_e32 v0, v0, v13361; GCN-NEXT:    ;ARITH_FENCE3362; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v03363; GCN-NEXT:    s_setpc_b64 s[30:31]3364  %mul = fmul float %a, %b3365  %fence = call float @llvm.arithmetic.fence.f32(float %mul)3366  %fneg = fneg float %fence3367  ret float %fneg3368}3369 3370; --------------------------------------------------------------------------------3371; vintrp tests3372; --------------------------------------------------------------------------------3373 3374define { float, float } @v_fneg_interp_p1_f32(float %a, float %b) #0 {3375; SI-LABEL: v_fneg_interp_p1_f32:3376; SI:       ; %bb.0:3377; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3378; SI-NEXT:    v_mul_f32_e64 v1, v0, -v13379; SI-NEXT:    s_mov_b32 m0, 03380; SI-NEXT:    v_interp_p1_f32 v0, v1, attr0.x3381; SI-NEXT:    v_interp_p1_f32 v1, v1, attr0.y3382; SI-NEXT:    s_setpc_b64 s[30:31]3383;3384; VI-LABEL: v_fneg_interp_p1_f32:3385; VI:       ; %bb.0:3386; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3387; VI-NEXT:    v_mul_f32_e64 v1, v0, -v13388; VI-NEXT:    s_mov_b32 m0, 03389; VI-NEXT:    v_interp_p1_f32_e32 v0, v1, attr0.x3390; VI-NEXT:    v_interp_p1_f32_e32 v1, v1, attr0.y3391; VI-NEXT:    s_setpc_b64 s[30:31]3392  %mul = fmul float %a, %b3393  %fneg = fneg float %mul3394  %intrp0 = call float @llvm.amdgcn.interp.p1(float %fneg, i32 0, i32 0, i32 0)3395  %intrp1 = call float @llvm.amdgcn.interp.p1(float %fneg, i32 1, i32 0, i32 0)3396  %insert.0 = insertvalue { float, float } poison, float %intrp0, 03397  %insert.1 = insertvalue { float, float } %insert.0, float %intrp1, 13398  ret { float, float } %insert.13399}3400 3401define { float, float } @v_fneg_interp_p2_f32(float %a, float %b) #0 {3402; SI-LABEL: v_fneg_interp_p2_f32:3403; SI:       ; %bb.0:3404; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3405; SI-NEXT:    v_mul_f32_e64 v2, v0, -v13406; SI-NEXT:    v_mov_b32_e32 v1, 4.03407; SI-NEXT:    v_mov_b32_e32 v0, 4.03408; SI-NEXT:    s_mov_b32 m0, 03409; SI-NEXT:    v_interp_p2_f32 v0, v2, attr0.x3410; SI-NEXT:    v_interp_p2_f32 v1, v2, attr0.y3411; SI-NEXT:    s_setpc_b64 s[30:31]3412;3413; VI-LABEL: v_fneg_interp_p2_f32:3414; VI:       ; %bb.0:3415; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3416; VI-NEXT:    v_mul_f32_e64 v2, v0, -v13417; VI-NEXT:    v_mov_b32_e32 v1, 4.03418; VI-NEXT:    v_mov_b32_e32 v0, 4.03419; VI-NEXT:    s_mov_b32 m0, 03420; VI-NEXT:    v_interp_p2_f32_e32 v0, v2, attr0.x3421; VI-NEXT:    v_interp_p2_f32_e32 v1, v2, attr0.y3422; VI-NEXT:    s_setpc_b64 s[30:31]3423  %mul = fmul float %a, %b3424  %fneg = fneg float %mul3425  %intrp0 = call float @llvm.amdgcn.interp.p2(float 4.0, float %fneg, i32 0, i32 0, i32 0)3426  %intrp1 = call float @llvm.amdgcn.interp.p2(float 4.0, float %fneg, i32 1, i32 0, i32 0)3427  %insert.0 = insertvalue { float, float } poison, float %intrp0, 03428  %insert.1 = insertvalue { float, float } %insert.0, float %intrp1, 13429  ret { float, float } %insert.13430}3431 3432; --------------------------------------------------------------------------------3433; CopyToReg tests3434; --------------------------------------------------------------------------------3435 3436define void @v_fneg_copytoreg_f32(ptr addrspace(1) %out, float %a, float %b, float %c, i32 %d) #0 {3437; SI-LABEL: v_fneg_copytoreg_f32:3438; SI:       ; %bb.0:3439; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3440; SI-NEXT:    v_and_b32_e32 v6, 0x3ff, v313441; SI-NEXT:    v_lshlrev_b32_e32 v6, 2, v63442; SI-NEXT:    v_add_i32_e32 v0, vcc, v0, v63443; SI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc3444; SI-NEXT:    v_mul_f32_e32 v2, v2, v33445; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v53446; SI-NEXT:    s_and_saveexec_b64 s[4:5], vcc3447; SI-NEXT:    s_cbranch_execz .LBB192_23448; SI-NEXT:  ; %bb.1: ; %if3449; SI-NEXT:    v_mul_f32_e64 v3, -v2, v43450; SI-NEXT:    flat_store_dword v[0:1], v33451; SI-NEXT:    s_waitcnt vmcnt(0)3452; SI-NEXT:  .LBB192_2: ; %endif3453; SI-NEXT:    s_or_b64 exec, exec, s[4:5]3454; SI-NEXT:    flat_store_dword v[0:1], v23455; SI-NEXT:    s_waitcnt vmcnt(0)3456; SI-NEXT:    s_setpc_b64 s[30:31]3457;3458; VI-LABEL: v_fneg_copytoreg_f32:3459; VI:       ; %bb.0:3460; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3461; VI-NEXT:    v_and_b32_e32 v6, 0x3ff, v313462; VI-NEXT:    v_lshlrev_b32_e32 v6, 2, v63463; VI-NEXT:    v_add_u32_e32 v0, vcc, v0, v63464; VI-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc3465; VI-NEXT:    v_mul_f32_e32 v2, v2, v33466; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v53467; VI-NEXT:    s_and_saveexec_b64 s[4:5], vcc3468; VI-NEXT:    s_cbranch_execz .LBB192_23469; VI-NEXT:  ; %bb.1: ; %if3470; VI-NEXT:    v_mul_f32_e64 v3, -v2, v43471; VI-NEXT:    flat_store_dword v[0:1], v33472; VI-NEXT:    s_waitcnt vmcnt(0)3473; VI-NEXT:  .LBB192_2: ; %endif3474; VI-NEXT:    s_or_b64 exec, exec, s[4:5]3475; VI-NEXT:    flat_store_dword v[0:1], v23476; VI-NEXT:    s_waitcnt vmcnt(0)3477; VI-NEXT:    s_setpc_b64 s[30:31]3478  %tid = call i32 @llvm.amdgcn.workitem.id.x()3479  %tid.ext = sext i32 %tid to i643480  %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext3481  %mul = fmul float %a, %b3482  %fneg = fneg float %mul3483  %cmp0 = icmp eq i32 %d, 03484  br i1 %cmp0, label %if, label %endif3485 3486if:3487  %mul1 = fmul float %fneg, %c3488  store volatile float %mul1, ptr addrspace(1) %out.gep3489  br label %endif3490 3491endif:3492  store volatile float %mul, ptr addrspace(1) %out.gep3493  ret void3494}3495 3496; --------------------------------------------------------------------------------3497; inlineasm tests3498; --------------------------------------------------------------------------------3499 3500; Can't fold into use, so should fold into source3501define float @v_fneg_inlineasm_f32(float %a, float %b, float %c, i32 %d) #0 {3502; GCN-LABEL: v_fneg_inlineasm_f32:3503; GCN:       ; %bb.0:3504; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3505; GCN-NEXT:    v_mul_f32_e64 v0, v0, -v13506; GCN-NEXT:    ;;#ASMSTART3507; GCN-NEXT:    ; use v03508; GCN-NEXT:    ;;#ASMEND3509; GCN-NEXT:    s_setpc_b64 s[30:31]3510  %mul = fmul float %a, %b3511  %fneg = fneg float %mul3512  call void asm sideeffect "; use $0", "v"(float %fneg) #03513  ret float %fneg3514}3515 3516; --------------------------------------------------------------------------------3517; inlineasm tests3518; --------------------------------------------------------------------------------3519 3520; Can't fold into use, so should fold into source3521define float @v_fneg_inlineasm_multi_use_src_f32(ptr addrspace(1) %out, float %a, float %b, float %c, i32 %d) #0 {3522; GCN-LABEL: v_fneg_inlineasm_multi_use_src_f32:3523; GCN:       ; %bb.0:3524; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3525; GCN-NEXT:    v_mul_f32_e32 v0, v2, v33526; GCN-NEXT:    v_xor_b32_e32 v1, 0x80000000, v03527; GCN-NEXT:    ;;#ASMSTART3528; GCN-NEXT:    ; use v13529; GCN-NEXT:    ;;#ASMEND3530; GCN-NEXT:    s_setpc_b64 s[30:31]3531  %mul = fmul float %a, %b3532  %fneg = fneg float %mul3533  call void asm sideeffect "; use $0", "v"(float %fneg) #03534  ret float %mul3535}3536 3537; --------------------------------------------------------------------------------3538; code size regression tests3539; --------------------------------------------------------------------------------3540 3541; There are multiple users of the fneg that must use a VOP33542; instruction, so there is no penalty3543define { float, float } @multiuse_fneg_2_vop3_users_f32(float %a, float %b, float %c) #0 {3544; GCN-LABEL: multiuse_fneg_2_vop3_users_f32:3545; GCN:       ; %bb.0:3546; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3547; GCN-NEXT:    v_fma_f32 v3, -v0, v1, v23548; GCN-NEXT:    v_fma_f32 v1, -v0, v2, 2.03549; GCN-NEXT:    v_mov_b32_e32 v0, v33550; GCN-NEXT:    s_setpc_b64 s[30:31]3551  %fneg.a = fneg float %a3552  %fma0 = call float @llvm.fma.f32(float %fneg.a, float %b, float %c)3553  %fma1 = call float @llvm.fma.f32(float %fneg.a, float %c, float 2.0)3554  %insert.0 = insertvalue { float, float } poison, float %fma0, 03555  %insert.1 = insertvalue { float, float } %insert.0, float %fma1, 13556  ret { float, float } %insert.13557}3558 3559; There are multiple users, but both require using a larger encoding3560; for the modifier.3561define { float, float } @multiuse_fneg_2_vop2_users_f32(float %a, float %b, float %c) #0 {3562; GCN-LABEL: multiuse_fneg_2_vop2_users_f32:3563; GCN:       ; %bb.0:3564; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3565; GCN-NEXT:    v_mul_f32_e64 v3, -v0, v13566; GCN-NEXT:    v_mul_f32_e64 v1, -v0, v23567; GCN-NEXT:    v_mov_b32_e32 v0, v33568; GCN-NEXT:    s_setpc_b64 s[30:31]3569  %fneg.a = fneg float %a3570  %mul0 = fmul float %fneg.a, %b3571  %mul1 = fmul float %fneg.a, %c3572  %insert.0 = insertvalue { float, float } poison, float %mul0, 03573  %insert.1 = insertvalue { float, float } %insert.0, float %mul1, 13574  ret { float, float } %insert.13575}3576 3577; One user is VOP3 so has no cost to folding the modifier, the other does.3578define { float, float } @multiuse_fneg_vop2_vop3_users_f32(float %a, float %b, float %c) #0 {3579; GCN-LABEL: multiuse_fneg_vop2_vop3_users_f32:3580; GCN:       ; %bb.0:3581; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3582; GCN-NEXT:    v_fma_f32 v3, -v0, v1, 2.03583; GCN-NEXT:    v_mul_f32_e64 v1, -v0, v23584; GCN-NEXT:    v_mov_b32_e32 v0, v33585; GCN-NEXT:    s_setpc_b64 s[30:31]3586  %fneg.a = fneg float %a3587  %fma0 = call float @llvm.fma.f32(float %fneg.a, float %b, float 2.0)3588  %mul1 = fmul float %fneg.a, %c3589 3590  %insert.0 = insertvalue { float, float } poison, float %fma0, 03591  %insert.1 = insertvalue { float, float } %insert.0, float %mul1, 13592  ret { float, float } %insert.13593}3594 3595; The use of the fneg requires a code size increase, but folding into3596; the source does not3597define { float, float } @free_fold_src_code_size_cost_use_f32(ptr addrspace(1) %out, float %a, float %b, float %c, float %d) #0 {3598; GCN-SAFE-LABEL: free_fold_src_code_size_cost_use_f32:3599; GCN-SAFE:       ; %bb.0:3600; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3601; GCN-SAFE-NEXT:    v_fma_f32 v1, v2, v3, 2.03602; GCN-SAFE-NEXT:    v_mul_f32_e64 v0, -v1, v43603; GCN-SAFE-NEXT:    v_mul_f32_e64 v1, -v1, v53604; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]3605;3606; GCN-NSZ-LABEL: free_fold_src_code_size_cost_use_f32:3607; GCN-NSZ:       ; %bb.0:3608; GCN-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3609; GCN-NSZ-NEXT:    v_fma_f32 v1, v2, -v3, -2.03610; GCN-NSZ-NEXT:    v_mul_f32_e32 v0, v1, v43611; GCN-NSZ-NEXT:    v_mul_f32_e32 v1, v1, v53612; GCN-NSZ-NEXT:    s_setpc_b64 s[30:31]3613  %fma0 = call float @llvm.fma.f32(float %a, float %b, float 2.0)3614  %fneg.fma0 = fneg float %fma03615  %mul1 = fmul float %fneg.fma0, %c3616  %mul2 = fmul float %fneg.fma0, %d3617 3618  %insert.0 = insertvalue { float, float } poison, float %mul1, 03619  %insert.1 = insertvalue { float, float } %insert.0, float %mul2, 13620  ret { float, float } %insert.13621}3622 3623define { double, double } @free_fold_src_code_size_cost_use_f64(double %a, double %b, double %c, double %d) #0 {3624; GCN-LABEL: free_fold_src_code_size_cost_use_f64:3625; GCN:       ; %bb.0:3626; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3627; GCN-NEXT:    v_fma_f64 v[2:3], v[0:1], v[2:3], 2.03628; GCN-NEXT:    v_mul_f64 v[0:1], -v[2:3], v[4:5]3629; GCN-NEXT:    v_mul_f64 v[2:3], -v[2:3], v[6:7]3630; GCN-NEXT:    s_setpc_b64 s[30:31]3631  %fma0 = call double @llvm.fma.f64(double %a, double %b, double 2.0)3632  %fneg.fma0 = fneg double %fma03633  %mul1 = fmul double %fneg.fma0, %c3634  %mul2 = fmul double %fneg.fma0, %d3635 3636  %insert.0 = insertvalue { double, double } poison, double %mul1, 03637  %insert.1 = insertvalue { double, double } %insert.0, double %mul2, 13638  ret { double, double } %insert.13639}3640 3641; %trunc.a has one fneg use, but it requires a code size increase and3642; %the fneg can instead be folded for free into the fma.3643define float @one_use_cost_to_fold_into_src_f32(float %a, float %b, float %c, float %d) #0 {3644; GCN-LABEL: one_use_cost_to_fold_into_src_f32:3645; GCN:       ; %bb.0:3646; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3647; GCN-NEXT:    v_trunc_f32_e32 v0, v03648; GCN-NEXT:    v_fma_f32 v0, -v0, v1, v23649; GCN-NEXT:    s_setpc_b64 s[30:31]3650  %trunc.a = call float @llvm.trunc.f32(float %a)3651  %trunc.fneg.a = fneg float %trunc.a3652  %fma0 = call float @llvm.fma.f32(float %trunc.fneg.a, float %b, float %c)3653  ret float %fma03654}3655 3656define { float, float } @multi_use_cost_to_fold_into_src(float %a, float %b, float %c, float %d) #0 {3657; GCN-LABEL: multi_use_cost_to_fold_into_src:3658; GCN:       ; %bb.0:3659; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3660; GCN-NEXT:    v_trunc_f32_e32 v4, v03661; GCN-NEXT:    v_fma_f32 v0, -v4, v1, v23662; GCN-NEXT:    v_mul_f32_e32 v1, v4, v33663; GCN-NEXT:    s_setpc_b64 s[30:31]3664  %trunc.a = call float @llvm.trunc.f32(float %a)3665  %trunc.fneg.a = fneg float %trunc.a3666  %fma0 = call float @llvm.fma.f32(float %trunc.fneg.a, float %b, float %c)3667  %mul1 = fmul float %trunc.a, %d3668  %insert.0 = insertvalue { float, float } poison, float %fma0, 03669  %insert.1 = insertvalue { float, float } %insert.0, float %mul1, 13670  ret { float, float } %insert.13671}3672 3673; The AMDGPU combine to pull fneg into the FMA operands was being3674; undone by the generic combine to pull the fneg out of the fma if3675; !isFNegFree. We were reporting false for v2f32 even though it will3676; be split into f32 where it will be free.3677define <2 x float> @fneg_fma_fneg_dagcombine_loop(<2 x float> %arg, <2 x float> %arg1, <2 x float> %arg2) #0 {3678; GCN-LABEL: fneg_fma_fneg_dagcombine_loop:3679; GCN:       ; %bb.0: ; %bb3680; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3681; GCN-NEXT:    s_brev_b32 s4, 13682; GCN-NEXT:    v_fma_f32 v3, v3, -v5, s43683; GCN-NEXT:    v_fma_f32 v2, v2, -v4, s43684; GCN-NEXT:    v_sub_f32_e32 v1, v3, v13685; GCN-NEXT:    v_sub_f32_e32 v0, v2, v03686; GCN-NEXT:    v_mul_f32_e32 v0, v0, v43687; GCN-NEXT:    v_mul_f32_e32 v1, v1, v53688; GCN-NEXT:    s_setpc_b64 s[30:31]3689bb:3690  %i3 = call fast <2 x float> @llvm.fma.v2f32(<2 x float> %arg1, <2 x float> %arg2, <2 x float> zeroinitializer)3691  %i4 = fadd fast <2 x float> %i3, %arg3692  %i5 = fneg <2 x float> %i43693  %i6 = fmul fast <2 x float> %i5, %arg23694  ret <2 x float> %i63695}3696 3697; This expects denormal flushing, so can't turn this fmul into fneg3698; TODO: Keeping this as fmul saves encoding size3699define float @nnan_fmul_neg1_to_fneg(float %x, float %y) #0 {3700; GCN-LABEL: nnan_fmul_neg1_to_fneg:3701; GCN:       ; %bb.0:3702; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3703; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v13704; GCN-NEXT:    s_setpc_b64 s[30:31]3705  %mul = fmul float %x, -1.03706  %add = fmul nnan float %mul, %y3707  ret float %add3708}3709 3710; It's legal to turn this fmul into an fneg since denormals are3711; preserved and we know an snan can't happen from the flag.3712define float @denormal_fmul_neg1_to_fneg(float %x, float %y) {3713; GCN-LABEL: denormal_fmul_neg1_to_fneg:3714; GCN:       ; %bb.0:3715; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3716; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v13717; GCN-NEXT:    s_setpc_b64 s[30:31]3718  %mul = fmul nnan float %x, -1.03719  %add = fmul float %mul, %y3720  ret float %add3721}3722 3723; know the source can't be an snan3724define float @denorm_snan_fmul_neg1_to_fneg(float %x, float %y) {3725; GCN-LABEL: denorm_snan_fmul_neg1_to_fneg:3726; GCN:       ; %bb.0:3727; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3728; GCN-NEXT:    v_mul_f32_e64 v0, v0, -v03729; GCN-NEXT:    v_mul_f32_e32 v0, v0, v13730; GCN-NEXT:    s_setpc_b64 s[30:31]3731  %canonical = fmul float %x, %x3732  %mul = fmul float %canonical, -1.03733  %add = fmul float %mul, %y3734  ret float %add3735}3736 3737define float @flush_snan_fmul_neg1_to_fneg(float %x, float %y) #0 {3738; GCN-LABEL: flush_snan_fmul_neg1_to_fneg:3739; GCN:       ; %bb.0:3740; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3741; GCN-NEXT:    v_mul_f32_e32 v0, 1.0, v03742; GCN-NEXT:    v_mul_f32_e64 v0, -v0, v13743; GCN-NEXT:    s_setpc_b64 s[30:31]3744  %quiet = call float @llvm.canonicalize.f32(float %x)3745  %mul = fmul float %quiet, -1.03746  %add = fmul float %mul, %y3747  ret float %add3748}3749 3750define float @fadd_select_fneg_fneg_f32(i32 %arg0, float %x, float %y, float %z) {3751; GCN-LABEL: fadd_select_fneg_fneg_f32:3752; GCN:       ; %bb.0:3753; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3754; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v03755; GCN-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc3756; GCN-NEXT:    v_sub_f32_e32 v0, v3, v03757; GCN-NEXT:    s_setpc_b64 s[30:31]3758  %cmp = icmp eq i32 %arg0, 03759  %neg.x = fneg float %x3760  %neg.y  = fneg float %y3761  %select = select i1 %cmp, float %neg.x, float %neg.y3762  %add = fadd float %select, %z3763  ret float %add3764}3765 3766define double @fadd_select_fneg_fneg_f64(i32 %arg0, double %x, double %y, double %z) {3767; GCN-LABEL: fadd_select_fneg_fneg_f64:3768; GCN:       ; %bb.0:3769; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3770; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v03771; GCN-NEXT:    v_cndmask_b32_e32 v2, v4, v2, vcc3772; GCN-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc3773; GCN-NEXT:    v_add_f64 v[0:1], v[5:6], -v[1:2]3774; GCN-NEXT:    s_setpc_b64 s[30:31]3775  %cmp = icmp eq i32 %arg0, 03776  %neg.x = fneg double %x3777  %neg.y  = fneg double %y3778  %select = select i1 %cmp, double %neg.x, double %neg.y3779  %add = fadd double %select, %z3780  ret double %add3781}3782 3783define half @fadd_select_fneg_fneg_f16(i32 %arg0, half %x, half %y, half %z) {3784; SI-LABEL: fadd_select_fneg_fneg_f16:3785; SI:       ; %bb.0:3786; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3787; SI-NEXT:    v_cvt_f16_f32_e32 v1, v13788; SI-NEXT:    v_cvt_f16_f32_e32 v2, v23789; SI-NEXT:    v_cvt_f16_f32_e32 v3, v33790; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v03791; SI-NEXT:    v_cvt_f32_f16_e32 v1, v13792; SI-NEXT:    v_cvt_f32_f16_e32 v2, v23793; SI-NEXT:    v_cvt_f32_f16_e32 v3, v33794; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc3795; SI-NEXT:    v_sub_f32_e32 v0, v3, v03796; SI-NEXT:    s_setpc_b64 s[30:31]3797;3798; VI-LABEL: fadd_select_fneg_fneg_f16:3799; VI:       ; %bb.0:3800; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3801; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v03802; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc3803; VI-NEXT:    v_sub_f16_e32 v0, v3, v03804; VI-NEXT:    s_setpc_b64 s[30:31]3805  %cmp = icmp eq i32 %arg0, 03806  %neg.x = fneg half %x3807  %neg.y = fneg half %y3808  %select = select i1 %cmp, half %neg.x, half %neg.y3809  %add = fadd half %select, %z3810  ret half %add3811}3812 3813; FIXME: Terrible code for SI3814define <2 x half> @fadd_select_fneg_fneg_v2f16(i32 %arg0, <2 x half> %x, <2 x half> %y, <2 x half> %z) {3815; SI-LABEL: fadd_select_fneg_fneg_v2f16:3816; SI:       ; %bb.0:3817; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3818; SI-NEXT:    v_cvt_f16_f32_e32 v2, v23819; SI-NEXT:    v_cvt_f16_f32_e32 v1, v13820; SI-NEXT:    v_cvt_f16_f32_e32 v3, v33821; SI-NEXT:    v_cvt_f16_f32_e32 v5, v53822; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v23823; SI-NEXT:    v_or_b32_e32 v1, v1, v23824; SI-NEXT:    v_cvt_f16_f32_e32 v2, v43825; SI-NEXT:    v_cvt_f16_f32_e32 v4, v63826; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v03827; SI-NEXT:    v_lshlrev_b32_e32 v2, 16, v23828; SI-NEXT:    v_or_b32_e32 v2, v3, v23829; SI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc3830; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v03831; SI-NEXT:    v_cvt_f32_f16_e32 v3, v43832; SI-NEXT:    v_cvt_f32_f16_e32 v4, v53833; SI-NEXT:    v_cvt_f32_f16_e32 v0, v03834; SI-NEXT:    v_cvt_f32_f16_e32 v1, v13835; SI-NEXT:    v_sub_f32_e32 v0, v4, v03836; SI-NEXT:    v_sub_f32_e32 v1, v3, v13837; SI-NEXT:    s_setpc_b64 s[30:31]3838;3839; VI-LABEL: fadd_select_fneg_fneg_v2f16:3840; VI:       ; %bb.0:3841; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3842; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v03843; VI-NEXT:    v_cndmask_b32_e32 v0, v2, v1, vcc3844; VI-NEXT:    v_sub_f16_sdwa v1, v3, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13845; VI-NEXT:    v_sub_f16_e32 v0, v3, v03846; VI-NEXT:    v_or_b32_e32 v0, v0, v13847; VI-NEXT:    s_setpc_b64 s[30:31]3848  %cmp = icmp eq i32 %arg0, 03849  %neg.x = fneg <2 x half> %x3850  %neg.y = fneg <2 x half> %y3851  %select = select i1 %cmp, <2 x half> %neg.x, <2 x half> %neg.y3852  %add = fadd <2 x half> %select, %z3853  ret <2 x half> %add3854}3855 3856; --------------------------------------------------------------------------------3857; select tests3858; --------------------------------------------------------------------------------3859 3860define amdgpu_kernel void @s_fneg_select_infloop_regression_f32(float %arg, i1 %arg1, ptr addrspace(1) %ptr) {3861; SI-LABEL: s_fneg_select_infloop_regression_f32:3862; SI:       ; %bb.0:3863; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x93864; SI-NEXT:    s_waitcnt lgkmcnt(0)3865; SI-NEXT:    s_bitcmp1_b32 s1, 03866; SI-NEXT:    v_mov_b32_e32 v0, s03867; SI-NEXT:    s_cselect_b64 s[0:1], -1, 03868; SI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[0:1]3869; SI-NEXT:    v_cndmask_b32_e64 v2, -v0, 0, s[0:1]3870; SI-NEXT:    v_mov_b32_e32 v0, s23871; SI-NEXT:    v_mov_b32_e32 v1, s33872; SI-NEXT:    flat_store_dword v[0:1], v23873; SI-NEXT:    s_endpgm3874;3875; VI-LABEL: s_fneg_select_infloop_regression_f32:3876; VI:       ; %bb.0:3877; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x243878; VI-NEXT:    s_waitcnt lgkmcnt(0)3879; VI-NEXT:    s_bitcmp1_b32 s1, 03880; VI-NEXT:    v_mov_b32_e32 v0, s03881; VI-NEXT:    s_cselect_b64 s[0:1], -1, 03882; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[0:1]3883; VI-NEXT:    v_cndmask_b32_e64 v2, -v0, 0, s[0:1]3884; VI-NEXT:    v_mov_b32_e32 v0, s23885; VI-NEXT:    v_mov_b32_e32 v1, s33886; VI-NEXT:    flat_store_dword v[0:1], v23887; VI-NEXT:    s_endpgm3888  %i = select i1 %arg1, float 0.0, float %arg3889  %i2 = fneg float %i3890  %i3 = select i1 %arg1, float 0.0, float %i23891  store float %i3, ptr addrspace(1) %ptr, align 43892  ret void3893}3894 3895define float @v_fneg_select_infloop_regression_f32(float %arg, i1 %arg1) {3896; GCN-LABEL: v_fneg_select_infloop_regression_f32:3897; GCN:       ; %bb.0:3898; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3899; GCN-NEXT:    v_and_b32_e32 v1, 1, v13900; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13901; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc3902; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, 0, vcc3903; GCN-NEXT:    s_setpc_b64 s[30:31]3904  %i = select i1 %arg1, float 0.0, float %arg3905  %i2 = fneg float %i3906  %i3 = select i1 %arg1, float 0.0, float %i23907  ret float %i33908}3909 3910define float @v_fneg_select_infloop_regression_f32_commute0(float %arg, i1 %arg1) {3911; GCN-LABEL: v_fneg_select_infloop_regression_f32_commute0:3912; GCN:       ; %bb.0:3913; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3914; GCN-NEXT:    v_and_b32_e32 v1, 1, v13915; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13916; GCN-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc3917; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, 0, vcc3918; GCN-NEXT:    s_setpc_b64 s[30:31]3919  %i = select i1 %arg1, float %arg, float 0.03920  %i2 = fneg float %i3921  %i3 = select i1 %arg1, float 0.0, float %i23922  ret float %i33923}3924 3925define float @v_fneg_select_infloop_regression_f32_commute1(float %arg, i1 %arg1) {3926; GCN-LABEL: v_fneg_select_infloop_regression_f32_commute1:3927; GCN:       ; %bb.0:3928; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3929; GCN-NEXT:    v_and_b32_e32 v1, 1, v13930; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13931; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc3932; GCN-NEXT:    v_cndmask_b32_e64 v0, 0, -v0, vcc3933; GCN-NEXT:    s_setpc_b64 s[30:31]3934  %i = select i1 %arg1, float 0.0, float %arg3935  %i2 = fneg float %i3936  %i3 = select i1 %arg1, float %i2, float 0.03937  ret float %i33938}3939 3940define float @v_fneg_select_infloop_regression_f32_commute2(float %arg, i1 %arg1) {3941; GCN-LABEL: v_fneg_select_infloop_regression_f32_commute2:3942; GCN:       ; %bb.0:3943; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3944; GCN-NEXT:    v_and_b32_e32 v1, 1, v13945; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13946; GCN-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc3947; GCN-NEXT:    v_cndmask_b32_e64 v0, 0, -v0, vcc3948; GCN-NEXT:    s_setpc_b64 s[30:31]3949  %i = select i1 %arg1, float %arg, float 0.03950  %i2 = fneg float %i3951  %i3 = select i1 %arg1, float %i2, float 0.03952  ret float %i33953}3954 3955; Check with an inline constant that's equally cheap to negate3956define float @v_fneg_select_infloop_regression_inline_imm_f32(float %arg, i1 %arg1) {3957; GCN-LABEL: v_fneg_select_infloop_regression_inline_imm_f32:3958; GCN:       ; %bb.0:3959; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3960; GCN-NEXT:    v_and_b32_e32 v1, 1, v13961; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13962; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 2.0, vcc3963; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, 2.0, vcc3964; GCN-NEXT:    s_setpc_b64 s[30:31]3965  %i = select i1 %arg1, float 2.0, float %arg3966  %i2 = fneg float %i3967  %i3 = select i1 %arg1, float 2.0, float %i23968  ret float %i33969}3970 3971define float @v_fneg_select_infloop_regression_inline_imm_f32_commute0(float %arg, i1 %arg1) {3972; GCN-LABEL: v_fneg_select_infloop_regression_inline_imm_f32_commute0:3973; GCN:       ; %bb.0:3974; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3975; GCN-NEXT:    v_and_b32_e32 v1, 1, v13976; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13977; GCN-NEXT:    v_cndmask_b32_e32 v0, 2.0, v0, vcc3978; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, 2.0, vcc3979; GCN-NEXT:    s_setpc_b64 s[30:31]3980  %i = select i1 %arg1, float %arg, float 2.03981  %i2 = fneg float %i3982  %i3 = select i1 %arg1, float 2.0, float %i23983  ret float %i33984}3985 3986define float @v_fneg_select_infloop_regression_inline_imm_f32_commute1(float %arg, i1 %arg1) {3987; GCN-LABEL: v_fneg_select_infloop_regression_inline_imm_f32_commute1:3988; GCN:       ; %bb.0:3989; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3990; GCN-NEXT:    v_and_b32_e32 v1, 1, v13991; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v13992; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 2.0, vcc3993; GCN-NEXT:    v_cndmask_b32_e64 v0, 2.0, -v0, vcc3994; GCN-NEXT:    s_setpc_b64 s[30:31]3995  %i = select i1 %arg1, float 2.0, float %arg3996  %i2 = fneg float %i3997  %i3 = select i1 %arg1, float %i2, float 2.03998  ret float %i33999}4000 4001define float @v_fneg_select_infloop_regression_inline_imm_f32_commute2(float %arg, i1 %arg1) {4002; GCN-LABEL: v_fneg_select_infloop_regression_inline_imm_f32_commute2:4003; GCN:       ; %bb.0:4004; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4005; GCN-NEXT:    v_and_b32_e32 v1, 1, v14006; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14007; GCN-NEXT:    v_cndmask_b32_e32 v0, 2.0, v0, vcc4008; GCN-NEXT:    v_cndmask_b32_e64 v0, 2.0, -v0, vcc4009; GCN-NEXT:    s_setpc_b64 s[30:31]4010  %i = select i1 %arg1, float %arg, float 2.04011  %i2 = fneg float %i4012  %i3 = select i1 %arg1, float %i2, float 2.04013  ret float %i34014}4015 4016; Check with an inline constant that's equally cheap to negate4017define float @v_fneg_select_infloop_regression_neg_inline_imm_f32(float %arg, i1 %arg1) {4018; GCN-LABEL: v_fneg_select_infloop_regression_neg_inline_imm_f32:4019; GCN:       ; %bb.0:4020; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4021; GCN-NEXT:    v_and_b32_e32 v1, 1, v14022; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14023; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, -2.0, vcc4024; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, -2.0, vcc4025; GCN-NEXT:    s_setpc_b64 s[30:31]4026  %i = select i1 %arg1, float -2.0, float %arg4027  %i2 = fneg float %i4028  %i3 = select i1 %arg1, float -2.0, float %i24029  ret float %i34030}4031 4032define float @v_fneg_select_infloop_regression_neg_inline_imm_f32_commute0(float %arg, i1 %arg1) {4033; GCN-LABEL: v_fneg_select_infloop_regression_neg_inline_imm_f32_commute0:4034; GCN:       ; %bb.0:4035; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4036; GCN-NEXT:    v_and_b32_e32 v1, 1, v14037; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14038; GCN-NEXT:    v_cndmask_b32_e32 v0, -2.0, v0, vcc4039; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, -2.0, vcc4040; GCN-NEXT:    s_setpc_b64 s[30:31]4041  %i = select i1 %arg1, float %arg, float -2.04042  %i2 = fneg float %i4043  %i3 = select i1 %arg1, float -2.0, float %i24044  ret float %i34045}4046 4047define float @v_fneg_select_infloop_regression_neg_inline_imm_f32_commute1(float %arg, i1 %arg1) {4048; GCN-LABEL: v_fneg_select_infloop_regression_neg_inline_imm_f32_commute1:4049; GCN:       ; %bb.0:4050; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4051; GCN-NEXT:    v_and_b32_e32 v1, 1, v14052; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14053; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, -2.0, vcc4054; GCN-NEXT:    v_cndmask_b32_e64 v0, -2.0, -v0, vcc4055; GCN-NEXT:    s_setpc_b64 s[30:31]4056  %i = select i1 %arg1, float -2.0, float %arg4057  %i2 = fneg float %i4058  %i3 = select i1 %arg1, float %i2, float -2.04059  ret float %i34060}4061 4062define float @v_fneg_select_infloop_regression_neg_inline_imm_f32_commute2(float %arg, i1 %arg1) {4063; GCN-LABEL: v_fneg_select_infloop_regression_neg_inline_imm_f32_commute2:4064; GCN:       ; %bb.0:4065; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4066; GCN-NEXT:    v_and_b32_e32 v1, 1, v14067; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14068; GCN-NEXT:    v_cndmask_b32_e32 v0, -2.0, v0, vcc4069; GCN-NEXT:    v_cndmask_b32_e64 v0, -2.0, -v0, vcc4070; GCN-NEXT:    s_setpc_b64 s[30:31]4071  %i = select i1 %arg1, float %arg, float -2.04072  %i2 = fneg float %i4073  %i3 = select i1 %arg1, float %i2, float -2.04074  ret float %i34075}4076 4077define amdgpu_kernel void @s_fneg_select_infloop_regression_f64(double %arg, i1 %arg1, ptr addrspace(1) %ptr) {4078; SI-LABEL: s_fneg_select_infloop_regression_f64:4079; SI:       ; %bb.0:4080; SI-NEXT:    s_load_dword s6, s[4:5], 0xb4081; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x94082; SI-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0xd4083; SI-NEXT:    v_bfrev_b32_e32 v0, 14084; SI-NEXT:    s_waitcnt lgkmcnt(0)4085; SI-NEXT:    s_bitcmp1_b32 s6, 04086; SI-NEXT:    s_cselect_b64 s[4:5], -1, 04087; SI-NEXT:    v_mov_b32_e32 v1, s14088; SI-NEXT:    s_and_b64 s[6:7], s[4:5], exec4089; SI-NEXT:    v_cndmask_b32_e64 v0, -v1, v0, s[4:5]4090; SI-NEXT:    s_cselect_b32 s0, 0, s04091; SI-NEXT:    v_mov_b32_e32 v2, s24092; SI-NEXT:    v_cndmask_b32_e64 v1, v0, 0, s[4:5]4093; SI-NEXT:    v_mov_b32_e32 v0, s04094; SI-NEXT:    v_mov_b32_e32 v3, s34095; SI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]4096; SI-NEXT:    s_endpgm4097;4098; VI-LABEL: s_fneg_select_infloop_regression_f64:4099; VI:       ; %bb.0:4100; VI-NEXT:    s_load_dword s6, s[4:5], 0x2c4101; VI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x244102; VI-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0x344103; VI-NEXT:    v_bfrev_b32_e32 v0, 14104; VI-NEXT:    s_waitcnt lgkmcnt(0)4105; VI-NEXT:    s_bitcmp1_b32 s6, 04106; VI-NEXT:    s_cselect_b64 s[4:5], -1, 04107; VI-NEXT:    v_mov_b32_e32 v1, s14108; VI-NEXT:    s_and_b64 s[6:7], s[4:5], exec4109; VI-NEXT:    v_cndmask_b32_e64 v0, -v1, v0, s[4:5]4110; VI-NEXT:    s_cselect_b32 s0, 0, s04111; VI-NEXT:    v_mov_b32_e32 v2, s24112; VI-NEXT:    v_cndmask_b32_e64 v1, v0, 0, s[4:5]4113; VI-NEXT:    v_mov_b32_e32 v0, s04114; VI-NEXT:    v_mov_b32_e32 v3, s34115; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]4116; VI-NEXT:    s_endpgm4117  %i = select i1 %arg1, double 0.0, double %arg4118  %i2 = fneg double %i4119  %i3 = select i1 %arg1, double 0.0, double %i24120  store double %i3, ptr addrspace(1) %ptr, align 44121  ret void4122}4123 4124define double @v_fneg_select_infloop_regression_f64(double %arg, i1 %arg1) {4125; GCN-LABEL: v_fneg_select_infloop_regression_f64:4126; GCN:       ; %bb.0:4127; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4128; GCN-NEXT:    v_and_b32_e32 v2, 1, v24129; GCN-NEXT:    v_bfrev_b32_e32 v3, 14130; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v24131; GCN-NEXT:    v_cndmask_b32_e64 v1, -v1, v3, vcc4132; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4133; GCN-NEXT:    v_cndmask_b32_e64 v1, v1, 0, vcc4134; GCN-NEXT:    s_setpc_b64 s[30:31]4135  %i = select i1 %arg1, double 0.0, double %arg4136  %i2 = fneg double %i4137  %i3 = select i1 %arg1, double 0.0, double %i24138  ret double %i34139}4140 4141define amdgpu_kernel void @s_fneg_select_infloop_regression_f16(half %arg, i1 %arg1, ptr addrspace(1) %ptr) {4142; SI-LABEL: s_fneg_select_infloop_regression_f16:4143; SI:       ; %bb.0:4144; SI-NEXT:    s_load_dword s2, s[4:5], 0x94145; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0xb4146; SI-NEXT:    s_waitcnt lgkmcnt(0)4147; SI-NEXT:    v_cvt_f32_f16_e32 v0, s24148; SI-NEXT:    s_bitcmp1_b32 s2, 164149; SI-NEXT:    s_cselect_b64 s[2:3], -1, 04150; SI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[2:3]4151; SI-NEXT:    v_cndmask_b32_e64 v0, -v0, 0, s[2:3]4152; SI-NEXT:    v_cvt_f16_f32_e32 v2, v04153; SI-NEXT:    v_mov_b32_e32 v0, s04154; SI-NEXT:    v_mov_b32_e32 v1, s14155; SI-NEXT:    flat_store_short v[0:1], v24156; SI-NEXT:    s_endpgm4157;4158; VI-LABEL: s_fneg_select_infloop_regression_f16:4159; VI:       ; %bb.0:4160; VI-NEXT:    s_load_dword s2, s[4:5], 0x244161; VI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2c4162; VI-NEXT:    s_waitcnt lgkmcnt(0)4163; VI-NEXT:    s_bitcmp1_b32 s2, 164164; VI-NEXT:    v_mov_b32_e32 v0, s24165; VI-NEXT:    s_cselect_b64 s[2:3], -1, 04166; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[2:3]4167; VI-NEXT:    v_xor_b32_e32 v0, 0x8000, v04168; VI-NEXT:    v_cndmask_b32_e64 v2, v0, 0, s[2:3]4169; VI-NEXT:    v_mov_b32_e32 v0, s04170; VI-NEXT:    v_mov_b32_e32 v1, s14171; VI-NEXT:    flat_store_short v[0:1], v24172; VI-NEXT:    s_endpgm4173  %i = select i1 %arg1, half 0.0, half %arg4174  %i2 = fneg half %i4175  %i3 = select i1 %arg1, half 0.0, half %i24176  store half %i3, ptr addrspace(1) %ptr, align 44177  ret void4178}4179 4180define half @v_fneg_select_infloop_regression_f16(half %arg, i1 %arg1) {4181; SI-LABEL: v_fneg_select_infloop_regression_f16:4182; SI:       ; %bb.0:4183; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4184; SI-NEXT:    v_cvt_f16_f32_e32 v0, v04185; SI-NEXT:    v_and_b32_e32 v1, 1, v14186; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14187; SI-NEXT:    v_cvt_f32_f16_e32 v0, v04188; SI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4189; SI-NEXT:    v_cndmask_b32_e64 v0, -v0, 0, vcc4190; SI-NEXT:    s_setpc_b64 s[30:31]4191;4192; VI-LABEL: v_fneg_select_infloop_regression_f16:4193; VI:       ; %bb.0:4194; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4195; VI-NEXT:    v_and_b32_e32 v1, 1, v14196; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14197; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4198; VI-NEXT:    v_xor_b32_e32 v0, 0x8000, v04199; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4200; VI-NEXT:    s_setpc_b64 s[30:31]4201  %i = select i1 %arg1, half 0.0, half %arg4202  %i2 = fneg half %i4203  %i3 = select i1 %arg1, half 0.0, half %i24204  ret half %i34205}4206 4207define amdgpu_kernel void @s_fneg_select_infloop_regression_v2f16(<2 x half> %arg, i1 %arg1, ptr addrspace(1) %ptr) {4208; SI-LABEL: s_fneg_select_infloop_regression_v2f16:4209; SI:       ; %bb.0:4210; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x94211; SI-NEXT:    s_waitcnt lgkmcnt(0)4212; SI-NEXT:    s_and_b32 s1, 1, s14213; SI-NEXT:    s_cselect_b32 s0, 0, s04214; SI-NEXT:    s_xor_b32 s0, s0, 0x800080004215; SI-NEXT:    s_cmp_eq_u32 s1, 14216; SI-NEXT:    s_cselect_b32 s0, 0, s04217; SI-NEXT:    v_mov_b32_e32 v0, s24218; SI-NEXT:    v_mov_b32_e32 v1, s34219; SI-NEXT:    v_mov_b32_e32 v2, s04220; SI-NEXT:    flat_store_dword v[0:1], v24221; SI-NEXT:    s_endpgm4222;4223; VI-LABEL: s_fneg_select_infloop_regression_v2f16:4224; VI:       ; %bb.0:4225; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x244226; VI-NEXT:    s_waitcnt lgkmcnt(0)4227; VI-NEXT:    s_and_b32 s1, 1, s14228; VI-NEXT:    s_cselect_b32 s0, 0, s04229; VI-NEXT:    s_xor_b32 s0, s0, 0x800080004230; VI-NEXT:    s_cmp_eq_u32 s1, 14231; VI-NEXT:    s_cselect_b32 s0, 0, s04232; VI-NEXT:    v_mov_b32_e32 v0, s24233; VI-NEXT:    v_mov_b32_e32 v1, s34234; VI-NEXT:    v_mov_b32_e32 v2, s04235; VI-NEXT:    flat_store_dword v[0:1], v24236; VI-NEXT:    s_endpgm4237  %i = select i1 %arg1, <2 x half> zeroinitializer, <2 x half> %arg4238  %i2 = fneg <2 x half> %i4239  %i3 = select i1 %arg1, <2 x half> zeroinitializer, <2 x half> %i24240  store <2 x half> %i3, ptr addrspace(1) %ptr, align 44241  ret void4242}4243 4244define <2 x half> @v_fneg_select_infloop_regression_v2f16(<2 x half> %arg, i1 %arg1) {4245; SI-LABEL: v_fneg_select_infloop_regression_v2f16:4246; SI:       ; %bb.0:4247; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4248; SI-NEXT:    v_cvt_f16_f32_e32 v1, v14249; SI-NEXT:    v_cvt_f16_f32_e32 v0, v04250; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v14251; SI-NEXT:    v_or_b32_e32 v0, v0, v14252; SI-NEXT:    v_and_b32_e32 v1, 1, v24253; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14254; SI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4255; SI-NEXT:    v_xor_b32_e32 v0, 0x80008000, v04256; SI-NEXT:    v_cndmask_b32_e64 v1, v0, 0, vcc4257; SI-NEXT:    v_cvt_f32_f16_e32 v0, v14258; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v14259; SI-NEXT:    v_cvt_f32_f16_e32 v1, v14260; SI-NEXT:    s_setpc_b64 s[30:31]4261;4262; VI-LABEL: v_fneg_select_infloop_regression_v2f16:4263; VI:       ; %bb.0:4264; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4265; VI-NEXT:    v_and_b32_e32 v1, 1, v14266; VI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14267; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4268; VI-NEXT:    v_xor_b32_e32 v0, 0x80008000, v04269; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4270; VI-NEXT:    s_setpc_b64 s[30:31]4271  %i = select i1 %arg1, <2 x half> zeroinitializer, <2 x half> %arg4272  %i2 = fneg <2 x half> %i4273  %i3 = select i1 %arg1, <2 x half> zeroinitializer, <2 x half> %i24274  ret <2 x half> %i34275}4276 4277define amdgpu_kernel void @s_fneg_select_infloop_regression_v2f32(<2 x float> %arg, i1 %arg1, ptr addrspace(1) %ptr) {4278; SI-LABEL: s_fneg_select_infloop_regression_v2f32:4279; SI:       ; %bb.0:4280; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x94281; SI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0xd4282; SI-NEXT:    v_bfrev_b32_e32 v0, 14283; SI-NEXT:    s_waitcnt lgkmcnt(0)4284; SI-NEXT:    s_bitcmp1_b32 s2, 04285; SI-NEXT:    v_mov_b32_e32 v1, s04286; SI-NEXT:    s_cselect_b64 s[2:3], -1, 04287; SI-NEXT:    v_cndmask_b32_e64 v2, -v1, v0, s[2:3]4288; SI-NEXT:    v_mov_b32_e32 v1, s14289; SI-NEXT:    v_cndmask_b32_e64 v0, -v1, v0, s[2:3]4290; SI-NEXT:    v_cndmask_b32_e64 v1, v0, 0, s[2:3]4291; SI-NEXT:    v_cndmask_b32_e64 v0, v2, 0, s[2:3]4292; SI-NEXT:    v_mov_b32_e32 v2, s44293; SI-NEXT:    v_mov_b32_e32 v3, s54294; SI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]4295; SI-NEXT:    s_endpgm4296;4297; VI-LABEL: s_fneg_select_infloop_regression_v2f32:4298; VI:       ; %bb.0:4299; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x244300; VI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x344301; VI-NEXT:    v_bfrev_b32_e32 v0, 14302; VI-NEXT:    s_waitcnt lgkmcnt(0)4303; VI-NEXT:    s_bitcmp1_b32 s2, 04304; VI-NEXT:    v_mov_b32_e32 v1, s04305; VI-NEXT:    s_cselect_b64 s[2:3], -1, 04306; VI-NEXT:    v_cndmask_b32_e64 v2, -v1, v0, s[2:3]4307; VI-NEXT:    v_mov_b32_e32 v1, s14308; VI-NEXT:    v_cndmask_b32_e64 v0, -v1, v0, s[2:3]4309; VI-NEXT:    v_cndmask_b32_e64 v1, v0, 0, s[2:3]4310; VI-NEXT:    v_cndmask_b32_e64 v0, v2, 0, s[2:3]4311; VI-NEXT:    v_mov_b32_e32 v2, s44312; VI-NEXT:    v_mov_b32_e32 v3, s54313; VI-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]4314; VI-NEXT:    s_endpgm4315  %i = select i1 %arg1, <2 x float> zeroinitializer, <2 x float> %arg4316  %i2 = fneg <2 x float> %i4317  %i3 = select i1 %arg1, <2 x float> zeroinitializer, <2 x float> %i24318  store <2 x float> %i3, ptr addrspace(1) %ptr, align 44319  ret void4320}4321 4322define <2 x float> @v_fneg_select_infloop_regression_v2f32(<2 x float> %arg, i1 %arg1) {4323; GCN-LABEL: v_fneg_select_infloop_regression_v2f32:4324; GCN:       ; %bb.0:4325; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4326; GCN-NEXT:    v_and_b32_e32 v2, 1, v24327; GCN-NEXT:    v_bfrev_b32_e32 v3, 14328; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v24329; GCN-NEXT:    v_cndmask_b32_e64 v1, -v1, v3, vcc4330; GCN-NEXT:    v_cndmask_b32_e64 v0, -v0, v3, vcc4331; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4332; GCN-NEXT:    v_cndmask_b32_e64 v1, v1, 0, vcc4333; GCN-NEXT:    s_setpc_b64 s[30:31]4334  %i = select i1 %arg1, <2 x float> zeroinitializer, <2 x float> %arg4335  %i2 = fneg <2 x float> %i4336  %i3 = select i1 %arg1, <2 x float> zeroinitializer, <2 x float> %i24337  ret <2 x float> %i34338}4339 4340define amdgpu_kernel void @s_fabs_select_infloop_regression_f32(float %arg, i1 %arg1, ptr addrspace(1) %ptr) {4341; SI-LABEL: s_fabs_select_infloop_regression_f32:4342; SI:       ; %bb.0:4343; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x94344; SI-NEXT:    s_waitcnt lgkmcnt(0)4345; SI-NEXT:    s_bitcmp1_b32 s1, 04346; SI-NEXT:    v_mov_b32_e32 v0, s04347; SI-NEXT:    s_cselect_b64 s[0:1], -1, 04348; SI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[0:1]4349; SI-NEXT:    v_cndmask_b32_e64 v2, |v0|, 0, s[0:1]4350; SI-NEXT:    v_mov_b32_e32 v0, s24351; SI-NEXT:    v_mov_b32_e32 v1, s34352; SI-NEXT:    flat_store_dword v[0:1], v24353; SI-NEXT:    s_endpgm4354;4355; VI-LABEL: s_fabs_select_infloop_regression_f32:4356; VI:       ; %bb.0:4357; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x244358; VI-NEXT:    s_waitcnt lgkmcnt(0)4359; VI-NEXT:    s_bitcmp1_b32 s1, 04360; VI-NEXT:    v_mov_b32_e32 v0, s04361; VI-NEXT:    s_cselect_b64 s[0:1], -1, 04362; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[0:1]4363; VI-NEXT:    v_cndmask_b32_e64 v2, |v0|, 0, s[0:1]4364; VI-NEXT:    v_mov_b32_e32 v0, s24365; VI-NEXT:    v_mov_b32_e32 v1, s34366; VI-NEXT:    flat_store_dword v[0:1], v24367; VI-NEXT:    s_endpgm4368  %i = select i1 %arg1, float 0.0, float %arg4369  %i2 = call float @llvm.fabs.f32(float %i)4370  %i3 = select i1 %arg1, float 0.0, float %i24371  store float %i3, ptr addrspace(1) %ptr, align 44372  ret void4373}4374 4375define float @v_fabs_select_infloop_regression_f32(float %arg, i1 %arg1) {4376; GCN-LABEL: v_fabs_select_infloop_regression_f32:4377; GCN:       ; %bb.0:4378; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4379; GCN-NEXT:    v_and_b32_e32 v1, 1, v14380; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14381; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4382; GCN-NEXT:    v_cndmask_b32_e64 v0, |v0|, 0, vcc4383; GCN-NEXT:    s_setpc_b64 s[30:31]4384  %i = select i1 %arg1, float 0.0, float %arg4385  %i2 = call float @llvm.fabs.f32(float %i)4386  %i3 = select i1 %arg1, float 0.0, float %i24387  ret float %i34388}4389 4390define amdgpu_kernel void @s_fneg_fabs_select_infloop_regression(float %arg, i1 %arg1, ptr addrspace(1) %ptr) {4391; SI-LABEL: s_fneg_fabs_select_infloop_regression:4392; SI:       ; %bb.0:4393; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x94394; SI-NEXT:    s_waitcnt lgkmcnt(0)4395; SI-NEXT:    s_bitcmp1_b32 s1, 04396; SI-NEXT:    v_mov_b32_e32 v0, s04397; SI-NEXT:    s_cselect_b64 s[0:1], -1, 04398; SI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[0:1]4399; SI-NEXT:    v_cndmask_b32_e64 v2, -|v0|, 0, s[0:1]4400; SI-NEXT:    v_mov_b32_e32 v0, s24401; SI-NEXT:    v_mov_b32_e32 v1, s34402; SI-NEXT:    flat_store_dword v[0:1], v24403; SI-NEXT:    s_endpgm4404;4405; VI-LABEL: s_fneg_fabs_select_infloop_regression:4406; VI:       ; %bb.0:4407; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x244408; VI-NEXT:    s_waitcnt lgkmcnt(0)4409; VI-NEXT:    s_bitcmp1_b32 s1, 04410; VI-NEXT:    v_mov_b32_e32 v0, s04411; VI-NEXT:    s_cselect_b64 s[0:1], -1, 04412; VI-NEXT:    v_cndmask_b32_e64 v0, v0, 0, s[0:1]4413; VI-NEXT:    v_cndmask_b32_e64 v2, -|v0|, 0, s[0:1]4414; VI-NEXT:    v_mov_b32_e32 v0, s24415; VI-NEXT:    v_mov_b32_e32 v1, s34416; VI-NEXT:    flat_store_dword v[0:1], v24417; VI-NEXT:    s_endpgm4418  %i = select i1 %arg1, float 0.0, float %arg4419  %i2 = call float @llvm.fabs.f32(float %i)4420  %neg.i2 = fneg float %i24421  %i3 = select i1 %arg1, float 0.0, float %neg.i24422  store float %i3, ptr addrspace(1) %ptr, align 44423  ret void4424}4425 4426define float @v_fneg_fabs_select_infloop_regression(float %arg, i1 %arg1) {4427; GCN-LABEL: v_fneg_fabs_select_infloop_regression:4428; GCN:       ; %bb.0:4429; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4430; GCN-NEXT:    v_and_b32_e32 v1, 1, v14431; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v14432; GCN-NEXT:    v_cndmask_b32_e64 v0, v0, 0, vcc4433; GCN-NEXT:    v_cndmask_b32_e64 v0, -|v0|, 0, vcc4434; GCN-NEXT:    s_setpc_b64 s[30:31]4435  %i = select i1 %arg1, float 0.0, float %arg4436  %i2 = call float @llvm.fabs.f32(float %i)4437  %neg.i2 = fneg float %i24438  %i3 = select i1 %arg1, float 0.0, float %neg.i24439  ret float %i34440}4441 4442define float @v_fmul_0_fsub_0_safe_infloop_regression(float %arg) {4443; GCN-SAFE-LABEL: v_fmul_0_fsub_0_safe_infloop_regression:4444; GCN-SAFE:       ; %bb.0: ; %bb4445; GCN-SAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4446; GCN-SAFE-NEXT:    v_mul_f32_e32 v0, 0, v04447; GCN-SAFE-NEXT:    v_sub_f32_e32 v0, 0, v04448; GCN-SAFE-NEXT:    s_setpc_b64 s[30:31]4449;4450; SI-NSZ-LABEL: v_fmul_0_fsub_0_safe_infloop_regression:4451; SI-NSZ:       ; %bb.0: ; %bb4452; SI-NSZ-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4453; SI-NSZ-NEXT:    s_brev_b32 s4, 14454; SI-NSZ-NEXT:    v_fma_f32 v0, v0, s4, 04455; SI-NSZ-NEXT:    s_setpc_b64 s[30:31]4456; FIXME: utils/update_llc_test_checks.py will generate redundant VI4457; labels, remove them, they will cause test failure.4458bb:4459  %i = fmul float %arg, 0.04460  %i1 = fsub float 0.0, %i4461  ret float %i14462}4463 4464define float @v_fmul_0_fsub_0_nsz_infloop_regression(float %arg) {4465; GCN-LABEL: v_fmul_0_fsub_0_nsz_infloop_regression:4466; GCN:       ; %bb.0: ; %bb4467; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4468; GCN-NEXT:    v_mul_f32_e32 v0, 0x80000000, v04469; GCN-NEXT:    s_setpc_b64 s[30:31]4470bb:4471  %i = fmul float %arg, 0.04472  %i1 = fsub nsz float 0.0, %i4473  ret float %i14474}4475 4476declare i32 @llvm.amdgcn.workitem.id.x() #14477declare float @llvm.fma.f32(float, float, float) #14478declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>)4479declare float @llvm.fmuladd.f32(float, float, float) #14480declare <4 x float> @llvm.fmuladd.v4f32(<4 x float>, <4 x float>, <4 x float>) #14481declare float @llvm.fabs.f32(float) #14482declare float @llvm.sin.f32(float) #14483declare float @llvm.trunc.f32(float) #14484declare float @llvm.round.f32(float) #14485declare float @llvm.rint.f32(float) #14486declare float @llvm.nearbyint.f32(float) #14487declare float @llvm.roundeven.f32(float) #14488declare float @llvm.canonicalize.f32(float) #14489declare float @llvm.arithmetic.fence.f32(float) #14490declare float @llvm.minnum.f32(float, float) #14491declare float @llvm.maxnum.f32(float, float) #14492declare double @llvm.minnum.f64(double, double) #14493declare double @llvm.fma.f64(double, double, double) #14494 4495declare float @llvm.amdgcn.sin.f32(float) #14496declare float @llvm.amdgcn.rcp.f32(float) #14497declare float @llvm.amdgcn.rcp.legacy(float) #14498declare float @llvm.amdgcn.fmul.legacy(float, float) #14499declare float @llvm.amdgcn.interp.p1(float, i32, i32, i32) #04500declare float @llvm.amdgcn.interp.p2(float, float, i32, i32, i32) #04501 4502declare half @llvm.fma.f16(half, half, half) #14503declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>)4504declare half @llvm.fmuladd.f16(half, half, half) #14505declare <4 x half> @llvm.fmuladd.v4f16(<4 x half>, <4 x half>, <4 x half>) #14506declare half @llvm.sin.f16(half) #14507declare half @llvm.trunc.f16(half) #14508declare half @llvm.round.f16(half) #14509declare half @llvm.rint.f16(half) #14510declare half @llvm.nearbyint.f16(half) #14511declare half @llvm.canonicalize.f16(half) #14512declare half @llvm.minnum.f16(half, half) #14513declare half @llvm.maxnum.f16(half, half) #14514declare half @llvm.amdgcn.sin.f16(half) #14515declare half @llvm.amdgcn.rcp.f16(half) #14516 4517attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }4518attributes #1 = { nounwind readnone }4519attributes #2 = { nounwind }4520attributes #3 = { nounwind "no-signed-zeros-fp-math"="true" }4521attributes #4 = { nounwind "amdgpu-ieee"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" }4522