From: Daniel Jacobowitz Date: Wed, 1 Aug 2007 16:53:01 +0000 (+0000) Subject: re PR tree-optimization/32919 (SSA corruption because of abnormal edges and PRE) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=62b0d9ecf809e007149b3921256ba6999e95dc89;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12d7e678204..9b951a7cdf3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-08-01 Daniel Jacobowitz + + 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 David Ung diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a6af5f8825b..c2de7148117 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-01 Daniel Jacobowitz + + PR tree-optimization/32919 + * gcc.c-torture/compile/pr32919.c: New. + 2007-08-01 Nick Clifton * 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 00000000000..33956c8c0b2 --- /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 4e3a5a3df83..1b63635881b 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 607cd1d298c..5e6a86a4b6c 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++)