Hi! When changing my recent match.pd fix to defer the -> exp2 (log2 (C) * x) optimization until later, I've swapped the two patterns and changed the first one to use exps and logs, but forgot to change the second one to use exp2s and log2s. For the testcase in the patch it actually didn't make a difference, it was enough that we deferred optimizing it (because we shortly afterwards propagated constants into the pow and constant folded it).
This patch adds a testcase that verifies it is done properly. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-02-13 Jakub Jelinek <ja...@redhat.com> PR middle-end/84309 * match.pd (pow(C,x) -> exp(log(C)*x)): Use exp2s and log2s instead of exps and logs in the use_exp2 case. * gcc.dg/pr84309-2.c: New test. --- gcc/match.pd.jj 2018-02-13 12:14:08.108314686 +0100 +++ gcc/match.pd 2018-02-13 12:28:59.958328523 +0100 @@ -4032,7 +4032,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* As libmvec doesn't have a vectorized exp2, defer optimizing this until after vectorization. */ (if (canonicalize_math_after_vectorization_p ()) - (exps (mult (logs @0) @1)))))))) + (exp2s (mult (log2s @0) @1)))))))) (for sqrts (SQRT) cbrts (CBRT) --- gcc/testsuite/gcc.dg/pr84309-2.c.jj 2018-02-13 12:30:25.208304990 +0100 +++ gcc/testsuite/gcc.dg/pr84309-2.c 2018-02-13 12:31:35.959285452 +0100 @@ -0,0 +1,11 @@ +/* PR middle-end/84309 */ +/* { dg-do compile } */ +/* { dg-options "-Ofast -fdump-tree-optimized" } */ + +double +foo (double x) +{ + return __builtin_pow (2.0, x); +} + +/* { dg-final { scan-tree-dump "__builtin_exp2 " "optimized" { target *-*-linux* *-*-gnu* } } } */ Jakub