Commit 5f705558 by Kenneth Zadeck Committed by Kenneth Zadeck

re PR middle-end/32349 (ICE in df_refs_verify with -O2 -fmodulo-sched for spec tests)

2007-06-17  Kenneth Zadeck <zadeck@naturalbridge.com>

	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 <zadeck@naturalbridge.com>

	* gcc.c-torture/compile/pr32349.c: New testcase.

From-SVN: r125776
parent 19caedae
2007-06-17 Kenneth Zadeck <zadeck@naturalbridge.com>
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 <nathan@codesourcery.com> 2007-06-17 Nathan Sidwell <nathan@codesourcery.com>
* config/m68k/m68k.h (ISA_HAS_FF1, ISA_HAS_MVS_MVZ): New. * config/m68k/m68k.h (ISA_HAS_FF1, ISA_HAS_MVS_MVZ): New.
......
...@@ -426,7 +426,7 @@ calculate_maxii (ddg_ptr g) ...@@ -426,7 +426,7 @@ calculate_maxii (ddg_ptr g)
ii { 1 if not. ii { 1 if not.
*/ */
static struct undo_replace_buff_elem * 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; ddg_ptr g = ps->g;
int ii = ps->ii; int ii = ps->ii;
...@@ -523,6 +523,8 @@ generate_reg_moves (partial_schedule_ptr ps) ...@@ -523,6 +523,8 @@ generate_reg_moves (partial_schedule_ptr ps)
} }
replace_rtx (g->nodes[i_use].insn, old_reg, new_reg); 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; prev_reg = new_reg;
...@@ -1151,7 +1153,7 @@ sms_schedule (void) ...@@ -1151,7 +1153,7 @@ sms_schedule (void)
/* Generate the kernel just to be able to measure its cycles. */ /* Generate the kernel just to be able to measure its cycles. */
permute_partial_schedule (ps, g->closing_branch->first_note); 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. */ /* 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)); new_cycles = kernel_number_of_cycles (BB_HEAD (g->bb), BB_END (g->bb));
...@@ -1201,7 +1203,7 @@ sms_schedule (void) ...@@ -1201,7 +1203,7 @@ sms_schedule (void)
/* The life-info is not valid any more. */ /* The life-info is not valid any more. */
df_set_bb_dirty (g->bb); df_set_bb_dirty (g->bb);
reg_move_replaces = generate_reg_moves (ps); reg_move_replaces = generate_reg_moves (ps, true);
if (dump_file) if (dump_file)
print_node_sched_params (dump_file, g->num_nodes); print_node_sched_params (dump_file, g->num_nodes);
/* Generate prolog and epilog. */ /* Generate prolog and epilog. */
...@@ -2481,8 +2483,8 @@ rest_of_handle_sms (void) ...@@ -2481,8 +2483,8 @@ rest_of_handle_sms (void)
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
if (bb->next_bb != EXIT_BLOCK_PTR) if (bb->next_bb != EXIT_BLOCK_PTR)
bb->aux = bb->next_bb; bb->aux = bb->next_bb;
cfg_layout_finalize ();
free_dominance_info (CDI_DOMINATORS); free_dominance_info (CDI_DOMINATORS);
cfg_layout_finalize ();
#endif /* INSN_SCHEDULING */ #endif /* INSN_SCHEDULING */
return 0; return 0;
} }
......
2007-06-17 Kenneth Zadeck <zadeck@naturalbridge.com>
* gcc.c-torture/compile/pr32349.c: New testcase.
2007-06-17 Eric Botcazou <ebotcazou@libertysurf.fr> 2007-06-17 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.target/sparc/align.c: Use 'unsigned char' as element type. * gcc.target/sparc/align.c: Use 'unsigned char' as element type.
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment