[dataflow][RFC] missing update of subregs_of_mode

Kenneth Zadeck zadeck@naturalbridge.com
Thu Mar 8 18:29:00 GMT 2007


Seongbae Park wrote:
> On 3/8/07, Kenneth Zadeck <zadeck@naturalbridge.com> wrote:
>> Seongbae Park wrote:
>> > Attached patch fixes one regression on ia64 on dataflow branch -
>> > builtins-32.c testcase in check-gcc fails.
>> >
>> > The patch has been bootstrapped and reg-tested on i686 and ia64.
>> >
>> > That said, I'm not quite sure this is the long term right approach,
>> > as potentially any pass can create new subregs that need to be
>> updated.
>> >
>> > As far as I can tell, the only places that use
>> > regclass.c::subregs_of_mode
>> > are:
>> > cannot_change_mode_set_regs()  and invalid_mode_change_p().
>> >
>> > And those are only used by local and global register allocator -
>> > hence I think we can get away with building this just before
>> > local-alloc only
>> > - e.g. move pass_subregs_of_mode_init to just before pass_local_alloc
>> > (and get rid of record_subregs_of_mode() call in combine).
>> >
>> > What do you think ?
>> >
>> > BTW, this turns out dataflow branch specific,
>> > because in mainline, flow.c updates subregs_of_mode
>> > (which has been changed in dataflow).
>> >
>> This was certainly an omission on my part.  We could certainly add this
>> to the rescaning.  However, i actually agree that if the only used of
>> this is in the register allocators, then the right thing to do is to
>> make this part of the register allocators and remove the access from the
>> rest of the passes.
>>
>> btw - did you check that none of the ports use this?
>
> Yes. I've grepped all files and as far as I can tell,
> register allocators are the only ones using it
> (beside combine updating it).
> I've bootstrapped & regtested it on ia64.
> Below is the patch.
>
> We may want to add this to the df scanning
> (after all, it's a global characteristic of subregs)
> but certainly we can do that later
> and this patch won't make it any more difficult (if not easier).
>
> Seongbae
>
>
> ChangeLog entry:
>
> 2007-03-08  Seongbae Park <seongbae.park@gmail.com>
>
>         * combine.c (gen_lowpart_for_combine): Remove update
>         of subregs_of_mode.
>         * passes.c (init_optimization_passes): Move
>         subregs_of_mode_init just before local-alloc.
>         Add a new pass subregs_of_mode_finish after global-alloc.
>         * regclass.c (cannot_change_mode_set_regs,
> invalid_mode_change_p):
>         Add a new assert.
>         (finish_subregs_of_mode): New function.
>         (pass_subregs_of_mode_finish): New pass structure.
>         * tree-pass.h (pass_subregs_of_mode_finish): Declaration for
> a new pass.
>
>
>
> # HG changeset patch
> # User spark@iowa
> # Node ID 9d365184e83ee0279d69c096af1bb0bb23899bd0
> # Parent  678bfeeff746c36220a879f3385129c646a3ae2f
> Better subregs-of-mode fix by building it just before local-alloc and
> destroying it right after global-alloc.
>
> diff -r 678bfeeff746 -r 9d365184e83e gcc/combine.c
> --- a/gcc/combine.c     Mon Mar 05 14:15:00 2007 -0800
> +++ b/gcc/combine.c     Thu Mar 08 09:51:30 2007 -0800
> @@ -9808,11 +9808,6 @@ gen_lowpart_for_combine (enum machine_mo
>
>   result = gen_lowpart_common (omode, x);
>
> -#ifdef CANNOT_CHANGE_MODE_CLASS
> -  if (result != 0 && GET_CODE (result) == SUBREG)
> -    record_subregs_of_mode (result);
> -#endif
> -
>   if (result)
>     return result;
>
> diff -r 678bfeeff746 -r 9d365184e83e gcc/passes.c
> --- a/gcc/passes.c      Mon Mar 05 14:15:00 2007 -0800
> +++ b/gcc/passes.c      Thu Mar 08 09:51:30 2007 -0800
> @@ -714,7 +714,6 @@ init_optimization_passes (void)
>       NEXT_PASS (pass_rtl_dse1);
>       NEXT_PASS (pass_rtl_fwprop_addr);
>       NEXT_PASS (pass_regclass_init);
> -      NEXT_PASS (pass_subregs_of_mode_init);
>       NEXT_PASS (pass_inc_dec);
>       NEXT_PASS (pass_stack_ptr_mod);
>       NEXT_PASS (pass_initialize_regs);
> @@ -730,8 +729,10 @@ init_optimization_passes (void)
>       NEXT_PASS (pass_see);
>       NEXT_PASS (pass_sms);
>       NEXT_PASS (pass_sched);
> +      NEXT_PASS (pass_subregs_of_mode_init);
>       NEXT_PASS (pass_local_alloc);
>       NEXT_PASS (pass_global_alloc);
> +      NEXT_PASS (pass_subregs_of_mode_finish);
>       NEXT_PASS (pass_postreload);
>        {
>          struct tree_opt_pass **p = &pass_postreload.sub;
> diff -r 678bfeeff746 -r 9d365184e83e gcc/regclass.c
> --- a/gcc/regclass.c    Mon Mar 05 14:15:00 2007 -0800
> +++ b/gcc/regclass.c    Thu Mar 08 09:51:30 2007 -0800
> @@ -2765,6 +2765,7 @@ cannot_change_mode_set_regs (HARD_REG_SE
>   unsigned char mask;
>   unsigned int i;
>
> +  gcc_assert (subregs_of_mode);
>   dummy.block = regno & -8;
>   node = htab_find_with_hash (subregs_of_mode, &dummy, dummy.block);
>   if (node == NULL)
> @@ -2790,6 +2791,7 @@ invalid_mode_change_p (unsigned int regn
>   enum machine_mode to;
>   unsigned char mask;
>
> +  gcc_assert (subregs_of_mode);
>   dummy.block = regno & -8;
>   node = htab_find_with_hash (subregs_of_mode, &dummy, dummy.block);
>   if (node == NULL)
> @@ -2803,9 +2805,21 @@ invalid_mode_change_p (unsigned int regn
>
>   return false;
> }
> +
> +static unsigned int
> +finish_subregs_of_mode (void)
> +{
> +  subregs_of_mode = 0;
> +  return 0;
> +}
> #else
> static unsigned int
> init_subregs_of_mode (void)
> +{
> +  return 0;
> +}
> +static unsigned int
> +finish_subregs_of_mode (void)
> {
>   return 0;
> }
> @@ -2839,6 +2853,23 @@ struct tree_opt_pass pass_subregs_of_mod
>   0                                     /* letter */
> };
>
> +struct tree_opt_pass pass_subregs_of_mode_finish =
> +{
> +  "subregs_of_mode_finish",               /* name */
> +  gate_subregs_of_mode_init,            /* gate */
> +  finish_subregs_of_mode,               /* execute */
> +  NULL,                                 /* sub */
> +  NULL,                                 /* next */
> +  0,                                    /* static_pass_number */
> +  0,                                    /* tv_id */
> +  0,                                    /* properties_required */
> +  0,                                    /* properties_provided */
> +  0,                                    /* properties_destroyed */
> +  0,                                    /* todo_flags_start */
> +  0,                                    /* todo_flags_finish */
> +  0                                     /* letter */
> +};
> +
>
>
> #include "gt-regclass.h"
> diff -r 678bfeeff746 -r 9d365184e83e gcc/tree-pass.h
> --- a/gcc/tree-pass.h   Mon Mar 05 14:15:00 2007 -0800
> +++ b/gcc/tree-pass.h   Thu Mar 08 09:51:30 2007 -0800
> @@ -370,6 +370,7 @@ extern struct tree_opt_pass pass_df_init
> extern struct tree_opt_pass pass_df_initialize;
> extern struct tree_opt_pass pass_regclass_init;
> extern struct tree_opt_pass pass_subregs_of_mode_init;
> +extern struct tree_opt_pass pass_subregs_of_mode_finish;
> extern struct tree_opt_pass pass_inc_dec;
> extern struct tree_opt_pass pass_no_new_pseudos;
> extern struct tree_opt_pass pass_stack_ptr_mod;
i defer to iant, but i do think that this is the proper way to go.



More information about the Gcc-patches mailing list