On Fri, 6 Sep 2019, Richard Biener wrote: > On Thu, 5 Sep 2019, Barnaby Wilks wrote: > > > Hello, > > > > This patch changes a match.pd expression so that binary math expressions > > will not be done in the precision of it's widest type if > > -funsafe-math-optimizations is enabled. > > > > This patch has been extracted from > > https://gcc.gnu.org/ml/gcc-patches/2019-09/msg00072.html > > based on upstream comments. > > > > For example take the function: > > > > float f (float x, float y) { > > double z = 1.0 / x; > > return z * y; > > } > > > > Without this patch this would generate the following (with -Ofast): > > > > _1 = (double) x_4(D); > > z_5 = 1.0e+0 / _1; > > _2 = (double) y_6(D); > > _3 = _2 * z_5; > > _7 = (float) _3; > > return _7; > > > > This contains 3 unnecessary casts - since all outputs of the expression > > are in single precision, the calculation itself can be done entirely in > > single precision - instead of converting the operands to double, > > doing the calculation and then converting the result back to > > single precision again. > > > > With this patch (and -Ofast) the following GIMPLE is generated: > > > > _5 = 1.0e+0 / x_1(D); > > _3 = y_2(D) * _5; > > return _3; > > > > The benefits can then be seen in the generated code: > > > > Without this patch > > > > f: > > fcvt d1, s1 > > fcvt d0, s0 > > fdiv d0, d1, d0 > > fcvt s0, d0 > > ret > > > > > > With this patch > > > > f: > > fdiv s0, s1, s0 > > ret > > > > Added tests to verify that no unnecessary casts are kept. > > > > Bootstrapped and regtested on aarch64 and x86_64 with no regressions. > > > > I don't have write access, so if OK for trunk then can someone commit on > > my behalf? > > OK. I'll commit it after a round of testing.
So on x86_64 I see the testcase FAILing: FAIL: gcc.dg/fold-binary-math-casts.c scan-tree-dump-not optimized "\\\\(double\\\\)" FAIL: gcc.dg/fold-binary-math-casts.c scan-tree-dump-not optimized "\\\\(float\\\\)" It's float k (float a) { return 1.0 / sqrt (a); } where we don't narrow the sqrt call itself (leftover from the other pattern?) Richard. > Thanks, > Richard. > > > Regards > > Barney > > > > gcc/ChangeLog: > > > > 2019-09-05 Barnaby Wilks <barnaby.wi...@arm.com> > > > > * match.pd: Add flag_unsafe_math_optimizations check > > before deciding on the widest type in a binary math operation. > > > > gcc/testsuite/ChangeLog: > > > > 2019-09-05 Barnaby Wilks <barnaby.wi...@arm.com> > > > > * gcc.dg/fold-binary-math-casts.c: New test. > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 247165 (AG München)