On Thu, May 3, 2012 at 6:05 PM, Michael Matz <m...@suse.de> wrote:
> Hi,
>
> Richi made some good points about my last patch, related to struct
> rtl_bb_info.  Even though it's not that important to shrink it (only few
> BBs are in RTL mode) there's no need to waste space.  My last patch
> created an unused pointer-sized hole in RTL mode, which we can just as
> well use for members of rtl_bb_info.  I've simply chosen the first, head_,
> because it entails few overall churn due to the use of BB_HEAD macro
> (header/footer are used directly), and because it's, well, the first :)
>
> We also thought about the visited member, but on review it's actually a
> silly member which we can also remove.  There's only three uses of it
> currently:
>
> * cfglayout.c: set-only never used
> * bb-reorder: duplicate_computed_gotos: used as bool flag
> * bb-reorder: tracing, used not as flag, but as trace indicator
>
> The first is useless, the second can be replaced by a proper bb->flags
> (BB_VISITED, newly introduced) and the third by an field in the
> side data structure that bb-reorder already employs.  Et voila, one word
> less for rtl_bb_info, making it overall one word smaller than before my
> last patch :)
>
> The churn in the patch is due to the il.rtl --> il.x.rtl renaming.  I wish
> we would accept anonymous structs for our sources, but we don't.

Well, as you touch all places that refer to header/footer why not
introduce macros to access them ...

> Currently regstrapping on x86_64-linux, okay if that passes?

Ok with the above change.

Thanks,
Richard.

