1; NOTE: Do not autogenerate 2; Assertions were previously autogenerated by utils/update_test_checks.py 3; but some hand modifications were needed to account for rounding errors 4; in constant folding that depend on the compiler's math library version. 5; RUN: opt < %s -passes=instcombine -S | FileCheck %s 6 7define float @powf_expf(float %x, float %y) { 8; CHECK-LABEL: @powf_expf( 9; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]] 10; CHECK-NEXT: [[EXP:%.*]] = call fast float @llvm.exp.f32(float [[MUL]]) 11; CHECK-NEXT: ret float [[EXP]] 12; 13 %call = call fast float @expf(float %x) nounwind readnone 14 %pow = call fast float @llvm.pow.f32(float %call, float %y) 15 ret float %pow 16} 17 18define float @powf_expf_libcall(float %x, float %y) { 19; CHECK-LABEL: @powf_expf_libcall( 20; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]] 21; CHECK-NEXT: [[EXPF:%.*]] = call fast float @expf(float [[MUL]]) 22; CHECK-NEXT: ret float [[EXPF]] 23; 24 %call = call fast float @expf(float %x) 25 %pow = call fast float @powf(float %call, float %y) 26 ret float %pow 27} 28 29define double @pow_exp(double %x, double %y) { 30; CHECK-LABEL: @pow_exp( 31; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]] 32; CHECK-NEXT: [[EXP:%.*]] = call fast double @llvm.exp.f64(double [[MUL]]) 33; CHECK-NEXT: ret double [[EXP]] 34; 35 %call = call fast double @exp(double %x) nounwind readnone 36 %pow = call fast double @llvm.pow.f64(double %call, double %y) 37 ret double %pow 38} 39 40define double @pow_exp_not_intrinsic(double %x, double %y) { 41; CHECK-LABEL: @pow_exp_not_intrinsic( 42; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]] 43; CHECK-NEXT: [[EXP:%.*]] = call fast double @llvm.exp.f64(double [[MUL]]) 44; CHECK-NEXT: ret double [[EXP]] 45; 46 %call = call fast double @exp(double %x) nounwind readnone 47 %pow = call fast double @pow(double %call, double %y) nounwind readnone 48 ret double %pow 49} 50 51define fp128 @powl_expl(fp128 %x, fp128 %y) { 52; CHECK-LABEL: @powl_expl( 53; CHECK-NEXT: [[MUL:%.*]] = fmul fast fp128 [[X:%.*]], [[Y:%.*]] 54; CHECK-NEXT: [[EXP:%.*]] = call fast fp128 @llvm.exp.f128(fp128 [[MUL]]) 55; CHECK-NEXT: ret fp128 [[EXP]] 56; 57 %call = call fast fp128 @expl(fp128 %x) nounwind readnone 58 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y) 59 ret fp128 %pow 60} 61 62define fp128 @powl_expl_not_fast(fp128 %x, fp128 %y) { 63; CHECK-LABEL: @powl_expl_not_fast( 64; CHECK-NEXT: [[CALL:%.*]] = call fp128 @expl(fp128 [[X:%.*]]) 65; CHECK-NEXT: [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]]) 66; CHECK-NEXT: ret fp128 [[POW]] 67; 68 %call = call fp128 @expl(fp128 %x) 69 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y) 70 ret fp128 %pow 71} 72 73define float @powf_exp2f(float %x, float %y) { 74; CHECK-LABEL: @powf_exp2f( 75; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]] 76; CHECK-NEXT: [[EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[MUL]]) 77; CHECK-NEXT: ret float [[EXP2]] 78; 79 %call = call fast float @exp2f(float %x) nounwind readnone 80 %pow = call fast float @llvm.pow.f32(float %call, float %y) 81 ret float %pow 82} 83 84define float @powf_exp2f_not_intrinsic(float %x, float %y) { 85; CHECK-LABEL: @powf_exp2f_not_intrinsic( 86; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]] 87; CHECK-NEXT: [[EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[MUL]]) 88; CHECK-NEXT: ret float [[EXP2]] 89; 90 %call = call fast float @exp2f(float %x) nounwind readnone 91 %pow = call fast float @powf(float %call, float %y) nounwind readnone 92 ret float %pow 93} 94 95define double @pow_exp2(double %x, double %y) { 96; CHECK-LABEL: @pow_exp2( 97; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]] 98; CHECK-NEXT: [[EXP2:%.*]] = call fast double @llvm.exp2.f64(double [[MUL]]) 99; CHECK-NEXT: ret double [[EXP2]] 100; 101 %call = call fast double @exp2(double %x) nounwind readnone 102 %pow = call fast double @llvm.pow.f64(double %call, double %y) 103 ret double %pow 104} 105 106define double @pow_exp2_libcall(double %x, double %y) { 107; CHECK-LABEL: @pow_exp2_libcall( 108; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]] 109; CHECK-NEXT: [[EXP2:%.*]] = call fast double @exp2(double [[MUL]]) 110; CHECK-NEXT: ret double [[EXP2]] 111; 112 %call = call fast double @exp2(double %x) 113 %pow = call fast double @pow(double %call, double %y) 114 ret double %pow 115} 116 117define fp128 @powl_exp2l(fp128 %x, fp128 %y) { 118; CHECK-LABEL: @powl_exp2l( 119; CHECK-NEXT: [[MUL:%.*]] = fmul fast fp128 [[X:%.*]], [[Y:%.*]] 120; CHECK-NEXT: [[EXP2:%.*]] = call fast fp128 @llvm.exp2.f128(fp128 [[MUL]]) 121; CHECK-NEXT: ret fp128 [[EXP2]] 122; 123 %call = call fast fp128 @exp2l(fp128 %x) nounwind readnone 124 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y) 125 ret fp128 %pow 126} 127 128define fp128 @powl_exp2l_not_fast(fp128 %x, fp128 %y) { 129; CHECK-LABEL: @powl_exp2l_not_fast( 130; CHECK-NEXT: [[CALL:%.*]] = call fp128 @exp2l(fp128 [[X:%.*]]) 131; CHECK-NEXT: [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]]) 132; CHECK-NEXT: ret fp128 [[POW]] 133; 134 %call = call fp128 @exp2l(fp128 %x) 135 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y) 136 ret fp128 %pow 137} 138 139; TODO: exp10() is not widely enabled by many targets yet. 140 141define float @powf_exp10f(float %x, float %y) { 142; CHECK-LABEL: @powf_exp10f( 143; CHECK-NEXT: [[CALL:%.*]] = call fast float @exp10f(float [[X:%.*]]) #[[ATTR1:[0-9]+]] 144; CHECK-NEXT: [[POW:%.*]] = call fast float @llvm.pow.f32(float [[CALL]], float [[Y:%.*]]) 145; CHECK-NEXT: ret float [[POW]] 146; 147 %call = call fast float @exp10f(float %x) nounwind readnone 148 %pow = call fast float @llvm.pow.f32(float %call, float %y) 149 ret float %pow 150} 151 152define double @pow_exp10(double %x, double %y) { 153; CHECK-LABEL: @pow_exp10( 154; CHECK-NEXT: [[CALL:%.*]] = call fast double @exp10(double [[X:%.*]]) #[[ATTR1]] 155; CHECK-NEXT: [[POW:%.*]] = call fast double @llvm.pow.f64(double [[CALL]], double [[Y:%.*]]) 156; CHECK-NEXT: ret double [[POW]] 157; 158 %call = call fast double @exp10(double %x) nounwind readnone 159 %pow = call fast double @llvm.pow.f64(double %call, double %y) 160 ret double %pow 161} 162 163define fp128 @pow_exp10l(fp128 %x, fp128 %y) { 164; CHECK-LABEL: @pow_exp10l( 165; CHECK-NEXT: [[CALL:%.*]] = call fast fp128 @exp10l(fp128 [[X:%.*]]) #[[ATTR1]] 166; CHECK-NEXT: [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]]) 167; CHECK-NEXT: ret fp128 [[POW]] 168; 169 %call = call fast fp128 @exp10l(fp128 %x) nounwind readnone 170 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y) 171 ret fp128 %pow 172} 173 174define float @reuse_fast(float %x, float %y, ptr %p) { 175; CHECK-LABEL: @reuse_fast( 176; CHECK-NEXT: [[EXP:%.*]] = call fast float @expf(float [[X:%.*]]) 177; CHECK-NEXT: [[POW:%.*]] = call fast float @powf(float [[EXP]], float [[Y:%.*]]) 178; CHECK-NEXT: store float [[EXP]], ptr [[P:%.*]], align 4 179; CHECK-NEXT: ret float [[POW]] 180; 181 %exp = call fast float @expf(float %x) 182 %pow = call fast float @powf(float %exp, float %y) 183 store float %exp, ptr %p, align 4 184 ret float %pow 185} 186 187define fp128 @reuse_libcall(fp128 %x, fp128 %y, ptr %p) { 188; CHECK-LABEL: @reuse_libcall( 189; CHECK-NEXT: [[EXP:%.*]] = call fp128 @expl(fp128 [[X:%.*]]) 190; CHECK-NEXT: [[POW:%.*]] = call fp128 @powl(fp128 [[EXP]], fp128 [[Y:%.*]]) 191; CHECK-NEXT: store fp128 [[EXP]], ptr [[P:%.*]], align 16 192; CHECK-NEXT: ret fp128 [[POW]] 193; 194 %exp = call fp128 @expl(fp128 %x) 195 %pow = call fp128 @powl(fp128 %exp, fp128 %y) 196 store fp128 %exp, ptr %p, align 16 197 ret fp128 %pow 198} 199 200define double @function_pointer(ptr %fptr, double %p1) { 201; CHECK-LABEL: @function_pointer( 202; CHECK-NEXT: [[CALL1:%.*]] = call fast double [[FPTR:%.*]]() 203; CHECK-NEXT: [[POW:%.*]] = call fast double @llvm.pow.f64(double [[CALL1]], double [[P1:%.*]]) 204; CHECK-NEXT: ret double [[POW]] 205; 206 %call1 = call fast double %fptr() 207 %pow = call fast double @llvm.pow.f64(double %call1, double %p1) 208 ret double %pow 209} 210 211; pow(C,x) -> exp2(log2(C)*x) 212 213declare void @use_d(double) 214declare void @use_f(float) 215 216define double @pow_ok_base(double %e) { 217; CHECK-LABEL: @pow_ok_base( 218; Do not change 0xBFE0776{{.*}} to the exact constant, see PR42740 219; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0xBFE0776{{.*}} 220; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]]) 221; CHECK-NEXT: ret double [[EXP2]] 222; 223 %call = tail call afn nnan ninf double @pow(double 0x3FE6666666666666, double %e) 224 ret double %call 225} 226 227define double @pow_ok_base_fast(double %e) { 228; CHECK-LABEL: @pow_ok_base_fast( 229; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[E:%.*]], 0xBFE0776{{.*}} 230; CHECK-NEXT: [[EXP2:%.*]] = tail call fast double @exp2(double [[MUL]]) 231; CHECK-NEXT: ret double [[EXP2]] 232; 233 %call = tail call fast double @pow(double 0x3FE6666666666666, double %e) 234 ret double %call 235} 236 237define double @pow_ok_base2(double %e) { 238; CHECK-LABEL: @pow_ok_base2( 239; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x4010952{{.*}} 240; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]]) 241; CHECK-NEXT: ret double [[EXP2]] 242; 243 %call = tail call afn nnan ninf double @pow(double 1.770000e+01, double %e) 244 ret double %call 245} 246 247define double @pow_ok_base3(double %e) { 248; CHECK-LABEL: @pow_ok_base3( 249; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x400AB0B5{{.*}} 250; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]]) 251; CHECK-NEXT: ret double [[EXP2]] 252; 253 %call = tail call afn nnan ninf double @pow(double 1.010000e+01, double %e) 254 ret double %call 255} 256 257define double @pow_ok_ten_base(double %e) { 258; CHECK-LABEL: @pow_ok_ten_base( 259; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x400A934F{{.*}} 260; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]]) 261; CHECK-NEXT: ret double [[EXP2]] 262; 263 %call = tail call afn nnan ninf double @pow(double 1.000000e+01, double %e) 264 ret double %call 265} 266 267define double @pow_ok_denorm_base(double %e) { 268; CHECK-LABEL: @pow_ok_denorm_base( 269; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0xC0904800000005C5 270; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]]) 271; CHECK-NEXT: ret double [[EXP2]] 272; 273 %call = tail call afn nnan ninf double @pow(double 0x00000000FFFFFFFF, double %e) 274 ret double %call 275} 276 277define float @powf_ok_base(float %e) { 278; CHECK-LABEL: @powf_ok_base( 279; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0xBFE07762{{.*}} 280; CHECK-NEXT: [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]]) 281; CHECK-NEXT: ret float [[EXP2F]] 282; 283 %call = tail call afn nnan ninf float @powf(float 0x3FE6666660000000, float %e) 284 ret float %call 285} 286 287define float @powf_ok_base2(float %e) { 288; CHECK-LABEL: @powf_ok_base2( 289; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x4010952{{.*}} 290; CHECK-NEXT: [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]]) 291; CHECK-NEXT: ret float [[EXP2F]] 292; 293 %call = tail call afn nnan ninf float @powf(float 0x4031B33340000000, float %e) 294 ret float %call 295} 296 297define float @powf_ok_base3(float %e) { 298; CHECK-LABEL: @powf_ok_base3( 299; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x400AB0B5{{.*}} 300; CHECK-NEXT: [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]]) 301; CHECK-NEXT: ret float [[EXP2F]] 302; 303 %call = tail call afn nnan ninf float @powf(float 0x4024333340000000, float %e) 304 ret float %call 305} 306 307define float @powf_ok_ten_base(float %e) { 308; CHECK-LABEL: @powf_ok_ten_base( 309; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x400A934{{.*}} 310; CHECK-NEXT: [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]]) 311; CHECK-NEXT: ret float [[EXP2F]] 312; 313 %call = tail call afn nnan ninf float @powf(float 1.000000e+01, float %e) 314 ret float %call 315} 316 317define float @powf_ok_denorm_base(float %e) { 318; CHECK-LABEL: @powf_ok_denorm_base( 319; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], -1.350000e+02 320; CHECK-NEXT: [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]]) 321; CHECK-NEXT: ret float [[EXP2F]] 322; 323 %call = tail call afn nnan ninf float @powf(float 0x3780000000000000, float %e) 324 ret float %call 325} 326 327; Negative tests 328 329define double @pow_zero_base(double %e) { 330; CHECK-LABEL: @pow_zero_base( 331; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0.000000e+00, double [[E:%.*]]) 332; CHECK-NEXT: ret double [[CALL]] 333; 334 %call = tail call afn nnan ninf double @pow(double 0.000000e+00, double %e) 335 ret double %call 336} 337 338define double @pow_zero_base2(double %e) { 339; CHECK-LABEL: @pow_zero_base2( 340; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn double @pow(double -0.000000e+00, double [[E:%.*]]) 341; CHECK-NEXT: ret double [[CALL]] 342; 343 %call = tail call afn nnan ninf double @pow(double -0.000000e+00, double %e) 344 ret double %call 345} 346 347define double @pow_inf_base(double %e) { 348; CHECK-LABEL: @pow_inf_base( 349; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0x7FF0000000000000, double [[E:%.*]]) 350; CHECK-NEXT: ret double [[CALL]] 351; 352 %call = tail call afn nnan ninf double @pow(double 0x7FF0000000000000, double %e) 353 ret double %call 354} 355 356define double @pow_nan_base(double %e) { 357; CHECK-LABEL: @pow_nan_base( 358; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0x7FF8000000000000, double [[E:%.*]]) 359; CHECK-NEXT: ret double [[CALL]] 360; 361 %call = tail call afn nnan ninf double @pow(double 0x7FF8000000000000, double %e) 362 ret double %call 363} 364 365define double @pow_negative_base(double %e) { 366; CHECK-LABEL: @pow_negative_base( 367; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn double @pow(double -4.000000e+00, double [[E:%.*]]) 368; CHECK-NEXT: ret double [[CALL]] 369; 370 %call = tail call afn nnan ninf double @pow(double -4.000000e+00, double %e) 371 ret double %call 372} 373 374define double @pow_multiuse(double %e) { 375; CHECK-LABEL: @pow_multiuse( 376; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x4002934{{.*}} 377; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]]) 378; CHECK-NEXT: tail call void @use_d(double [[EXP2]]) 379; CHECK-NEXT: ret double [[EXP2]] 380; 381 %call = tail call afn nnan ninf double @pow(double 5.000000e+00, double %e) 382 tail call void @use_d(double %call) 383 ret double %call 384} 385 386define double @pow_ok_base_no_afn(double %e) { 387; CHECK-LABEL: @pow_ok_base_no_afn( 388; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf double @pow(double 0x3FE6666666666666, double [[E:%.*]]) 389; CHECK-NEXT: ret double [[CALL]] 390; 391 %call = tail call nnan ninf double @pow(double 0x3FE6666666666666, double %e) 392 ret double %call 393} 394 395define double @pow_ok_base_no_nnan(double %e) { 396; CHECK-LABEL: @pow_ok_base_no_nnan( 397; CHECK-NEXT: [[CALL:%.*]] = tail call ninf afn double @pow(double 0x3FE6666666666666, double [[E:%.*]]) 398; CHECK-NEXT: ret double [[CALL]] 399; 400 %call = tail call afn ninf double @pow(double 0x3FE6666666666666, double %e) 401 ret double %call 402} 403 404define double @pow_ok_base_no_ninf(double %e) { 405; CHECK-LABEL: @pow_ok_base_no_ninf( 406; CHECK-NEXT: [[MUL:%.*]] = fmul nnan afn double [[E:%.*]], 0xBFE0776{{.*}} 407; CHECK-NEXT: [[EXP2:%.*]] = tail call nnan afn double @exp2(double [[MUL]]) 408; CHECK-NEXT: ret double [[EXP2]] 409; 410 %call = tail call afn nnan double @pow(double 0x3FE6666666666666, double %e) 411 ret double %call 412} 413 414define float @powf_zero_base(float %e) { 415; CHECK-LABEL: @powf_zero_base( 416; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0.000000e+00, float [[E:%.*]]) 417; CHECK-NEXT: ret float [[CALL]] 418; 419 %call = tail call afn nnan ninf float @powf(float 0.000000e+00, float %e) 420 ret float %call 421} 422 423define float @powf_zero_base2(float %e) { 424; CHECK-LABEL: @powf_zero_base2( 425; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn float @powf(float -0.000000e+00, float [[E:%.*]]) 426; CHECK-NEXT: ret float [[CALL]] 427; 428 %call = tail call afn nnan ninf float @powf(float -0.000000e+00, float %e) 429 ret float %call 430} 431 432define float @powf_inf_base(float %e) { 433; CHECK-LABEL: @powf_inf_base( 434; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0x7FF0000000000000, float [[E:%.*]]) 435; CHECK-NEXT: ret float [[CALL]] 436; 437 %call = tail call afn nnan ninf float @powf(float 0x7FF0000000000000, float %e) 438 ret float %call 439} 440 441define float @powf_nan_base(float %e) { 442; CHECK-LABEL: @powf_nan_base( 443; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0x7FF8000000000000, float [[E:%.*]]) 444; CHECK-NEXT: ret float [[CALL]] 445; 446 %call = tail call afn nnan ninf float @powf(float 0x7FF8000000000000, float %e) 447 ret float %call 448} 449 450define float @powf_negative_base(float %e) { 451; CHECK-LABEL: @powf_negative_base( 452; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn float @powf(float -4.000000e+00, float [[E:%.*]]) 453; CHECK-NEXT: ret float [[CALL]] 454; 455 %call = tail call afn nnan ninf float @powf(float -4.000000e+00, float %e) 456 ret float %call 457} 458 459define float @powf_multiuse(float %e) { 460; CHECK-LABEL: @powf_multiuse( 461; CHECK-NEXT: [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x4002934{{.*}} 462; CHECK-NEXT: [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]]) 463; CHECK-NEXT: tail call void @use_f(float [[EXP2F]]) 464; CHECK-NEXT: ret float [[EXP2F]] 465; 466 %call = tail call afn nnan ninf float @powf(float 5.000000e+00, float %e) 467 tail call void @use_f(float %call) 468 ret float %call 469} 470 471define float @powf_ok_base_no_afn(float %e) { 472; CHECK-LABEL: @powf_ok_base_no_afn( 473; CHECK-NEXT: [[CALL:%.*]] = tail call float @powf(float 0x3FE6666660000000, float [[E:%.*]]) 474; CHECK-NEXT: ret float [[CALL]] 475; 476 %call = tail call float @powf(float 0x3FE6666660000000, float %e) 477 ret float %call 478} 479 480define fp128 @powl_long_dbl_no_fold(fp128 %e) { 481; CHECK-LABEL: @powl_long_dbl_no_fold( 482; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn fp128 @powl(fp128 0xL00000000000000005001000000000000, fp128 [[E:%.*]]) 483; CHECK-NEXT: ret fp128 [[CALL]] 484; 485 %call = tail call afn nnan ninf fp128 @powl(fp128 0xL00000000000000005001000000000000, fp128 %e) 486 ret fp128 %call 487} 488 489declare float @expf(float) 490declare double @exp(double) 491declare fp128 @expl(fp128) 492declare float @exp2f(float) 493declare double @exp2(double) 494declare fp128 @exp2l(fp128) 495declare float @exp10f(float) 496declare double @exp10(double) 497declare fp128 @exp10l(fp128) 498declare float @powf(float, float) 499declare double @pow(double, double) 500declare fp128 @powl(fp128, fp128) 501declare float @llvm.pow.f32(float, float) 502declare double @llvm.pow.f64(double, double) 503declare fp128 @llvm.pow.f128(fp128, fp128) 504