From 5f7055585a583123884ed6b9c2eec1c8f340dbdb Mon Sep 17 00:00:00 2001 From: Kenneth Zadeck Date: Sun, 17 Jun 2007 17:51:25 +0000 Subject: [PATCH] re PR middle-end/32349 (ICE in df_refs_verify with -O2 -fmodulo-sched for spec tests) 2007-06-17 Kenneth Zadeck PR middle-end/32349 * modulo-sched (generate_reg_moves): Added rescan parameter and if this is true, rescan insn being modified. (sms_schedule): Added rescan parameter. (rest_of_handle_sms): Moved freeing of dominance info to before getting out of cfg_layout. 2007-06-17 Kenneth Zadeck * gcc.c-torture/compile/pr32349.c: New testcase. From-SVN: r125776 --- gcc/ChangeLog | 9 +++++++ gcc/modulo-sched.c | 10 ++++--- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.c-torture/compile/pr32349.c | 26 +++++++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr32349.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 321e61627a7..f284af0cbd1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-06-17 Kenneth Zadeck + + PR middle-end/32349 + * modulo-sched (generate_reg_moves): Added rescan parameter and if + this is true, rescan insn being modified. + (sms_schedule): Added rescan parameter. + (rest_of_handle_sms): Moved freeing of dominance info to before + getting out of cfg_layout. + 2007-06-17 Nathan Sidwell * config/m68k/m68k.h (ISA_HAS_FF1, ISA_HAS_MVS_MVZ): New. diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 25cd53a7975..6664e321838 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -426,7 +426,7 @@ calculate_maxii (ddg_ptr g) ii { 1 if not. */ static struct undo_replace_buff_elem * -generate_reg_moves (partial_schedule_ptr ps) +generate_reg_moves (partial_schedule_ptr ps, bool rescan) { ddg_ptr g = ps->g; int ii = ps->ii; @@ -523,6 +523,8 @@ generate_reg_moves (partial_schedule_ptr ps) } replace_rtx (g->nodes[i_use].insn, old_reg, new_reg); + if (rescan) + df_insn_rescan (g->nodes[i_use].insn); } prev_reg = new_reg; @@ -1151,7 +1153,7 @@ sms_schedule (void) /* Generate the kernel just to be able to measure its cycles. */ permute_partial_schedule (ps, g->closing_branch->first_note); - reg_move_replaces = generate_reg_moves (ps); + reg_move_replaces = generate_reg_moves (ps, false); /* Get the number of cycles the new kernel expect to execute in. */ new_cycles = kernel_number_of_cycles (BB_HEAD (g->bb), BB_END (g->bb)); @@ -1201,7 +1203,7 @@ sms_schedule (void) /* The life-info is not valid any more. */ df_set_bb_dirty (g->bb); - reg_move_replaces = generate_reg_moves (ps); + reg_move_replaces = generate_reg_moves (ps, true); if (dump_file) print_node_sched_params (dump_file, g->num_nodes); /* Generate prolog and epilog. */ @@ -2481,8 +2483,8 @@ rest_of_handle_sms (void) FOR_EACH_BB (bb) if (bb->next_bb != EXIT_BLOCK_PTR) bb->aux = bb->next_bb; - cfg_layout_finalize (); free_dominance_info (CDI_DOMINATORS); + cfg_layout_finalize (); #endif /* INSN_SCHEDULING */ return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a69e6ae4ea..5b08f687091 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-06-17 Kenneth Zadeck + + * gcc.c-torture/compile/pr32349.c: New testcase. + 2007-06-17 Eric Botcazou * gcc.target/sparc/align.c: Use 'unsigned char' as element type. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr32349.c b/gcc/testsuite/gcc.c-torture/compile/pr32349.c new file mode 100644 index 00000000000..570969dfdfb --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr32349.c @@ -0,0 +1,26 @@ +/* { dg-options "-O2 -fmodulo-sched" } */ + + +extern long *x1, *x2, *x3; + +int +foo () +{ + /* Switching the following two lines prevents the ICE. */ + long *p1, *p2; + long m, n, i; + + p1 = x1; + p2 = x2; + n = 0; + for (i = *x3; 0 < i; i--) + { + m = (*p1++) ^ (*p2++); + m = (m & 0x55555555) + ((m >> 1) & 0x55555555); + m = (m & 0x33333333) + ((m >> 2) & 0x33333333); + m = (m + (m >> 4)) & 0x0f0f0f0f; + m = (m + (m >> 8)); + n += m; + } + return n; +} -- 2.30.2