OSDN Git Service

* configure.ac (mips*-*-*linux*, mips*-*-gnu*): Use mt-mips-gnu.
[pf3gnuchains/gcc-fork.git] / gcc / regrename.c
index 7026ef3..0ed810e 100644 (file)
@@ -6,7 +6,7 @@
 
    GCC is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GCC is distributed in the hope that it will be useful, but WITHOUT
@@ -15,9 +15,8 @@
    License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING.  If not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.  */
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
@@ -89,7 +88,7 @@ static void scan_rtx (rtx, rtx *, enum reg_class, enum scan_actions,
                      enum op_type, int);
 static struct du_chain *build_def_use (basic_block);
 static void dump_def_use_chain (struct du_chain *);
-static void note_sets (rtx, rtx, void *);
+static void note_sets (rtx, const_rtx, void *);
 static void clear_dead_regs (HARD_REG_SET *, enum machine_mode, rtx);
 static void merge_overlapping_regs (basic_block, HARD_REG_SET *,
                                    struct du_chain *);
@@ -98,7 +97,7 @@ static void merge_overlapping_regs (basic_block, HARD_REG_SET *,
    record them in *DATA (which is actually a HARD_REG_SET *).  */
 
 static void
-note_sets (rtx x, rtx set ATTRIBUTE_UNUSED, void *data)
+note_sets (rtx x, const_rtx set ATTRIBUTE_UNUSED, void *data)
 {
   HARD_REG_SET *pset = (HARD_REG_SET *) data;
 
@@ -139,7 +138,7 @@ merge_overlapping_regs (basic_block b, HARD_REG_SET *pset,
   rtx insn;
   HARD_REG_SET live;
 
-  REG_SET_TO_HARD_REG_SET (live, DF_LIVE_IN (b));
+  REG_SET_TO_HARD_REG_SET (live, df_get_live_in (b));
   insn = BB_HEAD (b);
   while (t)
     {
@@ -185,12 +184,12 @@ regrename_optimize (void)
   df_set_flags (DF_LR_RUN_DCE);
   df_note_add_problem ();
   df_analyze ();
-  df_set_flags (DF_NO_INSN_RESCAN);
-  
+  df_set_flags (DF_DEFER_INSN_RESCAN);
+
   memset (tick, 0, sizeof tick);
 
   gcc_obstack_init (&rename_obstack);
-  first_obj = obstack_alloc (&rename_obstack, 0);
+  first_obj = XOBNEWVAR (&rename_obstack, char, 0);
 
   FOR_EACH_BB (bb)
     {
@@ -223,13 +222,13 @@ regrename_optimize (void)
        {
          int new_reg, best_new_reg;
          int n_uses;
-         struct du_chain *this = all_chains;
+         struct du_chain *this_du = all_chains;
          struct du_chain *tmp, *last;
          HARD_REG_SET this_unavailable;
-         int reg = REGNO (*this->loc);
+         int reg = REGNO (*this_du->loc);
          int i;
 
-         all_chains = this->next_chain;
+         all_chains = this_du->next_chain;
 
          best_new_reg = reg;
 
@@ -257,7 +256,7 @@ regrename_optimize (void)
             count number of uses, and narrow the set of registers we can
             use for renaming.  */
          n_uses = 0;
-         for (last = this; last->next_use; last = last->next_use)
+         for (last = this_du; last->next_use; last = last->next_use)
            {
              n_uses++;
              IOR_COMPL_HARD_REG_SET (this_unavailable,
@@ -269,16 +268,16 @@ regrename_optimize (void)
          IOR_COMPL_HARD_REG_SET (this_unavailable,
                                  reg_class_contents[last->cl]);
 
-         if (this->need_caller_save_reg)
+         if (this_du->need_caller_save_reg)
            IOR_HARD_REG_SET (this_unavailable, call_used_reg_set);
 
-         merge_overlapping_regs (bb, &this_unavailable, this);
+         merge_overlapping_regs (bb, &this_unavailable, this_du);
 
          /* Now potential_regs is a reasonable approximation, let's
             have a closer look at each register still in there.  */
          for (new_reg = 0; new_reg < FIRST_PSEUDO_REGISTER; new_reg++)
            {
-             int nregs = hard_regno_nregs[new_reg][GET_MODE (*this->loc)];
+             int nregs = hard_regno_nregs[new_reg][GET_MODE (*this_du->loc)];
 
              for (i = nregs - 1; i >= 0; --i)
                if (TEST_HARD_REG_BIT (this_unavailable, new_reg + i)
@@ -303,7 +302,7 @@ regrename_optimize (void)
 
              /* See whether it accepts all modes that occur in
                 definition and uses.  */
-             for (tmp = this; tmp; tmp = tmp->next_use)
+             for (tmp = this_du; tmp; tmp = tmp->next_use)
                if (! HARD_REGNO_MODE_OK (new_reg, GET_MODE (*tmp->loc))
                    || (tmp->need_caller_save_reg
                        && ! (HARD_REGNO_CALL_PART_CLOBBERED
@@ -334,7 +333,7 @@ regrename_optimize (void)
              continue;
            }
 
-         do_replace (this, best_new_reg);
+         do_replace (this_du, best_new_reg);
          tick[best_new_reg] = ++this_tick;
          df_set_regs_ever_live (best_new_reg, true);
 
@@ -346,8 +345,6 @@ regrename_optimize (void)
     }
 
   obstack_free (&rename_obstack, NULL);
-  df_clear_flags (DF_NO_INSN_RESCAN);
-  df_insn_rescan_all ();
 
   if (dump_file)
     fputc ('\n', dump_file);
@@ -365,6 +362,7 @@ do_replace (struct du_chain *chain, int reg)
       if (regno >= FIRST_PSEUDO_REGISTER)
        ORIGINAL_REGNO (*chain->loc) = regno;
       REG_ATTRS (*chain->loc) = attr;
+      df_insn_rescan (chain->insn);
       chain = chain->next_use;
     }
 }
@@ -387,16 +385,15 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl,
     {
       if (type == OP_OUT)
        {
-         struct du_chain *this
-           = obstack_alloc (&rename_obstack, sizeof (struct du_chain));
-         this->next_use = 0;
-         this->next_chain = open_chains;
-         this->loc = loc;
-         this->insn = insn;
-         this->cl = cl;
-         this->need_caller_save_reg = 0;
-         this->earlyclobber = earlyclobber;
-         open_chains = this;
+         struct du_chain *this_du = XOBNEW (&rename_obstack, struct du_chain);
+         this_du->next_use = 0;
+         this_du->next_chain = open_chains;
+         this_du->loc = loc;
+         this_du->insn = insn;
+         this_du->cl = cl;
+         this_du->need_caller_save_reg = 0;
+         this_du->earlyclobber = earlyclobber;
+         open_chains = this_du;
        }
       return;
     }
@@ -406,7 +403,7 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl,
 
   for (p = &open_chains; *p;)
     {
-      struct du_chain *this = *p;
+      struct du_chain *this_du = *p;
 
       /* Check if the chain has been terminated if it has then skip to
         the next chain.
@@ -415,18 +412,18 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl,
         the chain in Step 3, but are trying to hide in-out operands
         from terminate_write in Step 5.  */
 
-      if (*this->loc == cc0_rtx)
-       p = &this->next_chain;
+      if (*this_du->loc == cc0_rtx)
+       p = &this_du->next_chain;
       else
        {
-         int regno = REGNO (*this->loc);
-         int nregs = hard_regno_nregs[regno][GET_MODE (*this->loc)];
+         int regno = REGNO (*this_du->loc);
+         int nregs = hard_regno_nregs[regno][GET_MODE (*this_du->loc)];
          int exact_match = (regno == this_regno && nregs == this_nregs);
 
          if (regno + nregs <= this_regno
              || this_regno + this_nregs <= regno)
            {
-             p = &this->next_chain;
+             p = &this_du->next_chain;
              continue;
            }
 
@@ -440,23 +437,23 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl,
                 be replaced with, terminate the chain.  */
              if (cl != NO_REGS)
                {
-                 this = obstack_alloc (&rename_obstack, sizeof (struct du_chain));
-                 this->next_use = 0;
-                 this->next_chain = (*p)->next_chain;
-                 this->loc = loc;
-                 this->insn = insn;
-                 this->cl = cl;
-                 this->need_caller_save_reg = 0;
+                 this_du = XOBNEW (&rename_obstack, struct du_chain);
+                 this_du->next_use = 0;
+                 this_du->next_chain = (*p)->next_chain;
+                 this_du->loc = loc;
+                 this_du->insn = insn;
+                 this_du->cl = cl;
+                 this_du->need_caller_save_reg = 0;
                  while (*p)
                    p = &(*p)->next_use;
-                 *p = this;
+                 *p = this_du;
                  return;
                }
            }
 
          if (action != terminate_overlapping_read || ! exact_match)
            {
-             struct du_chain *next = this->next_chain;
+             struct du_chain *next = this_du->next_chain;
 
              /* Whether the terminated chain can be used for renaming
                 depends on the action and this being an exact match.
@@ -465,12 +462,12 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl,
              if ((action == terminate_dead || action == terminate_write)
                  && exact_match)
                {
-                 this->next_chain = closed_chains;
-                 closed_chains = this;
+                 this_du->next_chain = closed_chains;
+                 closed_chains = this_du;
                  if (dump_file)
                    fprintf (dump_file,
                             "Closing chain %s at insn %d (%s)\n",
-                            reg_names[REGNO (*this->loc)], INSN_UID (insn),
+                            reg_names[REGNO (*this_du->loc)], INSN_UID (insn),
                             scan_actions_name[(int) action]);
                }
              else
@@ -478,13 +475,13 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl,
                  if (dump_file)
                    fprintf (dump_file,
                             "Discarding chain %s at insn %d (%s)\n",
-                            reg_names[REGNO (*this->loc)], INSN_UID (insn),
+                            reg_names[REGNO (*this_du->loc)], INSN_UID (insn),
                             scan_actions_name[(int) action]);
                }
              *p = next;
            }
          else
-           p = &this->next_chain;
+           p = &this_du->next_chain;
        }
     }
 }
@@ -561,20 +558,19 @@ scan_rtx_address (rtx insn, rtx *loc, enum reg_class cl,
            int index_op;
            unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
 
-           if (REGNO_OK_FOR_INDEX_P (regno0)
-               && regno_ok_for_base_p (regno1, mode, PLUS, REG))
+           if (REGNO_OK_FOR_INDEX_P (regno1)
+               && regno_ok_for_base_p (regno0, mode, PLUS, REG))
+             index_op = 1;
+           else if (REGNO_OK_FOR_INDEX_P (regno0)
+                    && regno_ok_for_base_p (regno1, mode, PLUS, REG))
              index_op = 0;
-           else if (REGNO_OK_FOR_INDEX_P (regno1)
-                    && regno_ok_for_base_p (regno0, mode, PLUS, REG))
+           else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
+                    || REGNO_OK_FOR_INDEX_P (regno1))
              index_op = 1;
            else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
              index_op = 0;
-           else if (regno_ok_for_base_p (regno0, mode, PLUS, REG))
-             index_op = 1;
-           else if (REGNO_OK_FOR_INDEX_P (regno1))
-             index_op = 1;
            else
-             index_op = 0;
+             index_op = 1;
 
            locI = &XEXP (x, index_op);
            locB = &XEXP (x, !index_op);
@@ -655,6 +651,7 @@ scan_rtx (rtx insn, rtx *loc, enum reg_class cl,
     case CONST:
     case CONST_INT:
     case CONST_DOUBLE:
+    case CONST_FIXED:
     case CONST_VECTOR:
     case SYMBOL_REF:
     case LABEL_REF:
@@ -807,16 +804,8 @@ build_def_use (basic_block bb)
            }
          for (i = 0; i < recog_data.n_dups; i++)
            {
-             int dup_num = recog_data.dup_num[i];
-
              old_dups[i] = *recog_data.dup_loc[i];
              *recog_data.dup_loc[i] = cc0_rtx;
-
-             /* For match_dup of match_operator or match_parallel, share
-                them, so that we don't miss changes in the dup.  */
-             if (icode >= 0
-                 && insn_data[icode].operand[dup_num].eliminable == 0)
-               old_dups[i] = recog_data.operand[dup_num];
            }
 
          scan_rtx (insn, &PATTERN (insn), NO_REGS, terminate_all_read,
@@ -826,6 +815,8 @@ build_def_use (basic_block bb)
            *recog_data.dup_loc[i] = old_dups[i];
          for (i = 0; i < n_ops; i++)
            *recog_data.operand_loc[i] = old_operands[i];
+         if (recog_data.n_dups)
+           df_insn_rescan (insn);
 
          /* Step 2B: Can't rename function call argument registers.  */
          if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
@@ -985,15 +976,15 @@ dump_def_use_chain (struct du_chain *chains)
 {
   while (chains)
     {
-      struct du_chain *this = chains;
-      int r = REGNO (*this->loc);
-      int nregs = hard_regno_nregs[r][GET_MODE (*this->loc)];
+      struct du_chain *this_du = chains;
+      int r = REGNO (*this_du->loc);
+      int nregs = hard_regno_nregs[r][GET_MODE (*this_du->loc)];
       fprintf (dump_file, "Register %s (%d):", reg_names[r], nregs);
-      while (this)
+      while (this_du)
        {
-         fprintf (dump_file, " %d [%s]", INSN_UID (this->insn),
-                  reg_class_names[this->cl]);
-         this = this->next_use;
+         fprintf (dump_file, " %d [%s]", INSN_UID (this_du->insn),
+                  reg_class_names[this_du->cl]);
+         this_du = this_du->next_use;
        }
       fprintf (dump_file, "\n");
       chains = chains->next_chain;
@@ -1030,8 +1021,8 @@ static void kill_value_regno (unsigned, unsigned, struct value_data *);
 static void kill_value (rtx, struct value_data *);
 static void set_value_regno (unsigned, enum machine_mode, struct value_data *);
 static void init_value_data (struct value_data *);
-static void kill_clobbered_value (rtx, rtx, void *);
-static void kill_set_value (rtx, rtx, void *);
+static void kill_clobbered_value (rtx, const_rtx, void *);
+static void kill_set_value (rtx, const_rtx, void *);
 static int kill_autoinc_value (rtx *, void *);
 static void copy_value (rtx, rtx, struct value_data *);
 static bool mode_change_ok (enum machine_mode, enum machine_mode,
@@ -1171,9 +1162,9 @@ init_value_data (struct value_data *vd)
 /* Called through note_stores.  If X is clobbered, kill its value.  */
 
 static void
-kill_clobbered_value (rtx x, rtx set, void *data)
+kill_clobbered_value (rtx x, const_rtx set, void *data)
 {
-  struct value_data *vd = data;
+  struct value_data *const vd = (struct value_data *) data;
   if (GET_CODE (set) == CLOBBER)
     kill_value (x, vd);
 }
@@ -1182,9 +1173,9 @@ kill_clobbered_value (rtx x, rtx set, void *data)
    current value and install it as the root of its own value list.  */
 
 static void
-kill_set_value (rtx x, rtx set, void *data)
+kill_set_value (rtx x, const_rtx set, void *data)
 {
-  struct value_data *vd = data;
+  struct value_data *const vd = (struct value_data *) data;
   if (GET_CODE (set) != CLOBBER)
     {
       kill_value (x, vd);
@@ -1201,7 +1192,7 @@ static int
 kill_autoinc_value (rtx *px, void *data)
 {
   rtx x = *px;
-  struct value_data *vd = data;
+  struct value_data *const vd = (struct value_data *) data;
 
   if (GET_RTX_CLASS (GET_CODE (x)) == RTX_AUTOINC)
     {
@@ -1374,17 +1365,17 @@ find_oldest_value_reg (enum reg_class cl, rtx reg, struct value_data *vd)
   for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)
     {
       enum machine_mode oldmode = vd->e[i].mode;
-      rtx new;
+      rtx new_rtx;
 
       if (!in_hard_reg_set_p (reg_class_contents[cl], mode, i))
        return NULL_RTX;
 
-      new = maybe_mode_change (oldmode, vd->e[regno].mode, mode, i, regno);
-      if (new)
+      new_rtx = maybe_mode_change (oldmode, vd->e[regno].mode, mode, i, regno);
+      if (new_rtx)
        {
-         ORIGINAL_REGNO (new) = ORIGINAL_REGNO (reg);
-         REG_ATTRS (new) = REG_ATTRS (reg);
-         return new;
+         ORIGINAL_REGNO (new_rtx) = ORIGINAL_REGNO (reg);
+         REG_ATTRS (new_rtx) = REG_ATTRS (reg);
+         return new_rtx;
        }
     }
 
@@ -1398,14 +1389,14 @@ static bool
 replace_oldest_value_reg (rtx *loc, enum reg_class cl, rtx insn,
                          struct value_data *vd)
 {
-  rtx new = find_oldest_value_reg (cl, *loc, vd);
-  if (new)
+  rtx new_rtx = find_oldest_value_reg (cl, *loc, vd);
+  if (new_rtx)
     {
       if (dump_file)
        fprintf (dump_file, "insn %u: replaced reg %u with %u\n",
-                INSN_UID (insn), REGNO (*loc), REGNO (new));
+                INSN_UID (insn), REGNO (*loc), REGNO (new_rtx));
 
-      validate_change (insn, loc, new, 1);
+      validate_change (insn, loc, new_rtx, 1);
       return true;
     }
   return false;
@@ -1483,20 +1474,19 @@ replace_oldest_value_addr (rtx *loc, enum reg_class cl,
            int index_op;
            unsigned regno0 = REGNO (op0), regno1 = REGNO (op1);
 
-           if (REGNO_OK_FOR_INDEX_P (regno0)
-               && regno_ok_for_base_p (regno1, mode, PLUS, REG))
+           if (REGNO_OK_FOR_INDEX_P (regno1)
+               && regno_ok_for_base_p (regno0, mode, PLUS, REG))
+             index_op = 1;
+           else if (REGNO_OK_FOR_INDEX_P (regno0)
+                    && regno_ok_for_base_p (regno1, mode, PLUS, REG))
              index_op = 0;
-           else if (REGNO_OK_FOR_INDEX_P (regno1)
-                    && regno_ok_for_base_p (regno0, mode, PLUS, REG))
+           else if (regno_ok_for_base_p (regno0, mode, PLUS, REG)
+                    || REGNO_OK_FOR_INDEX_P (regno1))
              index_op = 1;
            else if (regno_ok_for_base_p (regno1, mode, PLUS, REG))
              index_op = 0;
-           else if (regno_ok_for_base_p (regno0, mode, PLUS, REG))
-             index_op = 1;
-           else if (REGNO_OK_FOR_INDEX_P (regno1))
-             index_op = 1;
            else
-             index_op = 0;
+             index_op = 1;
 
            locI = &XEXP (x, index_op);
            locB = &XEXP (x, !index_op);
@@ -1644,7 +1634,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
          unsigned int regno = REGNO (src);
          enum machine_mode mode = GET_MODE (src);
          unsigned int i;
-         rtx new;
+         rtx new_rtx;
 
          /* If we are accessing SRC in some mode other that what we
             set it in, make sure that the replacement is valid.  */
@@ -1659,13 +1649,13 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
             register in the same class.  */
          if (REG_P (SET_DEST (set)))
            {
-             new = find_oldest_value_reg (REGNO_REG_CLASS (regno), src, vd);
-             if (new && validate_change (insn, &SET_SRC (set), new, 0))
+             new_rtx = find_oldest_value_reg (REGNO_REG_CLASS (regno), src, vd);
+             if (new_rtx && validate_change (insn, &SET_SRC (set), new_rtx, 0))
                {
                  if (dump_file)
                    fprintf (dump_file,
                             "insn %u: replaced reg %u with %u\n",
-                            INSN_UID (insn), regno, REGNO (new));
+                            INSN_UID (insn), regno, REGNO (new_rtx));
                  changed = true;
                  goto did_replacement;
                }
@@ -1675,18 +1665,18 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
          for (i = vd->e[regno].oldest_regno; i != regno;
               i = vd->e[i].next_regno)
            {
-             new = maybe_mode_change (vd->e[i].mode, vd->e[regno].mode,
+             new_rtx = maybe_mode_change (vd->e[i].mode, vd->e[regno].mode,
                                       mode, i, regno);
-             if (new != NULL_RTX)
+             if (new_rtx != NULL_RTX)
                {
-                 if (validate_change (insn, &SET_SRC (set), new, 0))
+                 if (validate_change (insn, &SET_SRC (set), new_rtx, 0))
                    {
-                     ORIGINAL_REGNO (new) = ORIGINAL_REGNO (src);
-                     REG_ATTRS (new) = REG_ATTRS (src);
+                     ORIGINAL_REGNO (new_rtx) = ORIGINAL_REGNO (src);
+                     REG_ATTRS (new_rtx) = REG_ATTRS (src);
                      if (dump_file)
                        fprintf (dump_file,
                                 "insn %u: replaced reg %u with %u\n",
-                                INSN_UID (insn), regno, REGNO (new));
+                                INSN_UID (insn), regno, REGNO (new_rtx));
                      changed = true;
                      goto did_replacement;
                    }
@@ -1739,13 +1729,13 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
          if (replaced[i])
            {
              int j;
-             rtx new;
+             rtx new_rtx;
 
-             new = *recog_data.operand_loc[i];
-             recog_data.operand[i] = new;
+             new_rtx = *recog_data.operand_loc[i];
+             recog_data.operand[i] = new_rtx;
              for (j = 0; j < recog_data.n_dups; j++)
                if (recog_data.dup_num[j] == i)
-                 validate_change (insn, recog_data.dup_loc[j], new, 1);
+                 validate_unshare_change (insn, recog_data.dup_loc[j], new_rtx, 1);
 
              any_replacements = true;
            }
@@ -1947,8 +1937,10 @@ rest_of_handle_regrename (void)
   return 0;
 }
 
-struct tree_opt_pass pass_regrename =
+struct rtl_opt_pass pass_regrename =
 {
+ {
+  RTL_PASS,
   "rnreg",                              /* name */
   gate_handle_regrename,                /* gate */
   rest_of_handle_regrename,             /* execute */
@@ -1960,9 +1952,9 @@ struct tree_opt_pass pass_regrename =
   0,                                    /* properties_provided */
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
-  TODO_df_finish |
-  TODO_dump_func,                       /* todo_flags_finish */
-  'n'                                   /* letter */
+  TODO_df_finish | TODO_verify_rtl_sharing |
+  TODO_dump_func                        /* todo_flags_finish */
+ }
 };
 
 static bool
@@ -1980,8 +1972,10 @@ rest_of_handle_cprop (void)
   return 0;
 }
 
-struct tree_opt_pass pass_cprop_hardreg =
+struct rtl_opt_pass pass_cprop_hardreg =
 {
+ {
+  RTL_PASS,
   "cprop_hardreg",                      /* name */
   gate_handle_cprop,                    /* gate */
   rest_of_handle_cprop,                 /* execute */
@@ -1993,7 +1987,7 @@ struct tree_opt_pass pass_cprop_hardreg =
   0,                                    /* properties_provided */
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
-  TODO_dump_func,                       /* todo_flags_finish */
-  'n'                                   /* letter */
+  TODO_dump_func | TODO_verify_rtl_sharing /* todo_flags_finish */
+ }
 };