From 1a46d33d9fd500a1d19a04dfc1770b889f6fe12f Mon Sep 17 00:00:00 2001 From: Revital Eres Date: Wed, 19 Dec 2007 13:36:32 +0000 Subject: [PATCH] Fix generation of reg-moves From-SVN: r131060 --- gcc/ChangeLog | 8 ++++++ gcc/modulo-sched.c | 48 ++++++++++++++++++++++++++++++++++-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/sms-5.c | 47 +++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/sms-5.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 46b29f081b1e..f9aee9232e4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-12-19 Alexander Monakov + Revital Eres + + * modulo-sched.c (generate_reg_moves): Insert the reg-moves + right before the notes which precedes the insn, if they exists. + (loop_canon_p): Add dump info. + (sms_schedule): Likewise. + 2007-12-19 Richard Sandiford * tree.h (set_decl_incoming_rtl): Add a by_reference_p parameter. diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index c052ddeaa47f..ba65ebde7dd2 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -506,7 +506,9 @@ generate_reg_moves (partial_schedule_ptr ps, bool rescan) /* Now generate the reg_moves, attaching relevant uses to them. */ SCHED_NREG_MOVES (u) = nreg_moves; old_reg = prev_reg = copy_rtx (SET_DEST (single_set (u->insn))); - last_reg_move = u->insn; + /* Insert the reg-moves right before the notes which precede + the insn they relates to. */ + last_reg_move = u->first_note; for (i_reg_move = 0; i_reg_move < nreg_moves; i_reg_move++) { @@ -794,7 +796,11 @@ loop_canon_p (struct loop *loop) { if (loop->inner || !loop_outer (loop)) + { + if (dump_file) + fprintf (dump_file, "SMS loop inner or !loop_outer\n"); return false; + } if (!single_exit (loop)) { @@ -910,6 +916,12 @@ sms_schedule (void) We use loop->num as index into this array. */ g_arr = XCNEWVEC (ddg_ptr, number_of_loops ()); + if (dump_file) + { + fprintf (dump_file, "\n\nSMS analysis phase\n"); + fprintf (dump_file, "===================\n\n"); + } + /* Build DDGs for all the relevant loops and hold them in G_ARR indexed by the loop index. */ FOR_EACH_LOOP (li, loop, 0) @@ -926,11 +938,24 @@ sms_schedule (void) break; } + if (dump_file) + { + rtx insn = BB_END (loop->header); + + fprintf (dump_file, "SMS loop num: %d, file: %s, line: %d\n", + loop->num, insn_file (insn), insn_line (insn)); + + } + if (! loop_canon_p (loop)) continue; if (! loop_single_full_bb_p (loop)) + { + if (dump_file) + fprintf (dump_file, "SMS not loop_single_full_bb_p\n"); continue; + } bb = loop->header; @@ -971,7 +996,11 @@ sms_schedule (void) /* Make sure this is a doloop. */ if ( !(count_reg = doloop_register_get (head, tail))) + { + if (dump_file) + fprintf (dump_file, "SMS doloop_register_get failed\n"); continue; + } /* Don't handle BBs with calls or barriers, or !single_set insns, or auto-increment insns (to avoid creating invalid reg-moves @@ -1021,7 +1050,15 @@ sms_schedule (void) } g_arr[loop->num] = g; + if (dump_file) + fprintf (dump_file, "...OK\n"); + } + if (dump_file) + { + fprintf (dump_file, "\nSMS transformation phase\n"); + fprintf (dump_file, "=========================\n\n"); + } /* We don't want to perform SMS on new loops - created by versioning. */ FOR_EACH_LOOP (li, loop, 0) @@ -1036,7 +1073,14 @@ sms_schedule (void) continue; if (dump_file) - print_ddg (dump_file, g); + { + rtx insn = BB_END (loop->header); + + fprintf (dump_file, "SMS loop num: %d, file: %s, line: %d\n", + loop->num, insn_file (insn), insn_line (insn)); + + print_ddg (dump_file, g); + } get_ebb_head_tail (loop->header, loop->header, &head, &tail); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2929f2cc4d05..9701bee17496 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-12-19 Revital Eres + + * gcc.dg/sms-5.c: New testcase. + 2007-12-19 Jerry DeLisle PR fortran/34325 diff --git a/gcc/testsuite/gcc.dg/sms-5.c b/gcc/testsuite/gcc.dg/sms-5.c new file mode 100644 index 000000000000..9c2e0165c566 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sms-5.c @@ -0,0 +1,47 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fmodulo-sched -fmodulo-sched-allow-regmoves -funroll-loops" } */ +/* This is the same test as loop-2e.c test. It is related to a fix in + the generation of the prolog and epilog. */ + +extern void abort (void); + +void f (int *p, int **q) +{ + int i; + for (i = 0; i < 40; i++) + { + *q++ = &p[i]; + } +} + +int main () +{ + void *p; + int *q[40]; + __SIZE_TYPE__ start; + + /* Find the signed middle of the address space. */ + if (sizeof(start) == sizeof(int)) + start = (__SIZE_TYPE__) __INT_MAX__; + else if (sizeof(start) == sizeof(long)) + start = (__SIZE_TYPE__) __LONG_MAX__; + else if (sizeof(start) == sizeof(long long)) + start = (__SIZE_TYPE__) __LONG_LONG_MAX__; + else + return 0; + + /* Arbitrarily align the pointer. */ + start &= -32; + + /* Pretend that's good enough to start address arithmetic. */ + p = (void *)start; + + /* Verify that GIV replacement computes the correct results. */ + q[39] = 0; + f (p, q); + if (q[39] != (int *)p + 39) + abort (); + + return 0; +} + -- 2.47.2