OSDN Git Service

PR tree-optimization/20920
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Apr 2005 15:05:50 +0000 (15:05 +0000)
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Apr 2005 15:05:50 +0000 (15:05 +0000)
* tree-pretty-print.c (dump_generic_node): Show '(ab)' if an
SSA_NAME flows through an abnormal edge.
* tree-vrp.c (infer_value_range): Ignore SSA names that flow
through abnormal edges.
(maybe_add_assert_expr): Likewise.

PR tree-optimization/20920
* g++.dg/tree-ssa/pr20920.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97971 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr20920.C [new file with mode: 0644]
gcc/tree-pretty-print.c
gcc/tree-vrp.c

index 01b7c25..0b840d3 100644 (file)
@@ -1,3 +1,12 @@
+2005-04-11  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/20920
+       * tree-pretty-print.c (dump_generic_node): Show '(ab)' if an
+       SSA_NAME flows through an abnormal edge.
+       * tree-vrp.c (infer_value_range): Ignore SSA names that flow
+       through abnormal edges.
+       (maybe_add_assert_expr): Likewise.
+
 2005-04-11  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/s390/s390.h (s390_tune_string, s390_arch_string)
index 1ad47f1..50d11b6 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-11  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/20920
+       * g++.dg/tree-ssa/pr20920.C: New test.
+
 2005-04-11  Uros Bizjak  <uros@kss-loka.si>
 
        * gcc.dg/builtins-53.c: Also check (int)ceil* and
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20920.C b/gcc/testsuite/g++.dg/tree-ssa/pr20920.C
new file mode 100644 (file)
index 0000000..02edd28
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* This was causing a failure in the out of SSA pass because VRP was
+   trying to insert assertions for SSA names that flow through
+   abnormal edges.  */
+void f(int) __attribute__((__noreturn__));
+int d(const char *);
+char * j ();
+
+char *
+foo (int x)
+{
+  char *path = __null;
+  try
+    {
+      path = j ();
+      if (path != __null)
+        if (d (path) != 0)
+          f (127);
+      f (127);
+    }
+  catch (...) { }
+
+  return path;
+}
index 598cc90..5d23082 100644 (file)
@@ -1416,6 +1416,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
       pp_string (buffer, "_");
       pp_decimal_int (buffer, SSA_NAME_VERSION (node));
+      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
+       pp_string (buffer, "(ab)");
       break;
 
     case WITH_SIZE_EXPR:
index 3a3260a..3e366d2 100644 (file)
@@ -1280,6 +1280,11 @@ fp_predicate (tree expr)
 static tree
 infer_value_range (tree stmt, tree op)
 {
+  /* Do not attempt to infer anything in names that flow through
+     abnormal edges.  */
+  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
+    return NULL_TREE;
+
   if (POINTER_TYPE_P (TREE_TYPE (op)))
     {
       bool is_store;
@@ -1385,7 +1390,7 @@ has_assert_expr (tree op, tree cond)
 
       d) Mark X and Y in FOUND.
 
-   3- If BB does not end in a conditional expression, then we recurse
+   4- If BB does not end in a conditional expression, then we recurse
       into BB's dominator children.
    
    At the end of the recursive traversal, ASSERT_EXPRs will have been
@@ -1441,7 +1446,7 @@ maybe_add_assert_expr (basic_block bb)
          if (!cond)
            continue;
 
-         /* Step 3.  If OP is used in such a way that we can infer a
+         /* Step 2.  If OP is used in such a way that we can infer a
             value range for it, create a new ASSERT_EXPR for OP
             (unless OP already has an ASSERT_EXPR).  */
          gcc_assert (!is_ctrl_stmt (stmt));
@@ -1504,6 +1509,12 @@ maybe_add_assert_expr (basic_block bb)
         sub-graphs or if they had been found in a block upstream from
         BB.  */
       op = USE_OP (uses, 0);
+
+      /* Do not attempt to infer anything in names that flow through
+        abnormal edges.  */
+      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
+       return false;
+
       RESET_BIT (found, SSA_NAME_VERSION (op));
 
       /* Look for uses of the operands in each of the sub-graphs
@@ -1546,7 +1557,7 @@ maybe_add_assert_expr (basic_block bb)
     }
   else
     {
-      /* Step 3.  Recurse into the dominator children of BB.  */
+      /* Step 4.  Recurse into the dominator children of BB.  */
       basic_block son;
 
       for (son = first_dom_son (CDI_DOMINATORS, bb);