From 2b6719e94d0b518cc8ebb8dfa878346dbbef6d3f Mon Sep 17 00:00:00 2001 From: dnovillo Date: Mon, 11 Apr 2005 15:05:50 +0000 Subject: [PATCH] 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. 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 | 9 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr20920.C | 26 ++++++++++++++++++++++++++ gcc/tree-pretty-print.c | 2 ++ gcc/tree-vrp.c | 17 ++++++++++++++--- 5 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr20920.C 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 + + 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 * 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 + + PR tree-optimization/20920 + * g++.dg/tree-ssa/pr20920.C: New test. + 2005-04-11 Uros Bizjak * 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); -- 2.11.0