summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/modulo-sched.c10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr32349.c26
4 files changed, 45 insertions, 4 deletions
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 <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>
* 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 <zadeck@naturalbridge.com>
+
+ * gcc.c-torture/compile/pr32349.c: New testcase.
+
2007-06-17 Eric Botcazou <ebotcazou@libertysurf.fr>
* 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;
+}