aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-10-21 08:08:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-10-21 08:08:05 +0000
commit39c97e4132a0e6b16ee4299d87f29c14d5db5313 (patch)
treeb50c0f53459764cd9e9872408b0d572501342029 /gcc/fold-const.c
parent33b35c280747d60086dc2cc640a3c15239ec3e8d (diff)
downloadgcc-39c97e4132a0e6b16ee4299d87f29c14d5db5313.zip
gcc-39c97e4132a0e6b16ee4299d87f29c14d5db5313.tar.gz
gcc-39c97e4132a0e6b16ee4299d87f29c14d5db5313.tar.bz2
re PR tree-optimization/68031 (cc1 crashes when compiling newlib / mktm_r.c)
2015-10-21 Richard Biener <rguenther@suse.de> 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
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c37
1 files changed, 16 insertions, 21 deletions
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));
}