1322 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=CHECK,SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=CHECK,GISEL %s4 5; Test that fneg is folded into source modifiers when it wasn't6; possible to fold fsub to fneg without context.7 8define float @no_fold_f32_fsub_into_fneg_modifier_ieee_pos1(float %v0, float %v1) #0 {9; CHECK-LABEL: no_fold_f32_fsub_into_fneg_modifier_ieee_pos1:10; CHECK: ; %bb.0:11; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; CHECK-NEXT: v_sub_f32_e32 v0, 1.0, v013; CHECK-NEXT: v_mul_f32_e32 v0, v0, v114; CHECK-NEXT: s_setpc_b64 s[30:31]15 %sub = fsub float 1.0, %v016 %mul = fmul float %sub, %v117 ret float %mul18}19 20define float @no_fold_f32_fsub_into_fneg_modifier_daz_pos1(float %v0, float %v1) #1 {21; CHECK-LABEL: no_fold_f32_fsub_into_fneg_modifier_daz_pos1:22; CHECK: ; %bb.0:23; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)24; CHECK-NEXT: v_sub_f32_e32 v0, 1.0, v025; CHECK-NEXT: v_mul_f32_e32 v0, v0, v126; CHECK-NEXT: s_setpc_b64 s[30:31]27 %sub = fsub float 1.0, %v028 %mul = fmul float %sub, %v129 ret float %mul30}31 32define float @no_fold_f32_fsub_into_fneg_modifier_ieee_commuted(float %v0, float %v1) #0 {33; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_ieee_commuted:34; SDAG: ; %bb.0:35; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)36; SDAG-NEXT: v_add_f32_e32 v0, 0, v037; SDAG-NEXT: v_mul_f32_e32 v0, v0, v138; SDAG-NEXT: s_setpc_b64 s[30:31]39;40; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_ieee_commuted:41; GISEL: ; %bb.0:42; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)43; GISEL-NEXT: v_subrev_f32_e32 v0, 0x80000000, v044; GISEL-NEXT: v_mul_f32_e32 v0, v0, v145; GISEL-NEXT: s_setpc_b64 s[30:31]46 %sub = fsub float %v0, -0.047 %mul = fmul float %sub, %v148 ret float %mul49}50 51define float @fold_f32_fsub_into_fneg_modifier_ieee_pos0(float %v0, float %v1) #0 {52; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_pos0:53; SDAG: ; %bb.0:54; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)55; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v156; SDAG-NEXT: s_setpc_b64 s[30:31]57;58; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_pos0:59; GISEL: ; %bb.0:60; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)61; GISEL-NEXT: v_sub_f32_e32 v0, 0, v062; GISEL-NEXT: v_mul_f32_e32 v0, v0, v163; GISEL-NEXT: s_setpc_b64 s[30:31]64 %sub = fsub float 0.0, %v065 %mul = fmul float %sub, %v166 ret float %mul67}68 69define float @fold_f32_fsub_into_fneg_modifier_daz_pos0(float %v0, float %v1) #1 {70; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_daz_pos0:71; SDAG: ; %bb.0:72; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)73; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v174; SDAG-NEXT: s_setpc_b64 s[30:31]75;76; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_daz_pos0:77; GISEL: ; %bb.0:78; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)79; GISEL-NEXT: v_sub_f32_e32 v0, 0, v080; GISEL-NEXT: v_mul_f32_e32 v0, v0, v181; GISEL-NEXT: s_setpc_b64 s[30:31]82 %sub = fsub float 0.0, %v083 %mul = fmul float %sub, %v184 ret float %mul85}86 87define float @no_fold_f32_fsub_into_fneg_modifier_daz_commuted(float %v0, float %v1) #1 {88; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_daz_commuted:89; SDAG: ; %bb.0:90; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)91; SDAG-NEXT: v_add_f32_e32 v0, 0, v092; SDAG-NEXT: v_mul_f32_e32 v0, v0, v193; SDAG-NEXT: s_setpc_b64 s[30:31]94;95; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_daz_commuted:96; GISEL: ; %bb.0:97; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)98; GISEL-NEXT: v_subrev_f32_e32 v0, 0x80000000, v099; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1100; GISEL-NEXT: s_setpc_b64 s[30:31]101 %sub = fsub float %v0, -0.0102 %mul = fmul float %sub, %v1103 ret float %mul104}105 106define float @fold_f32_fsub_into_fneg_modifier_ieee(float %v0, float %v1) #0 {107; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_ieee:108; SDAG: ; %bb.0:109; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)110; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1111; SDAG-NEXT: s_setpc_b64 s[30:31]112;113; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_ieee:114; GISEL: ; %bb.0:115; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)116; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0117; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1118; GISEL-NEXT: s_setpc_b64 s[30:31]119 %sub = fsub float -0.0, %v0120 %mul = fmul float %sub, %v1121 ret float %mul122}123 124define float @fold_f32_fsub_into_fneg_modifier_daz(float %v0, float %v1) #1 {125; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_daz:126; SDAG: ; %bb.0:127; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1129; SDAG-NEXT: s_setpc_b64 s[30:31]130;131; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_daz:132; GISEL: ; %bb.0:133; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)134; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0135; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1136; GISEL-NEXT: s_setpc_b64 s[30:31]137 %sub = fsub float -0.0, %v0138 %mul = fmul float %sub, %v1139 ret float %mul140}141 142define float @fold_f32_fsub_into_fneg_modifier_ieee_nsz(float %v0, float %v1) #0 {143; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_nsz:144; SDAG: ; %bb.0:145; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)146; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1147; SDAG-NEXT: s_setpc_b64 s[30:31]148;149; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_nsz:150; GISEL: ; %bb.0:151; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)152; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0153; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1154; GISEL-NEXT: s_setpc_b64 s[30:31]155 %sub = fsub nsz float -0.0, %v0156 %mul = fmul nsz float %sub, %v1157 ret float %mul158}159 160define float @fold_f32_fsub_into_fneg_modifier_daz_nsz(float %v0, float %v1) #1 {161; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_daz_nsz:162; SDAG: ; %bb.0:163; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)164; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1165; SDAG-NEXT: s_setpc_b64 s[30:31]166;167; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_daz_nsz:168; GISEL: ; %bb.0:169; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)170; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0171; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1172; GISEL-NEXT: s_setpc_b64 s[30:31]173 %sub = fsub nsz float -0.0, %v0174 %mul = fmul nsz float %sub, %v1175 ret float %mul176}177 178define float @fold_f32_fsub_into_fneg_modifier_dynamic(float %v0, float %v1) #2 {179; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic:180; SDAG: ; %bb.0:181; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)182; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1183; SDAG-NEXT: s_setpc_b64 s[30:31]184;185; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic:186; GISEL: ; %bb.0:187; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)188; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0189; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1190; GISEL-NEXT: s_setpc_b64 s[30:31]191 %sub = fsub float -0.0, %v0192 %mul = fmul float %sub, %v1193 ret float %mul194}195 196define float @fold_f32_fsub_into_fneg_modifier_dynamic_nsz(float %v0, float %v1) #2 {197; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic_nsz:198; SDAG: ; %bb.0:199; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)200; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1201; SDAG-NEXT: s_setpc_b64 s[30:31]202;203; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic_nsz:204; GISEL: ; %bb.0:205; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)206; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0207; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1208; GISEL-NEXT: s_setpc_b64 s[30:31]209 %sub = fsub nsz float -0.0, %v0210 %mul = fmul nsz float %sub, %v1211 ret float %mul212}213 214define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_ieee(<2 x float> %v0, <2 x float> %v1) #0 {215; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee:216; SDAG: ; %bb.0:217; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2219; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3220; SDAG-NEXT: s_setpc_b64 s[30:31]221;222; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee:223; GISEL: ; %bb.0:224; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)225; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0226; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1227; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2228; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3229; GISEL-NEXT: s_setpc_b64 s[30:31]230 %sub = fsub <2 x float> <float -0.0, float -0.0>, %v0231 %mul = fmul <2 x float> %sub, %v1232 ret <2 x float> %mul233}234 235define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_daz(<2 x float> %v0, <2 x float> %v1) #1 {236; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz:237; SDAG: ; %bb.0:238; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)239; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2240; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3241; SDAG-NEXT: s_setpc_b64 s[30:31]242;243; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz:244; GISEL: ; %bb.0:245; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)246; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0247; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1248; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2249; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3250; GISEL-NEXT: s_setpc_b64 s[30:31]251 %sub = fsub <2 x float> <float -0.0, float -0.0>, %v0252 %mul = fmul <2 x float> %sub, %v1253 ret <2 x float> %mul254}255 256define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_ieee_nsz(<2 x float> %v0, <2 x float> %v1) #0 {257; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee_nsz:258; SDAG: ; %bb.0:259; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)260; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2261; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3262; SDAG-NEXT: s_setpc_b64 s[30:31]263;264; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee_nsz:265; GISEL: ; %bb.0:266; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0268; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1269; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2270; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3271; GISEL-NEXT: s_setpc_b64 s[30:31]272 %sub = fsub nsz <2 x float> <float -0.0, float -0.0>, %v0273 %mul = fmul nsz <2 x float> %sub, %v1274 ret <2 x float> %mul275}276 277define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_daz_nsz(<2 x float> %v0, <2 x float> %v1) #1 {278; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz_nsz:279; SDAG: ; %bb.0:280; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)281; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2282; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3283; SDAG-NEXT: s_setpc_b64 s[30:31]284;285; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz_nsz:286; GISEL: ; %bb.0:287; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)288; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0289; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1290; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2291; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3292; GISEL-NEXT: s_setpc_b64 s[30:31]293 %sub = fsub nsz <2 x float> <float -0.0, float -0.0>, %v0294 %mul = fmul nsz <2 x float> %sub, %v1295 ret <2 x float> %mul296}297 298define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_dynamic(<2 x float> %v0, <2 x float> %v1) #2 {299; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic:300; SDAG: ; %bb.0:301; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)302; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2303; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3304; SDAG-NEXT: s_setpc_b64 s[30:31]305;306; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic:307; GISEL: ; %bb.0:308; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)309; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0310; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1311; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2312; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3313; GISEL-NEXT: s_setpc_b64 s[30:31]314 %sub = fsub <2 x float> <float -0.0, float -0.0>, %v0315 %mul = fmul <2 x float> %sub, %v1316 ret <2 x float> %mul317}318 319define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_dynamic_nsz(<2 x float> %v0, <2 x float> %v1) #2 {320; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic_nsz:321; SDAG: ; %bb.0:322; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)323; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2324; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3325; SDAG-NEXT: s_setpc_b64 s[30:31]326;327; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic_nsz:328; GISEL: ; %bb.0:329; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)330; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0331; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1332; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2333; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3334; GISEL-NEXT: s_setpc_b64 s[30:31]335 %sub = fsub nsz <2 x float> <float -0.0, float -0.0>, %v0336 %mul = fmul nsz <2 x float> %sub, %v1337 ret <2 x float> %mul338}339 340 341define half @fold_f16_fsub_into_fneg_modifier_ieee(half %v0, half %v1) #0 {342; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_ieee:343; SDAG: ; %bb.0:344; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)345; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1346; SDAG-NEXT: s_setpc_b64 s[30:31]347;348; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_ieee:349; GISEL: ; %bb.0:350; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)351; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0352; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1353; GISEL-NEXT: s_setpc_b64 s[30:31]354 %sub = fsub half -0.0, %v0355 %mul = fmul half %sub, %v1356 ret half %mul357}358 359define half @fold_f16_fsub_into_fneg_modifier_daz(half %v0, half %v1) #1 {360; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_daz:361; SDAG: ; %bb.0:362; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)363; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1364; SDAG-NEXT: s_setpc_b64 s[30:31]365;366; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_daz:367; GISEL: ; %bb.0:368; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)369; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0370; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1371; GISEL-NEXT: s_setpc_b64 s[30:31]372 %sub = fsub half -0.0, %v0373 %mul = fmul half %sub, %v1374 ret half %mul375}376 377define half @fold_f16_fsub_into_fneg_modifier_ieee_nsz(half %v0, half %v1) #0 {378; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_ieee_nsz:379; SDAG: ; %bb.0:380; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)381; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1382; SDAG-NEXT: s_setpc_b64 s[30:31]383;384; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_ieee_nsz:385; GISEL: ; %bb.0:386; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)387; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0388; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1389; GISEL-NEXT: s_setpc_b64 s[30:31]390 %sub = fsub nsz half -0.0, %v0391 %mul = fmul nsz half %sub, %v1392 ret half %mul393}394 395define half @fold_f16_fsub_into_fneg_modifier_daz_nsz(half %v0, half %v1) #1 {396; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_daz_nsz:397; SDAG: ; %bb.0:398; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)399; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1400; SDAG-NEXT: s_setpc_b64 s[30:31]401;402; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_daz_nsz:403; GISEL: ; %bb.0:404; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)405; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0406; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1407; GISEL-NEXT: s_setpc_b64 s[30:31]408 %sub = fsub nsz half -0.0, %v0409 %mul = fmul nsz half %sub, %v1410 ret half %mul411}412 413define half @fold_f16_fsub_into_fneg_modifier_dynamic(half %v0, half %v1) #2 {414; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic:415; SDAG: ; %bb.0:416; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)417; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1418; SDAG-NEXT: s_setpc_b64 s[30:31]419;420; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic:421; GISEL: ; %bb.0:422; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)423; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0424; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1425; GISEL-NEXT: s_setpc_b64 s[30:31]426 %sub = fsub half -0.0, %v0427 %mul = fmul half %sub, %v1428 ret half %mul429}430 431define half @fold_f16_fsub_into_fneg_modifier_dynamic_nsz(half %v0, half %v1) #2 {432; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic_nsz:433; SDAG: ; %bb.0:434; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)435; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1436; SDAG-NEXT: s_setpc_b64 s[30:31]437;438; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic_nsz:439; GISEL: ; %bb.0:440; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)441; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0442; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1443; GISEL-NEXT: s_setpc_b64 s[30:31]444 %sub = fsub nsz half -0.0, %v0445 %mul = fmul nsz half %sub, %v1446 ret half %mul447}448 449define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_ieee(<2 x half> %v0, <2 x half> %v1) #0 {450; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee:451; SDAG: ; %bb.0:452; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)453; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]454; SDAG-NEXT: s_setpc_b64 s[30:31]455;456; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee:457; GISEL: ; %bb.0:458; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)459; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]460; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1461; GISEL-NEXT: s_setpc_b64 s[30:31]462 %sub = fsub <2 x half> <half -0.0, half -0.0>, %v0463 %mul = fmul <2 x half> %sub, %v1464 ret <2 x half> %mul465}466 467define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_daz(<2 x half> %v0, <2 x half> %v1) #1 {468; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz:469; SDAG: ; %bb.0:470; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)471; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]472; SDAG-NEXT: s_setpc_b64 s[30:31]473;474; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz:475; GISEL: ; %bb.0:476; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)477; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]478; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1479; GISEL-NEXT: s_setpc_b64 s[30:31]480 %sub = fsub <2 x half> <half -0.0, half -0.0>, %v0481 %mul = fmul <2 x half> %sub, %v1482 ret <2 x half> %mul483}484 485define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_ieee_nsz(<2 x half> %v0, <2 x half> %v1) #0 {486; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee_nsz:487; SDAG: ; %bb.0:488; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)489; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]490; SDAG-NEXT: s_setpc_b64 s[30:31]491;492; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee_nsz:493; GISEL: ; %bb.0:494; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)495; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]496; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1497; GISEL-NEXT: s_setpc_b64 s[30:31]498 %sub = fsub nsz <2 x half> <half -0.0, half -0.0>, %v0499 %mul = fmul nsz <2 x half> %sub, %v1500 ret <2 x half> %mul501}502 503define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_daz_nsz(<2 x half> %v0, <2 x half> %v1) #1 {504; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz_nsz:505; SDAG: ; %bb.0:506; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)507; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]508; SDAG-NEXT: s_setpc_b64 s[30:31]509;510; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz_nsz:511; GISEL: ; %bb.0:512; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)513; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]514; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1515; GISEL-NEXT: s_setpc_b64 s[30:31]516 %sub = fsub nsz <2 x half> <half -0.0, half -0.0>, %v0517 %mul = fmul nsz <2 x half> %sub, %v1518 ret <2 x half> %mul519}520 521define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_dynamic(<2 x half> %v0, <2 x half> %v1) #2 {522; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic:523; SDAG: ; %bb.0:524; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)525; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]526; SDAG-NEXT: s_setpc_b64 s[30:31]527;528; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic:529; GISEL: ; %bb.0:530; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)531; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]532; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1533; GISEL-NEXT: s_setpc_b64 s[30:31]534 %sub = fsub <2 x half> <half -0.0, half -0.0>, %v0535 %mul = fmul <2 x half> %sub, %v1536 ret <2 x half> %mul537}538 539define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_dynamic_nsz(<2 x half> %v0, <2 x half> %v1) #2 {540; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic_nsz:541; SDAG: ; %bb.0:542; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)543; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]544; SDAG-NEXT: s_setpc_b64 s[30:31]545;546; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic_nsz:547; GISEL: ; %bb.0:548; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)549; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]550; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1551; GISEL-NEXT: s_setpc_b64 s[30:31]552 %sub = fsub nsz <2 x half> <half -0.0, half -0.0>, %v0553 %mul = fmul nsz <2 x half> %sub, %v1554 ret <2 x half> %mul555}556 557define double @fold_f64_fsub_into_fneg_modifier_ieee(double %v0, double %v1) #0 {558; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_ieee:559; SDAG: ; %bb.0:560; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)561; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]562; SDAG-NEXT: s_setpc_b64 s[30:31]563;564; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_ieee:565; GISEL: ; %bb.0:566; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)567; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]568; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]569; GISEL-NEXT: s_setpc_b64 s[30:31]570 %sub = fsub double -0.0, %v0571 %mul = fmul double %sub, %v1572 ret double %mul573}574 575define double @fold_f64_fsub_into_fneg_modifier_daz(double %v0, double %v1) #1 {576; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_daz:577; SDAG: ; %bb.0:578; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)579; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]580; SDAG-NEXT: s_setpc_b64 s[30:31]581;582; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_daz:583; GISEL: ; %bb.0:584; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)585; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]586; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]587; GISEL-NEXT: s_setpc_b64 s[30:31]588 %sub = fsub double -0.0, %v0589 %mul = fmul double %sub, %v1590 ret double %mul591}592 593define double @fold_f64_fsub_into_fneg_modifier_ieee_nsz(double %v0, double %v1) #0 {594; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_ieee_nsz:595; SDAG: ; %bb.0:596; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)597; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]598; SDAG-NEXT: s_setpc_b64 s[30:31]599;600; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_ieee_nsz:601; GISEL: ; %bb.0:602; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)603; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]604; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]605; GISEL-NEXT: s_setpc_b64 s[30:31]606 %sub = fsub nsz double -0.0, %v0607 %mul = fmul nsz double %sub, %v1608 ret double %mul609}610 611define double @fold_f64_fsub_into_fneg_modifier_daz_nsz(double %v0, double %v1) #1 {612; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_daz_nsz:613; SDAG: ; %bb.0:614; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)615; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]616; SDAG-NEXT: s_setpc_b64 s[30:31]617;618; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_daz_nsz:619; GISEL: ; %bb.0:620; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)621; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]622; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]623; GISEL-NEXT: s_setpc_b64 s[30:31]624 %sub = fsub nsz double -0.0, %v0625 %mul = fmul nsz double %sub, %v1626 ret double %mul627}628 629define double @fold_f64_fsub_into_fneg_modifier_dynamic(double %v0, double %v1) #2 {630; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic:631; SDAG: ; %bb.0:632; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)633; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]634; SDAG-NEXT: s_setpc_b64 s[30:31]635;636; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic:637; GISEL: ; %bb.0:638; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)639; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]640; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]641; GISEL-NEXT: s_setpc_b64 s[30:31]642 %sub = fsub double -0.0, %v0643 %mul = fmul double %sub, %v1644 ret double %mul645}646 647define double @fold_f64_fsub_into_fneg_modifier_dynamic_nsz(double %v0, double %v1) #2 {648; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic_nsz:649; SDAG: ; %bb.0:650; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)651; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]652; SDAG-NEXT: s_setpc_b64 s[30:31]653;654; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic_nsz:655; GISEL: ; %bb.0:656; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)657; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]658; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]659; GISEL-NEXT: s_setpc_b64 s[30:31]660 %sub = fsub nsz double -0.0, %v0661 %mul = fmul nsz double %sub, %v1662 ret double %mul663}664 665define float @fold_f32_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, float %v0, float %v1) #0 {666; SDAG-LABEL: fold_f32_select_user_fsub_into_fneg_modifier_ieee:667; SDAG: ; %bb.0:668; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)669; SDAG-NEXT: v_and_b32_e32 v0, 1, v0670; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0671; SDAG-NEXT: v_cndmask_b32_e64 v0, v2, -v1, vcc672; SDAG-NEXT: s_setpc_b64 s[30:31]673;674; GISEL-LABEL: fold_f32_select_user_fsub_into_fneg_modifier_ieee:675; GISEL: ; %bb.0:676; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)677; GISEL-NEXT: v_and_b32_e32 v0, 1, v0678; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1679; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0680; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc681; GISEL-NEXT: s_setpc_b64 s[30:31]682 %sub = fsub float -0.0, %v0683 %mul = select i1 %cond, float %sub, float %v1684 ret float %mul685}686 687define float @no_fold_f32_select_user_fsub_into_fneg_modifier_daz(i1 %cond, float %v0, float %v1) #1 {688; SDAG-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_daz:689; SDAG: ; %bb.0:690; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)691; SDAG-NEXT: v_and_b32_e32 v0, 1, v0692; SDAG-NEXT: v_sub_f32_e32 v1, 0x80000000, v1693; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0694; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc695; SDAG-NEXT: s_setpc_b64 s[30:31]696;697; GISEL-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_daz:698; GISEL: ; %bb.0:699; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)700; GISEL-NEXT: v_and_b32_e32 v0, 1, v0701; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1702; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0703; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc704; GISEL-NEXT: s_setpc_b64 s[30:31]705 %sub = fsub float -0.0, %v0706 %mul = select i1 %cond, float %sub, float %v1707 ret float %mul708}709 710define float @no_fold_f32_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, float %v0, float %v1) #2 {711; SDAG-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_dynamic:712; SDAG: ; %bb.0:713; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)714; SDAG-NEXT: v_and_b32_e32 v0, 1, v0715; SDAG-NEXT: v_sub_f32_e32 v1, 0x80000000, v1716; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0717; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc718; SDAG-NEXT: s_setpc_b64 s[30:31]719;720; GISEL-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_dynamic:721; GISEL: ; %bb.0:722; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)723; GISEL-NEXT: v_and_b32_e32 v0, 1, v0724; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1725; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0726; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc727; GISEL-NEXT: s_setpc_b64 s[30:31]728 %sub = fsub float -0.0, %v0729 %mul = select i1 %cond, float %sub, float %v1730 ret float %mul731}732 733define half @fold_f16_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, half %v0, half %v1) #0 {734; SDAG-LABEL: fold_f16_select_user_fsub_into_fneg_modifier_ieee:735; SDAG: ; %bb.0:736; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)737; SDAG-NEXT: v_and_b32_e32 v0, 1, v0738; SDAG-NEXT: v_xor_b32_e32 v1, 0x8000, v1739; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0740; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc741; SDAG-NEXT: s_setpc_b64 s[30:31]742;743; GISEL-LABEL: fold_f16_select_user_fsub_into_fneg_modifier_ieee:744; GISEL: ; %bb.0:745; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)746; GISEL-NEXT: v_and_b32_e32 v0, 1, v0747; GISEL-NEXT: v_max_f16_e64 v1, -v1, -v1748; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0749; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc750; GISEL-NEXT: s_setpc_b64 s[30:31]751 %sub = fsub half -0.0, %v0752 %mul = select i1 %cond, half %sub, half %v1753 ret half %mul754}755 756define half @no_fold_f16_select_user_fsub_into_fneg_modifier_daz(i1 %cond, half %v0, half %v1) #1 {757; SDAG-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_daz:758; SDAG: ; %bb.0:759; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)760; SDAG-NEXT: v_and_b32_e32 v0, 1, v0761; SDAG-NEXT: v_sub_f16_e32 v1, 0x8000, v1762; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0763; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc764; SDAG-NEXT: s_setpc_b64 s[30:31]765;766; GISEL-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_daz:767; GISEL: ; %bb.0:768; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)769; GISEL-NEXT: v_and_b32_e32 v0, 1, v0770; GISEL-NEXT: v_max_f16_e64 v1, -v1, -v1771; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0772; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc773; GISEL-NEXT: s_setpc_b64 s[30:31]774 %sub = fsub half -0.0, %v0775 %mul = select i1 %cond, half %sub, half %v1776 ret half %mul777}778 779define half @no_fold_f16_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, half %v0, half %v1) #2 {780; SDAG-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_dynamic:781; SDAG: ; %bb.0:782; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)783; SDAG-NEXT: v_and_b32_e32 v0, 1, v0784; SDAG-NEXT: v_sub_f16_e32 v1, 0x8000, v1785; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0786; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc787; SDAG-NEXT: s_setpc_b64 s[30:31]788;789; GISEL-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_dynamic:790; GISEL: ; %bb.0:791; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)792; GISEL-NEXT: v_and_b32_e32 v0, 1, v0793; GISEL-NEXT: v_max_f16_e64 v1, -v1, -v1794; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0795; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc796; GISEL-NEXT: s_setpc_b64 s[30:31]797 %sub = fsub half -0.0, %v0798 %mul = select i1 %cond, half %sub, half %v1799 ret half %mul800}801 802define double @fold_f64_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, double %v0, double %v1) #0 {803; SDAG-LABEL: fold_f64_select_user_fsub_into_fneg_modifier_ieee:804; SDAG: ; %bb.0:805; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)806; SDAG-NEXT: v_and_b32_e32 v0, 1, v0807; SDAG-NEXT: v_xor_b32_e32 v2, 0x80000000, v2808; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0809; SDAG-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc810; SDAG-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc811; SDAG-NEXT: s_setpc_b64 s[30:31]812;813; GISEL-LABEL: fold_f64_select_user_fsub_into_fneg_modifier_ieee:814; GISEL: ; %bb.0:815; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)816; GISEL-NEXT: v_max_f64 v[1:2], -v[1:2], -v[1:2]817; GISEL-NEXT: v_and_b32_e32 v0, 1, v0818; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0819; GISEL-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc820; GISEL-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc821; GISEL-NEXT: s_setpc_b64 s[30:31]822 %sub = fsub double -0.0, %v0823 %mul = select i1 %cond, double %sub, double %v1824 ret double %mul825}826 827define double @no_fold_f64_select_user_fsub_into_fneg_modifier_daz(i1 %cond, double %v0, double %v1) #1 {828; SDAG-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_daz:829; SDAG: ; %bb.0:830; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)831; SDAG-NEXT: v_and_b32_e32 v0, 1, v0832; SDAG-NEXT: v_xor_b32_e32 v2, 0x80000000, v2833; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0834; SDAG-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc835; SDAG-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc836; SDAG-NEXT: s_setpc_b64 s[30:31]837;838; GISEL-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_daz:839; GISEL: ; %bb.0:840; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)841; GISEL-NEXT: v_max_f64 v[1:2], -v[1:2], -v[1:2]842; GISEL-NEXT: v_and_b32_e32 v0, 1, v0843; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0844; GISEL-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc845; GISEL-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc846; GISEL-NEXT: s_setpc_b64 s[30:31]847 %sub = fsub double -0.0, %v0848 %mul = select i1 %cond, double %sub, double %v1849 ret double %mul850}851 852define double @no_fold_f64_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, double %v0, double %v1) #2 {853; SDAG-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_dynamic:854; SDAG: ; %bb.0:855; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)856; SDAG-NEXT: v_and_b32_e32 v0, 1, v0857; SDAG-NEXT: v_xor_b32_e32 v2, 0x80000000, v2858; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0859; SDAG-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc860; SDAG-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc861; SDAG-NEXT: s_setpc_b64 s[30:31]862;863; GISEL-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_dynamic:864; GISEL: ; %bb.0:865; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)866; GISEL-NEXT: v_max_f64 v[1:2], -v[1:2], -v[1:2]867; GISEL-NEXT: v_and_b32_e32 v0, 1, v0868; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0869; GISEL-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc870; GISEL-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc871; GISEL-NEXT: s_setpc_b64 s[30:31]872 %sub = fsub double -0.0, %v0873 %mul = select i1 %cond, double %sub, double %v1874 ret double %mul875}876 877define <2 x half> @fold_v2f16_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, <2 x half> %v0, <2 x half> %v1) #0 {878; SDAG-LABEL: fold_v2f16_select_user_fsub_into_fneg_modifier_ieee:879; SDAG: ; %bb.0:880; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)881; SDAG-NEXT: v_and_b32_e32 v0, 1, v0882; SDAG-NEXT: v_xor_b32_e32 v1, 0x80008000, v1883; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0884; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc885; SDAG-NEXT: s_setpc_b64 s[30:31]886;887; GISEL-LABEL: fold_v2f16_select_user_fsub_into_fneg_modifier_ieee:888; GISEL: ; %bb.0:889; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)890; GISEL-NEXT: v_and_b32_e32 v0, 1, v0891; GISEL-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1]892; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0893; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc894; GISEL-NEXT: s_setpc_b64 s[30:31]895 %sub = fsub <2 x half> <half -0.0, half -0.0>, %v0896 %mul = select i1 %cond, <2 x half> %sub, <2 x half> %v1897 ret <2 x half> %mul898}899 900define <2 x half> @no_fold_v2f16_select_user_fsub_into_fneg_modifier_daz(i1 %cond, <2 x half> %v0, <2 x half> %v1) #1 {901; SDAG-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_daz:902; SDAG: ; %bb.0:903; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)904; SDAG-NEXT: v_and_b32_e32 v0, 1, v0905; SDAG-NEXT: v_xor_b32_e32 v1, 0x80008000, v1906; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0907; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc908; SDAG-NEXT: s_setpc_b64 s[30:31]909;910; GISEL-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_daz:911; GISEL: ; %bb.0:912; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)913; GISEL-NEXT: v_and_b32_e32 v0, 1, v0914; GISEL-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1]915; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0916; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc917; GISEL-NEXT: s_setpc_b64 s[30:31]918 %sub = fsub <2 x half> <half -0.0, half -0.0>, %v0919 %mul = select i1 %cond, <2 x half> %sub, <2 x half> %v1920 ret <2 x half> %mul921}922 923define <2 x half> @no_fold_v2f16_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, <2 x half> %v0, <2 x half> %v1) #2 {924; SDAG-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_dynamic:925; SDAG: ; %bb.0:926; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)927; SDAG-NEXT: v_and_b32_e32 v0, 1, v0928; SDAG-NEXT: v_xor_b32_e32 v1, 0x80008000, v1929; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0930; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc931; SDAG-NEXT: s_setpc_b64 s[30:31]932;933; GISEL-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_dynamic:934; GISEL: ; %bb.0:935; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)936; GISEL-NEXT: v_and_b32_e32 v0, 1, v0937; GISEL-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1]938; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0939; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc940; GISEL-NEXT: s_setpc_b64 s[30:31]941 %sub = fsub <2 x half> <half -0.0, half -0.0>, %v0942 %mul = select i1 %cond, <2 x half> %sub, <2 x half> %v1943 ret <2 x half> %mul944}945 946define float @fold_f32_strict_fsub_into_fneg_modifier_ieee(float %v0, float %v1) #3 {947; CHECK-LABEL: fold_f32_strict_fsub_into_fneg_modifier_ieee:948; CHECK: ; %bb.0:949; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)950; CHECK-NEXT: v_sub_f32_e32 v0, 0x80000000, v0951; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1952; CHECK-NEXT: s_setpc_b64 s[30:31]953 %sub = call float @llvm.experimental.constrained.fsub.f32(float -0.0, float %v0, metadata !"round.dynamic", metadata !"fpexcept.strict")954 %mul = call float @llvm.experimental.constrained.fmul.f32(float %sub, float %v1, metadata !"round.dynamic", metadata !"fpexcept.strict")955 ret float %mul956}957 958define float @fold_f32_strict_fsub_into_fneg_modifier_daz(float %v0, float %v1) #4 {959; CHECK-LABEL: fold_f32_strict_fsub_into_fneg_modifier_daz:960; CHECK: ; %bb.0:961; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)962; CHECK-NEXT: v_sub_f32_e32 v0, 0x80000000, v0963; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1964; CHECK-NEXT: s_setpc_b64 s[30:31]965 %sub = call float @llvm.experimental.constrained.fsub.f32(float -0.0, float %v0, metadata !"round.dynamic", metadata !"fpexcept.strict")966 %mul = call float @llvm.experimental.constrained.fmul.f32(float %sub, float %v1, metadata !"round.dynamic", metadata !"fpexcept.strict")967 ret float %mul968}969 970define float @fold_f32_strict_fsub_into_fneg_modifier_dynamic(float %v0, float %v1) #5 {971; CHECK-LABEL: fold_f32_strict_fsub_into_fneg_modifier_dynamic:972; CHECK: ; %bb.0:973; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)974; CHECK-NEXT: v_sub_f32_e32 v0, 0x80000000, v0975; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1976; CHECK-NEXT: s_setpc_b64 s[30:31]977 %sub = call float @llvm.experimental.constrained.fsub.f32(float -0.0, float %v0, metadata !"round.dynamic", metadata !"fpexcept.strict")978 %mul = call float @llvm.experimental.constrained.fmul.f32(float %sub, float %v1, metadata !"round.dynamic", metadata !"fpexcept.strict")979 ret float %mul980}981 982define i1 @no_fold_f32_fsub_into_fneg_modifier_class_issnan_ieee(float %v0) #0 {983; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_ieee:984; SDAG: ; %bb.0:985; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)986; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], -v0, 1987; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]988; SDAG-NEXT: s_setpc_b64 s[30:31]989;990; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_ieee:991; GISEL: ; %bb.0:992; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)993; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0994; GISEL-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 1995; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]996; GISEL-NEXT: s_setpc_b64 s[30:31]997 %sub = fsub float -0.0, %v0998 %class = call i1 @llvm.is.fpclass.f32(float %sub, i32 1)999 ret i1 %class1000}1001 1002define i1 @no_fold_f32_fsub_into_fneg_modifier_class_issnan_daz(float %v0) #1 {1003; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_daz:1004; SDAG: ; %bb.0:1005; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1006; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01007; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 11008; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1009; SDAG-NEXT: s_setpc_b64 s[30:31]1010;1011; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_daz:1012; GISEL: ; %bb.0:1013; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1014; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01015; GISEL-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 11016; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1017; GISEL-NEXT: s_setpc_b64 s[30:31]1018 %sub = fsub float -0.0, %v01019 %class = call i1 @llvm.is.fpclass.f32(float %sub, i32 1)1020 ret i1 %class1021}1022 1023define i1 @no_fold_f32_fsub_into_fneg_modifier_class_issnan_dynamic(float %v0) #2 {1024; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_dynamic:1025; SDAG: ; %bb.0:1026; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1027; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01028; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 11029; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1030; SDAG-NEXT: s_setpc_b64 s[30:31]1031;1032; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_dynamic:1033; GISEL: ; %bb.0:1034; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1035; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01036; GISEL-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 11037; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1038; GISEL-NEXT: s_setpc_b64 s[30:31]1039 %sub = fsub float -0.0, %v01040 %class = call i1 @llvm.is.fpclass.f32(float %sub, i32 1)1041 ret i1 %class1042}1043 1044define i1 @no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_ieee(float %v0) #0 {1045; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_ieee:1046; SDAG: ; %bb.0:1047; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1048; SDAG-NEXT: v_mov_b32_e32 v1, 0x901049; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], -v0, v11050; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1051; SDAG-NEXT: s_setpc_b64 s[30:31]1052;1053; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_ieee:1054; GISEL: ; %bb.0:1055; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1056; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01057; GISEL-NEXT: v_mov_b32_e32 v1, 0x901058; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v11059; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1060; GISEL-NEXT: s_setpc_b64 s[30:31]1061 %sub = fsub float -0.0, %v01062 %class = call i1 @llvm.is.fpclass.f32(float %sub, i32 144)1063 ret i1 %class1064}1065 1066define i1 @no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_daz(float %v0) #1 {1067; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_daz:1068; SDAG: ; %bb.0:1069; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1070; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01071; SDAG-NEXT: v_mov_b32_e32 v1, 0x901072; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v11073; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1074; SDAG-NEXT: s_setpc_b64 s[30:31]1075;1076; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_daz:1077; GISEL: ; %bb.0:1078; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1079; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01080; GISEL-NEXT: v_mov_b32_e32 v1, 0x901081; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v11082; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1083; GISEL-NEXT: s_setpc_b64 s[30:31]1084 %sub = fsub float -0.0, %v01085 %class = call i1 @llvm.is.fpclass.f32(float %sub, i32 144)1086 ret i1 %class1087}1088 1089define i1 @no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_dynamic(float %v0) #2 {1090; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_dynamic:1091; SDAG: ; %bb.0:1092; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1093; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01094; SDAG-NEXT: v_mov_b32_e32 v1, 0x901095; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v11096; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1097; SDAG-NEXT: s_setpc_b64 s[30:31]1098;1099; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_dynamic:1100; GISEL: ; %bb.0:1101; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1102; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01103; GISEL-NEXT: v_mov_b32_e32 v1, 0x901104; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v11105; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1106; GISEL-NEXT: s_setpc_b64 s[30:31]1107 %sub = fsub float -0.0, %v01108 %class = call i1 @llvm.is.fpclass.f32(float %sub, i32 144)1109 ret i1 %class1110}1111 1112define i1 @no_fold_f32_fsub_into_fneg_modifier_class_var_ieee(float %v0, i32 %testmask) #0 {1113; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_ieee:1114; SDAG: ; %bb.0:1115; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1116; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], -v0, v11117; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1118; SDAG-NEXT: s_setpc_b64 s[30:31]1119;1120; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_ieee:1121; GISEL: ; %bb.0:1122; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1123; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01124; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v11125; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1126; GISEL-NEXT: s_setpc_b64 s[30:31]1127 %sub = fsub float -0.0, %v01128 %class = call i1 @llvm.amdgcn.class.f32(float %sub, i32 %testmask)1129 ret i1 %class1130}1131 1132define i1 @no_fold_f32_fsub_into_fneg_modifier_class_var_daz(float %v0, i32 %testmask) #1 {1133; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_daz:1134; SDAG: ; %bb.0:1135; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1136; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01137; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v11138; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1139; SDAG-NEXT: s_setpc_b64 s[30:31]1140;1141; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_daz:1142; GISEL: ; %bb.0:1143; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1144; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01145; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v11146; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1147; GISEL-NEXT: s_setpc_b64 s[30:31]1148 %sub = fsub float -0.0, %v01149 %class = call i1 @llvm.amdgcn.class.f32(float %sub, i32 %testmask)1150 ret i1 %class1151}1152 1153define i1 @no_fold_f32_fsub_into_fneg_modifier_class_var_dynamic(float %v0, i32 %testmask) #2 {1154; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_dynamic:1155; SDAG: ; %bb.0:1156; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1157; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01158; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v11159; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1160; SDAG-NEXT: s_setpc_b64 s[30:31]1161;1162; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_dynamic:1163; GISEL: ; %bb.0:1164; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1165; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01166; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v11167; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1168; GISEL-NEXT: s_setpc_b64 s[30:31]1169 %sub = fsub float -0.0, %v01170 %class = call i1 @llvm.amdgcn.class.f32(float %sub, i32 %testmask)1171 ret i1 %class1172}1173 1174define i1 @no_fold_f64_fsub_into_fneg_modifier_class_var_daz(double %v0, i32 %testmask) #1 {1175; SDAG-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_var_daz:1176; SDAG: ; %bb.0:1177; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1178; SDAG-NEXT: v_cmp_class_f64_e64 s[4:5], -v[0:1], v21179; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1180; SDAG-NEXT: s_setpc_b64 s[30:31]1181;1182; GISEL-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_var_daz:1183; GISEL: ; %bb.0:1184; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1185; GISEL-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]1186; GISEL-NEXT: v_cmp_class_f64_e32 vcc, v[0:1], v21187; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1188; GISEL-NEXT: s_setpc_b64 s[30:31]1189 %sub = fsub double -0.0, %v01190 %class = call i1 @llvm.amdgcn.class.f64(double %sub, i32 %testmask)1191 ret i1 %class1192}1193 1194define i1 @no_fold_f16_fsub_into_fneg_modifier_class_var_daz(half %v0, i32 %testmask) #1 {1195; SDAG-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_var_daz:1196; SDAG: ; %bb.0:1197; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1198; SDAG-NEXT: v_sub_f16_e32 v0, 0x8000, v01199; SDAG-NEXT: v_cmp_class_f16_e32 vcc, v0, v11200; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1201; SDAG-NEXT: s_setpc_b64 s[30:31]1202;1203; GISEL-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_var_daz:1204; GISEL: ; %bb.0:1205; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1206; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v01207; GISEL-NEXT: v_cmp_class_f16_e32 vcc, v0, v11208; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1209; GISEL-NEXT: s_setpc_b64 s[30:31]1210 %sub = fsub half -0.0, %v01211 %class = call i1 @llvm.amdgcn.class.f16(half %sub, i32 %testmask)1212 ret i1 %class1213}1214 1215define i1 @no_fold_f64_fsub_into_fneg_modifier_class_daz(double %v0) #1 {1216; SDAG-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_daz:1217; SDAG: ; %bb.0:1218; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1219; SDAG-NEXT: v_mov_b32_e32 v2, 0x901220; SDAG-NEXT: v_cmp_class_f64_e64 s[4:5], -v[0:1], v21221; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]1222; SDAG-NEXT: s_setpc_b64 s[30:31]1223;1224; GISEL-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_daz:1225; GISEL: ; %bb.0:1226; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1227; GISEL-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]1228; GISEL-NEXT: v_mov_b32_e32 v2, 0x901229; GISEL-NEXT: v_cmp_class_f64_e32 vcc, v[0:1], v21230; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1231; GISEL-NEXT: s_setpc_b64 s[30:31]1232 %sub = fsub double -0.0, %v01233 %class = call i1 @llvm.is.fpclass.f64(double %sub, i32 144)1234 ret i1 %class1235}1236 1237define i1 @no_fold_f16_fsub_into_fneg_modifier_class_daz(half %v0) #1 {1238; SDAG-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_daz:1239; SDAG: ; %bb.0:1240; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1241; SDAG-NEXT: v_sub_f16_e32 v0, 0x8000, v01242; SDAG-NEXT: v_mov_b32_e32 v1, 0x901243; SDAG-NEXT: v_cmp_class_f16_e32 vcc, v0, v11244; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1245; SDAG-NEXT: s_setpc_b64 s[30:31]1246;1247; GISEL-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_daz:1248; GISEL: ; %bb.0:1249; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1250; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v01251; GISEL-NEXT: v_mov_b32_e32 v1, 0x901252; GISEL-NEXT: v_cmp_class_f16_e32 vcc, v0, v11253; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc1254; GISEL-NEXT: s_setpc_b64 s[30:31]1255 %sub = fsub half -0.0, %v01256 %class = call i1 @llvm.is.fpclass.f16(half %sub, i32 144)1257 ret i1 %class1258}1259 1260define amdgpu_gfx float @fold_f32_fsub_into_fneg_modifier_interp_daz(float %v0, i32 inreg %v1) #1 {1261; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_interp_daz:1262; SDAG: ; %bb.0:1263; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1264; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v01265; SDAG-NEXT: s_mov_b32 m0, s41266; SDAG-NEXT: s_nop 01267; SDAG-NEXT: v_interp_p1_f32_e32 v0, v0, attr0.x1268; SDAG-NEXT: s_setpc_b64 s[30:31]1269;1270; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_interp_daz:1271; GISEL: ; %bb.0:1272; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1273; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01274; GISEL-NEXT: s_mov_b32 m0, s41275; GISEL-NEXT: s_nop 01276; GISEL-NEXT: v_interp_p1_f32_e32 v0, v0, attr0.x1277; GISEL-NEXT: s_setpc_b64 s[30:31]1278 %sub = fsub float -0.0, %v01279 %p0_0 = call float @llvm.amdgcn.interp.p1(float %sub, i32 0, i32 0, i32 %v1)1280 ret float %p0_01281}1282 1283define amdgpu_gfx float @fold_f16_fsub_into_fneg_modifier_interp_daz(float %v0, i32 inreg %m0) #1 {1284; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_interp_daz:1285; SDAG: ; %bb.0:1286; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1287; SDAG-NEXT: s_mov_b32 m0, s41288; SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 2, 2), 31289; SDAG-NEXT: v_interp_p1ll_f16 v0, -v0, attr2.y1290; SDAG-NEXT: s_setpc_b64 s[30:31]1291;1292; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_interp_daz:1293; GISEL: ; %bb.0:1294; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1295; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v01296; GISEL-NEXT: s_mov_b32 m0, s41297; GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 2, 2), 31298; GISEL-NEXT: v_interp_p1ll_f16 v0, v0, attr2.y1299; GISEL-NEXT: s_setpc_b64 s[30:31]1300 %sub = fsub float -0.0, %v01301 %p1_0 = call float @llvm.amdgcn.interp.p1.f16(float %sub, i32 1, i32 2, i1 0, i32 %m0)1302 ret float %p1_01303}1304 1305declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)1306declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)1307declare i1 @llvm.is.fpclass.f32(float, i32 immarg)1308declare i1 @llvm.amdgcn.class.f32(float, i32)1309declare i1 @llvm.is.fpclass.f64(double, i32 immarg)1310declare i1 @llvm.amdgcn.class.f64(double, i32)1311declare i1 @llvm.is.fpclass.f16(half, i32 immarg)1312declare i1 @llvm.amdgcn.class.f16(half, i32)1313declare float @llvm.amdgcn.interp.p1(float, i32, i32, i32)1314declare float @llvm.amdgcn.interp.p1.f16(float, i32, i32, i1, i32)1315 1316attributes #0 = { "denormal-fp-math"="ieee,ieee" }1317attributes #1 = { "denormal-fp-math"="preserve-sign,preserve-sign" }1318attributes #2 = { "denormal-fp-math"="dynamic,dynamic" }1319attributes #3 = { "denormal-fp-math"="ieee,ieee" strictfp }1320attributes #4 = { "denormal-fp-math"="preserve-sign,preserve-sign" strictfp }1321attributes #5 = { "denormal-fp-math"="dynamic,dynamic" strictfp }1322