summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr20920.C26
-rw-r--r--gcc/tree-pretty-print.c2
-rw-r--r--gcc/tree-vrp.c17
5 files changed, 56 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01b7c253d81..0b840d32060 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1ad47f1aa38..50d11b6abb4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..02edd282773
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr20920.C
@@ -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;
+}
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 598cc907819..5d230822a92 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -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:
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 3a3260a7f4b..3e366d2dc0f 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -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);