1a597ff31SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes 2a597ff31SMatt Arsenault; RUN: opt -S -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,IEEE %s 3a597ff31SMatt Arsenault; RUN: opt -S -passes=instcombine -denormal-fp-math=preserve-sign < %s | FileCheck -check-prefixes=CHECK,DAZ %s 4a597ff31SMatt Arsenault; RUN: opt -S -passes=instcombine -denormal-fp-math=positive-zero < %s | FileCheck -check-prefixes=CHECK,DAPZ %s 5a597ff31SMatt Arsenault 6a597ff31SMatt Arsenault; Test for patterns that appear when denormal range checks are folded 7a597ff31SMatt Arsenault; to compares to 0, which drop canonicalizing 8a597ff31SMatt Arsenault 9a597ff31SMatt Arsenaultdeclare void @llvm.assume(i1 noundef) 10a597ff31SMatt Arsenaultdeclare float @llvm.fabs.f32(float) 11a597ff31SMatt Arsenaultdeclare float @llvm.ldexp.f32.i32(float, i32) 12a597ff31SMatt Arsenaultdeclare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) 13a597ff31SMatt Arsenault 14a597ff31SMatt Arsenault 15a597ff31SMatt Arsenaultdefine i32 @fcmp_zero_select_is_not_fp(float %x) { 16a597ff31SMatt Arsenault; CHECK-LABEL: @fcmp_zero_select_is_not_fp( 175ae881ffSMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = bitcast float [[X:%.*]] to i32 18a597ff31SMatt Arsenault; CHECK-NEXT: ret i32 [[SCALED_IF_DENORMAL]] 19a597ff31SMatt Arsenault; 20a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 21a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 22a597ff31SMatt Arsenault %bitcast.scaled.x = bitcast float %scaled.x to i32 23a597ff31SMatt Arsenault %bitcast.x = bitcast float %x to i32 24a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, i32 %bitcast.scaled.x, i32 %bitcast.x 25a597ff31SMatt Arsenault ret i32 %scaled.if.denormal 26a597ff31SMatt Arsenault} 27a597ff31SMatt Arsenault 28a597ff31SMatt Arsenaultdefine i32 @fcmp_zero_select_is_not_fp_unfoldable(float %x, i32 %y, i32 %z) { 29a597ff31SMatt Arsenault; CHECK-LABEL: @fcmp_zero_select_is_not_fp_unfoldable( 30a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 31a597ff31SMatt Arsenault; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[X_IS_ZERO]], i32 [[Y:%.*]], i32 [[Z:%.*]] 32a597ff31SMatt Arsenault; CHECK-NEXT: ret i32 [[SELECT]] 33a597ff31SMatt Arsenault; 34a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 35a597ff31SMatt Arsenault %select = select i1 %x.is.zero, i32 %y, i32 %z 36a597ff31SMatt Arsenault ret i32 %select 37a597ff31SMatt Arsenault} 38a597ff31SMatt Arsenault 39a597ff31SMatt Arsenault; Real case 40a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_0_oeq_zero_f32(float %x) { 41a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32( 425ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 43a597ff31SMatt Arsenault; 44a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 45a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 46a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 47a597ff31SMatt Arsenault ret float %scaled.if.denormal 48a597ff31SMatt Arsenault} 49a597ff31SMatt Arsenault 50a597ff31SMatt Arsenaultdefine float @ldexp_by_5_if_0_oeq_zero_f32(float %x) { 51a597ff31SMatt Arsenault; CHECK-LABEL: @ldexp_by_5_if_0_oeq_zero_f32( 52a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 53a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 5) 54a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 55a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 56a597ff31SMatt Arsenault; 57a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 58a597ff31SMatt Arsenault %scaled.x = call float @llvm.ldexp.f32.i32(float %x, i32 5) 59a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 60a597ff31SMatt Arsenault ret float %scaled.if.denormal 61a597ff31SMatt Arsenault} 62a597ff31SMatt Arsenault 63a597ff31SMatt Arsenaultdefine <2 x float> @ldexp_by_5_if_0_oeq_zero_v2f32(<2 x float> %x) { 64a597ff31SMatt Arsenault; CHECK-LABEL: @ldexp_by_5_if_0_oeq_zero_v2f32( 65a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer 66*38fffa63SPaul Walker; CHECK-NEXT: [[SCALED_X:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> splat (i32 5)) 67a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select <2 x i1> [[X_IS_ZERO]], <2 x float> [[SCALED_X]], <2 x float> [[X]] 68a597ff31SMatt Arsenault; CHECK-NEXT: ret <2 x float> [[SCALED_IF_DENORMAL]] 69a597ff31SMatt Arsenault; 70a597ff31SMatt Arsenault %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer 71a597ff31SMatt Arsenault %scaled.x = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 5, i32 5>) 72a597ff31SMatt Arsenault %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x 73a597ff31SMatt Arsenault ret <2 x float> %scaled.if.denormal 74a597ff31SMatt Arsenault} 75a597ff31SMatt Arsenault 76a597ff31SMatt Arsenaultdefine <2 x float> @ldexp_by_n_if_0_oeq_zero_v2f32(<2 x float> %x, <2 x i32> %n) { 77a597ff31SMatt Arsenault; CHECK-LABEL: @ldexp_by_n_if_0_oeq_zero_v2f32( 78a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer 79a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[N:%.*]]) 80a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select <2 x i1> [[X_IS_ZERO]], <2 x float> [[SCALED_X]], <2 x float> [[X]] 81a597ff31SMatt Arsenault; CHECK-NEXT: ret <2 x float> [[SCALED_IF_DENORMAL]] 82a597ff31SMatt Arsenault; 83a597ff31SMatt Arsenault %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer 84a597ff31SMatt Arsenault %scaled.x = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %n) 85a597ff31SMatt Arsenault %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x 86a597ff31SMatt Arsenault ret <2 x float> %scaled.if.denormal 87a597ff31SMatt Arsenault} 88a597ff31SMatt Arsenault 89a597ff31SMatt Arsenaultdefine float @ldexp_by_n_if_0_oeq_zero_f32(float %x, i32 %n) { 90a597ff31SMatt Arsenault; CHECK-LABEL: @ldexp_by_n_if_0_oeq_zero_f32( 91a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 92a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[N:%.*]]) 93a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 94a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 95a597ff31SMatt Arsenault; 96a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 97a597ff31SMatt Arsenault %scaled.x = call float @llvm.ldexp.f32.i32(float %x, i32 %n) 98a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 99a597ff31SMatt Arsenault ret float %scaled.if.denormal 100a597ff31SMatt Arsenault} 101a597ff31SMatt Arsenault 102a597ff31SMatt Arsenault; Real case, vector splat 103a597ff31SMatt Arsenaultdefine <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_splat(<2 x float> %x) { 104a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_splat( 1055ae881ffSMatt Arsenault; CHECK-NEXT: ret <2 x float> [[X:%.*]] 106a597ff31SMatt Arsenault; 107a597ff31SMatt Arsenault %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer 108a597ff31SMatt Arsenault %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0> 109a597ff31SMatt Arsenault %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x 110a597ff31SMatt Arsenault ret <2 x float> %scaled.if.denormal 111a597ff31SMatt Arsenault} 112a597ff31SMatt Arsenault 113a597ff31SMatt Arsenaultdefine <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_nonsplat(<2 x float> %x) { 114a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_nonsplat( 1155ae881ffSMatt Arsenault; CHECK-NEXT: ret <2 x float> [[X:%.*]] 116a597ff31SMatt Arsenault; 117a597ff31SMatt Arsenault %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer 118a597ff31SMatt Arsenault %scaled.x = fmul <2 x float> %x, <float 32.0, float 64.0> 119a597ff31SMatt Arsenault %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x 120a597ff31SMatt Arsenault ret <2 x float> %scaled.if.denormal 121a597ff31SMatt Arsenault} 122a597ff31SMatt Arsenault 123a597ff31SMatt Arsenaultdefine <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_eq_mixed_zero_vector(<2 x float> %x) { 124a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_eq_mixed_zero_vector( 1255ae881ffSMatt Arsenault; CHECK-NEXT: ret <2 x float> [[X:%.*]] 126a597ff31SMatt Arsenault; 127a597ff31SMatt Arsenault %x.is.zero = fcmp oeq <2 x float> %x, <float 0.0, float -0.0> 128a597ff31SMatt Arsenault %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0> 129a597ff31SMatt Arsenault %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x 130a597ff31SMatt Arsenault ret <2 x float> %scaled.if.denormal 131a597ff31SMatt Arsenault} 132a597ff31SMatt Arsenault 133a597ff31SMatt Arsenaultdefine <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_eq_zero_vector_undef(<2 x float> %x) { 134a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_eq_zero_vector_undef( 1355ae881ffSMatt Arsenault; CHECK-NEXT: ret <2 x float> [[X:%.*]] 136a597ff31SMatt Arsenault; 137a597ff31SMatt Arsenault %x.is.zero = fcmp oeq <2 x float> %x, <float 0.0, float poison> 138a597ff31SMatt Arsenault %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0> 139a597ff31SMatt Arsenault %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x 140a597ff31SMatt Arsenault ret <2 x float> %scaled.if.denormal 141a597ff31SMatt Arsenault} 142a597ff31SMatt Arsenault 143a597ff31SMatt Arsenaultdefine float @select_wrong_value(float %x, float %y) { 144a597ff31SMatt Arsenault; CHECK-LABEL: @select_wrong_value( 145a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 146a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01 147a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[Y:%.*]] 148a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 149a597ff31SMatt Arsenault; 150a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 151a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 152a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %y 153a597ff31SMatt Arsenault ret float %scaled.if.denormal 154a597ff31SMatt Arsenault} 155a597ff31SMatt Arsenault 156a597ff31SMatt Arsenaultdefine float @fmul_wrong_value(float %x, float %y) { 157a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_wrong_value( 158a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 159a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[Y:%.*]], 3.200000e+01 160a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 161a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 162a597ff31SMatt Arsenault; 163a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 164a597ff31SMatt Arsenault %scaled.x = fmul float %y, 32.0 165a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 166a597ff31SMatt Arsenault ret float %scaled.if.denormal 167a597ff31SMatt Arsenault} 168a597ff31SMatt Arsenault 169a597ff31SMatt Arsenault; wrong compared constant 170a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_1_oeq_zero_f32(float %x) { 171a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_1_oeq_zero_f32( 172a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ONE:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00 173a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ONE]], float 3.200000e+01, float [[X]] 174a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 175a597ff31SMatt Arsenault; 176a597ff31SMatt Arsenault %x.is.one = fcmp oeq float %x, 1.0 177a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 178a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x 179a597ff31SMatt Arsenault ret float %scaled.if.denormal 180a597ff31SMatt Arsenault} 181a597ff31SMatt Arsenault 182a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_var_oeq_zero_f32(float %x, float %y) { 183a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_var_oeq_zero_f32( 184a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ONE:%.*]] = fcmp oeq float [[X:%.*]], [[Y:%.*]] 185a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01 186a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ONE]], float [[SCALED_X]], float [[X]] 187a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 188a597ff31SMatt Arsenault; 189a597ff31SMatt Arsenault %x.is.one = fcmp oeq float %x, %y 190a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 191a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x 192a597ff31SMatt Arsenault ret float %scaled.if.denormal 193a597ff31SMatt Arsenault} 194a597ff31SMatt Arsenault 195a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_0_ueq_zero_f32(float %x) { 196a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_ueq_zero_f32( 1975ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 198a597ff31SMatt Arsenault; 199a597ff31SMatt Arsenault %x.is.zero = fcmp ueq float %x, 0.0 200a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 201a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 202a597ff31SMatt Arsenault ret float %scaled.if.denormal 203a597ff31SMatt Arsenault} 204a597ff31SMatt Arsenault 205a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_0_oeq_negzero_f32(float %x) { 206a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_negzero_f32( 2075ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 208a597ff31SMatt Arsenault; 209a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, -0.0 210a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 211a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 212a597ff31SMatt Arsenault ret float %scaled.if.denormal 213a597ff31SMatt Arsenault} 214a597ff31SMatt Arsenault 215a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_0_oeq_zero_f32_multiple_use_cmp(float %x, ptr %ptr) { 216a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32_multiple_use_cmp( 217a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 218a597ff31SMatt Arsenault; CHECK-NEXT: store i1 [[X_IS_ZERO]], ptr [[PTR:%.*]], align 1 2195ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X]] 220a597ff31SMatt Arsenault; 221a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 222a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 223a597ff31SMatt Arsenault store i1 %x.is.zero, ptr %ptr 224a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 225a597ff31SMatt Arsenault ret float %scaled.if.denormal 226a597ff31SMatt Arsenault} 227a597ff31SMatt Arsenault 228a597ff31SMatt Arsenaultdefine float @fmul_by_32_if_0_oeq_zero_f32_multiple_use_fmul(float %x, ptr %ptr) { 229a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32_multiple_use_fmul( 2305ae881ffSMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X:%.*]], 3.200000e+01 231a597ff31SMatt Arsenault; CHECK-NEXT: store float [[SCALED_X]], ptr [[PTR:%.*]], align 4 2325ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X]] 233a597ff31SMatt Arsenault; 234a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 235a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 236a597ff31SMatt Arsenault store float %scaled.x, ptr %ptr 237a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 238a597ff31SMatt Arsenault ret float %scaled.if.denormal 239a597ff31SMatt Arsenault} 240a597ff31SMatt Arsenault 241a597ff31SMatt Arsenaultdefine float @fmul_by_0_if_0_oeq_zero_f32(float %x) { 242a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_0_if_0_oeq_zero_f32( 2435ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 244a597ff31SMatt Arsenault; 245a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 246a597ff31SMatt Arsenault %scaled.x = fmul float %x, 0.0 247a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 248a597ff31SMatt Arsenault ret float %scaled.if.denormal 249a597ff31SMatt Arsenault} 250a597ff31SMatt Arsenault 251a597ff31SMatt Arsenault; Inverse of the real case 252a597ff31SMatt Arsenaultdefine float @x_if_one_zero_else_mul_by_32(float %x) { 253a597ff31SMatt Arsenault; CHECK-LABEL: @x_if_one_zero_else_mul_by_32( 2545ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 255a597ff31SMatt Arsenault; 256a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, 0.0 257a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 258a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 259a597ff31SMatt Arsenault ret float %scaled.if.denormal 260a597ff31SMatt Arsenault} 261a597ff31SMatt Arsenault 262a597ff31SMatt Arsenaultdefine float @x_if_one_negzero_else_mul_by_32(float %x) { 263a597ff31SMatt Arsenault; CHECK-LABEL: @x_if_one_negzero_else_mul_by_32( 2645ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 265a597ff31SMatt Arsenault; 266a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, -0.0 267a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 268a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 269a597ff31SMatt Arsenault ret float %scaled.if.denormal 270a597ff31SMatt Arsenault} 271a597ff31SMatt Arsenault 272a597ff31SMatt Arsenaultdefine float @x_if_une_zero_else_mul_by_32(float %x) { 273a597ff31SMatt Arsenault; CHECK-LABEL: @x_if_une_zero_else_mul_by_32( 2745ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 275a597ff31SMatt Arsenault; 276a597ff31SMatt Arsenault %x.is.not.zero = fcmp une float %x, 0.0 277a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 278a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 279a597ff31SMatt Arsenault ret float %scaled.if.denormal 280a597ff31SMatt Arsenault} 281a597ff31SMatt Arsenault 282a597ff31SMatt Arsenaultdefine float @x_if_une_negzero_else_mul_by_32(float %x) { 283a597ff31SMatt Arsenault; CHECK-LABEL: @x_if_une_negzero_else_mul_by_32( 2845ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 285a597ff31SMatt Arsenault; 286a597ff31SMatt Arsenault %x.is.not.zero = fcmp une float %x, -0.0 287a597ff31SMatt Arsenault %scaled.x = fmul float %x, 32.0 288a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 289a597ff31SMatt Arsenault ret float %scaled.if.denormal 290a597ff31SMatt Arsenault} 291a597ff31SMatt Arsenault 292a597ff31SMatt Arsenaultdefine float @fmul_by_neg32_if_0_oeq_zero_f32(float %x) { 293a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32( 294a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 295a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01 296a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 297a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 298a597ff31SMatt Arsenault; 299a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 300a597ff31SMatt Arsenault %scaled.x = fmul float %x, -32.0 301a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 302a597ff31SMatt Arsenault ret float %scaled.if.denormal 303a597ff31SMatt Arsenault} 304a597ff31SMatt Arsenault 305a597ff31SMatt Arsenaultdefine float @fmul_by_neg32_if_0_one_zero_f32(float %x) { 306a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32( 307a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_NOT_ZERO:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00 308a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01 309a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_NOT_ZERO]], float [[X]], float [[SCALED_X]] 310a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 311a597ff31SMatt Arsenault; 312a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, 0.0 313a597ff31SMatt Arsenault %scaled.x = fmul float %x, -32.0 314a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 315a597ff31SMatt Arsenault ret float %scaled.if.denormal 316a597ff31SMatt Arsenault} 317a597ff31SMatt Arsenault 318a597ff31SMatt Arsenaultdefine float @fmul_by_neg32_if_0_oeq_zero_f32_select_nsz(float %x) { 319a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32_select_nsz( 3205ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 321a597ff31SMatt Arsenault; 322a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 323a597ff31SMatt Arsenault %scaled.x = fmul float %x, -32.0 324a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 325a597ff31SMatt Arsenault ret float %scaled.if.denormal 326a597ff31SMatt Arsenault} 327a597ff31SMatt Arsenault 328a597ff31SMatt Arsenaultdefine float @fmul_by_neg32_if_0_one_zero_f32_select_nsz(float %x) { 329a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32_select_nsz( 3305ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 331a597ff31SMatt Arsenault; 332a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, 0.0 333a597ff31SMatt Arsenault %scaled.x = fmul float %x, -32.0 334a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x 335a597ff31SMatt Arsenault ret float %scaled.if.denormal 336a597ff31SMatt Arsenault} 337a597ff31SMatt Arsenault 338a597ff31SMatt Arsenaultdefine float @fmul_by_neg32_if_0_oeq_zero_f32_fmul_nsz(float %x) { 339a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32_fmul_nsz( 340a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 341a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01 342a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 343a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 344a597ff31SMatt Arsenault; 345a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 346a597ff31SMatt Arsenault %scaled.x = fmul nsz float %x, -32.0 347a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 348a597ff31SMatt Arsenault ret float %scaled.if.denormal 349a597ff31SMatt Arsenault} 350a597ff31SMatt Arsenault 351a597ff31SMatt Arsenaultdefine float @fmul_by_neg32_if_0_one_zero_f32_mul_nsz(float %x) { 352a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32_mul_nsz( 353a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_NOT_ZERO:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00 354a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01 355a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_NOT_ZERO]], float [[X]], float [[SCALED_X]] 356a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 357a597ff31SMatt Arsenault; 358a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, 0.0 359a597ff31SMatt Arsenault %scaled.x = fmul nsz float %x, -32.0 360a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x 361a597ff31SMatt Arsenault ret float %scaled.if.denormal 362a597ff31SMatt Arsenault} 363a597ff31SMatt Arsenault 364a597ff31SMatt Arsenaultdefine float @fmul_by_neg0_if_0_oeq_zero_f32(float %x) { 365a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neg0_if_0_oeq_zero_f32( 366a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 367a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], -0.000000e+00 368a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 369a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 370a597ff31SMatt Arsenault; 371a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 372a597ff31SMatt Arsenault %scaled.x = fmul float %x, -0.0 373a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 374a597ff31SMatt Arsenault ret float %scaled.if.denormal 375a597ff31SMatt Arsenault} 376a597ff31SMatt Arsenault 377a597ff31SMatt Arsenaultdefine float @fmul_by_neginf_if_0_oeq_zero_f32(float %x) { 378a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_neginf_if_0_oeq_zero_f32( 379a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 380a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 0xFFF0000000000000 381a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 382a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 383a597ff31SMatt Arsenault; 384a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 385a597ff31SMatt Arsenault %scaled.x = fmul float %x, 0xFFF0000000000000 386a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 387a597ff31SMatt Arsenault ret float %scaled.if.denormal 388a597ff31SMatt Arsenault} 389a597ff31SMatt Arsenault 390a597ff31SMatt Arsenaultdefine float @fmul_by_posinf_if_0_oeq_zero_f32(float %x) { 391a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_posinf_if_0_oeq_zero_f32( 392a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 393a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = fmul float [[X]], 0x7FF0000000000000 394a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]] 395a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 396a597ff31SMatt Arsenault; 397a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 398a597ff31SMatt Arsenault %scaled.x = fmul float %x, 0x7FF0000000000000 399a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 400a597ff31SMatt Arsenault ret float %scaled.if.denormal 401a597ff31SMatt Arsenault} 402a597ff31SMatt Arsenault 403a597ff31SMatt Arsenaultdefine float @fmul_by_qnan_if_0_oeq_zero_f32(float %x) { 404a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_qnan_if_0_oeq_zero_f32( 405a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 406a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float 0x7FF8000000000000, float [[X]] 407a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 408a597ff31SMatt Arsenault; 409a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 410a597ff31SMatt Arsenault %scaled.x = fmul float %x, 0x7FF8000000000000 411a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 412a597ff31SMatt Arsenault ret float %scaled.if.denormal 413a597ff31SMatt Arsenault} 414a597ff31SMatt Arsenault 415a597ff31SMatt Arsenaultdefine float @fmul_by_snan_if_0_oeq_zero_f32(float %x) { 416a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_snan_if_0_oeq_zero_f32( 417a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 418a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float 0x7FF8800000000000, float [[X]] 419a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 420a597ff31SMatt Arsenault; 421a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 422a597ff31SMatt Arsenault %scaled.x = fmul float %x, 0x7FF0800000000000 423a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 424a597ff31SMatt Arsenault ret float %scaled.if.denormal 425a597ff31SMatt Arsenault} 426a597ff31SMatt Arsenault 427a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32(float %x, float %y) { 428a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32( 429a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 43009eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 431a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 432a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 433a597ff31SMatt Arsenault; 434a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 435a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 43609eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 437a597ff31SMatt Arsenault ret float %scaled.if.denormal 438a597ff31SMatt Arsenault} 439a597ff31SMatt Arsenault 440a597ff31SMatt Arsenaultdefine float @fmul_by_fabs_var_if_0_oeq_zero_f32(float %x, float %y) { 441a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_fabs_var_if_0_oeq_zero_f32( 442a597ff31SMatt Arsenault; CHECK-NEXT: [[Y_FABS:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]]) 443a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 44409eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y_FABS]], float 1.000000e+00 445a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 446a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 447a597ff31SMatt Arsenault; 448a597ff31SMatt Arsenault %y.fabs = call float @llvm.fabs.f32(float %y) 449a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 450a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y.fabs 45109eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 452a597ff31SMatt Arsenault ret float %scaled.if.denormal 453a597ff31SMatt Arsenault} 454a597ff31SMatt Arsenault 455a597ff31SMatt Arsenaultdefine float @fmul_by_fabs_nnan_ninf_var_if_0_oeq_zero_f32(float %x, float %y) { 456a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_fabs_nnan_ninf_var_if_0_oeq_zero_f32( 4575ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 458a597ff31SMatt Arsenault; 459a597ff31SMatt Arsenault %y.fabs = call nnan ninf float @llvm.fabs.f32(float %y) 460a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 461a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y.fabs 462a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 463a597ff31SMatt Arsenault ret float %scaled.if.denormal 464a597ff31SMatt Arsenault} 465a597ff31SMatt Arsenault 466a597ff31SMatt Arsenault; nsz is not sufficient 467a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(float %x, float %y) { 468a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul( 469a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 47009eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 47196b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 472a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 473a597ff31SMatt Arsenault; 474a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 475a597ff31SMatt Arsenault %scaled.x = fmul nsz float %x, %y 47609eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 477a597ff31SMatt Arsenault ret float %scaled.if.denormal 478a597ff31SMatt Arsenault} 479a597ff31SMatt Arsenault 480a597ff31SMatt Arsenault; nsz ninf is not sufficient 481a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(float %x, float %y) { 482a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul( 483a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 48409eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 48596b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 486a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 487a597ff31SMatt Arsenault; 488a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 489a597ff31SMatt Arsenault %scaled.x = fmul nsz ninf float %x, %y 49009eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 491a597ff31SMatt Arsenault ret float %scaled.if.denormal 492a597ff31SMatt Arsenault} 493a597ff31SMatt Arsenault 494a597ff31SMatt Arsenault; nsz nnan is not sufficient 495a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(float %x, float %y) { 496a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul( 497a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 49809eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 49996b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 500a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 501a597ff31SMatt Arsenault; 502a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 503a597ff31SMatt Arsenault %scaled.x = fmul nsz nnan float %x, %y 50409eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 505a597ff31SMatt Arsenault ret float %scaled.if.denormal 506a597ff31SMatt Arsenault} 507a597ff31SMatt Arsenault 508a597ff31SMatt Arsenault; nnan ninf is not sufficient 509a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(float %x, float %y) { 510a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul( 511a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 51209eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 51396b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 514a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 515a597ff31SMatt Arsenault; 516a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 517a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf float %x, %y 51809eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 519a597ff31SMatt Arsenault ret float %scaled.if.denormal 520a597ff31SMatt Arsenault} 521a597ff31SMatt Arsenault 522a597ff31SMatt Arsenault; nsz nnan ninf is sufficient, but not useful on the select 523a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_ninf_select(float %x, float %y) { 524a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_ninf_select( 525a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 526a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 527a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 528a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 529a597ff31SMatt Arsenault; 530a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 531a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 532a597ff31SMatt Arsenault %scaled.if.denormal = select nsz nnan ninf i1 %x.is.zero, float %scaled.x, float %x 533a597ff31SMatt Arsenault ret float %scaled.if.denormal 534a597ff31SMatt Arsenault} 535a597ff31SMatt Arsenault 536a597ff31SMatt Arsenault; nsz can come from only the select 537a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz(float %x, float %y) { 538a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz( 5395ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 540a597ff31SMatt Arsenault; 541a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 542a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf float %x, %y 543a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 544a597ff31SMatt Arsenault ret float %scaled.if.denormal 545a597ff31SMatt Arsenault} 546a597ff31SMatt Arsenault 547a597ff31SMatt Arsenault; nsz can come from only the select 548a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted(float %x, float %y) { 549a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted( 5505ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 551a597ff31SMatt Arsenault; 552a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, 0.0 553a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf float %x, %y 554a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x 555a597ff31SMatt Arsenault ret float %scaled.if.denormal 556a597ff31SMatt Arsenault} 557a597ff31SMatt Arsenault 558a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x, float %y) { 559a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz( 560a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 56109eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 56296b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 563a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 564a597ff31SMatt Arsenault; 565a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 566a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf nsz float %x, %y 56709eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 568a597ff31SMatt Arsenault ret float %scaled.if.denormal 569a597ff31SMatt Arsenault} 570a597ff31SMatt Arsenault 571a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(float %x, float %y) { 572a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted( 573a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 57409eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 57596b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 576a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 577a597ff31SMatt Arsenault; 578a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 579a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf nsz float %y, %x 58009eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 581a597ff31SMatt Arsenault ret float %scaled.if.denormal 582a597ff31SMatt Arsenault} 583a597ff31SMatt Arsenault 584a597ff31SMatt Arsenault; test computeKnownFPClass is checked 585a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(float %x, float nofpclass(nzero) %y) { 586a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero( 587a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 58809eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 58996b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 590a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 591a597ff31SMatt Arsenault; 592a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 593a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf float %x, %y 59409eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 595a597ff31SMatt Arsenault ret float %scaled.if.denormal 596a597ff31SMatt Arsenault} 597a597ff31SMatt Arsenault 598a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(float %x, float nofpclass(nzero nsub) %y) { 599a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub( 600a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 60109eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 60296b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 603a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 604a597ff31SMatt Arsenault; 605a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 606a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf float %x, %y 60709eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 608a597ff31SMatt Arsenault ret float %scaled.if.denormal 609a597ff31SMatt Arsenault} 610a597ff31SMatt Arsenault 611a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_known_never_nan_inf_select_nsz(float %x, float nofpclass(nan inf) %y) { 612a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_known_never_nan_inf_select_nsz( 6135ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 614a597ff31SMatt Arsenault; 615a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 616a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 617a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 618a597ff31SMatt Arsenault ret float %scaled.if.denormal 619a597ff31SMatt Arsenault} 620a597ff31SMatt Arsenault 621a597ff31SMatt Arsenault; Infer everything from incoming multiplied value 622a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero(float %x, float nofpclass(nan inf nzero) %y) { 623a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero( 624a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 62509eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 626a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 627a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 628a597ff31SMatt Arsenault; 629a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 630a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 63109eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 632a597ff31SMatt Arsenault ret float %scaled.if.denormal 633a597ff31SMatt Arsenault} 634a597ff31SMatt Arsenault 635a597ff31SMatt Arsenaultdefine 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) { 636a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero_nsub( 637a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 63809eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00 639a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 640a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 641a597ff31SMatt Arsenault; 642a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 643a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 64409eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 645a597ff31SMatt Arsenault ret float %scaled.if.denormal 646a597ff31SMatt Arsenault} 647a597ff31SMatt Arsenault 648a597ff31SMatt Arsenaultdefine 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) { 649a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_neg( 6505ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 651a597ff31SMatt Arsenault; 652a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 653a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 654a597ff31SMatt Arsenault %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x 655a597ff31SMatt Arsenault ret float %scaled.if.denormal 656a597ff31SMatt Arsenault} 657a597ff31SMatt Arsenault 658a597ff31SMatt Arsenault; Test assume of y works 659a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(float %x, float %y) { 660a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz( 661a597ff31SMatt Arsenault; CHECK-NEXT: [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]]) 6627a71ac2bSYingwei Zheng; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000 663a597ff31SMatt Arsenault; CHECK-NEXT: call void @llvm.assume(i1 [[IS_FINITE]]) 6645ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 665a597ff31SMatt Arsenault; 666a597ff31SMatt Arsenault %fabs.y = call float @llvm.fabs.f32(float %y) 667a597ff31SMatt Arsenault %is.finite = fcmp olt float %fabs.y, 0x7FF0000000000000 668a597ff31SMatt Arsenault call void @llvm.assume(i1 %is.finite) 669a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 670a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 671a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x 672a597ff31SMatt Arsenault ret float %scaled.if.denormal 673a597ff31SMatt Arsenault} 674a597ff31SMatt Arsenault 675a597ff31SMatt Arsenault; Test assume of y works in inverted case 676a597ff31SMatt Arsenaultdefine float @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(float %x, float %y) { 677a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz( 678a597ff31SMatt Arsenault; CHECK-NEXT: [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]]) 6797a71ac2bSYingwei Zheng; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000 680a597ff31SMatt Arsenault; CHECK-NEXT: call void @llvm.assume(i1 [[IS_FINITE]]) 6815ae881ffSMatt Arsenault; CHECK-NEXT: ret float [[X:%.*]] 682a597ff31SMatt Arsenault; 683a597ff31SMatt Arsenault %fabs.y = call float @llvm.fabs.f32(float %y) 684a597ff31SMatt Arsenault %is.finite = fcmp olt float %fabs.y, 0x7FF0000000000000 685a597ff31SMatt Arsenault call void @llvm.assume(i1 %is.finite) 686a597ff31SMatt Arsenault %x.is.not.zero = fcmp one float %x, 0.0 687a597ff31SMatt Arsenault %scaled.x = fmul float %x, %y 688a597ff31SMatt Arsenault %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x 689a597ff31SMatt Arsenault ret float %scaled.if.denormal 690a597ff31SMatt Arsenault} 691a597ff31SMatt Arsenault 692a597ff31SMatt Arsenaultdefine float @fmul_by_self_if_0_oeq_zero_f32(float %x) { 693a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32( 694a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 69509eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00 696a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 697a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 698a597ff31SMatt Arsenault; 699a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 700a597ff31SMatt Arsenault %scaled.x = fmul float %x, %x 70109eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 702a597ff31SMatt Arsenault ret float %scaled.if.denormal 703a597ff31SMatt Arsenault} 704a597ff31SMatt Arsenault 705a597ff31SMatt Arsenaultdefine float @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x) { 706a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz( 707a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 70809eb9f11SMichele Scandale; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00 70996b14f2cSYingwei Zheng; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]] 710a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 711a597ff31SMatt Arsenault; 712a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 713a597ff31SMatt Arsenault %scaled.x = fmul nnan ninf nsz float %x, %x 71409eb9f11SMichele Scandale %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x 715a597ff31SMatt Arsenault ret float %scaled.if.denormal 716a597ff31SMatt Arsenault} 717a597ff31SMatt Arsenault 718a597ff31SMatt Arsenaultdefine float @fmul_by_self_if_0_oeq_zero_f32_select_nnan_ninf_nsz(float %x) { 719a597ff31SMatt Arsenault; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_select_nnan_ninf_nsz( 720a597ff31SMatt Arsenault; CHECK-NEXT: [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 721a597ff31SMatt Arsenault; CHECK-NEXT: [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00 722a1058776SNikita Popov; CHECK-NEXT: [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]] 723a597ff31SMatt Arsenault; CHECK-NEXT: ret float [[SCALED_IF_DENORMAL]] 724a597ff31SMatt Arsenault; 725a597ff31SMatt Arsenault %x.is.zero = fcmp oeq float %x, 0.0 726a597ff31SMatt Arsenault %scaled.x = fmul float %x, %x 727a597ff31SMatt Arsenault %scaled.if.denormal = select nnan ninf nsz i1 %x.is.zero, float %scaled.x, float %x 728a597ff31SMatt Arsenault ret float %scaled.if.denormal 729a597ff31SMatt Arsenault} 730a597ff31SMatt Arsenault 731a597ff31SMatt Arsenault;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 732a597ff31SMatt Arsenault; DAPZ: {{.*}} 733a597ff31SMatt Arsenault; DAZ: {{.*}} 734a597ff31SMatt Arsenault; IEEE: {{.*}} 735