OSDN Git Service

Fix generation of reg-moves
authorrevitale <revitale@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Dec 2007 13:36:32 +0000 (13:36 +0000)
committerrevitale <revitale@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Dec 2007 13:36:32 +0000 (13:36 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131060 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/modulo-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/sms-5.c [new file with mode: 0644]

index 46b29f0..f9aee92 100644 (file)
@@ -1,3 +1,11 @@
+2007-12-19  Alexander Monakov  <amonakov@ispras.ru>
+           Revital Eres  <eres@il.ibm.com>
+
+       * 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  <rsandifo@nildram.co.uk>
 
        * tree.h (set_decl_incoming_rtl): Add a by_reference_p parameter.
index c052dde..ba65ebd 100644 (file)
@@ -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);
 
index 2929f2c..9701bee 100644 (file)
@@ -1,3 +1,7 @@
+2007-12-19  Revital Eres  <eres@il.ibm.com>
+
+        * gcc.dg/sms-5.c: New testcase.
+
 2007-12-19  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        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 (file)
index 0000000..9c2e016
--- /dev/null
@@ -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;
+}
+