504 lines · plain
1; NOTE: Do not autogenerate2; Assertions were previously autogenerated by utils/update_test_checks.py3; but some hand modifications were needed to account for rounding errors4; in constant folding that depend on the compiler's math library version.5; RUN: opt < %s -passes=instcombine -S | FileCheck %s6 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 readnone14 %pow = call fast float @llvm.pow.f32(float %call, float %y)15 ret float %pow16}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 %pow27}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 readnone36 %pow = call fast double @llvm.pow.f64(double %call, double %y)37 ret double %pow38}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 readnone47 %pow = call fast double @pow(double %call, double %y) nounwind readnone48 ret double %pow49}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 readnone58 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)59 ret fp128 %pow60}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 %pow71}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 readnone80 %pow = call fast float @llvm.pow.f32(float %call, float %y)81 ret float %pow82}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 readnone91 %pow = call fast float @powf(float %call, float %y) nounwind readnone92 ret float %pow93}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 readnone102 %pow = call fast double @llvm.pow.f64(double %call, double %y)103 ret double %pow104}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 %pow115}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 readnone124 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)125 ret fp128 %pow126}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 %pow137}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 readnone148 %pow = call fast float @llvm.pow.f32(float %call, float %y)149 ret float %pow150}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 readnone159 %pow = call fast double @llvm.pow.f64(double %call, double %y)160 ret double %pow161}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 readnone170 %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)171 ret fp128 %pow172}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 4179; 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 4184 ret float %pow185}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 16192; 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 16197 ret fp128 %pow198}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 %pow209}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 PR42740219; 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 %call225}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 %call235}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 %call245}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 %call255}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 %call265}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:%.*]], 0xC0904800000005C5270; 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 %call275}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 %call285}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 %call295}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 %call305}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 %call315}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+02320; 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 %call325}326 327; Negative tests328 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 %call336}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 %call345}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 %call354}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 %call363}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 %call372}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 %call384}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 %call393}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 %call402}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 %call412}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 %call421}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 %call430}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 %call439}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 %call448}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 %call457}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 %call469}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 %call478}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 %call487}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