This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Modulo-scheduling improvements.


Andrey Belevantsev <abel@ispras.ru> wrote on 02/11/2007 15:54:56:

> Hello,
>
> Ayal Zaks wrote:
> >> 1.  Use MAX_ASAP in MAX_II estimation.
> ...
>
> > I prefer not to have a global_max_asap (especially for such a
short-lived
> > variable), but have calculate_order_params() return the critical path
> > length, say using an int* parameter. If you can test on PowerPC please
do
> > so, otherwise Revital - could you check this patch on PowerPC and SPU?
> > Patch approved with the above change if additional tests pass.
>
> I've incorporated your suggestions in the below patch and also fixed
> some static prototypes while doing this.  Bootstrapped and tested on
> ia64; Revital kindly tested it on ppc64.  Is this ok?  I believe that
> the patch is suitable for stage3 as it was submitted and preapproved
> during stage2, but anyways.
>

Sure, this is ok.
Thanks,
Ayal.

> Andrey
> 2007-11-02  Dmitry Zhurikhin  <zhur@ispras.ru>
>         Andrey Belevantsev <abel@ispras.ru>
>
>    * modulo-sched.c (sms_order_nodes, permute_partial_schedule,
>    generate_prolog_epilog, duplicate_insns_of_cycles): Fix prototypes.
>    (calculate_order_params, sms_order_nodes): New parameter pmax_asap.
>    Save calculated max_asap in it.
>    (sms_schedule): Calculate maxii using max_asap.
> Index: gcc/modulo-sched.c
> ===================================================================
> --- gcc/modulo-sched.c   (revision 129721)
> +++ gcc/modulo-sched.c   (working copy)
> @@ -194,15 +194,14 @@ static int compute_split_row (sbitmap, i
>
>  static int issue_rate;
>
> -static int sms_order_nodes (ddg_ptr, int, int * result);
> +static int sms_order_nodes (ddg_ptr, int, int *, int *);
>  static void set_node_sched_params (ddg_ptr);
>  static partial_schedule_ptr sms_schedule_by_order (ddg_ptr, int, int,
int *);
> -static void permute_partial_schedule (partial_schedule_ptr ps, rtx
last);
> -static void generate_prolog_epilog (partial_schedule_ptr, struct loop
*loop,
> +static void permute_partial_schedule (partial_schedule_ptr, rtx);
> +static void generate_prolog_epilog (partial_schedule_ptr, struct loop *,
>                                      rtx, rtx);
> -static void duplicate_insns_of_cycles (partial_schedule_ptr ps,
> -                   int from_stage, int to_stage,
> -                   int is_prolog, rtx count_reg);
> +static void duplicate_insns_of_cycles (partial_schedule_ptr,
> +                   int, int, int, rtx);
>
>  #define SCHED_ASAP(x) (((node_sched_params_ptr)(x)->aux.info)->asap)
>  #define SCHED_TIME(x) (((node_sched_params_ptr)(x)->aux.info)->time)
> @@ -866,7 +865,7 @@ sms_schedule (void)
>    rtx insn;
>    ddg_ptr *g_arr, g;
>    int * node_order;
> -  int maxii;
> +  int maxii, max_asap;
>    loop_iterator li;
>    partial_schedule_ptr ps;
>    basic_block bb = NULL;
> @@ -1093,9 +1092,9 @@ sms_schedule (void)
>        node_order = XNEWVEC (int, g->num_nodes);
>
>        mii = 1; /* Need to pass some estimate of mii.  */
> -      rec_mii = sms_order_nodes (g, mii, node_order);
> +      rec_mii = sms_order_nodes (g, mii, node_order, &max_asap);
>        mii = MAX (res_MII (g), rec_mii);
> -      maxii = MAXII_FACTOR * mii;
> +      maxii = MAX (max_asap, MAXII_FACTOR * mii);
>
>        if (dump_file)
>     fprintf (dump_file, "SMS iis %d %d %d (rec_mii, mii, maxii)\n",
> @@ -1851,7 +1850,7 @@ typedef struct node_order_params * nopa;
>
>  static void order_nodes_of_sccs (ddg_all_sccs_ptr, int * result);
>  static int order_nodes_in_scc (ddg_ptr, sbitmap, sbitmap, int*, int);
> -static nopa  calculate_order_params (ddg_ptr, int mii);
> +static nopa  calculate_order_params (ddg_ptr, int, int *);
>  static int find_max_asap (ddg_ptr, sbitmap);
>  static int find_max_hv_min_mob (ddg_ptr, sbitmap);
>  static int find_max_dv_min_mob (ddg_ptr, sbitmap);
> @@ -1896,15 +1895,15 @@ check_nodes_order (int *node_order, int
>
>  /* Order the nodes of G for scheduling and pass the result in
>     NODE_ORDER.  Also set aux.count of each node to ASAP.
> -   Return the recMII for the given DDG.  */
> +   Put maximal ASAP to PMAX_ASAP.  Return the recMII for the given DDG.
*/
>  static int
> -sms_order_nodes (ddg_ptr g, int mii, int * node_order)
> +sms_order_nodes (ddg_ptr g, int mii, int * node_order, int *pmax_asap)
>  {
>    int i;
>    int rec_mii = 0;
>    ddg_all_sccs_ptr sccs = create_ddg_all_sccs (g);
>
> -  nopa nops = calculate_order_params (g, mii);
> +  nopa nops = calculate_order_params (g, mii, pmax_asap);
>
>    if (dump_file)
>      print_sccs (dump_file, sccs, g);
> @@ -1979,7 +1978,7 @@ order_nodes_of_sccs (ddg_all_sccs_ptr al
>
>  /* MII is needed if we consider backarcs (that do not close recursive
cycles).  */
>  static struct node_order_params *
> -calculate_order_params (ddg_ptr g, int mii ATTRIBUTE_UNUSED)
> +calculate_order_params (ddg_ptr g, int mii ATTRIBUTE_UNUSED, int
*pmax_asap)
>  {
>    int u;
>    int max_asap;
> @@ -2042,6 +2041,7 @@ calculate_order_params (ddg_ptr g, int m
>        }
>    }
>
> +  *pmax_asap = max_asap;
>    return node_order_params_arr;
>  }
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]