[PATCH] Fix ICE with exp.simdclone.0 (PR tree-optimization/84687)
Richard Biener
rguenther@suse.de
Tue Mar 6 06:28:00 GMT 2018
On March 5, 2018 9:40:28 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>This patch clears DECL_BUILT_IN on simd clones, similarly how
>cgraphclones.c
>does:
> /* When signature changes, we need to clear builtin info. */
> if (DECL_BUILT_IN (new_decl)
> && args_to_skip
> && !bitmap_empty_p (args_to_skip))
> {
> DECL_BUILT_IN_CLASS (new_decl) = NOT_BUILT_IN;
> DECL_FUNCTION_CODE (new_decl) = (enum built_in_function) 0;
> }
>because simd clones are always signature changes (would be nice if we
>had
>some way to optimize these later, but seems it wouldn't be easy),
>and in order not to regress optimization-wise, also an early
>optimization
>in match.pd - we have this now deferred till late folding of pow(C,x)
>to exp(log(C)*x), and also exp(x)*exp(y) folding to exp(x+y), if we
>already have one exp (or exp2 or exp10 etc.) call in the
>multiplication,
>there is no reason to defer it any longer, all we do is trade the one
>pow call and one exp{,2,10} call and one multiplication for that
>exp{,2,10} call plus one multiplication and one addition, the addition
>surely will be less expensive than pow and I think precision should not
>be
>that bad either (and it is -ffast-math guarded anyway).
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Thanks,
Richard.
>2018-03-05 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/84687
> * omp-simd-clone.c (simd_clone_create): Clear DECL_BUILT_IN_CLASS
> on new_node->decl.
> * match.pd (pow(C,x)*expN(y) -> expN(logN(C)*x+y)): New optimization.
>
> * gcc.dg/pr84687.c: New test.
>
>--- gcc/omp-simd-clone.c.jj 2018-02-13 09:33:31.107560174 +0100
>+++ gcc/omp-simd-clone.c 2018-03-05 16:47:56.943365091 +0100
>@@ -456,6 +456,8 @@ simd_clone_create (struct cgraph_node *o
> if (new_node == NULL)
> return new_node;
>
>+ DECL_BUILT_IN_CLASS (new_node->decl) = NOT_BUILT_IN;
>+ DECL_FUNCTION_CODE (new_node->decl) = (enum built_in_function) 0;
> TREE_PUBLIC (new_node->decl) = TREE_PUBLIC (old_node->decl);
> DECL_COMDAT (new_node->decl) = DECL_COMDAT (old_node->decl);
> DECL_WEAK (new_node->decl) = DECL_WEAK (old_node->decl);
>--- gcc/match.pd.jj 2018-02-20 14:55:28.988215213 +0100
>+++ gcc/match.pd 2018-03-05 16:52:11.486487079 +0100
>@@ -4030,6 +4030,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> (exps (mult (logs @0) @1))
> (exp2s (mult (log2s @0) @1)))))))
>
>+ /* pow(C,x)*expN(y) -> expN(logN(C)*x+y) if C > 0. */
>+ (for pows (POW)
>+ exps (EXP EXP2 EXP10 POW10)
>+ logs (LOG LOG2 LOG10 LOG10)
>+ (simplify
>+ (mult:c (pows:s REAL_CST@0 @1) (exps:s @2))
>+ (if (real_compare (GT_EXPR, TREE_REAL_CST_PTR (@0), &dconst0)
>+ && real_isfinite (TREE_REAL_CST_PTR (@0)))
>+ (exps (plus (mult (logs @0) @1) @2)))))
>+
> (for sqrts (SQRT)
> cbrts (CBRT)
> pows (POW)
>--- gcc/testsuite/gcc.dg/pr84687.c.jj 2018-03-05 16:45:57.020307612
>+0100
>+++ gcc/testsuite/gcc.dg/pr84687.c 2018-03-05 16:45:41.977300398 +0100
>@@ -0,0 +1,19 @@
>+/* PR tree-optimization/84687 */
>+/* { dg-do compile } */
>+/* { dg-options "-Ofast" } */
>+
>+int a[64], b;
>+double pow (double, double);
>+__attribute__((__simd__)) double exp (double);
>+
>+void
>+foo (double x)
>+{
>+ int i;
>+ double c = exp (x);
>+ for (i = 0; i < 64; i++)
>+ {
>+ b = i;
>+ a[i] = pow (12.0, b) * pow (c, i);
>+ }
>+}
>
> Jakub
More information about the Gcc-patches
mailing list