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 <[email protected]>
> Sent: Tuesday, August 17, 2021 9:13 AM
> To: Andrew Pinski <[email protected]>
> Cc: Jirui Wu <[email protected]>; Richard Sandiford
> <[email protected]>; [email protected]; [email protected];
> [email protected]
> 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-
> [email protected]> wrote:
> >
> > On Mon, Aug 16, 2021 at 9:15 AM Jirui Wu via Gcc-patches
> > <[email protected]> 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.
diff
Description: diff
