735 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes2; RUN: opt -S -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,IEEE %s3; RUN: opt -S -passes=instcombine -denormal-fp-math=preserve-sign < %s | FileCheck -check-prefixes=CHECK,DAZ %s4; RUN: opt -S -passes=instcombine -denormal-fp-math=positive-zero < %s | FileCheck -check-prefixes=CHECK,DAPZ %s5 6; Test for patterns that appear when denormal range checks are folded7; to compares to 0, which drop canonicalizing8 9declare void @llvm.assume(i1 noundef)10declare float @llvm.fabs.f32(float)11declare float @llvm.ldexp.f32.i32(float, i32)12declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>)13 14 15define i32 @fcmp_zero_select_is_not_fp(float %x) {16; CHECK-LABEL: @fcmp_zero_select_is_not_fp(17; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = bitcast float [[X:%.*]] to i3218; CHECK-NEXT: ret i32 [[SCALED_IF_DENORMAL]]19;20 %x.is.zero = fcmp oeq float %x, 0.021 %scaled.x = fmul float %x, 32.022 %bitcast.scaled.x = bitcast float %scaled.x to i3223 %bitcast.x = bitcast float %x to i3224 %scaled.if.denormal = select i1 %x.is.zero, i32 %bitcast.scaled.x, i32 %bitcast.x25 ret i32 %scaled.if.denormal26}27 28define i32 @fcmp_zero_select_is_not_fp_unfoldable(float %x, i32 %y, i32 %z) {29; CHECK-LABEL: @fcmp_zero_select_is_not_fp_unfoldable(30; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+0031; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[X_IS_ZERO]], i32 [[Y:%.*]], i32 [[Z:%.*]]32; CHECK-NEXT: ret i32 [[SELECT]]33;34 %x.is.zero = fcmp oeq float %x, 0.035 %select = select i1 %x.is.zero, i32 %y, i32 %z36 ret i32 %select37}38 39; Real case40define float @fmul_by_32_if_0_oeq_zero_f32(float %x) {41; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32(42; CHECK-NEXT: ret float [[X:%.*]]43;44 %x.is.zero = fcmp oeq float %x, 0.045 %scaled.x = fmul float %x, 32.046 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x47 ret float %scaled.if.denormal48}49 50define float @ldexp_by_5_if_0_oeq_zero_f32(float %x) {51; CHECK-LABEL: @ldexp_by_5_if_0_oeq_zero_f32(52; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+0053; CHECK-NEXT: [[SCALED_X:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 5)54; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]55; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]56;57 %x.is.zero = fcmp oeq float %x, 0.058 %scaled.x = call float @llvm.ldexp.f32.i32(float %x, i32 5)59 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x60 ret float %scaled.if.denormal61}62 63define <2 x float> @ldexp_by_5_if_0_oeq_zero_v2f32(<2 x float> %x) {64; CHECK-LABEL: @ldexp_by_5_if_0_oeq_zero_v2f32(65; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer66; CHECK-NEXT: [[SCALED_X:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> splat (i32 5))67; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select <2 x i1> [[X_IS_ZERO]], <2 x float> [[SCALED_X]], <2 x float> [[X]]68; CHECK-NEXT: ret <2 x float> [[SCALED_IF_DENORMAL]]69;70 %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer71 %scaled.x = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 5, i32 5>)72 %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x73 ret <2 x float> %scaled.if.denormal74}75 76define <2 x float> @ldexp_by_n_if_0_oeq_zero_v2f32(<2 x float> %x, <2 x i32> %n) {77; CHECK-LABEL: @ldexp_by_n_if_0_oeq_zero_v2f32(78; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer79; CHECK-NEXT: [[SCALED_X:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[N:%.*]])80; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select <2 x i1> [[X_IS_ZERO]], <2 x float> [[SCALED_X]], <2 x float> [[X]]81; CHECK-NEXT: ret <2 x float> [[SCALED_IF_DENORMAL]]82;83 %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer84 %scaled.x = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %n)85 %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x86 ret <2 x float> %scaled.if.denormal87}88 89define float @ldexp_by_n_if_0_oeq_zero_f32(float %x, i32 %n) {90; CHECK-LABEL: @ldexp_by_n_if_0_oeq_zero_f32(91; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+0092; CHECK-NEXT: [[SCALED_X:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[N:%.*]])93; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]94; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]95;96 %x.is.zero = fcmp oeq float %x, 0.097 %scaled.x = call float @llvm.ldexp.f32.i32(float %x, i32 %n)98 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x99 ret float %scaled.if.denormal100}101 102; Real case, vector splat103define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_splat(<2 x float> %x) {104; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_splat(105; CHECK-NEXT: ret <2 x float> [[X:%.*]]106;107 %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer108 %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0>109 %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x110 ret <2 x float> %scaled.if.denormal111}112 113define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_nonsplat(<2 x float> %x) {114; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_nonsplat(115; CHECK-NEXT: ret <2 x float> [[X:%.*]]116;117 %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer118 %scaled.x = fmul <2 x float> %x, <float 32.0, float 64.0>119 %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x120 ret <2 x float> %scaled.if.denormal121}122 123define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_eq_mixed_zero_vector(<2 x float> %x) {124; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_eq_mixed_zero_vector(125; CHECK-NEXT: ret <2 x float> [[X:%.*]]126;127 %x.is.zero = fcmp oeq <2 x float> %x, <float 0.0, float -0.0>128 %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0>129 %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x130 ret <2 x float> %scaled.if.denormal131}132 133define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_eq_zero_vector_undef(<2 x float> %x) {134; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_eq_zero_vector_undef(135; CHECK-NEXT: ret <2 x float> [[X:%.*]]136;137 %x.is.zero = fcmp oeq <2 x float> %x, <float 0.0, float poison>138 %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0>139 %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x140 ret <2 x float> %scaled.if.denormal141}142 143define float @select_wrong_value(float %x, float %y) {144; CHECK-LABEL: @select_wrong_value(145; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00146; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01147; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[Y:%.*]]148; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]149;150 %x.is.zero = fcmp oeq float %x, 0.0151 %scaled.x = fmul float %x, 32.0152 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %y153 ret float %scaled.if.denormal154}155 156define float @fmul_wrong_value(float %x, float %y) {157; CHECK-LABEL: @fmul_wrong_value(158; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00159; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[Y:%.*]], 3.200000e+01160; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]161; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]162;163 %x.is.zero = fcmp oeq float %x, 0.0164 %scaled.x = fmul float %y, 32.0165 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x166 ret float %scaled.if.denormal167}168 169; wrong compared constant170define float @fmul_by_32_if_1_oeq_zero_f32(float %x) {171; CHECK-LABEL: @fmul_by_32_if_1_oeq_zero_f32(172; CHECK-NEXT: [[X_IS_ONE:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00173; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ONE]], float 3.200000e+01, float [[X]]174; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]175;176 %x.is.one = fcmp oeq float %x, 1.0177 %scaled.x = fmul float %x, 32.0178 %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x179 ret float %scaled.if.denormal180}181 182define float @fmul_by_32_if_var_oeq_zero_f32(float %x, float %y) {183; CHECK-LABEL: @fmul_by_32_if_var_oeq_zero_f32(184; CHECK-NEXT: [[X_IS_ONE:%.*]] = fcmp oeq float [[X:%.*]], [[Y:%.*]]185; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01186; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ONE]], float [[SCALED_X]], float [[X]]187; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]188;189 %x.is.one = fcmp oeq float %x, %y190 %scaled.x = fmul float %x, 32.0191 %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x192 ret float %scaled.if.denormal193}194 195define float @fmul_by_32_if_0_ueq_zero_f32(float %x) {196; CHECK-LABEL: @fmul_by_32_if_0_ueq_zero_f32(197; CHECK-NEXT: ret float [[X:%.*]]198;199 %x.is.zero = fcmp ueq float %x, 0.0200 %scaled.x = fmul float %x, 32.0201 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x202 ret float %scaled.if.denormal203}204 205define float @fmul_by_32_if_0_oeq_negzero_f32(float %x) {206; CHECK-LABEL: @fmul_by_32_if_0_oeq_negzero_f32(207; CHECK-NEXT: ret float [[X:%.*]]208;209 %x.is.zero = fcmp oeq float %x, -0.0210 %scaled.x = fmul float %x, 32.0211 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x212 ret float %scaled.if.denormal213}214 215define float @fmul_by_32_if_0_oeq_zero_f32_multiple_use_cmp(float %x, ptr %ptr) {216; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32_multiple_use_cmp(217; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00218; CHECK-NEXT: store i1 [[X_IS_ZERO]], ptr [[PTR:%.*]], align 1219; CHECK-NEXT: ret float [[X]]220;221 %x.is.zero = fcmp oeq float %x, 0.0222 %scaled.x = fmul float %x, 32.0223 store i1 %x.is.zero, ptr %ptr224 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x225 ret float %scaled.if.denormal226}227 228define float @fmul_by_32_if_0_oeq_zero_f32_multiple_use_fmul(float %x, ptr %ptr) {229; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32_multiple_use_fmul(230; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X:%.*]], 3.200000e+01231; CHECK-NEXT: store float [[SCALED_X]], ptr [[PTR:%.*]], align 4232; CHECK-NEXT: ret float [[X]]233;234 %x.is.zero = fcmp oeq float %x, 0.0235 %scaled.x = fmul float %x, 32.0236 store float %scaled.x, ptr %ptr237 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x238 ret float %scaled.if.denormal239}240 241define float @fmul_by_0_if_0_oeq_zero_f32(float %x) {242; CHECK-LABEL: @fmul_by_0_if_0_oeq_zero_f32(243; CHECK-NEXT: ret float [[X:%.*]]244;245 %x.is.zero = fcmp oeq float %x, 0.0246 %scaled.x = fmul float %x, 0.0247 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x248 ret float %scaled.if.denormal249}250 251; Inverse of the real case252define float @x_if_one_zero_else_mul_by_32(float %x) {253; CHECK-LABEL: @x_if_one_zero_else_mul_by_32(254; CHECK-NEXT: ret float [[X:%.*]]255;256 %x.is.not.zero = fcmp one float %x, 0.0257 %scaled.x = fmul float %x, 32.0258 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x259 ret float %scaled.if.denormal260}261 262define float @x_if_one_negzero_else_mul_by_32(float %x) {263; CHECK-LABEL: @x_if_one_negzero_else_mul_by_32(264; CHECK-NEXT: ret float [[X:%.*]]265;266 %x.is.not.zero = fcmp one float %x, -0.0267 %scaled.x = fmul float %x, 32.0268 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x269 ret float %scaled.if.denormal270}271 272define float @x_if_une_zero_else_mul_by_32(float %x) {273; CHECK-LABEL: @x_if_une_zero_else_mul_by_32(274; CHECK-NEXT: ret float [[X:%.*]]275;276 %x.is.not.zero = fcmp une float %x, 0.0277 %scaled.x = fmul float %x, 32.0278 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x279 ret float %scaled.if.denormal280}281 282define float @x_if_une_negzero_else_mul_by_32(float %x) {283; CHECK-LABEL: @x_if_une_negzero_else_mul_by_32(284; CHECK-NEXT: ret float [[X:%.*]]285;286 %x.is.not.zero = fcmp une float %x, -0.0287 %scaled.x = fmul float %x, 32.0288 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x289 ret float %scaled.if.denormal290}291 292define float @fmul_by_neg32_if_0_oeq_zero_f32(float %x) {293; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32(294; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00295; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01296; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]297; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]298;299 %x.is.zero = fcmp oeq float %x, 0.0300 %scaled.x = fmul float %x, -32.0301 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x302 ret float %scaled.if.denormal303}304 305define float @fmul_by_neg32_if_0_one_zero_f32(float %x) {306; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32(307; CHECK-NEXT: [[X_IS_NOT_ZERO:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00308; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01309; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_NOT_ZERO]], float [[X]], float [[SCALED_X]]310; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]311;312 %x.is.not.zero = fcmp one float %x, 0.0313 %scaled.x = fmul float %x, -32.0314 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x315 ret float %scaled.if.denormal316}317 318define float @fmul_by_neg32_if_0_oeq_zero_f32_select_nsz(float %x) {319; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32_select_nsz(320; CHECK-NEXT: ret float [[X:%.*]]321;322 %x.is.zero = fcmp oeq float %x, 0.0323 %scaled.x = fmul float %x, -32.0324 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x325 ret float %scaled.if.denormal326}327 328define float @fmul_by_neg32_if_0_one_zero_f32_select_nsz(float %x) {329; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32_select_nsz(330; CHECK-NEXT: ret float [[X:%.*]]331;332 %x.is.not.zero = fcmp one float %x, 0.0333 %scaled.x = fmul float %x, -32.0334 %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x335 ret float %scaled.if.denormal336}337 338define float @fmul_by_neg32_if_0_oeq_zero_f32_fmul_nsz(float %x) {339; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32_fmul_nsz(340; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00341; CHECK-NEXT: [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01342; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]343; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]344;345 %x.is.zero = fcmp oeq float %x, 0.0346 %scaled.x = fmul nsz float %x, -32.0347 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x348 ret float %scaled.if.denormal349}350 351define float @fmul_by_neg32_if_0_one_zero_f32_mul_nsz(float %x) {352; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32_mul_nsz(353; CHECK-NEXT: [[X_IS_NOT_ZERO:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00354; CHECK-NEXT: [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01355; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_NOT_ZERO]], float [[X]], float [[SCALED_X]]356; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]357;358 %x.is.not.zero = fcmp one float %x, 0.0359 %scaled.x = fmul nsz float %x, -32.0360 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x361 ret float %scaled.if.denormal362}363 364define float @fmul_by_neg0_if_0_oeq_zero_f32(float %x) {365; CHECK-LABEL: @fmul_by_neg0_if_0_oeq_zero_f32(366; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00367; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -0.000000e+00368; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]369; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]370;371 %x.is.zero = fcmp oeq float %x, 0.0372 %scaled.x = fmul float %x, -0.0373 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x374 ret float %scaled.if.denormal375}376 377define float @fmul_by_neginf_if_0_oeq_zero_f32(float %x) {378; CHECK-LABEL: @fmul_by_neginf_if_0_oeq_zero_f32(379; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00380; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 0xFFF0000000000000381; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]382; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]383;384 %x.is.zero = fcmp oeq float %x, 0.0385 %scaled.x = fmul float %x, 0xFFF0000000000000386 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x387 ret float %scaled.if.denormal388}389 390define float @fmul_by_posinf_if_0_oeq_zero_f32(float %x) {391; CHECK-LABEL: @fmul_by_posinf_if_0_oeq_zero_f32(392; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00393; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 0x7FF0000000000000394; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]395; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]396;397 %x.is.zero = fcmp oeq float %x, 0.0398 %scaled.x = fmul float %x, 0x7FF0000000000000399 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x400 ret float %scaled.if.denormal401}402 403define float @fmul_by_qnan_if_0_oeq_zero_f32(float %x) {404; CHECK-LABEL: @fmul_by_qnan_if_0_oeq_zero_f32(405; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00406; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float 0x7FF8000000000000, float [[X]]407; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]408;409 %x.is.zero = fcmp oeq float %x, 0.0410 %scaled.x = fmul float %x, 0x7FF8000000000000411 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x412 ret float %scaled.if.denormal413}414 415define float @fmul_by_snan_if_0_oeq_zero_f32(float %x) {416; CHECK-LABEL: @fmul_by_snan_if_0_oeq_zero_f32(417; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00418; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float 0x7FF8800000000000, float [[X]]419; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]420;421 %x.is.zero = fcmp oeq float %x, 0.0422 %scaled.x = fmul float %x, 0x7FF0800000000000423 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x424 ret float %scaled.if.denormal425}426 427define float @fmul_by_var_if_0_oeq_zero_f32(float %x, float %y) {428; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32(429; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00430; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00431; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]432; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]433;434 %x.is.zero = fcmp oeq float %x, 0.0435 %scaled.x = fmul float %x, %y436 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x437 ret float %scaled.if.denormal438}439 440define float @fmul_by_fabs_var_if_0_oeq_zero_f32(float %x, float %y) {441; CHECK-LABEL: @fmul_by_fabs_var_if_0_oeq_zero_f32(442; CHECK-NEXT: [[Y_FABS:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])443; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00444; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y_FABS]], float 1.000000e+00445; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]446; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]447;448 %y.fabs = call float @llvm.fabs.f32(float %y)449 %x.is.zero = fcmp oeq float %x, 0.0450 %scaled.x = fmul float %x, %y.fabs451 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x452 ret float %scaled.if.denormal453}454 455define float @fmul_by_fabs_nnan_ninf_var_if_0_oeq_zero_f32(float %x, float %y) {456; CHECK-LABEL: @fmul_by_fabs_nnan_ninf_var_if_0_oeq_zero_f32(457; CHECK-NEXT: ret float [[X:%.*]]458;459 %y.fabs = call nnan ninf float @llvm.fabs.f32(float %y)460 %x.is.zero = fcmp oeq float %x, 0.0461 %scaled.x = fmul float %x, %y.fabs462 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x463 ret float %scaled.if.denormal464}465 466; nsz is not sufficient467define float @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(float %x, float %y) {468; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(469; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00470; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00471; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]472; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]473;474 %x.is.zero = fcmp oeq float %x, 0.0475 %scaled.x = fmul nsz float %x, %y476 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x477 ret float %scaled.if.denormal478}479 480; nsz ninf is not sufficient481define float @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(float %x, float %y) {482; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(483; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00484; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00485; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]486; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]487;488 %x.is.zero = fcmp oeq float %x, 0.0489 %scaled.x = fmul nsz ninf float %x, %y490 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x491 ret float %scaled.if.denormal492}493 494; nsz nnan is not sufficient495define float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(float %x, float %y) {496; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(497; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00498; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00499; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]500; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]501;502 %x.is.zero = fcmp oeq float %x, 0.0503 %scaled.x = fmul nsz nnan float %x, %y504 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x505 ret float %scaled.if.denormal506}507 508; nnan ninf is not sufficient509define float @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(float %x, float %y) {510; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(511; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00512; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00513; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]514; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]515;516 %x.is.zero = fcmp oeq float %x, 0.0517 %scaled.x = fmul nnan ninf float %x, %y518 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x519 ret float %scaled.if.denormal520}521 522; nsz nnan ninf is sufficient, but not useful on the select523define float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_ninf_select(float %x, float %y) {524; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_ninf_select(525; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00526; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00527; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]528; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]529;530 %x.is.zero = fcmp oeq float %x, 0.0531 %scaled.x = fmul float %x, %y532 %scaled.if.denormal = select nsz nnan ninf i1 %x.is.zero, float %scaled.x, float %x533 ret float %scaled.if.denormal534}535 536; nsz can come from only the select537define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz(float %x, float %y) {538; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz(539; CHECK-NEXT: ret float [[X:%.*]]540;541 %x.is.zero = fcmp oeq float %x, 0.0542 %scaled.x = fmul nnan ninf float %x, %y543 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x544 ret float %scaled.if.denormal545}546 547; nsz can come from only the select548define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted(float %x, float %y) {549; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted(550; CHECK-NEXT: ret float [[X:%.*]]551;552 %x.is.not.zero = fcmp one float %x, 0.0553 %scaled.x = fmul nnan ninf float %x, %y554 %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x555 ret float %scaled.if.denormal556}557 558define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x, float %y) {559; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(560; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00561; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00562; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]563; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]564;565 %x.is.zero = fcmp oeq float %x, 0.0566 %scaled.x = fmul nnan ninf nsz float %x, %y567 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x568 ret float %scaled.if.denormal569}570 571define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(float %x, float %y) {572; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(573; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00574; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00575; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]576; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]577;578 %x.is.zero = fcmp oeq float %x, 0.0579 %scaled.x = fmul nnan ninf nsz float %y, %x580 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x581 ret float %scaled.if.denormal582}583 584; test computeKnownFPClass is checked585define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(float %x, float nofpclass(nzero) %y) {586; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(587; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00588; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00589; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]590; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]591;592 %x.is.zero = fcmp oeq float %x, 0.0593 %scaled.x = fmul nnan ninf float %x, %y594 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x595 ret float %scaled.if.denormal596}597 598define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(float %x, float nofpclass(nzero nsub) %y) {599; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(600; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00601; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00602; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]603; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]604;605 %x.is.zero = fcmp oeq float %x, 0.0606 %scaled.x = fmul nnan ninf float %x, %y607 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x608 ret float %scaled.if.denormal609}610 611define float @fmul_by_var_if_0_oeq_zero_f32_known_never_nan_inf_select_nsz(float %x, float nofpclass(nan inf) %y) {612; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_known_never_nan_inf_select_nsz(613; CHECK-NEXT: ret float [[X:%.*]]614;615 %x.is.zero = fcmp oeq float %x, 0.0616 %scaled.x = fmul float %x, %y617 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x618 ret float %scaled.if.denormal619}620 621; Infer everything from incoming multiplied value622define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero(float %x, float nofpclass(nan inf nzero) %y) {623; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero(624; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00625; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00626; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]627; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]628;629 %x.is.zero = fcmp oeq float %x, 0.0630 %scaled.x = fmul float %x, %y631 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x632 ret float %scaled.if.denormal633}634 635define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero_nsub(float %x, float nofpclass(nan inf nzero nsub) %y) {636; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero_nsub(637; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00638; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00639; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]640; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]641;642 %x.is.zero = fcmp oeq float %x, 0.0643 %scaled.x = fmul float %x, %y644 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x645 ret float %scaled.if.denormal646}647 648define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_neg(float %x, float nofpclass(nan inf nzero nsub nnorm) %y) {649; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_neg(650; CHECK-NEXT: ret float [[X:%.*]]651;652 %x.is.zero = fcmp oeq float %x, 0.0653 %scaled.x = fmul float %x, %y654 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x655 ret float %scaled.if.denormal656}657 658; Test assume of y works659define float @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(float %x, float %y) {660; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(661; CHECK-NEXT: [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])662; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000663; CHECK-NEXT: call void @llvm.assume(i1 [[IS_FINITE]])664; CHECK-NEXT: ret float [[X:%.*]]665;666 %fabs.y = call float @llvm.fabs.f32(float %y)667 %is.finite = fcmp olt float %fabs.y, 0x7FF0000000000000668 call void @llvm.assume(i1 %is.finite)669 %x.is.zero = fcmp oeq float %x, 0.0670 %scaled.x = fmul float %x, %y671 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x672 ret float %scaled.if.denormal673}674 675; Test assume of y works in inverted case676define float @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(float %x, float %y) {677; CHECK-LABEL: @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(678; CHECK-NEXT: [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])679; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000680; CHECK-NEXT: call void @llvm.assume(i1 [[IS_FINITE]])681; CHECK-NEXT: ret float [[X:%.*]]682;683 %fabs.y = call float @llvm.fabs.f32(float %y)684 %is.finite = fcmp olt float %fabs.y, 0x7FF0000000000000685 call void @llvm.assume(i1 %is.finite)686 %x.is.not.zero = fcmp one float %x, 0.0687 %scaled.x = fmul float %x, %y688 %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x689 ret float %scaled.if.denormal690}691 692define float @fmul_by_self_if_0_oeq_zero_f32(float %x) {693; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32(694; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00695; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00696; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]697; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]698;699 %x.is.zero = fcmp oeq float %x, 0.0700 %scaled.x = fmul float %x, %x701 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x702 ret float %scaled.if.denormal703}704 705define float @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x) {706; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(707; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00708; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00709; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]710; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]711;712 %x.is.zero = fcmp oeq float %x, 0.0713 %scaled.x = fmul nnan ninf nsz float %x, %x714 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x715 ret float %scaled.if.denormal716}717 718define float @fmul_by_self_if_0_oeq_zero_f32_select_nnan_ninf_nsz(float %x) {719; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_select_nnan_ninf_nsz(720; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00721; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00722; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]723; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]]724;725 %x.is.zero = fcmp oeq float %x, 0.0726 %scaled.x = fmul float %x, %x727 %scaled.if.denormal = select nnan ninf nsz i1 %x.is.zero, float %scaled.x, float %x728 ret float %scaled.if.denormal729}730 731;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:732; DAPZ: {{.*}}733; DAZ: {{.*}}734; IEEE: {{.*}}735