From 3eb1eecf29e1e28982b297e565ee291be8636532 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 15 Feb 2018 12:17:05 +0100 Subject: [PATCH] re PR tree-optimization/84334 (Stack overflow with -Ofast -frounding-math) PR tree-optimization/84334 * match.pd ((A +- CST1) +- CST2 -> A + CST3): If A is also a CONSTANT_CLASS_P, punt. * gcc.dg/pr84334.c: New test. From-SVN: r257683 --- gcc/ChangeLog | 7 +++++++ gcc/match.pd | 9 ++++++--- gcc/testsuite/ChangeLog | 9 ++++++++- gcc/testsuite/gcc.dg/pr84334.c | 12 ++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr84334.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c30a1ed0db..05b77100138 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-02-15 Jakub Jelinek + + PR tree-optimization/84334 + * match.pd ((A +- CST1) +- CST2 -> A + CST3): If A is + also a CONSTANT_CLASS_P, punt. + 2018-02-14 Jim Wilson * config/riscv/riscv.c (riscv_first_stack_step): Move locals after @@ -2336,6 +2342,7 @@ * config/aarch64/predicates.md (Uti): Add new constraint. 2018-01-17 Carl Love + * config/rs6000/vsx.md (define_expand xl_len_r, define_expand stxvl, define_expand *stxvl): Add match_dup argument. (define_insn): Add, match_dup 1 argument to define_insn stxvll and diff --git a/gcc/match.pd b/gcc/match.pd index f7597110c4b..4452b58caed 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1733,9 +1733,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) CONSTANT_CLASS_P@2) /* If one of the types wraps, use that one. */ (if (!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_WRAPS (type)) - (if (outer_op == PLUS_EXPR) - (plus (view_convert @0) (inner_op @2 (view_convert @1))) - (minus (view_convert @0) (neg_inner_op @2 (view_convert @1)))) + /* If all 3 captures are CONSTANT_CLASS_P, punt, as we might recurse + forever if something doesn't simplify into a constant. */ + (if (!CONSTANT_CLASS_P (@0)) + (if (outer_op == PLUS_EXPR) + (plus (view_convert @0) (inner_op @2 (view_convert @1))) + (minus (view_convert @0) (neg_inner_op @2 (view_convert @1))))) (if (!ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0)) || TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))) (if (outer_op == PLUS_EXPR) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 431af1a9008..2ac6e7b0dfa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,10 @@ +2018-02-15 Jakub Jelinek + + PR tree-optimization/84334 + * gcc.dg/pr84334.c: New test. + 2018-02-14 Carl Love + * gcc.target/powerpc/builtins-4-int128-runnable.c (dg-require-effective-target): Change vsx_hw to p8vector_hw. (dg-options): Change -maltivec -mvsx to -mpower8-vector. @@ -1558,6 +1564,7 @@ * gcc.target/powerpc/pr83862.c: New test. 2018-01-22 Carl Love + * gcc.target/powerpc/powerpc.exp: Add torture tests for builtins-4-runnable.c, builtins-6-runnable.c, builtins-5-p9-runnable.c, builtins-6-p9-runnable.c. @@ -3617,7 +3624,7 @@ PR c++/83734 * g++.dg/cpp0x/pr83734.C: New test. -2018-01-09 Carl Love +2018-01-09 Carl Love * gcc.target/powerpc/builtins-1.c (main): Add tests for vec_mergee and vec_mergeo builtins with float, double, long long, unsigned long long, diff --git a/gcc/testsuite/gcc.dg/pr84334.c b/gcc/testsuite/gcc.dg/pr84334.c new file mode 100644 index 00000000000..8cfde69bd82 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr84334.c @@ -0,0 +1,12 @@ +/* PR tree-optimization/84334 */ +/* { dg-do compile } */ +/* { dg-options "-Ofast -frounding-math" } */ + +float +foo (void) +{ + float a = 9.999999974752427078783512115478515625e-7f; + float b = 1.999999994950485415756702423095703125e-6f; + float c = 4.999999873689375817775726318359375e-6f; + return a + b + c; +} -- 2.30.2