1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes 2; RUN: opt -S -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,IEEE %s 3; RUN: opt -S -passes=instcombine -denormal-fp-math=preserve-sign < %s | FileCheck -check-prefixes=CHECK,DAZ %s 4; RUN: opt -S -passes=instcombine -denormal-fp-math=positive-zero < %s | FileCheck -check-prefixes=CHECK,DAPZ %s 5 6; Test for patterns that appear when denormal range checks are folded 7; to compares to 0, which drop canonicalizing 8 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 i32 18; CHECK-NEXT: ret i32 [[SCALED_IF_DENORMAL]] 19; 20 %x.is.zero = fcmp oeq float %x, 0.0 21 %scaled.x = fmul float %x, 32.0 22 %bitcast.scaled.x = bitcast float %scaled.x to i32 23 %bitcast.x = bitcast float %x to i32 24 %scaled.if.denormal = select i1 %x.is.zero, i32 %bitcast.scaled.x, i32 %bitcast.x 25 ret i32 %scaled.if.denormal 26} 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+00 31; 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.0 35 %select = select i1 %x.is.zero, i32 %y, i32 %z 36 ret i32 %select 37} 38 39; Real case 40define 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.0 45 %scaled.x = fmul float %x, 32.0 46 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 47 ret float %scaled.if.denormal 48} 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+00 53; 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.0 58 %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 %x 60 ret float %scaled.if.denormal 61} 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:%.*]], zeroinitializer 66; 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, zeroinitializer 71 %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> %x 73 ret <2 x float> %scaled.if.denormal 74} 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:%.*]], zeroinitializer 79; 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, zeroinitializer 84 %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> %x 86 ret <2 x float> %scaled.if.denormal 87} 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+00 92; 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.0 97 %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 %x 99 ret float %scaled.if.denormal 100} 101 102; Real case, vector splat 103define <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, zeroinitializer 108 %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> %x 110 ret <2 x float> %scaled.if.denormal 111} 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, zeroinitializer 118 %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> %x 120 ret <2 x float> %scaled.if.denormal 121} 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> %x 130 ret <2 x float> %scaled.if.denormal 131} 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> %x 140 ret <2 x float> %scaled.if.denormal 141} 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+00 146; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01 147; 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.0 151 %scaled.x = fmul float %x, 32.0 152 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %y 153 ret float %scaled.if.denormal 154} 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+00 159; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[Y:%.*]], 3.200000e+01 160; 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.0 164 %scaled.x = fmul float %y, 32.0 165 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 166 ret float %scaled.if.denormal 167} 168 169; wrong compared constant 170define 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+00 173; 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.0 177 %scaled.x = fmul float %x, 32.0 178 %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x 179 ret float %scaled.if.denormal 180} 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+01 186; 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, %y 190 %scaled.x = fmul float %x, 32.0 191 %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x 192 ret float %scaled.if.denormal 193} 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.0 200 %scaled.x = fmul float %x, 32.0 201 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 202 ret float %scaled.if.denormal 203} 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.0 210 %scaled.x = fmul float %x, 32.0 211 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 212 ret float %scaled.if.denormal 213} 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+00 218; CHECK-NEXT: store i1 [[X_IS_ZERO]], ptr [[PTR:%.*]], align 1 219; CHECK-NEXT: ret float [[X]] 220; 221 %x.is.zero = fcmp oeq float %x, 0.0 222 %scaled.x = fmul float %x, 32.0 223 store i1 %x.is.zero, ptr %ptr 224 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 225 ret float %scaled.if.denormal 226} 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+01 231; CHECK-NEXT: store float [[SCALED_X]], ptr [[PTR:%.*]], align 4 232; CHECK-NEXT: ret float [[X]] 233; 234 %x.is.zero = fcmp oeq float %x, 0.0 235 %scaled.x = fmul float %x, 32.0 236 store float %scaled.x, ptr %ptr 237 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 238 ret float %scaled.if.denormal 239} 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.0 246 %scaled.x = fmul float %x, 0.0 247 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 248 ret float %scaled.if.denormal 249} 250 251; Inverse of the real case 252define 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.0 257 %scaled.x = fmul float %x, 32.0 258 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 259 ret float %scaled.if.denormal 260} 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.0 267 %scaled.x = fmul float %x, 32.0 268 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 269 ret float %scaled.if.denormal 270} 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.0 277 %scaled.x = fmul float %x, 32.0 278 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 279 ret float %scaled.if.denormal 280} 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.0 287 %scaled.x = fmul float %x, 32.0 288 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 289 ret float %scaled.if.denormal 290} 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+00 295; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01 296; 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.0 300 %scaled.x = fmul float %x, -32.0 301 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 302 ret float %scaled.if.denormal 303} 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+00 308; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01 309; 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.0 313 %scaled.x = fmul float %x, -32.0 314 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 315 ret float %scaled.if.denormal 316} 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.0 323 %scaled.x = fmul float %x, -32.0 324 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 325 ret float %scaled.if.denormal 326} 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.0 333 %scaled.x = fmul float %x, -32.0 334 %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x 335 ret float %scaled.if.denormal 336} 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+00 341; CHECK-NEXT: [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01 342; 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.0 346 %scaled.x = fmul nsz float %x, -32.0 347 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 348 ret float %scaled.if.denormal 349} 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+00 354; CHECK-NEXT: [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01 355; 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.0 359 %scaled.x = fmul nsz float %x, -32.0 360 %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 361 ret float %scaled.if.denormal 362} 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+00 367; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -0.000000e+00 368; 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.0 372 %scaled.x = fmul float %x, -0.0 373 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 374 ret float %scaled.if.denormal 375} 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+00 380; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 0xFFF0000000000000 381; 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.0 385 %scaled.x = fmul float %x, 0xFFF0000000000000 386 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 387 ret float %scaled.if.denormal 388} 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+00 393; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 0x7FF0000000000000 394; 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.0 398 %scaled.x = fmul float %x, 0x7FF0000000000000 399 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 400 ret float %scaled.if.denormal 401} 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+00 406; 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.0 410 %scaled.x = fmul float %x, 0x7FF8000000000000 411 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 412 ret float %scaled.if.denormal 413} 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+00 418; 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.0 422 %scaled.x = fmul float %x, 0x7FF0800000000000 423 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 424 ret float %scaled.if.denormal 425} 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+00 430; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 431; 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.0 435 %scaled.x = fmul float %x, %y 436 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 437 ret float %scaled.if.denormal 438} 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+00 444; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y_FABS]], float 1.000000e+00 445; 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.0 450 %scaled.x = fmul float %x, %y.fabs 451 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 452 ret float %scaled.if.denormal 453} 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.0 461 %scaled.x = fmul float %x, %y.fabs 462 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 463 ret float %scaled.if.denormal 464} 465 466; nsz is not sufficient 467define 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+00 470; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 471; 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.0 475 %scaled.x = fmul nsz float %x, %y 476 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 477 ret float %scaled.if.denormal 478} 479 480; nsz ninf is not sufficient 481define 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+00 484; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 485; 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.0 489 %scaled.x = fmul nsz ninf float %x, %y 490 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 491 ret float %scaled.if.denormal 492} 493 494; nsz nnan is not sufficient 495define 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+00 498; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 499; 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.0 503 %scaled.x = fmul nsz nnan float %x, %y 504 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 505 ret float %scaled.if.denormal 506} 507 508; nnan ninf is not sufficient 509define 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+00 512; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 513; 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.0 517 %scaled.x = fmul nnan ninf float %x, %y 518 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 519 ret float %scaled.if.denormal 520} 521 522; nsz nnan ninf is sufficient, but not useful on the select 523define 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+00 526; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 527; 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.0 531 %scaled.x = fmul float %x, %y 532 %scaled.if.denormal = select nsz nnan ninf i1 %x.is.zero, float %scaled.x, float %x 533 ret float %scaled.if.denormal 534} 535 536; nsz can come from only the select 537define 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.0 542 %scaled.x = fmul nnan ninf float %x, %y 543 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 544 ret float %scaled.if.denormal 545} 546 547; nsz can come from only the select 548define 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.0 553 %scaled.x = fmul nnan ninf float %x, %y 554 %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x 555 ret float %scaled.if.denormal 556} 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+00 561; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 562; 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.0 566 %scaled.x = fmul nnan ninf nsz float %x, %y 567 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 568 ret float %scaled.if.denormal 569} 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+00 574; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 575; 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.0 579 %scaled.x = fmul nnan ninf nsz float %y, %x 580 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 581 ret float %scaled.if.denormal 582} 583 584; test computeKnownFPClass is checked 585define 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+00 588; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 589; 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.0 593 %scaled.x = fmul nnan ninf float %x, %y 594 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 595 ret float %scaled.if.denormal 596} 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+00 601; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 602; 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.0 606 %scaled.x = fmul nnan ninf float %x, %y 607 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 608 ret float %scaled.if.denormal 609} 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.0 616 %scaled.x = fmul float %x, %y 617 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 618 ret float %scaled.if.denormal 619} 620 621; Infer everything from incoming multiplied value 622define 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+00 625; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 626; 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.0 630 %scaled.x = fmul float %x, %y 631 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 632 ret float %scaled.if.denormal 633} 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+00 638; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 639; 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.0 643 %scaled.x = fmul float %x, %y 644 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 645 ret float %scaled.if.denormal 646} 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.0 653 %scaled.x = fmul float %x, %y 654 %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 655 ret float %scaled.if.denormal 656} 657 658; Test assume of y works 659define 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]], 0x7FF0000000000000 663; 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, 0x7FF0000000000000 668 call void @llvm.assume(i1 %is.finite) 669 %x.is.zero = fcmp oeq float %x, 0.0 670 %scaled.x = fmul float %x, %y 671 %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 672 ret float %scaled.if.denormal 673} 674 675; Test assume of y works in inverted case 676define 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]], 0x7FF0000000000000 680; 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, 0x7FF0000000000000 685 call void @llvm.assume(i1 %is.finite) 686 %x.is.not.zero = fcmp one float %x, 0.0 687 %scaled.x = fmul float %x, %y 688 %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x 689 ret float %scaled.if.denormal 690} 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+00 695; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00 696; 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.0 700 %scaled.x = fmul float %x, %x 701 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 702 ret float %scaled.if.denormal 703} 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+00 708; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00 709; 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.0 713 %scaled.x = fmul nnan ninf nsz float %x, %x 714 %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 715 ret float %scaled.if.denormal 716} 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+00 721; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00 722; 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.0 726 %scaled.x = fmul float %x, %x 727 %scaled.if.denormal = select nnan ninf nsz i1 %x.is.zero, float %scaled.x, float %x 728 ret float %scaled.if.denormal 729} 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