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.
diff
Description: diff