------- Comment #2 from zadeck at naturalbridge dot com 2007-06-17 13:51 ------- Subject: Re: [4.3 Regression] ICE in df_refs_verify with -O2 -fmodulo-sched for spec tests
This patch fixes the df issues with modulo scheduling. It simply never worked and was not tested because there is no default test coverage for it. I have added the testcase that janis sent me, but this is a completely inadequate test for this pass. Janis did test this fix with the spec benchmarks on the ppc and it did work. The last frag was suggested by stevenb. If you free the dominance info before gettting out of cfglayout it is faster since the dominance does not have to be updated. 2007-06-17 Kenneth Zadeck <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> * gcc.c-torture/compile/pr32349.c: New testcase. ok to commit? Kenny Index: testsuite/gcc.c-torture/compile/pr32349.c =================================================================== --- testsuite/gcc.c-torture/compile/pr32349.c (revision 0) +++ testsuite/gcc.c-torture/compile/pr32349.c (revision 0) @@ -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; +} Index: modulo-sched.c =================================================================== --- modulo-sched.c (revision 125775) +++ modulo-sched.c (working copy) @@ -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 } 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; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32349