[llvm] r340947 - [InstCombine] Expand the simplification of pow() into exp2()

Evandro Menezes via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 30 12:00:24 PDT 2018


Reid,

That's the transformation that I suspected.  I added a test just like 
this to the patch using the triple for Windows.

Thank you,

-- 
Evandro Menezes

On 08/30/2018 01:56 PM, Reid Kleckner wrote:
> I don't have time to try it, but I made this reduction:
> target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-windows-msvc19.11.0"
> @a = dso_local global double 0.000000e+00, align 8
> define dso_local double @b() {
> entry:
>    %0 = load double, double* @a, align 8
>    %call = call double @pow(double 2.000000e+00, double %0)
>    ret double %call
> }
> declare dso_local double @pow(double, double)
> I suspect the triple is the important part.
>
> On Thu, Aug 30, 2018 at 11:01 AM Evandro Menezes 
> <e.menezes at samsung.com <mailto:e.menezes at samsung.com>> wrote:
>
>     Hey, Reid.
>
>     I don't have access to a Windows machine.  Would it be possible
>     for you to try the new patch at https://reviews.llvm.org/D49273?
>
>     Thank you,
>
>     -- 
>     Evandro Menezes
>
>     On 08/29/2018 06:19 PM, Reid Kleckner wrote:
>>     It's a name LLVM makes up when mangling unnamed private globals
>>     like @0 = global i32. I'm not yet sure how your change causes
>>     these problems, but I've gone ahead and reverted your change in
>>     r340991 and am starting a reduction now. I have to run soon so I
>>     won't be able to share it until tomorrow, most likely.
>>
>>     On Wed, Aug 29, 2018 at 4:05 PM Evandro Menezes
>>     <e.menezes at samsung.com <mailto:e.menezes at samsung.com>> wrote:
>>
>>         Reid,
>>
>>         Can you please provide an indication of what this symbol is
>>         about, as I'm not familiar with the VS linker?
>>
>>         Thank you,
>>
>>         -- 
>>         Evandro Menezes
>>
>>         On 08/29/2018 05:50 PM, Reid Kleckner wrote:
>>>         My bisection shows that this broke the clang stage 2 build:
>>>         http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/13525
>>>
>>>         We end up with references to __unnamed_1 globals that are
>>>         unresolved. I'll revert and get a reproducer.
>>>
>>>         On Wed, Aug 29, 2018 at 11:00 AM Evandro Menezes via
>>>         llvm-commits <llvm-commits at lists.llvm.org
>>>         <mailto:llvm-commits at lists.llvm.org>> wrote:
>>>
>>>             Author: evandro
>>>             Date: Wed Aug 29 10:59:34 2018
>>>             New Revision: 340947
>>>
>>>             URL: http://llvm.org/viewvc/llvm-project?rev=340947&view=rev
>>>             Log:
>>>             [InstCombine] Expand the simplification of pow() into exp2()
>>>
>>>             Generalize the simplification of `pow(2.0, y)` to
>>>             `pow(2.0 ** n, y)` for all
>>>             scalar and vector types.
>>>
>>>             This improvement helps some benchmarks in SPEC CPU2000
>>>             and CPU2006, such as
>>>             252.eon, 447.dealII, 453.povray.  Otherwise, no
>>>             significant regressions on
>>>             x86-64 or A64.
>>>
>>>             Differential revision: https://reviews.llvm.org/D49273
>>>
>>>             Modified:
>>>             llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
>>>             llvm/trunk/test/Transforms/InstCombine/pow-1.ll
>>>
>>>             Modified:
>>>             llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
>>>             URL:
>>>             http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=340947&r1=340946&r2=340947&view=diff
>>>             ==============================================================================
>>>             --- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
>>>             (original)
>>>             +++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
>>>             Wed Aug 29 10:59:34 2018
>>>             @@ -13,6 +13,7 @@
>>>              //===----------------------------------------------------------------------===//
>>>
>>>              #include "llvm/Transforms/Utils/SimplifyLibCalls.h"
>>>             +#include "llvm/ADT/APSInt.h"
>>>              #include "llvm/ADT/SmallString.h"
>>>              #include "llvm/ADT/StringMap.h"
>>>              #include "llvm/ADT/Triple.h"
>>>             @@ -1183,12 +1184,13 @@ static Value *getPow(Value
>>>             *InnerChain[3
>>>              }
>>>
>>>              /// Use exp{,2}(x * y) for pow(exp{,2}(x), y);
>>>             -/// exp2(x) for pow(2.0, x); exp10(x) for pow(10.0, x).
>>>             +/// exp2(n * x) for pow(2.0 ** n, x); exp10(x) for
>>>             pow(10.0, x).
>>>              Value *LibCallSimplifier::replacePowWithExp(CallInst
>>>             *Pow, IRBuilder<> &B) {
>>>                Value *Base = Pow->getArgOperand(0), *Expo =
>>>             Pow->getArgOperand(1);
>>>                AttributeList Attrs =
>>>             Pow->getCalledFunction()->getAttributes();
>>>                Module *Mod = Pow->getModule();
>>>                Type *Ty = Pow->getType();
>>>             +  bool Ignored;
>>>
>>>                // Evaluate special cases related to a nested
>>>             function as the base.
>>>
>>>             @@ -1232,10 +1234,28 @@ Value
>>>             *LibCallSimplifier::replacePowWith
>>>
>>>                // Evaluate special cases related to a constant base.
>>>
>>>             -  // pow(2.0, x) -> exp2(x)
>>>             -  if (match(Base, m_SpecificFP(2.0))) {
>>>             -    Value *Exp2 = Intrinsic::getDeclaration(Mod,
>>>             Intrinsic::exp2, Ty);
>>>             -    return B.CreateCall(Exp2, Expo, "exp2");
>>>             +  const APFloat *BaseF;
>>>             +  if (!match(Pow->getArgOperand(0), m_APFloat(BaseF)))
>>>             +    return nullptr;
>>>             +
>>>             +  // pow(2.0 ** n, x) -> exp2(n * x)
>>>             +  APFloat BaseR = APFloat(1.0);
>>>             +  BaseR.convert(BaseF->getSemantics(),
>>>             APFloat::rmTowardZero, &Ignored);
>>>             +  BaseR = BaseR / *BaseF;
>>>             +  bool IsInteger    = BaseF->isInteger(),
>>>             +       IsReciprocal = BaseR.isInteger();
>>>             +  const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
>>>             +  APSInt NI(64, false);
>>>             +  if ((IsInteger || IsReciprocal) &&
>>>             +      !NF->convertToInteger(NI, APFloat::rmTowardZero,
>>>             &Ignored) &&
>>>             +      NI > 1 && NI.isPowerOf2()) {
>>>             +    double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
>>>             +    Value *FMul = B.CreateFMul(Expo,
>>>             ConstantFP::get(Ty, N), "mul");
>>>             +    if (Pow->doesNotAccessMemory())
>>>             +      return
>>>             B.CreateCall(Intrinsic::getDeclaration(Mod,
>>>             Intrinsic::exp2, Ty),
>>>             +                          FMul, "exp2");
>>>             +    else
>>>             +      return emitUnaryFloatFnCall(FMul,
>>>             TLI->getName(LibFunc_exp2), B, Attrs);
>>>                }
>>>
>>>                // pow(10.0, x) -> exp10(x)
>>>
>>>             Modified: llvm/trunk/test/Transforms/InstCombine/pow-1.ll
>>>             URL:
>>>             http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pow-1.ll?rev=340947&r1=340946&r2=340947&view=diff
>>>             ==============================================================================
>>>             --- llvm/trunk/test/Transforms/InstCombine/pow-1.ll
>>>             (original)
>>>             +++ llvm/trunk/test/Transforms/InstCombine/pow-1.ll Wed
>>>             Aug 29 10:59:34 2018
>>>             @@ -16,6 +16,7 @@
>>>
>>>              declare float @powf(float, float) nounwind readonly
>>>              declare double @pow(double, double) nounwind readonly
>>>             +declare double @llvm.pow.f64(double, double)
>>>              declare <2 x float> @llvm.pow.v2f32(<2 x float>, <2 x
>>>             float>) nounwind readonly
>>>              declare <2 x double> @llvm.pow.v2f64(<2 x double>, <2 x
>>>             double>) nounwind readonly
>>>
>>>             @@ -57,18 +58,18 @@ define <2 x double> @test_simplify2v(<2
>>>
>>>              define float @test_simplify3(float %x) {
>>>              ; ANY-LABEL: @test_simplify3(
>>>             -; ANY-NEXT:    [[EXP2:%.*]] = call float
>>>             @llvm.exp2.f32(float [[X:%.*]])
>>>             -; ANY-NEXT:    ret float [[EXP2]]
>>>             +; ANY-NEXT:    [[EXP2F:%.*]] = call float @exp2f(float
>>>             [[X:%.*]]) [[NUW_RO:#[0-9]+]]
>>>             +; ANY-NEXT:    ret float [[EXP2F]]
>>>              ;
>>>                %retval = call float @powf(float 2.0, float %x)
>>>                ret float %retval
>>>              }
>>>
>>>             -; TODO: Should result in exp2(-2.0 * x).
>>>              define double @test_simplify3n(double %x) {
>>>              ; ANY-LABEL: @test_simplify3n(
>>>             -; ANY-NEXT:    [[RETVAL:%.*]] = call double @pow(double
>>>             2.500000e-01, double [[X:%.*]])
>>>             -; ANY-NEXT:    ret double [[RETVAL]]
>>>             +; ANY-NEXT:    [[MUL:%.*]] = fmul double [[X:%.*]],
>>>             -2.000000e+00
>>>             +; ANY-NEXT:    [[EXP2:%.*]] = call double @exp2(double
>>>             [[MUL]]) [[NUW_RO]]
>>>             +; ANY-NEXT:    ret double [[EXP2]]
>>>              ;
>>>                %retval = call double @pow(double 0.25, double %x)
>>>                ret double %retval
>>>             @@ -83,11 +84,11 @@ define <2 x float> @test_simplify3v(<2 x
>>>                ret <2 x float> %retval
>>>              }
>>>
>>>             -; TODO: Should result in exp2(2.0 * x).
>>>              define <2 x double> @test_simplify3vn(<2 x double> %x) {
>>>              ; ANY-LABEL: @test_simplify3vn(
>>>             -; ANY-NEXT:    [[RETVAL:%.*]] = call <2 x double>
>>>             @llvm.pow.v2f64(<2 x double> <double 4.000000e+00,
>>>             double 4.000000e+00>, <2 x double> [[X:%.*]])
>>>             -; ANY-NEXT:    ret <2 x double> [[RETVAL]]
>>>             +; ANY-NEXT:    [[MUL:%.*]] = fmul <2 x double>
>>>             [[X:%.*]], <double 2.000000e+00, double 2.000000e+00>
>>>             +; ANY-NEXT:    [[EXP2:%.*]] = call <2 x double>
>>>             @llvm.exp2.v2f64(<2 x double> [[MUL]])
>>>             +; ANY-NEXT:    ret <2 x double> [[EXP2]]
>>>              ;
>>>                %retval = call <2 x double> @llvm.pow.v2f64(<2 x
>>>             double> <double 4.0, double 4.0>, <2 x double> %x)
>>>                ret <2 x double> %retval
>>>             @@ -95,18 +96,18 @@ define <2 x double> @test_simplify3vn(<2
>>>
>>>              define double @test_simplify4(double %x) {
>>>              ; ANY-LABEL: @test_simplify4(
>>>             -; ANY-NEXT:    [[EXP2:%.*]] = call double
>>>             @llvm.exp2.f64(double [[X:%.*]])
>>>             +; ANY-NEXT:    [[EXP2:%.*]] = call double @exp2(double
>>>             [[X:%.*]]) [[NUW_RO]]
>>>              ; ANY-NEXT:    ret double [[EXP2]]
>>>              ;
>>>                %retval = call double @pow(double 2.0, double %x)
>>>                ret double %retval
>>>              }
>>>
>>>             -; TODO: Should result in exp2f(3.0 * x).
>>>              define float @test_simplify4n(float %x) {
>>>              ; ANY-LABEL: @test_simplify4n(
>>>             -; ANY-NEXT:    [[RETVAL:%.*]] = call float @powf(float
>>>             8.000000e+00, float [[X:%.*]])
>>>             -; ANY-NEXT:    ret float [[RETVAL]]
>>>             +; ANY-NEXT:    [[MUL:%.*]] = fmul float [[X:%.*]],
>>>             3.000000e+00
>>>             +; ANY-NEXT:    [[EXP2F:%.*]] = call float @exp2f(float
>>>             [[MUL]]) [[NUW_RO]]
>>>             +; ANY-NEXT:    ret float [[EXP2F]]
>>>              ;
>>>                %retval = call float @powf(float 8.0, float %x)
>>>                ret float %retval
>>>             @@ -121,11 +122,11 @@ define <2 x double>
>>>             @test_simplify4v(<2
>>>                ret <2 x double> %retval
>>>              }
>>>
>>>             -; TODO: Should result in exp2f(-x).
>>>              define <2 x float> @test_simplify4vn(<2 x float> %x) {
>>>              ; ANY-LABEL: @test_simplify4vn(
>>>             -; ANY-NEXT:    [[RETVAL:%.*]] = call <2 x float>
>>>             @llvm.pow.v2f32(<2 x float> <float 5.000000e-01, float
>>>             5.000000e-01>, <2 x float> [[X:%.*]])
>>>             -; ANY-NEXT:    ret <2 x float> [[RETVAL]]
>>>             +; ANY-NEXT:    [[MUL:%.*]] = fsub <2 x float> <float
>>>             -0.000000e+00, float -0.000000e+00>, [[X:%.*]]
>>>             +; ANY-NEXT:    [[EXP2:%.*]] = call <2 x float>
>>>             @llvm.exp2.v2f32(<2 x float> [[MUL]])
>>>             +; ANY-NEXT:    ret <2 x float> [[EXP2]]
>>>              ;
>>>                %retval = call <2 x float> @llvm.pow.v2f32(<2 x
>>>             float> <float 0.5, float 0.5>, <2 x float> %x)
>>>                ret <2 x float> %retval
>>>             @@ -169,7 +170,7 @@ define <2 x double> @test_simplify6v(<2
>>>
>>>              define float @test_simplify7(float %x) {
>>>              ; ANY-LABEL: @test_simplify7(
>>>             -; ANY-NEXT:    [[SQRTF:%.*]] = call float @sqrtf(float
>>>             [[X:%.*]]) [[NUW_RO:#[0-9]+]]
>>>             +; ANY-NEXT:    [[SQRTF:%.*]] = call float @sqrtf(float
>>>             [[X:%.*]]) [[NUW_RO]]
>>>              ; ANY-NEXT:    [[ABS:%.*]] = call float
>>>             @llvm.fabs.f32(float [[SQRTF]])
>>>              ; ANY-NEXT:    [[ISINF:%.*]] = fcmp oeq float [[X]],
>>>             0xFFF0000000000000
>>>              ; ANY-NEXT:    [[TMP1:%.*]] = select i1 [[ISINF]],
>>>             float 0x7FF0000000000000, float [[ABS]]
>>>             @@ -330,7 +331,6 @@ define <2 x double> @pow_neg1_double_fas
>>>                ret <2 x double> %r
>>>              }
>>>
>>>             -declare double @llvm.pow.f64(double %Val, double %Power)
>>>              define double @test_simplify17(double %x) {
>>>              ; ANY-LABEL: @test_simplify17(
>>>              ; ANY-NEXT:    [[SQRT:%.*]] = call double
>>>             @llvm.sqrt.f64(double [[X:%.*]])
>>>
>>>
>>>             _______________________________________________
>>>             llvm-commits mailing list
>>>             llvm-commits at lists.llvm.org
>>>             <mailto:llvm-commits at lists.llvm.org>
>>>             http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180830/a0b2dbd6/attachment.html>


More information about the llvm-commits mailing list