------- 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

Reply via email to