re PR tree-optimization/68031 (cc1 crashes when compiling newlib / mktm_r.c)
authorRichard Biener <rguenther@suse.de>
Wed, 21 Oct 2015 08:08:05 +0000 (08:08 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 21 Oct 2015 08:08:05 +0000 (08:08 +0000)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr68031.c [new file with mode: 0644]

index 20c272d9edc3f7261d85de30a0cd50369cb6ec12..89b7c441f2e2da510f1c28c0e6fa7302649db01e 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2015-10-21  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68026
index 1e7fbb4aaf5b15a83a6d99eca7c5f1549eee1457..197383db70f1f9baa10e811d99592e64f404c6d3 100644 (file)
@@ -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));
     }
index 1809ddfcce380aa33ee9abdd0c2b4125160c3b2e..9c09d652279ed3de44ba94b61f37f9571631e98f 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-21  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/68031
+       * gcc.dg/torture/pr68031.c: New testcase.
+
 2015-10-21  Richard Biener  <rguenther@suse.de>
 
        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 (file)
index 0000000..76790a6
--- /dev/null
@@ -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);
+}