Index: llvm/include/llvm/Support/MathExtras.h =================================================================== --- llvm/include/llvm/Support/MathExtras.h +++ llvm/include/llvm/Support/MathExtras.h @@ -39,6 +39,7 @@ #endif namespace llvm { + /// The behavior an operation has on an input of 0. enum ZeroBehavior { /// The returned value is undefined. @@ -49,6 +50,41 @@ ZB_Width }; +/// Mathematical constants. +namespace numbers { +/// TODO: Track C++20 std::numbners. +constexpr double e = 2.7182818284590452354, // https://oeis.org/A001113 + egamma = .57721566490153286061, // https://oeis.org/A001620 + ln2 = .69314718055994530942, // https://oeis.org/A002162 + ln10 = 2.3025850929940456840, // https://oeis.org/A002392 + log2e = 1.4426950408889634074, + log10e = .43429448190325182765, + pi = 3.1415926535897932385, // https://oeis.org/A000796 + inv_pi = .31830988618379067154, // https://oeis.org/A049541 + sqrtpi = 1.7724538509055160273, // https://oeis.org/A002161 + inv_sqrtpi = .56418958354775628695, // https://oeis.org/A087197 + sqrt2 = 1.4142135623730950488, // https://oeis.org/A00219 inv_sqrt2 = 0.7071067811865475, + inv_sqrt2 = .70710678118654752440, + sqrt3 = 1.7320508075688772935, // https://oeis.org/A002194 + inv_sqrt3 = .57735026918962576451, + phi = 1.6180339887498948482; // https://oeis.org/A001622 +constexpr float ef = 2.71828183F, // https://oeis.org/A001113 + egammaf = .577215665F, // https://oeis.org/A001620 + ln2f = .693147181F, // https://oeis.org/A002162 + ln10f = 2.30258509F, // https://oeis.org/A002392 + log2ef = 1.44269504F, + log10ef = .434294482F, + pif = 3.14159265F, // https://oeis.org/A000796 + inv_pif = .318309886F, // https://oeis.org/A049541 + sqrtpif = 1.77245385F, // https://oeis.org/A002161 + inv_sqrtpif = .564189584F, // https://oeis.org/A087197 + sqrt2f = 1.41421356F, // https://oeis.org/A002193 + inv_sqrt2f = .707106781F, + sqrt3f = 1.73205081F, // https://oeis.org/A002194 + inv_sqrt3f = .577350269F, + phif = 1.61803399F; // https://oeis.org/A001622 +} // namespace numbers + namespace detail { template struct TrailingZerosCounter { static unsigned count(T Val, ZeroBehavior) { Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -4974,12 +4974,11 @@ // Put the exponent in the right bit position for later addition to the // final result: // - // #define LOG2OFe 1.4426950f - // t0 = Op * LOG2OFe + // t0 = Op * log2(e) // TODO: What fast-math-flags should be set here? SDValue t0 = DAG.getNode(ISD::FMUL, dl, MVT::f32, Op, - getF32Constant(DAG, 0x3fb8aa3b, dl)); + DAG.getConstantFP(numbers::log2ef, dl, MVT::f32)); return getLimitedPrecisionExp2(t0, dl, DAG); } @@ -4997,10 +4996,11 @@ LimitFloatPrecision > 0 && LimitFloatPrecision <= 18) { SDValue Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op); - // Scale the exponent by log(2) [0.69314718f]. + // Scale the exponent by log(2). SDValue Exp = GetExponent(DAG, Op1, TLI, dl); - SDValue LogOfExponent = DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp, - getF32Constant(DAG, 0x3f317218, dl)); + SDValue LogOfExponent = + DAG.getNode(ISD::FMUL, dl, MVT::f32, Exp, + DAG.getConstantFP(numbers::ln2f, dl, MVT::f32)); // Get the significand and build it into a floating-point number with // exponent of 1. Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp =================================================================== --- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -48,7 +48,6 @@ cl::desc("Enable unsafe double to float " "shrinking for math lib calls")); - //===----------------------------------------------------------------------===// // Helper Functions //===----------------------------------------------------------------------===// @@ -1941,9 +1940,8 @@ ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) { Constant *Eul; if (ArgLb == ExpLb || ArgID == Intrinsic::exp) - // FIXME: The Euler number should be M_E, but it's place of definition - // is not quite standard. - Eul = ConstantFP::get(Log->getType(), 2.7182818284590452354); + // FIXME: Add more precise value of e for long double. + Eul = ConstantFP::get(Log->getType(), numbers::e); else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2) Eul = ConstantFP::get(Log->getType(), 2.0); else