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: [dataflow][RFC] missing update of subregs_of_mode


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;


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