[Bug libfortran/68743] [6 Regression] FAIL: gfortran.dg/aint_anint_1.f90 -O0 execution test
sgk at troutmask dot apl.washington.edu
gcc-bugzilla@gcc.gnu.org
Wed Dec 16 00:02:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68743
--- Comment #21 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Tue, Dec 15, 2015 at 08:58:23PM +0000, danglin at gcc dot gnu.org wrote:
>
> The -fno-builtin option works and gives the best code:
>
> stw %r2,-20(%r30)
> ldo 64(%r30),%r30
> .CALL ARGW0=FR,ARGW1=FU
> bl floor,%r2
> fcnvff,sgl,dbl %fr4L,%fr5
> fcnvff,dbl,sgl %fr4,%fr4L
> ldw -84(%r30),%r2
> bv %r0(%r2)
> ldo -64(%r30),%r30
-fno-builtin would apply to the whole file, and may then
be a pessimization for other functions in c99_functions.c.
> The first approach in #16 can be made to work but one needs to assign
> x to a volatile double instead of retval. The code isn't too bad but
> it introduces an unnecessary store/load pair:
>
> float
> floorf (float x)
> {
> volatile double y = x;
> return (float) floor(y);
> }
>
> gives
>
> stw %r2,-20(%r30)
> fcnvff,sgl,dbl %fr4L,%fr4
> ldo 64(%r30),%r30
> ldo -64(%r30),%r28
> fstds %fr4,8(%r28)
> fldds 8(%r28),%fr5
> .CALL ARGW0=FR,ARGW1=FU
> bl floor,%r2
> nop
>
I suspect that this is the option that should be committed.
It fixes the problem and localizes the store/load penalty
to only floorf. If you want to commit the above fix, it's
ok with me.
More information about the Gcc-bugs
mailing list