This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: fast-math optimization question
- From: Andrew Pinski <pinskia at gmail dot com>
- To: Steve Ellcey <sellcey at mips dot com>
- Cc: GCC Mailing List <gcc at gcc dot gnu dot org>
- Date: Thu, 9 Oct 2014 11:27:15 -0700
- Subject: Re: fast-math optimization question
- Authentication-results: sourceware.org; auth=none
- References: <10940e4b-0c5c-4a2a-9432-6385e9590fb4 at BAMAIL02 dot ba dot imgtec dot org>
On Thu, Oct 9, 2014 at 11:23 AM, Steve Ellcey <sellcey@mips.com> wrote:
> I have a -ffast-math (missing?) optimization question. I noticed on MIPS
> that if I compiled:
>
> #include <math.h>
> extern x;
> void foo() { x = sin(log(x)); }
>
> GCC will extend 'x' to double precision, call the double precision log and sin
> functions and then truncate the result to single precision.
>
> If instead, I have:
>
> #include <math.h>
> extern x;
> void foo() { x = log(x); x = sin(x); }
>
> Then GCC will call the single precision log and sin functions and not do
> any extensions or truncations. In addition to avoiding the extend/trunc
> instructions the single precision log and sin functions are presumably
> faster then the double precision ones making the entire code much faster.
>
> Is there a reason why GCC couldn't (under -ffast-math) call the single
> precision routines for the first case?
There is no reason why it could not. The reason why it does not
currently is because there is no pass which does the demotion and the
only case of demotion that happens is with a simple
(float)function((double)float_val);
Thanks,
Andrew