From: Richard Biener Date: Wed, 21 Oct 2015 08:08:05 +0000 (+0000) Subject: re PR tree-optimization/68031 (cc1 crashes when compiling newlib / mktm_r.c) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=39c97e4132a0e6b16ee4299d87f29c14d5db5313;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20c272d9edc..89b7c441f2e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +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 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 1e7fbb4aaf5..197383db70f 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 1809ddfcce3..9c09d652279 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/gcc.dg/torture/pr68031.c b/gcc/testsuite/gcc.dg/torture/pr68031.c new file mode 100644 index 00000000000..76790a6592c --- /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); +}