https://bugs.llvm.org/show_bug.cgi?id=43239

            Bug ID: 43239
           Summary: Missed optimization: extra XOR and FMA
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++
          Assignee: unassignedclangb...@nondot.org
          Reporter: zamazan...@tut.by
                CC: blitzrak...@gmail.com, dgre...@apple.com,
                    erik.pilking...@gmail.com, llvm-bugs@lists.llvm.org,
                    richard-l...@metafoo.co.uk

For the code below:


#include <cmath>

double t1(double x, double y)
{
    return std::sqrt(x*x + y*y);
}


clang(trunk) with '-O3 -ffast-math' generates:


t1(double, double):                                # @t1(double, double)
        mulsd   xmm0, xmm0
        mulsd   xmm1, xmm1
        addsd   xmm1, xmm0
        xorps   xmm0, xmm0
        sqrtsd  xmm0, xmm1
        ret


gcc(trunk) with '-O3 -ffast-math' is better here (doesn't add extra xorps
instr) and generates:


t1(double, double):
        mulsd   xmm1, xmm1
        mulsd   xmm0, xmm0
        addsd   xmm0, xmm1
        sqrtsd  xmm0, xmm0
        ret


Godbolt playground: https://godbolt.org/z/Cx9EDI

Also note that with '-O3 -march=native -ffast-math' both compilers (gcc(trunk)
and clang(trunk)) generate equal code:


t1(double, double):
        vmulsd  xmm1, xmm1, xmm1
        vfmadd132sd     xmm0, xmm1, xmm0
        vsqrtsd xmm0, xmm0, xmm0
        ret

Godbolt playground: https://godbolt.org/z/fHgGxw


But without '-ffast-math' outputs are different: clang doesn't use FMA instr.

Godbolt playground: https://godbolt.org/z/X46_hD

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to