------- Comment #5 from zadeck at naturalbridge dot com  2007-06-17 17:52 
-------
Subject: Re:  [4.3 Regression] ICE in df_refs_verify
 with -O2 -fmodulo-sched for spec tests

committed as revision 125776

Kenneth Zadeck wrote:
> 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