https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83348

            Bug ID: 83348
           Summary: Missed optimization in math expression: can be used
                    std::pow function
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zamazan4ik at tut dot by
  Target Milestone: ---

gcc(trunk) with optimization flags '--std=c++17 -O3 -march=native -ffast-math'
for this code:


double f(double a)
{
    return a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*
           a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*
           a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*
           a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*
           a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*
           a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a;
}


generates this assembly:

f(double):
        vmulsd  xmm1, xmm0, xmm0
        vmulsd  xmm1, xmm1, xmm1
        vmulsd  xmm1, xmm1, xmm1
        vmulsd  xmm1, xmm1, xmm1
        vmulsd  xmm0, xmm1, xmm0
        vmulsd  xmm1, xmm0, xmm0
        vmulsd  xmm0, xmm1, xmm0
        vmulsd  xmm0, xmm0, xmm0
        ret


But here it can be simplified by using std::pow function. If you will increase
length of this multiply chain, gcc just will add more and more multiplications.

Reply via email to