diff options
author | Daniel Jacobowitz <dan@codesourcery.com> | 2007-08-01 16:53:01 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@gcc.gnu.org> | 2007-08-01 16:53:01 +0000 |
commit | 62b0d9ecf809e007149b3921256ba6999e95dc89 (patch) | |
tree | d02919ec89b4a0c74b6a0015731011335652b7ca | |
parent | 08e7e8cb97f7b79d945ac7a53102cc94ce6f433c (diff) | |
download | gcc-62b0d9ecf809e007149b3921256ba6999e95dc89.zip gcc-62b0d9ecf809e007149b3921256ba6999e95dc89.tar.gz gcc-62b0d9ecf809e007149b3921256ba6999e95dc89.tar.bz2 |
re PR tree-optimization/32919 (SSA corruption because of abnormal edges and PRE)
PR tree-optimization/32919
* tree-ssa-sccvn.c (visit_phi): Do not visit abnormal PHIs.
* tree-ssa-coalesce.c (ssa_conflicts_dump): New.
(coalesce_ssa_name): Call it.
From-SVN: r127132
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr32919.c | 26 | ||||
-rw-r--r-- | gcc/tree-ssa-coalesce.c | 20 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 5 |
5 files changed, 63 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12d7e67..9b951a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-08-01 Daniel Jacobowitz <dan@codesourcery.com> + + PR tree-optimization/32919 + * tree-ssa-sccvn.c (visit_phi): Do not visit abnormal PHIs. + * tree-ssa-coalesce.c (ssa_conflicts_dump): New. + (coalesce_ssa_name): Call it. + 2007-08-01 Sandra Loosemore <sandra@codesourcery.com> David Ung <davidu@mips.com> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a6af5f8..c2de714 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-01 Daniel Jacobowitz <dan@codesourcery.com> + + PR tree-optimization/32919 + * gcc.c-torture/compile/pr32919.c: New. + 2007-08-01 Nick Clifton <nickc@redhat.com> * gcc.c-torture/execute/execute.exp: Change copyright header to diff --git a/gcc/testsuite/gcc.c-torture/compile/pr32919.c b/gcc/testsuite/gcc.c-torture/compile/pr32919.c new file mode 100644 index 0000000..33956c8 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr32919.c @@ -0,0 +1,26 @@ +void _IO_vfprintf_internal ( char *f ) +{ + static const void *const step0_jumps[] = { &&do_form_unknown, &&do_flag_plus, &&do_form_float }; + const void * ptr = step0_jumps[0]; + do { + char spec; + spec = (*++f); + goto *ptr; +do_flag_plus: + read_int (&f); +do_number: + _itoa_word (spec); +do_form_float: + if (ptr != ((void *)0)) + { + spec = 'x'; + goto do_number; + } + if (spec != 'S') + __strnlen (); + return; + do_form_unknown:; + } + while (*f != '\0'); +} + diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c index 4e3a5a3..1b63635 100644 --- a/gcc/tree-ssa-coalesce.c +++ b/gcc/tree-ssa-coalesce.c @@ -589,6 +589,24 @@ ssa_conflicts_merge (ssa_conflicts_p ptr, unsigned x, unsigned y) } +/* Dump a conflicts graph. */ + +static void +ssa_conflicts_dump (FILE *file, ssa_conflicts_p ptr) +{ + unsigned x; + + fprintf (file, "\nConflict graph:\n"); + + for (x = 0; x < ptr->size; x++) + if (ptr->conflicts[x]) + { + fprintf (dump_file, "%d: ", x); + dump_bitmap (file, ptr->conflicts[x]); + } +} + + /* This structure is used to efficiently record the current status of live SSA_NAMES when building a conflict graph. LIVE_BASE_VAR has a bit set for each base variable which has at least one @@ -1302,6 +1320,8 @@ coalesce_ssa_name (void) /* Build a conflict graph. */ graph = build_ssa_conflict_graph (liveinfo); delete_tree_live_info (liveinfo); + if (dump_file && (dump_flags & TDF_DETAILS)) + ssa_conflicts_dump (dump_file, graph); sort_coalesce_list (cl); diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 607cd1d..5e6a86a 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1259,6 +1259,11 @@ visit_phi (tree phi) bool allsame = true; int i; + /* TODO: We could check for this in init_sccvn, and replace this + with a gcc_assert. */ + if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi))) + return set_ssa_val_to (PHI_RESULT (phi), PHI_RESULT (phi)); + /* See if all non-TOP arguments have the same value. TOP is equivalent to everything, so we can ignore it. */ for (i = 0; i < PHI_NUM_ARGS (phi); i++) |