Hi all,

This patch generates FRINTZ instruction to optimize type casts.

The changes in this patch covers:
* Generate FRINTZ for (double)(int) casts.
* Add new test cases.

The intermediate type is not checked according to the C99 spec. 
Overflow of the integral part when casting floats to integers causes undefined 
behavior.
As a result, optimization to trunc() is not invalid. 
I've confirmed that Boolean type does not match the matching condition.

Regtested on aarch64-none-linux-gnu and no issues.

Ok for master? If OK can it be committed for me, I have no commit rights.

Thanks,
Jirui

gcc/ChangeLog:

        * match.pd: Generate IFN_TRUNC.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/merge_trunc1.c: New test.

> -----Original Message-----
> From: Richard Biener <richard.guent...@gmail.com>
> Sent: Tuesday, August 17, 2021 9:13 AM
> To: Andrew Pinski <pins...@gmail.com>
> Cc: Jirui Wu <jirui...@arm.com>; Richard Sandiford
> <richard.sandif...@arm.com>; i...@airs.com; gcc-patches@gcc.gnu.org;
> rguent...@suse.de
> Subject: Re: [Patch][GCC][middle-end] - Generate FRINTZ for (double)(int)
> under -ffast-math on aarch64
> 
> On Mon, Aug 16, 2021 at 8:48 PM Andrew Pinski via Gcc-patches <gcc-
> patc...@gcc.gnu.org> wrote:
> >
> > On Mon, Aug 16, 2021 at 9:15 AM Jirui Wu via Gcc-patches
> > <gcc-patches@gcc.gnu.org> wrote:
> > >
> > > Hi all,
> > >
> > > This patch generates FRINTZ instruction to optimize type casts.
> > >
> > > The changes in this patch covers:
> > > * Opimization of a FIX_TRUNC_EXPR cast inside a FLOAT_EXPR using
> IFN_TRUNC.
> > > * Change of corresponding test cases.
> > >
> > > Regtested on aarch64-none-linux-gnu and no issues.
> > >
> > > Ok for master? If OK can it be committed for me, I have no commit rights.
> >
> > Is there a reason why you are doing the transformation manually inside
> > forwprop rather than handling it inside match.pd?
> > Also can't this only be done for -ffast-math case?
> 
> You definitely have to look at the intermediate type - that could be a uint8_t
> or even a boolean type.  So unless the intermediate type can represent all
> float values optimizing to trunc() is invalid.  Also if you emit IFN_TRUNC you
> have to make sure there's target support - we don't emit calls to a library
> trunc() from an internal function call (and we wouldn't want to optimize it
> that way).
> 
> Richard.
> 
> >
> > Thanks,
> > Andrew Pinski
> >
> > >
> > > Thanks,
> > > Jirui
> > >
> > > gcc/ChangeLog:
> > >
> > >         * tree-ssa-forwprop.c (pass_forwprop::execute): Optimize with 
> > > frintz.
> > >
> > >
> > > gcc/testsuite/ChangeLog:
> > >
> > >         * gcc.target/aarch64/fix_trunc1.c: Update to new expectation.

Attachment: diff
Description: diff

Reply via email to