[SimplifyLibCalls] Optimization for pow(x, n) where n is some constant
authorWeiming Zhao <weimingz@codeaurora.org>
Fri, 4 Dec 2015 22:00:47 +0000 (22:00 +0000)
committerWeiming Zhao <weimingz@codeaurora.org>
Fri, 4 Dec 2015 22:00:47 +0000 (22:00 +0000)
Summary:
    In order to avoid calling pow function we generate repeated fmul when n is a
    positive or negative whole number.

    For each exponent we pre-compute Addition Chains in order to minimize the no.
    of fmuls.
    Refer: http://wwwhomes.uni-bielefeld.de/achim/addition_chain.html

    We pre-compute addition chains for exponents upto 32 (which results in a max of
    7 fmuls).

    For eg:
    4 = 2+2
    5 = 2+3
    6 = 3+3 and so on

    Hence,
    pow(x, 4.0) ==> y = fmul x, x
                    x = fmul y, y
                    ret x

    For negative exponents, we simply compute the reciprocal of the final result.

    Note: This transformation is only enabled under fast-math.

    Patch by Mandeep Singh Grang <mgrang@codeaurora.org>

Reviewers: weimingz, majnemer, escha, davide, scanon, joerg

Subscribers: probinson, escha, llvm-commits

Differential Revision: http://reviews.llvm.org/D13994

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254776 91177308-0d34-0410-b5e6-96231b3b80d8


No differences found