From 39c97e4132a0e6b16ee4299d87f29c14d5db5313 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 21 Oct 2015 08:08:05 +0000 Subject: [PATCH] re PR tree-optimization/68031 (cc1 crashes when compiling newlib / mktm_r.c) 2015-10-21 Richard Biener PR middle-end/68031 * fold-const.c: Include tree-ssa-operands.h and tree-into-ssa.h. (tree_ssa_name_nonnegative_warnv_p): Fold into ... (tree_single_nonnegative_warnv_p): ... here. For SSA names make sure they are not registered for update. * gcc.dg/torture/pr68031.c: New testcase. From-SVN: r229118 --- gcc/ChangeLog | 8 ++++++++ gcc/fold-const.c | 37 +++++++++++++++------------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr68031.c | 11 ++++++++++ 4 files changed, 40 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr68031.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20c272d..89b7c44 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2015-10-21 Richard Biener + PR middle-end/68031 + * fold-const.c: Include tree-ssa-operands.h and tree-into-ssa.h. + (tree_ssa_name_nonnegative_warnv_p): Fold into ... + (tree_single_nonnegative_warnv_p): ... here. For SSA names + make sure they are not registered for update. + +2015-10-21 Richard Biener + PR tree-optimization/68026 * tree-ssa-ccp.c (get_value_for_expr): Zero-extend mask for unsigned VARYING values. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 1e7fbb4..197383d 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -79,6 +79,8 @@ along with GCC; see the file COPYING3. If not see #include "optabs-query.h" #include "gimple-fold.h" #include "params.h" +#include "tree-ssa-operands.h" +#include "tree-into-ssa.h" #ifndef LOAD_EXTEND_OP #define LOAD_EXTEND_OP(M) UNKNOWN @@ -12940,25 +12942,6 @@ tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0, return false; } -/* Return true if SSA name T is known to be non-negative. If the return - value is based on the assumption that signed overflow is undefined, - set *STRICT_OVERFLOW_P to true; otherwise, don't change - *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */ - -static bool -tree_ssa_name_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth) -{ - /* Limit the depth of recursion to avoid quadratic behavior. - This is expected to catch almost all occurrences in practice. - If this code misses important cases that unbounded recursion - would not, passes that need this information could be revised - to provide it through dataflow propagation. */ - if (depth < PARAM_VALUE (PARAM_MAX_SSA_NAME_QUERY_DEPTH)) - return gimple_stmt_nonnegative_warnv_p (SSA_NAME_DEF_STMT (t), - strict_overflow_p, depth); - return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t)); -} - /* Return true if T is known to be non-negative. If the return value is based on the assumption that signed overflow is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change @@ -12967,6 +12950,10 @@ tree_ssa_name_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth) bool tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth) { + if (TREE_CODE (t) == SSA_NAME + && name_registered_for_update_p (t)) + return false; + if (TYPE_UNSIGNED (TREE_TYPE (t))) return true; @@ -12985,8 +12972,16 @@ tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth) return RECURSE (TREE_OPERAND (t, 1)) && RECURSE (TREE_OPERAND (t, 2)); case SSA_NAME: - return tree_ssa_name_nonnegative_warnv_p (t, strict_overflow_p, depth); - + /* Limit the depth of recursion to avoid quadratic behavior. + This is expected to catch almost all occurrences in practice. + If this code misses important cases that unbounded recursion + would not, passes that need this information could be revised + to provide it through dataflow propagation. */ + if (depth < PARAM_VALUE (PARAM_MAX_SSA_NAME_QUERY_DEPTH)) + return gimple_stmt_nonnegative_warnv_p (SSA_NAME_DEF_STMT (t), + strict_overflow_p, depth); + + /* Fallthru. */ default: return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1809ddf..9c09d65 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2015-10-21 Richard Biener + PR middle-end/68031 + * gcc.dg/torture/pr68031.c: New testcase. + +2015-10-21 Richard Biener + PR tree-optimization/68026 * gcc.dg/tree-ssa/ssa-ccp-39.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr68031.c b/gcc/testsuite/gcc.dg/torture/pr68031.c new file mode 100644 index 0000000..76790a6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68031.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +void _mktm_r (long lcltime, int *res) +{ + long rem = lcltime % ((60L * 60L) * 24L); + if (rem < 0) + return; + while (rem >= ((60L * 60L) * 24L)) + rem -= ((60L * 60L) * 24L); + *res = (int) (rem % 60L); +} -- 2.7.4