>
> Ciao,
> Michael.
> -------------------------
> 2012-05-03  Michael Matz  <m...@suse.de>
>
>        * basic-block.h (struct rtl_bb_info): Remove visited member and
>        move head_ member to ...
>        (struct basic_block_def.basic_block_il_dependent): ... the new
>        member x, replacing but containing old member rtl.
>        (enum bb_flags): New BB_VISITED flag.
>
>        * jump.c (mark_all_labels): Adjust.
>        * cfgcleanup.c (try_optimize_cfg): Adjust.
>        * cfglayout.c (record_effective_endpoints): Adjust.
>        (relink_block_chain): Ditto (and don't fiddle with visited).
>        (fixup_reorder_chain): Adjust.
>        (fixup_fallthru_exit_predecessor): Ditto.
>        (cfg_layout_duplicate_bb): Ditto.
>        * combine.c (update_cfg_for_uncondjump): Adjust.
>        * bb-reorder.c (struct bbro_basic_block_data_def): Add visited
>        member.
>        (bb_visited_trace): New accessor.
>        (mark_bb_visited): Move in front.
>        (rotate_loop): Use bb_visited_trace.
>        (find_traces_1_round): Ditto.
>        (emit_barrier_after): Ditto.
>        (copy_bb): Ditto, and initialize visited on resize.
>        (reorder_basic_blocks): Initize visited member.
>        (duplicate_computed_gotos): Clear bb flags at start, use
>        BB_VISITED flags.
>
>        * cfgrtl.c (try_redirect_by_replacing_jump): Adjust.
>        (rtl_verify_flow_info_1): Ditto.
>        (cfg_layout_split_block): Ditto.
>        (cfg_layout_delete_block): Ditto.
>        (cfg_layout_merge_blocks): Ditto.
>        (init_rtl_bb_info): Adjust and initialize il.x.head_ member.
>
> Index: jump.c
> ===================================================================
> --- jump.c      (revision 187098)
> +++ jump.c      (working copy)
> @@ -275,13 +275,13 @@ mark_all_labels (rtx f)
>          /* In cfglayout mode, there may be non-insns between the
>             basic blocks.  If those non-insns represent tablejump data,
>             they contain label references that we must record.  */
> -         for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
> +         for (insn = bb->il.x.rtl->header; insn; insn = NEXT_INSN (insn))
>            if (INSN_P (insn))
>              {
>                gcc_assert (JUMP_TABLE_DATA_P (insn));
>                mark_jump_label (PATTERN (insn), insn, 0);
>              }
> -         for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
> +         for (insn = bb->il.x.rtl->footer; insn; insn = NEXT_INSN (insn))
>            if (INSN_P (insn))
>              {
>                gcc_assert (JUMP_TABLE_DATA_P (insn));
> Index: cfgcleanup.c
> ===================================================================
> --- cfgcleanup.c        (revision 187098)
> +++ cfgcleanup.c        (working copy)
> @@ -2586,21 +2586,21 @@ try_optimize_cfg (int mode)
>
>                      if (current_ir_type () == IR_RTL_CFGLAYOUT)
>                        {
> -                         if (b->il.rtl->footer
> -                             && BARRIER_P (b->il.rtl->footer))
> +                         if (b->il.x.rtl->footer
> +                             && BARRIER_P (b->il.x.rtl->footer))
>                            FOR_EACH_EDGE (e, ei, b->preds)
>                              if ((e->flags & EDGE_FALLTHRU)
> -                                 && e->src->il.rtl->footer == NULL)
> +                                 && e->src->il.x.rtl->footer == NULL)
>                                {
> -                                 if (b->il.rtl->footer)
> +                                 if (b->il.x.rtl->footer)
>                                    {
> -                                     e->src->il.rtl->footer = 
> b->il.rtl->footer;
> -                                     b->il.rtl->footer = NULL;
> +                                     e->src->il.x.rtl->footer = 
> b->il.x.rtl->footer;
> +                                     b->il.x.rtl->footer = NULL;
>                                    }
>                                  else
>                                    {
>                                      start_sequence ();
> -                                     e->src->il.rtl->footer = emit_barrier 
> ();
> +                                     e->src->il.x.rtl->footer = emit_barrier 
> ();
>                                      end_sequence ();
>                                    }
>                                }
> Index: cfglayout.c
> ===================================================================
> --- cfglayout.c (revision 187098)
> +++ cfglayout.c (working copy)
> @@ -208,11 +208,11 @@ record_effective_endpoints (void)
>       rtx end;
>
>       if (PREV_INSN (BB_HEAD (bb)) && next_insn != BB_HEAD (bb))
> -       bb->il.rtl->header = unlink_insn_chain (next_insn,
> +       bb->il.x.rtl->header = unlink_insn_chain (next_insn,
>                                              PREV_INSN (BB_HEAD (bb)));
>       end = skip_insns_after_block (bb);
>       if (NEXT_INSN (BB_END (bb)) && BB_END (bb) != end)
> -       bb->il.rtl->footer = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
> +       bb->il.x.rtl->footer = unlink_insn_chain (NEXT_INSN (BB_END (bb)), 
> end);
>       next_insn = NEXT_INSN (BB_END (bb));
>     }
>
> @@ -633,9 +633,8 @@ reemit_insn_block_notes (void)
>
>
>  /* Link the basic blocks in the correct order, compacting the basic
> -   block queue while at it.  This also clears the visited flag on
> -   all basic blocks.  If STAY_IN_CFGLAYOUT_MODE is false, this function
> -   also clears the basic block header and footer fields.
> +   block queue while at it.  If STAY_IN_CFGLAYOUT_MODE is false, this
> +   function also clears the basic block header and footer fields.
>
>    This function is usually called after a pass (e.g. tracer) finishes
>    some transformations while in cfglayout mode.  The required sequence
> @@ -681,13 +680,12 @@ relink_block_chain (bool stay_in_cfglayo
>   prev_bb->next_bb = EXIT_BLOCK_PTR;
>   EXIT_BLOCK_PTR->prev_bb = prev_bb;
>
> -  /* Then, clean up the aux and visited fields.  */
> +  /* Then, clean up the aux fields.  */
>   FOR_ALL_BB (bb)
>     {
>       bb->aux = NULL;
> -      bb->il.rtl->visited = 0;
>       if (!stay_in_cfglayout_mode)
> -       bb->il.rtl->header = bb->il.rtl->footer = NULL;
> +       bb->il.x.rtl->header = bb->il.x.rtl->footer = NULL;
>     }
>
>   /* Maybe reset the original copy tables, they are not valid anymore
> @@ -723,14 +721,14 @@ fixup_reorder_chain (void)
>
>   for (bb = ENTRY_BLOCK_PTR->next_bb; bb; bb = (basic_block) bb->aux)
>     {
> -      if (bb->il.rtl->header)
> +      if (bb->il.x.rtl->header)
>        {
>          if (insn)
> -           NEXT_INSN (insn) = bb->il.rtl->header;
> +           NEXT_INSN (insn) = bb->il.x.rtl->header;
>          else
> -           set_first_insn (bb->il.rtl->header);
> -         PREV_INSN (bb->il.rtl->header) = insn;
> -         insn = bb->il.rtl->header;
> +           set_first_insn (bb->il.x.rtl->header);
> +         PREV_INSN (bb->il.x.rtl->header) = insn;
> +         insn = bb->il.x.rtl->header;
>          while (NEXT_INSN (insn))
>            insn = NEXT_INSN (insn);
>        }
> @@ -740,10 +738,10 @@ fixup_reorder_chain (void)
>        set_first_insn (BB_HEAD (bb));
>       PREV_INSN (BB_HEAD (bb)) = insn;
>       insn = BB_END (bb);
> -      if (bb->il.rtl->footer)
> +      if (bb->il.x.rtl->footer)
>        {
> -         NEXT_INSN (insn) = bb->il.rtl->footer;
> -         PREV_INSN (bb->il.rtl->footer) = insn;
> +         NEXT_INSN (insn) = bb->il.x.rtl->footer;
> +         PREV_INSN (bb->il.x.rtl->footer) = insn;
>          while (NEXT_INSN (insn))
>            insn = NEXT_INSN (insn);
>        }
> @@ -799,7 +797,7 @@ fixup_reorder_chain (void)
>                {
>                  gcc_assert (!onlyjump_p (bb_end_insn)
>                              || returnjump_p (bb_end_insn));
> -                 bb->il.rtl->footer = emit_barrier_after (bb_end_insn);
> +                 bb->il.x.rtl->footer = emit_barrier_after (bb_end_insn);
>                  continue;
>                }
>
> @@ -908,7 +906,6 @@ fixup_reorder_chain (void)
>       nb = force_nonfallthru_and_redirect (e_fall, e_fall->dest, ret_label);
>       if (nb)
>        {
> -         nb->il.rtl->visited = 1;
>          nb->aux = bb->aux;
>          bb->aux = nb;
>          /* Don't process this new block.  */
> @@ -1062,8 +1059,8 @@ fixup_fallthru_exit_predecessor (void)
>          bb = split_block (bb, NULL)->dest;
>          bb->aux = c->aux;
>          c->aux = bb;
> -         bb->il.rtl->footer = c->il.rtl->footer;
> -         c->il.rtl->footer = NULL;
> +         bb->il.x.rtl->footer = c->il.x.rtl->footer;
> +         c->il.x.rtl->footer = NULL;
>        }
>
>       while (c->aux != bb)
> @@ -1272,24 +1269,24 @@ cfg_layout_duplicate_bb (basic_block bb)
>                               EXIT_BLOCK_PTR->prev_bb);
>
>   BB_COPY_PARTITION (new_bb, bb);
> -  if (bb->il.rtl->header)
> +  if (bb->il.x.rtl->header)
>     {
> -      insn = bb->il.rtl->header;
> +      insn = bb->il.x.rtl->header;
>       while (NEXT_INSN (insn))
>        insn = NEXT_INSN (insn);
> -      insn = duplicate_insn_chain (bb->il.rtl->header, insn);
> +      insn = duplicate_insn_chain (bb->il.x.rtl->header, insn);
>       if (insn)
> -       new_bb->il.rtl->header = unlink_insn_chain (insn, get_last_insn ());
> +       new_bb->il.x.rtl->header = unlink_insn_chain (insn, get_last_insn ());
>     }
>
> -  if (bb->il.rtl->footer)
> +  if (bb->il.x.rtl->footer)
>     {
> -      insn = bb->il.rtl->footer;
> +      insn = bb->il.x.rtl->footer;
>       while (NEXT_INSN (insn))
>        insn = NEXT_INSN (insn);
> -      insn = duplicate_insn_chain (bb->il.rtl->footer, insn);
> +      insn = duplicate_insn_chain (bb->il.x.rtl->footer, insn);
>       if (insn)
> -       new_bb->il.rtl->footer = unlink_insn_chain (insn, get_last_insn ());
> +       new_bb->il.x.rtl->footer = unlink_insn_chain (insn, get_last_insn ());
>     }
>
>   return new_bb;
> Index: combine.c
> ===================================================================
> --- combine.c   (revision 187098)
> +++ combine.c   (working copy)
> @@ -2536,13 +2536,13 @@ update_cfg_for_uncondjump (rtx insn)
>       single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
>
>       /* Remove barriers from the footer if there are any.  */
> -      for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
> +      for (insn = bb->il.x.rtl->footer; insn; insn = NEXT_INSN (insn))
>        if (BARRIER_P (insn))
>          {
>            if (PREV_INSN (insn))
>              NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
>            else
> -             bb->il.rtl->footer = NEXT_INSN (insn);
> +             bb->il.x.rtl->footer = NEXT_INSN (insn);
>            if (NEXT_INSN (insn))
>              PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
>          }
> Index: bb-reorder.c
> ===================================================================
> --- bb-reorder.c        (revision 187098)
> +++ bb-reorder.c        (working copy)
> @@ -133,6 +133,9 @@ typedef struct bbro_basic_block_data_def
>   /* Which trace is the bb in?  */
>   int in_trace;
>
> +  /* Which trace was this bb visited in?  */
> +  int visited;
> +
>   /* Which heap is BB in (if any)?  */
>   fibheap_t heap;
>
> @@ -183,6 +186,29 @@ static void connect_traces (int, struct
>  static bool copy_bb_p (const_basic_block, int);
>  static bool push_to_next_round_p (const_basic_block, int, int, int, 
> gcov_type);
>
> +/* Return the trace number in which BB was visited.  */
> +
> +static int
> +bb_visited_trace (const_basic_block bb)
> +{
> +  gcc_assert (bb->index < array_size);
> +  return bbd[bb->index].visited;
> +}
> +
> +/* This function marks BB that it was visited in trace number TRACE.  */
> +
> +static void
> +mark_bb_visited (basic_block bb, int trace)
> +{
> +  bbd[bb->index].visited = trace;
> +  if (bbd[bb->index].heap)
> +    {
> +      fibheap_delete_node (bbd[bb->index].heap, bbd[bb->index].node);
> +      bbd[bb->index].heap = NULL;
> +      bbd[bb->index].node = NULL;
> +    }
> +}
> +
>  /* Check to see if bb should be pushed into the next round of trace
>    collections or not.  Reasons for pushing the block forward are 1).
>    If the block is cold, we are doing partitioning, and there will be
> @@ -306,14 +332,14 @@ rotate_loop (edge back_edge, struct trac
>
>       FOR_EACH_EDGE (e, ei, bb->succs)
>        if (e->dest != EXIT_BLOCK_PTR
> -           && e->dest->il.rtl->visited != trace_n
> +           && bb_visited_trace (e->dest) != trace_n
>            && (e->flags & EDGE_CAN_FALLTHRU)
>            && !(e->flags & EDGE_COMPLEX))
>        {
>          if (is_preferred)
>            {
>              /* The best edge is preferred.  */
> -             if (!e->dest->il.rtl->visited
> +             if (!bb_visited_trace (e->dest)
>                  || bbd[e->dest->index].start_of_trace >= 0)
>                {
>                  /* The current edge E is also preferred.  */
> @@ -329,7 +355,7 @@ rotate_loop (edge back_edge, struct trac
>            }
>          else
>            {
> -             if (!e->dest->il.rtl->visited
> +             if (!bb_visited_trace (e->dest)
>                  || bbd[e->dest->index].start_of_trace >= 0)
>                {
>                  /* The current edge E is preferred.  */
> @@ -397,20 +423,6 @@ rotate_loop (edge back_edge, struct trac
>   return best_bb;
>  }
>
> -/* This function marks BB that it was visited in trace number TRACE.  */
> -
> -static void
> -mark_bb_visited (basic_block bb, int trace)
> -{
> -  bb->il.rtl->visited = trace;
> -  if (bbd[bb->index].heap)
> -    {
> -      fibheap_delete_node (bbd[bb->index].heap, bbd[bb->index].node);
> -      bbd[bb->index].heap = NULL;
> -      bbd[bb->index].node = NULL;
> -    }
> -}
> -
>  /* One round of finding traces. Find traces for BRANCH_TH and EXEC_TH i.e. do
>    not include basic blocks their probability is lower than BRANCH_TH or their
>    frequency is lower than EXEC_TH into traces (or count is lower than
> @@ -496,8 +508,8 @@ find_traces_1_round (int branch_th, int
>              if (e->dest == EXIT_BLOCK_PTR)
>                continue;
>
> -             if (e->dest->il.rtl->visited
> -                 && e->dest->il.rtl->visited != *n_traces)
> +             if (bb_visited_trace (e->dest)
> +                 && bb_visited_trace (e->dest) != *n_traces)
>                continue;
>
>              if (BB_PARTITION (e->dest) != BB_PARTITION (bb))
> @@ -550,7 +562,7 @@ find_traces_1_round (int branch_th, int
>            {
>              if (e == best_edge
>                  || e->dest == EXIT_BLOCK_PTR
> -                 || e->dest->il.rtl->visited)
> +                 || bb_visited_trace (e->dest))
>                continue;
>
>              key = bb_to_key (e->dest);
> @@ -611,7 +623,7 @@ find_traces_1_round (int branch_th, int
>
>          if (best_edge) /* Suitable successor was found.  */
>            {
> -             if (best_edge->dest->il.rtl->visited == *n_traces)
> +             if (bb_visited_trace (best_edge->dest) == *n_traces)
>                {
>                  /* We do nothing with one basic block loops.  */
>                  if (best_edge->dest != bb)
> @@ -682,7 +694,7 @@ find_traces_1_round (int branch_th, int
>                    if (e != best_edge
>                        && (e->flags & EDGE_CAN_FALLTHRU)
>                        && !(e->flags & EDGE_COMPLEX)
> -                       && !e->dest->il.rtl->visited
> +                       && !bb_visited_trace (e->dest)
>                        && single_pred_p (e->dest)
>                        && !(e->flags & EDGE_CROSSING)
>                        && single_succ_p (e->dest)
> @@ -716,7 +728,7 @@ find_traces_1_round (int branch_th, int
>       FOR_EACH_EDGE (e, ei, bb->succs)
>        {
>          if (e->dest == EXIT_BLOCK_PTR
> -             || e->dest->il.rtl->visited)
> +             || bb_visited_trace (e->dest))
>            continue;
>
>          if (bbd[e->dest->index].heap)
> @@ -758,15 +770,11 @@ copy_bb (basic_block old_bb, edge e, bas
>   BB_COPY_PARTITION (new_bb, old_bb);
>
>   gcc_assert (e->dest == new_bb);
> -  gcc_assert (!e->dest->il.rtl->visited);
>
>   if (dump_file)
>     fprintf (dump_file,
>             "Duplicated bb %d (created bb %d)\n",
>             old_bb->index, new_bb->index);
> -  new_bb->il.rtl->visited = trace;
> -  new_bb->aux = bb->aux;
> -  bb->aux = new_bb;
>
>   if (new_bb->index >= array_size || last_basic_block > array_size)
>     {
> @@ -779,8 +787,9 @@ copy_bb (basic_block old_bb, edge e, bas
>       for (i = array_size; i < new_size; i++)
>        {
>          bbd[i].start_of_trace = -1;
> -         bbd[i].in_trace = -1;
>          bbd[i].end_of_trace = -1;
> +         bbd[i].in_trace = -1;
> +         bbd[i].visited = 0;
>          bbd[i].heap = NULL;
>          bbd[i].node = NULL;
>        }
> @@ -794,6 +803,11 @@ copy_bb (basic_block old_bb, edge e, bas
>        }
>     }
>
> +  gcc_assert (!bb_visited_trace (e->dest));
> +  mark_bb_visited (new_bb, trace);
> +  new_bb->aux = bb->aux;
> +  bb->aux = new_bb;
> +
>   bbd[new_bb->index].in_trace = trace;
>
>   return new_bb;
> @@ -1214,7 +1228,7 @@ static void
>  emit_barrier_after_bb (basic_block bb)
>  {
>   rtx barrier = emit_barrier_after (BB_END (bb));
> -  bb->il.rtl->footer = unlink_insn_chain (barrier, barrier);
> +  bb->il.x.rtl->footer = unlink_insn_chain (barrier, barrier);
>  }
>
>  /* The landing pad OLD_LP, in block OLD_BB, has edges from both partitions.
> @@ -1929,8 +1943,9 @@ reorder_basic_blocks (void)
>   for (i = 0; i < array_size; i++)
>     {
>       bbd[i].start_of_trace = -1;
> -      bbd[i].in_trace = -1;
>       bbd[i].end_of_trace = -1;
> +      bbd[i].in_trace = -1;
> +      bbd[i].visited = 0;
>       bbd[i].heap = NULL;
>       bbd[i].node = NULL;
>     }
> @@ -2012,6 +2027,7 @@ duplicate_computed_gotos (void)
>   if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1)
>     return 0;
>
> +  clear_bb_flags ();
>   cfg_layout_initialize (0);
>
>   /* We are estimating the length of uncond jump insn only once
> @@ -2075,10 +2091,10 @@ duplicate_computed_gotos (void)
>   /* Duplicate computed gotos.  */
>   FOR_EACH_BB (bb)
>     {
> -      if (bb->il.rtl->visited)
> +      if (bb->flags & BB_VISITED)
>        continue;
>
> -      bb->il.rtl->visited = 1;
> +      bb->flags |= BB_VISITED;
>
>       /* BB must have one outgoing edge.  That edge must not lead to
>         the exit block or the next block.
> @@ -2096,7 +2112,7 @@ duplicate_computed_gotos (void)
>       new_bb = duplicate_block (single_succ (bb), single_succ_edge (bb), bb);
>       new_bb->aux = bb->aux;
>       bb->aux = new_bb;
> -      new_bb->il.rtl->visited = 1;
> +      new_bb->flags |= BB_VISITED;
>     }
>
>  done:
> Index: basic-block.h
> ===================================================================
> --- basic-block.h       (revision 187099)
> +++ basic-block.h       (working copy)
> @@ -102,17 +102,14 @@ extern const struct gcov_ctr_summary *pr
>  struct loop;
>
>  struct GTY(()) rtl_bb_info {
> -  /* The first and last insns of the block.  */
> -  rtx head_;
> +  /* The first insn of the block is embedded into bb->il.x.  */
> +  /* The last insn of the block.  */
>   rtx end_;
>
>   /* In CFGlayout mode points to insn notes/jumptables to be placed just 
> before
>      and after the block.   */
>   rtx header;
>   rtx footer;
> -
> -  /* This field is used by the bb-reorder pass.  */
> -  int visited;
>  };
>
>  struct GTY(()) gimple_bb_info {
> @@ -169,7 +166,10 @@ struct GTY((chain_next ("%h.next_bb"), c
>
>   union basic_block_il_dependent {
>       struct gimple_bb_info GTY ((tag ("0"))) gimple;
> -      struct rtl_bb_info * GTY ((tag ("1"))) rtl;
> +      struct {
> +        rtx head_;
> +        struct rtl_bb_info * rtl;
> +      } GTY ((tag ("1"))) x;
>     } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
>
>   /* Expected number of executions: calculated in profile.c.  */
> @@ -260,7 +260,10 @@ enum bb_flags
>      df_set_bb_dirty, but not cleared by df_analyze, so it can be used
>      to test whether a block has been modified prior to a df_analyze
>      call.  */
> -  BB_MODIFIED = 1 << 12
> +  BB_MODIFIED = 1 << 12,
> +
> +  /* A general visited flag for passes to use.  */
> +  BB_VISITED = 1 << 13
>  };
>
>  /* Dummy flag for convenience in the hot/cold partitioning code.  */
> @@ -415,8 +418,8 @@ struct GTY(()) control_flow_graph {
>
>  /* Stuff for recording basic block info.  */
>
> -#define BB_HEAD(B)      (B)->il.rtl->head_
> -#define BB_END(B)       (B)->il.rtl->end_
> +#define BB_HEAD(B)      (B)->il.x.head_
> +#define BB_END(B)       (B)->il.x.rtl->end_
>
>  /* Special block numbers [markers] for entry and exit.
>    Neither of them is supposed to hold actual statements.  */
> Index: cfgrtl.c
> ===================================================================
> --- cfgrtl.c    (revision 187098)
> +++ cfgrtl.c    (working copy)
> @@ -837,7 +837,7 @@ try_redirect_by_replacing_jump (edge e,
>       /* Selectively unlink whole insn chain.  */
>       if (in_cfglayout)
>        {
> -         rtx insn = src->il.rtl->footer;
> +         rtx insn = src->il.x.rtl->footer;
>
>          delete_insn_chain (kill_from, BB_END (src), false);
>
> @@ -849,7 +849,7 @@ try_redirect_by_replacing_jump (edge e,
>                  if (PREV_INSN (insn))
>                    NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
>                  else
> -                   src->il.rtl->footer = NEXT_INSN (insn);
> +                   src->il.x.rtl->footer = NEXT_INSN (insn);
>                  if (NEXT_INSN (insn))
>                    PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
>                }
> @@ -1857,7 +1857,7 @@ rtl_verify_flow_info_1 (void)
>            err = 1;
>          }
>
> -      for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
> +      for (insn = bb->il.x.rtl->header; insn; insn = NEXT_INSN (insn))
>        if (!BARRIER_P (insn)
>            && BLOCK_FOR_INSN (insn) != NULL)
>          {
> @@ -1865,7 +1865,7 @@ rtl_verify_flow_info_1 (void)
>                   INSN_UID (insn), bb->index);
>            err = 1;
>          }
> -      for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
> +      for (insn = bb->il.x.rtl->footer; insn; insn = NEXT_INSN (insn))
>        if (!BARRIER_P (insn)
>            && BLOCK_FOR_INSN (insn) != NULL)
>          {
> @@ -2597,8 +2597,8 @@ cfg_layout_split_block (basic_block bb,
>   rtx insn = (rtx) insnp;
>   basic_block new_bb = rtl_split_block (bb, insn);
>
> -  new_bb->il.rtl->footer = bb->il.rtl->footer;
> -  bb->il.rtl->footer = NULL;
> +  new_bb->il.x.rtl->footer = bb->il.x.rtl->footer;
> +  bb->il.x.rtl->footer = NULL;
>
>   return new_bb;
>  }
> @@ -2703,24 +2703,24 @@ cfg_layout_delete_block (basic_block bb)
>  {
>   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
>
> -  if (bb->il.rtl->header)
> +  if (bb->il.x.rtl->header)
>     {
>       next = BB_HEAD (bb);
>       if (prev)
> -       NEXT_INSN (prev) = bb->il.rtl->header;
> +       NEXT_INSN (prev) = bb->il.x.rtl->header;
>       else
> -       set_first_insn (bb->il.rtl->header);
> -      PREV_INSN (bb->il.rtl->header) = prev;
> -      insn = bb->il.rtl->header;
> +       set_first_insn (bb->il.x.rtl->header);
> +      PREV_INSN (bb->il.x.rtl->header) = prev;
> +      insn = bb->il.x.rtl->header;
>       while (NEXT_INSN (insn))
>        insn = NEXT_INSN (insn);
>       NEXT_INSN (insn) = next;
>       PREV_INSN (next) = insn;
>     }
>   next = NEXT_INSN (BB_END (bb));
> -  if (bb->il.rtl->footer)
> +  if (bb->il.x.rtl->footer)
>     {
> -      insn = bb->il.rtl->footer;
> +      insn = bb->il.x.rtl->footer;
>       while (insn)
>        {
>          if (BARRIER_P (insn))
> @@ -2728,7 +2728,7 @@ cfg_layout_delete_block (basic_block bb)
>              if (PREV_INSN (insn))
>                NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
>              else
> -               bb->il.rtl->footer = NEXT_INSN (insn);
> +               bb->il.x.rtl->footer = NEXT_INSN (insn);
>              if (NEXT_INSN (insn))
>                PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
>            }
> @@ -2736,11 +2736,11 @@ cfg_layout_delete_block (basic_block bb)
>            break;
>          insn = NEXT_INSN (insn);
>        }
> -      if (bb->il.rtl->footer)
> +      if (bb->il.x.rtl->footer)
>        {
>          insn = BB_END (bb);
> -         NEXT_INSN (insn) = bb->il.rtl->footer;
> -         PREV_INSN (bb->il.rtl->footer) = insn;
> +         NEXT_INSN (insn) = bb->il.x.rtl->footer;
> +         PREV_INSN (bb->il.x.rtl->footer) = insn;
>          while (NEXT_INSN (insn))
>            insn = NEXT_INSN (insn);
>          NEXT_INSN (insn) = next;
> @@ -2751,7 +2751,7 @@ cfg_layout_delete_block (basic_block bb)
>        }
>     }
>   if (bb->next_bb != EXIT_BLOCK_PTR)
> -    to = &bb->next_bb->il.rtl->header;
> +    to = &bb->next_bb->il.x.rtl->header;
>   else
>     to = &cfg_layout_function_footer;
>
> @@ -2882,18 +2882,18 @@ cfg_layout_merge_blocks (basic_block a,
>     }
>
>   /* Possible line number notes should appear in between.  */
> -  if (b->il.rtl->header)
> +  if (b->il.x.rtl->header)
>     {
>       rtx first = BB_END (a), last;
>
> -      last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a), a);
> +      last = emit_insn_after_noloc (b->il.x.rtl->header, BB_END (a), a);
>       /* The above might add a BARRIER as BB_END, but as barriers
>         aren't valid parts of a bb, remove_insn doesn't update
>         BB_END if it is a barrier.  So adjust BB_END here.  */
>       while (BB_END (a) != first && BARRIER_P (BB_END (a)))
>        BB_END (a) = PREV_INSN (BB_END (a));
>       delete_insn_chain (NEXT_INSN (first), last, false);
> -      b->il.rtl->header = NULL;
> +      b->il.x.rtl->header = NULL;
>     }
>
>   /* In the case basic blocks are not adjacent, move them around.  */
> @@ -2924,20 +2924,20 @@ cfg_layout_merge_blocks (basic_block a,
>   df_bb_delete (b->index);
>
>   /* Possible tablejumps and barriers should appear after the block.  */
> -  if (b->il.rtl->footer)
> +  if (b->il.x.rtl->footer)
>     {
> -      if (!a->il.rtl->footer)
> -       a->il.rtl->footer = b->il.rtl->footer;
> +      if (!a->il.x.rtl->footer)
> +       a->il.x.rtl->footer = b->il.x.rtl->footer;
>       else
>        {
> -         rtx last = a->il.rtl->footer;
> +         rtx last = a->il.x.rtl->footer;
>
>          while (NEXT_INSN (last))
>            last = NEXT_INSN (last);
> -         NEXT_INSN (last) = b->il.rtl->footer;
> -         PREV_INSN (b->il.rtl->footer) = last;
> +         NEXT_INSN (last) = b->il.x.rtl->footer;
> +         PREV_INSN (b->il.x.rtl->footer) = last;
>        }
> -      b->il.rtl->footer = NULL;
> +      b->il.x.rtl->footer = NULL;
>     }
>
>   /* If B was a forwarder block, propagate the locus on the edge.  */
> @@ -3211,8 +3211,9 @@ rtl_extract_cond_bb_edges (basic_block b
>  void
>  init_rtl_bb_info (basic_block bb)
>  {
> -  gcc_assert (!bb->il.rtl);
> -  bb->il.rtl = ggc_alloc_cleared_rtl_bb_info ();
> +  gcc_assert (!bb->il.x.rtl);
> +  bb->il.x.head_ = NULL;
> +  bb->il.x.rtl = ggc_alloc_cleared_rtl_bb_info ();
>  }
>
>  /* Returns true if it is possible to remove edge E by redirecting

Reply via email to