diff mbox

gather bbs and conditions in a single walk through dominators

Message ID 1444239710-26682-1-git-send-email-s.pop@samsung.com
State New
Headers show

Commit Message

Sebastian Pop Oct. 7, 2015, 5:41 p.m. UTC
2015-10-06  Aditya Kumar  <aditya.k7@samsung.com>
                Sebastian Pop  <s.pop@samsung.com>

                * graphite-dependences.c (scop_get_dependences): Do not use SCOP_BBS.
                * graphite-isl-ast-to-gimple.c (get_max_schedule_dimensions): Same.
                (generate_isl_schedule): Same.
                * graphite-optimize-isl.c (scop_get_domains): Same.
                (apply_schedule_map_to_scop): Same.
                * graphite-poly.c (print_iteration_domains): Same.
                (remove_gbbs_in_scop): Same.
                (new_scop): Same.
                (free_scop): Same.
                (print_scop): Same.
                * graphite-poly.h (struct scop): Rename bbs to pbbs.
                (SCOP_BBS): Remove.
                * graphite-scop-detection.c (compare_bb_depths): Remove.
                (graphite_sort_dominated_info): Remove.
                (try_generate_gimple_bb): Move out of scop_detection.
                (all_non_dominated_preds_marked_p): Remove.
                (build_scop_bbs_1): Remove.
                (build_scop_bbs): Remove.
                (nb_pbbs_in_loops): Do not use SCOP_BBS.
                (find_scop_parameters): Same.
                (sese_dom_walker): Rename gather_bbs.
                (before_dom_children): Call try_generate_gimple_bb and collect gbb
                and pbb.
                (build_scops): Call gather_bbs.
                * graphite-sese-to-poly.c (build_scop_scattering): Do not use SCOP_BBS.
                (add_conditions_to_constraints): Same.
                (build_scop_iteration_domain): Same.
                (build_scop_drs): Same.
                (new_pbb_from_pbb): Same.
                * sese.c (new_sese_info): Create bbs.
                * sese.h (struct sese_info_t): Add bbs.
---
 gcc/graphite-dependences.c       |   2 +-
 gcc/graphite-isl-ast-to-gimple.c |   4 +-
 gcc/graphite-optimize-isl.c      |   4 +-
 gcc/graphite-poly.c              |  14 +--
 gcc/graphite-poly.h              |   3 +-
 gcc/graphite-scop-detection.c    | 231 ++++++++++-----------------------------
 gcc/graphite-sese-to-poly.c      |  19 ++--
 gcc/sese.c                       |   1 +
 gcc/sese.h                       |   3 +
 9 files changed, 83 insertions(+), 198 deletions(-)

Comments

Sebastian Pop Oct. 7, 2015, 7:18 p.m. UTC | #1
Hi,

The patch cleans up the function to build scop's basic blocks and the function
that gathers the conditions under which a basic block is executed.  We remove
one traversal of the dominator tree.

This refactoring was triggered by the need of a vec<bb> of all the basic blocks
in a region.  We will use that vector in a patch that removes the out-of-ssa
translation of scalar dependences: we will iterate through the basic blocks of a
region to record scalar dependences crossing bbs or going out of the region.

The patch passes bootstrap and regtest on x86_64-linux.

Sebastian Pop wrote:
> 2015-10-06  Aditya Kumar  <aditya.k7@samsung.com>
>                 Sebastian Pop  <s.pop@samsung.com>
> 
>                 * graphite-dependences.c (scop_get_dependences): Do not use SCOP_BBS.
>                 * graphite-isl-ast-to-gimple.c (get_max_schedule_dimensions): Same.
>                 (generate_isl_schedule): Same.
>                 * graphite-optimize-isl.c (scop_get_domains): Same.
>                 (apply_schedule_map_to_scop): Same.
>                 * graphite-poly.c (print_iteration_domains): Same.
>                 (remove_gbbs_in_scop): Same.
>                 (new_scop): Same.
>                 (free_scop): Same.
>                 (print_scop): Same.
>                 * graphite-poly.h (struct scop): Rename bbs to pbbs.
>                 (SCOP_BBS): Remove.
>                 * graphite-scop-detection.c (compare_bb_depths): Remove.
>                 (graphite_sort_dominated_info): Remove.
>                 (try_generate_gimple_bb): Move out of scop_detection.
>                 (all_non_dominated_preds_marked_p): Remove.
>                 (build_scop_bbs_1): Remove.
>                 (build_scop_bbs): Remove.
>                 (nb_pbbs_in_loops): Do not use SCOP_BBS.
>                 (find_scop_parameters): Same.
>                 (sese_dom_walker): Rename gather_bbs.
>                 (before_dom_children): Call try_generate_gimple_bb and collect gbb
>                 and pbb.
>                 (build_scops): Call gather_bbs.
>                 * graphite-sese-to-poly.c (build_scop_scattering): Do not use SCOP_BBS.
>                 (add_conditions_to_constraints): Same.
>                 (build_scop_iteration_domain): Same.
>                 (build_scop_drs): Same.
>                 (new_pbb_from_pbb): Same.
>                 * sese.c (new_sese_info): Create bbs.
>                 * sese.h (struct sese_info_t): Add bbs.
> ---
>  gcc/graphite-dependences.c       |   2 +-
>  gcc/graphite-isl-ast-to-gimple.c |   4 +-
>  gcc/graphite-optimize-isl.c      |   4 +-
>  gcc/graphite-poly.c              |  14 +--
>  gcc/graphite-poly.h              |   3 +-
>  gcc/graphite-scop-detection.c    | 231 ++++++++++-----------------------------
>  gcc/graphite-sese-to-poly.c      |  19 ++--
>  gcc/sese.c                       |   1 +
>  gcc/sese.h                       |   3 +
>  9 files changed, 83 insertions(+), 198 deletions(-)
> 
> diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
> index 8829cb4..e879429 100644
> --- a/gcc/graphite-dependences.c
> +++ b/gcc/graphite-dependences.c
> @@ -335,7 +335,7 @@ scop_get_dependences (scop_p scop)
>    isl_union_map *dependences;
>  
>    if (!scop->must_raw)
> -    compute_deps (scop, SCOP_BBS (scop),
> +    compute_deps (scop, scop->pbbs,
>  		  &scop->must_raw, &scop->may_raw,
>  		  &scop->must_raw_no_source, &scop->may_raw_no_source,
>  		  &scop->must_war, &scop->may_war,
> diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
> index f4e7edf..2f2e2ba 100644
> --- a/gcc/graphite-isl-ast-to-gimple.c
> +++ b/gcc/graphite-isl-ast-to-gimple.c
> @@ -940,7 +940,7 @@ int get_max_schedule_dimensions (scop_p scop)
>    poly_bb_p pbb;
>    int schedule_dims = 0;
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      {
>        int pbb_schedule_dims = isl_map_dim (pbb->transformed, isl_dim_out);
>        if (pbb_schedule_dims > schedule_dims)
> @@ -987,7 +987,7 @@ generate_isl_schedule (scop_p scop)
>    isl_union_map *schedule_isl =
>      isl_union_map_empty (isl_set_get_space (scop->param_context));
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      {
>        /* Dead code elimination: when the domain of a PBB is empty,
>  	 don't generate code for the PBB.  */
> diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c
> index 2bae417..090bc01 100644
> --- a/gcc/graphite-optimize-isl.c
> +++ b/gcc/graphite-optimize-isl.c
> @@ -58,7 +58,7 @@ scop_get_domains (scop_p scop ATTRIBUTE_UNUSED)
>    isl_space *space = isl_set_get_space (scop->param_context);
>    isl_union_set *res = isl_union_set_empty (space);
>  
> -  FOR_EACH_VEC_ELT (scop->bbs, i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      res = isl_union_set_add_set (res, isl_set_copy (pbb->domain));
>  
>    return res;
> @@ -270,7 +270,7 @@ apply_schedule_map_to_scop (scop_p scop, isl_union_map *schedule_map)
>    int i;
>    poly_bb_p pbb;
>  
> -  FOR_EACH_VEC_ELT (scop->bbs, i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      {
>        isl_set *domain = isl_set_copy (pbb->domain);
>        isl_map *stmt_schedule;
> diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
> index 39e7aa4..84ecee0 100644
> --- a/gcc/graphite-poly.c
> +++ b/gcc/graphite-poly.c
> @@ -87,7 +87,7 @@ print_iteration_domains (FILE *file, scop_p scop, int verbosity)
>    int i;
>    poly_bb_p pbb;
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      print_iteration_domain (file, pbb, verbosity);
>  }
>  
> @@ -294,7 +294,7 @@ remove_gbbs_in_scop (scop_p scop)
>    int i;
>    poly_bb_p pbb;
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      free_gimple_poly_bb (PBB_BLACK_BOX (pbb));
>  }
>  
> @@ -320,7 +320,7 @@ new_scop (edge entry, edge exit)
>    scop->must_waw_no_source = NULL;
>    scop->may_waw_no_source = NULL;
>    scop_set_region (scop, region);
> -  SCOP_BBS (scop).create (3);
> +  scop->pbbs.create (3);
>    POLY_SCOP_P (scop) = false;
>    scop->drs.create (3);
>  
> @@ -338,10 +338,10 @@ free_scop (scop_p scop)
>    remove_gbbs_in_scop (scop);
>    free_sese_info (SCOP_REGION (scop));
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      free_poly_bb (pbb);
>  
> -  SCOP_BBS (scop).release ();
> +  scop->pbbs.release ();
>  
>    isl_set_free (scop->param_context);
>    isl_union_map_free (scop->must_raw);
> @@ -625,9 +625,9 @@ print_scop (FILE *file, scop_p scop, int verbosity)
>    if (verbosity > 0)
>      fprintf (file, "# Number of statements\n");
>  
> -  fprintf (file, "%d\n", SCOP_BBS (scop).length ());
> +  fprintf (file, "%d\n", scop->pbbs.length ());
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      print_pbb (file, pbb, verbosity);
>  
>    fprintf (file, "#)\n");
> diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
> index 977f97e..e477439 100644
> --- a/gcc/graphite-poly.h
> +++ b/gcc/graphite-poly.h
> @@ -415,7 +415,7 @@ struct scop
>    /* All the basic blocks in this scop that contain memory references
>       and that will be represented as statements in the polyhedral
>       representation.  */
> -  vec<poly_bb_p> bbs;
> +  vec<poly_bb_p> pbbs;
>  
>    /* All the data references in this scop.  */
>    vec<dr_info> drs;
> @@ -451,7 +451,6 @@ struct scop
>    bool poly_scop_p;
>  };
>  
> -#define SCOP_BBS(S) (S->bbs)
>  #define SCOP_REGION(S) (S->region)
>  #define SCOP_CONTEXT(S) (NULL)
>  #define POLY_SCOP_P(S) (S->poly_scop_p)
> diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
> index 43e03a6..6c0987d 100644
> --- a/gcc/graphite-scop-detection.c
> +++ b/gcc/graphite-scop-detection.c
> @@ -113,34 +113,6 @@ same_close_phi_node (gphi *p1, gphi *p2)
>  			  gimple_phi_arg_def (p2, 0), 0);
>  }
>  
> -/* Compare the depth of two basic_block's P1 and P2.  */
> -
> -static int
> -compare_bb_depths (const void *p1, const void *p2)
> -{
> -  const_basic_block const bb1 = *(const_basic_block const *)p1;
> -  const_basic_block const bb2 = *(const_basic_block const *)p2;
> -  int d1 = loop_depth (bb1->loop_father);
> -  int d2 = loop_depth (bb2->loop_father);
> -
> -  if (d1 < d2)
> -    return 1;
> -
> -  if (d1 > d2)
> -    return -1;
> -
> -  return 0;
> -}
> -
> -/* Sort the basic blocks from DOM such that the first are the ones at
> -   a deepest loop level.  */
> -
> -static void
> -graphite_sort_dominated_info (vec<basic_block> dom)
> -{
> -  dom.qsort (compare_bb_depths);
> -}
> -
>  static void make_close_phi_nodes_unique (basic_block bb);
>  
>  /* Remove the close phi node at GSI and replace its rhs with the rhs
> @@ -509,25 +481,6 @@ public:
>  
>    static bool can_represent_loop (loop_p loop, sese_l scop);
>  
> -  /* Generates a polyhedral black box only if the bb contains interesting
> -     information.  */
> -
> -  static gimple_poly_bb_p try_generate_gimple_bb (scop_p scop, basic_block bb);
> -
> -  /* Returns true if all predecessors of BB, that are not dominated by BB, are
> -     marked in MAP.  The predecessors dominated by BB are loop latches and will
> -     be handled after BB.  */
> -
> -  static bool all_non_dominated_preds_marked_p (basic_block bb, sbitmap map);
> -
> -  /* Recursive helper function for build_scops_bbs.  */
> -
> -  static void build_scop_bbs_1 (scop_p scop, sbitmap visited, basic_block bb);
> -
> -  /* Gather the basic blocks belonging to the SCOP.  */
> -
> -  static void build_scop_bbs (scop_p scop);
> -
>    /* Returns the number of pbbs that are in loops contained in SCOP.  */
>  
>    static int nb_pbbs_in_loops (scop_p scop);
> @@ -1519,102 +1472,6 @@ scop_detection::loop_body_is_valid_scop (loop_p loop, sese_l scop) const
>    return true;
>  }
>  
> -/* Generates a polyhedral black box only if the bb contains interesting
> -   information.  */
> -
> -gimple_poly_bb_p
> -scop_detection::try_generate_gimple_bb (scop_p scop, basic_block bb)
> -{
> -  vec<data_reference_p> drs;
> -  drs.create (5);
> -  sese_l region = scop->region->region;
> -  loop_p nest = outermost_loop_in_sese (region, bb);
> -
> -  loop_p loop = bb->loop_father;
> -  if (!loop_in_sese_p (loop, region))
> -    loop = nest;
> -
> -  gimple_stmt_iterator gsi;
> -  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> -    {
> -      gimple *stmt = gsi_stmt (gsi);
> -      if (is_gimple_debug (stmt))
> -	continue;
> -
> -      graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
> -    }
> -
> -  return new_gimple_poly_bb (bb, drs);
> -}
> -
> -/* Returns true if all predecessors of BB, that are not dominated by BB, are
> -   marked in MAP.  The predecessors dominated by BB are loop latches and will
> -   be handled after BB.  */
> -
> -bool
> -scop_detection::all_non_dominated_preds_marked_p (basic_block bb, sbitmap map)
> -{
> -  edge e;
> -  edge_iterator ei;
> -
> -  FOR_EACH_EDGE (e, ei, bb->preds)
> -    if (!bitmap_bit_p (map, e->src->index)
> -	&& !dominated_by_p (CDI_DOMINATORS, e->src, bb))
> -      return false;
> -
> -  return true;
> -}
> -
> -/* Recursive helper function for build_scops_bbs.  */
> -
> -void
> -scop_detection::build_scop_bbs_1 (scop_p scop, sbitmap visited, basic_block bb)
> -{
> -  if (bitmap_bit_p (visited, bb->index)
> -      || !bb_in_sese_p (bb, scop->region->region))
> -    return;
> -
> -  poly_bb_p pbb = new_poly_bb (scop, try_generate_gimple_bb (scop, bb));
> -  SCOP_BBS (scop).safe_push (pbb);
> -  bitmap_set_bit (visited, bb->index);
> -
> -  vec<basic_block> dom = get_dominated_by (CDI_DOMINATORS, bb);
> -
> -  if (!dom.exists ())
> -    return;
> -
> -  graphite_sort_dominated_info (dom);
> -
> -  while (!dom.is_empty ())
> -    {
> -      int i;
> -      basic_block dom_bb;
> -
> -      FOR_EACH_VEC_ELT (dom, i, dom_bb)
> -	if (all_non_dominated_preds_marked_p (dom_bb, visited))
> -	  {
> -	    build_scop_bbs_1 (scop, visited, dom_bb);
> -	    dom.unordered_remove (i);
> -	    break;
> -	  }
> -    }
> -
> -  dom.release ();
> -}
> -
> -/* Gather the basic blocks belonging to the SCOP.  */
> -
> -void
> -scop_detection::build_scop_bbs (scop_p scop)
> -{
> -  sbitmap visited = sbitmap_alloc (last_basic_block_for_fn (cfun));
> -  sese_l region = scop->region->region;
> -
> -  bitmap_clear (visited);
> -  build_scop_bbs_1 (scop, visited, region.entry->dest);
> -  sbitmap_free (visited);
> -}
> -
>  /* Returns the number of pbbs that are in loops contained in SCOP.  */
>  
>  int
> @@ -1624,7 +1481,7 @@ scop_detection::nb_pbbs_in_loops (scop_p scop)
>    poly_bb_p pbb;
>    int res = 0;
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      if (loop_in_sese_p (gbb_loop (PBB_BLACK_BOX (pbb)), scop->region->region))
>        res++;
>  
> @@ -1783,28 +1640,57 @@ find_scop_parameters (scop_p scop)
>  
>    /* Find the parameters used in data accesses.  */
>    poly_bb_p pbb;
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      find_params_in_bb (region, PBB_BLACK_BOX (pbb));
>  
>    int nbp = sese_nb_params (region);
>    scop_set_nb_params (scop, nbp);
>  }
>  
> -class sese_dom_walker : public dom_walker
> +/* Generates a polyhedral black box only if the bb contains interesting
> +   information.  */
> +
> +static gimple_poly_bb_p
> +try_generate_gimple_bb (scop_p scop, basic_block bb)
> +{
> +  vec<data_reference_p> drs;
> +  drs.create (5);
> +  sese_l region = scop->region->region;
> +  loop_p nest = outermost_loop_in_sese (region, bb);
> +
> +  loop_p loop = bb->loop_father;
> +  if (!loop_in_sese_p (loop, region))
> +    loop = nest;
> +
> +  gimple_stmt_iterator gsi;
> +  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> +    {
> +      gimple *stmt = gsi_stmt (gsi);
> +      if (is_gimple_debug (stmt))
> +	continue;
> +
> +      graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
> +    }
> +
> +  return new_gimple_poly_bb (bb, drs);
> +}
> +
> +/* Gather BBs and conditions for a SCOP.  */
> +class gather_bbs : public dom_walker
>  {
>  public:
> -  sese_dom_walker (cdi_direction, sese_l);
> +  gather_bbs (cdi_direction, scop_p);
>  
>    virtual void before_dom_children (basic_block);
>    virtual void after_dom_children (basic_block);
>  
>  private:
> -  auto_vec<gimple *, 3> m_conditions, m_cases;
> -  sese_l m_region;
> +  auto_vec<gimple *, 3> conditions, cases;
> +  scop_p scop;
>  };
>  }
> -sese_dom_walker::sese_dom_walker (cdi_direction direction, sese_l region)
> -  : dom_walker (direction), m_region (region)
> +gather_bbs::gather_bbs (cdi_direction direction, scop_p scop)
> +  : dom_walker (direction), scop (scop)
>  {
>  }
>  
> @@ -1812,50 +1698,48 @@ sese_dom_walker::sese_dom_walker (cdi_direction direction, sese_l region)
>     blocks.  */
>  
>  void
> -sese_dom_walker::before_dom_children (basic_block bb)
> +gather_bbs::before_dom_children (basic_block bb)
>  {
> -  gimple_poly_bb_p gbb;
> -  gcond *stmt;
> -
> -  if (!bb_in_sese_p (bb, m_region))
> +  if (!bb_in_sese_p (bb, scop->region->region))
>      return;
>  
> -  stmt = single_pred_cond_non_loop_exit (bb);
> +  gcond *stmt = single_pred_cond_non_loop_exit (bb);
>  
>    if (stmt)
>      {
>        edge e = single_pred_edge (bb);
>  
> -      m_conditions.safe_push (stmt);
> +      conditions.safe_push (stmt);
>  
>        if (e->flags & EDGE_TRUE_VALUE)
> -	m_cases.safe_push (stmt);
> +	cases.safe_push (stmt);
>        else
> -	m_cases.safe_push (NULL);
> +	cases.safe_push (NULL);
>      }
>  
> -  gbb = gbb_from_bb (bb);
> +  scop->region->bbs.safe_push (bb);
>  
> -  if (gbb)
> -    {
> -      GBB_CONDITIONS (gbb) = m_conditions.copy ();
> -      GBB_CONDITION_CASES (gbb) = m_cases.copy ();
> -    }
> +  gimple_poly_bb_p gbb = try_generate_gimple_bb (scop, bb);
> +  GBB_CONDITIONS (gbb) = conditions.copy ();
> +  GBB_CONDITION_CASES (gbb) = cases.copy ();
> +
> +  poly_bb_p pbb = new_poly_bb (scop, gbb);
> +  scop->pbbs.safe_push (pbb);
>  }
>  
>  /* Call-back for dom_walk executed after visiting the dominated
>     blocks.  */
>  
>  void
> -sese_dom_walker::after_dom_children (basic_block bb)
> +gather_bbs::after_dom_children (basic_block bb)
>  {
> -  if (!bb_in_sese_p (bb, m_region))
> +  if (!bb_in_sese_p (bb, scop->region->region))
>      return;
>  
>    if (single_pred_cond_non_loop_exit (bb))
>      {
> -      m_conditions.pop ();
> -      m_cases.pop ();
> +      conditions.pop ();
> +      cases.pop ();
>      }
>  }
>  
> @@ -1881,7 +1765,9 @@ build_scops (vec<scop_p> *scops)
>      {
>        scop_p scop = new_scop (s.entry, s.exit);
>  
> -      sb.build_scop_bbs (scop);
> +      /* Record all basic blocks and their conditions in REGION.  */
> +      gather_bbs (CDI_DOMINATORS, scop).walk (cfun->cfg->x_entry_block_ptr);
> +
>        /* Do not optimize a scop containing only PBBs that do not belong
>  	 to any loops.  */
>        if (sb.nb_pbbs_in_loops (scop) == 0)
> @@ -1892,9 +1778,6 @@ build_scops (vec<scop_p> *scops)
>  	}
>  
>        build_sese_loop_nests (scop->region);
> -      /* Record all conditions in REGION.  */
> -      sese_dom_walker (CDI_DOMINATORS, scop->region->region).walk
> -	(cfun->cfg->x_entry_block_ptr);
>  
>        find_scop_parameters (scop);
>        graphite_dim_t max_dim = PARAM_VALUE (PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS);
> diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
> index c9a2964..261e67d 100644
> --- a/gcc/graphite-sese-to-poly.c
> +++ b/gcc/graphite-sese-to-poly.c
> @@ -329,7 +329,7 @@ build_scop_scattering (scop_p scop)
>  
>    int i;
>    poly_bb_p pbb;
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      {
>        gimple_poly_bb_p gbb = PBB_BLACK_BOX (pbb);
>        int prefix = 0;
> @@ -808,7 +808,7 @@ add_conditions_to_constraints (scop_p scop)
>    int i;
>    poly_bb_p pbb;
>  
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      add_conditions_to_domain (pbb);
>  }
>  
> @@ -904,7 +904,7 @@ build_scop_iteration_domain (scop_p scop)
>  				    isl_set_copy (scop->param_context), doms);
>  
>    poly_bb_p pbb;
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      {
>        loop = pbb_loop (pbb);
>  
> @@ -1138,17 +1138,17 @@ build_scop_drs (scop_p scop)
>  
>    /* Remove all the PBBs that do not have data references: these basic
>       blocks are not handled in the polyhedral representation.  */
> -  for (i = 0; SCOP_BBS (scop).iterate (i, &pbb); i++)
> +  for (i = 0; scop->pbbs.iterate (i, &pbb); i++)
>      if (GBB_DATA_REFS (PBB_BLACK_BOX (pbb)).is_empty ())
>        {
>  	free_gimple_poly_bb (PBB_BLACK_BOX (pbb));
>  	free_poly_bb (pbb);
> -	SCOP_BBS (scop).ordered_remove (i);
> +	scop->pbbs.ordered_remove (i);
>  	i--;
>        }
>  
>    data_reference_p dr;
> -  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
> +  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
>      if (pbb)
>        FOR_EACH_VEC_ELT (GBB_DATA_REFS (PBB_BLACK_BOX (pbb)), j, dr)
>  	scop->drs.safe_push (dr_info (dr, -1, pbb));
> @@ -1248,11 +1248,10 @@ new_pbb_from_pbb (scop_p scop, poly_bb_p pbb, basic_block bb)
>    gimple_poly_bb_p gbb = PBB_BLACK_BOX (pbb);
>    gimple_poly_bb_p gbb1 = new_gimple_poly_bb (bb, drs);
>    poly_bb_p pbb1 = new_poly_bb (scop, gbb1);
> -  int index, n = SCOP_BBS (scop).length ();
> +  int index, n = scop->pbbs.length ();
>  
> -  /* The INDEX of PBB in SCOP_BBS.  */
>    for (index = 0; index < n; index++)
> -    if (SCOP_BBS (scop)[index] == pbb)
> +    if (scop->pbbs[index] == pbb)
>        break;
>  
>    pbb1->domain = isl_set_copy (pbb->domain);
> @@ -1262,7 +1261,7 @@ new_pbb_from_pbb (scop_p scop, poly_bb_p pbb, basic_block bb)
>    GBB_PBB (gbb1) = pbb1;
>    GBB_CONDITIONS (gbb1) = GBB_CONDITIONS (gbb).copy ();
>    GBB_CONDITION_CASES (gbb1) = GBB_CONDITION_CASES (gbb).copy ();
> -  SCOP_BBS (scop).safe_insert (index + 1, pbb1);
> +  scop->pbbs.safe_insert (index + 1, pbb1);
>  }
>  
>  /* Insert on edge E the assignment "RES := EXPR".  */
> diff --git a/gcc/sese.c b/gcc/sese.c
> index 6bb1322..aa19c68 100644
> --- a/gcc/sese.c
> +++ b/gcc/sese.c
> @@ -265,6 +265,7 @@ new_sese_info (edge entry, edge exit)
>    SESE_LOOP_NEST (region).create (3);
>    SESE_PARAMS (region).create (3);
>    region->parameter_rename_map = new parameter_rename_map_t;
> +  region->bbs.create (3);
>  
>    return region;
>  }
> diff --git a/gcc/sese.h b/gcc/sese.h
> index 2cda5e1..d429d58 100644
> --- a/gcc/sese.h
> +++ b/gcc/sese.h
> @@ -78,6 +78,9 @@ typedef struct sese_info_t
>    /* Loops completely contained in this SESE.  */
>    bitmap loops;
>    vec<loop_p> loop_nest;
> +
> +  /* Basic blocks contained in this SESE.  */
> +  vec<basic_block> bbs;
>  } *sese_info_p;
>  
>  #define SESE_PARAMS(S) (S->params)
> -- 
> 2.1.0.243.g30d45f7
>
diff mbox

Patch

diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index 8829cb4..e879429 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -335,7 +335,7 @@  scop_get_dependences (scop_p scop)
   isl_union_map *dependences;
 
   if (!scop->must_raw)
-    compute_deps (scop, SCOP_BBS (scop),
+    compute_deps (scop, scop->pbbs,
 		  &scop->must_raw, &scop->may_raw,
 		  &scop->must_raw_no_source, &scop->may_raw_no_source,
 		  &scop->must_war, &scop->may_war,
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index f4e7edf..2f2e2ba 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -940,7 +940,7 @@  int get_max_schedule_dimensions (scop_p scop)
   poly_bb_p pbb;
   int schedule_dims = 0;
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     {
       int pbb_schedule_dims = isl_map_dim (pbb->transformed, isl_dim_out);
       if (pbb_schedule_dims > schedule_dims)
@@ -987,7 +987,7 @@  generate_isl_schedule (scop_p scop)
   isl_union_map *schedule_isl =
     isl_union_map_empty (isl_set_get_space (scop->param_context));
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     {
       /* Dead code elimination: when the domain of a PBB is empty,
 	 don't generate code for the PBB.  */
diff --git a/gcc/graphite-optimize-isl.c b/gcc/graphite-optimize-isl.c
index 2bae417..090bc01 100644
--- a/gcc/graphite-optimize-isl.c
+++ b/gcc/graphite-optimize-isl.c
@@ -58,7 +58,7 @@  scop_get_domains (scop_p scop ATTRIBUTE_UNUSED)
   isl_space *space = isl_set_get_space (scop->param_context);
   isl_union_set *res = isl_union_set_empty (space);
 
-  FOR_EACH_VEC_ELT (scop->bbs, i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     res = isl_union_set_add_set (res, isl_set_copy (pbb->domain));
 
   return res;
@@ -270,7 +270,7 @@  apply_schedule_map_to_scop (scop_p scop, isl_union_map *schedule_map)
   int i;
   poly_bb_p pbb;
 
-  FOR_EACH_VEC_ELT (scop->bbs, i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     {
       isl_set *domain = isl_set_copy (pbb->domain);
       isl_map *stmt_schedule;
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index 39e7aa4..84ecee0 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -87,7 +87,7 @@  print_iteration_domains (FILE *file, scop_p scop, int verbosity)
   int i;
   poly_bb_p pbb;
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     print_iteration_domain (file, pbb, verbosity);
 }
 
@@ -294,7 +294,7 @@  remove_gbbs_in_scop (scop_p scop)
   int i;
   poly_bb_p pbb;
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     free_gimple_poly_bb (PBB_BLACK_BOX (pbb));
 }
 
@@ -320,7 +320,7 @@  new_scop (edge entry, edge exit)
   scop->must_waw_no_source = NULL;
   scop->may_waw_no_source = NULL;
   scop_set_region (scop, region);
-  SCOP_BBS (scop).create (3);
+  scop->pbbs.create (3);
   POLY_SCOP_P (scop) = false;
   scop->drs.create (3);
 
@@ -338,10 +338,10 @@  free_scop (scop_p scop)
   remove_gbbs_in_scop (scop);
   free_sese_info (SCOP_REGION (scop));
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     free_poly_bb (pbb);
 
-  SCOP_BBS (scop).release ();
+  scop->pbbs.release ();
 
   isl_set_free (scop->param_context);
   isl_union_map_free (scop->must_raw);
@@ -625,9 +625,9 @@  print_scop (FILE *file, scop_p scop, int verbosity)
   if (verbosity > 0)
     fprintf (file, "# Number of statements\n");
 
-  fprintf (file, "%d\n", SCOP_BBS (scop).length ());
+  fprintf (file, "%d\n", scop->pbbs.length ());
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     print_pbb (file, pbb, verbosity);
 
   fprintf (file, "#)\n");
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
index 977f97e..e477439 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -415,7 +415,7 @@  struct scop
   /* All the basic blocks in this scop that contain memory references
      and that will be represented as statements in the polyhedral
      representation.  */
-  vec<poly_bb_p> bbs;
+  vec<poly_bb_p> pbbs;
 
   /* All the data references in this scop.  */
   vec<dr_info> drs;
@@ -451,7 +451,6 @@  struct scop
   bool poly_scop_p;
 };
 
-#define SCOP_BBS(S) (S->bbs)
 #define SCOP_REGION(S) (S->region)
 #define SCOP_CONTEXT(S) (NULL)
 #define POLY_SCOP_P(S) (S->poly_scop_p)
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index 43e03a6..6c0987d 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -113,34 +113,6 @@  same_close_phi_node (gphi *p1, gphi *p2)
 			  gimple_phi_arg_def (p2, 0), 0);
 }
 
-/* Compare the depth of two basic_block's P1 and P2.  */
-
-static int
-compare_bb_depths (const void *p1, const void *p2)
-{
-  const_basic_block const bb1 = *(const_basic_block const *)p1;
-  const_basic_block const bb2 = *(const_basic_block const *)p2;
-  int d1 = loop_depth (bb1->loop_father);
-  int d2 = loop_depth (bb2->loop_father);
-
-  if (d1 < d2)
-    return 1;
-
-  if (d1 > d2)
-    return -1;
-
-  return 0;
-}
-
-/* Sort the basic blocks from DOM such that the first are the ones at
-   a deepest loop level.  */
-
-static void
-graphite_sort_dominated_info (vec<basic_block> dom)
-{
-  dom.qsort (compare_bb_depths);
-}
-
 static void make_close_phi_nodes_unique (basic_block bb);
 
 /* Remove the close phi node at GSI and replace its rhs with the rhs
@@ -509,25 +481,6 @@  public:
 
   static bool can_represent_loop (loop_p loop, sese_l scop);
 
-  /* Generates a polyhedral black box only if the bb contains interesting
-     information.  */
-
-  static gimple_poly_bb_p try_generate_gimple_bb (scop_p scop, basic_block bb);
-
-  /* Returns true if all predecessors of BB, that are not dominated by BB, are
-     marked in MAP.  The predecessors dominated by BB are loop latches and will
-     be handled after BB.  */
-
-  static bool all_non_dominated_preds_marked_p (basic_block bb, sbitmap map);
-
-  /* Recursive helper function for build_scops_bbs.  */
-
-  static void build_scop_bbs_1 (scop_p scop, sbitmap visited, basic_block bb);
-
-  /* Gather the basic blocks belonging to the SCOP.  */
-
-  static void build_scop_bbs (scop_p scop);
-
   /* Returns the number of pbbs that are in loops contained in SCOP.  */
 
   static int nb_pbbs_in_loops (scop_p scop);
@@ -1519,102 +1472,6 @@  scop_detection::loop_body_is_valid_scop (loop_p loop, sese_l scop) const
   return true;
 }
 
-/* Generates a polyhedral black box only if the bb contains interesting
-   information.  */
-
-gimple_poly_bb_p
-scop_detection::try_generate_gimple_bb (scop_p scop, basic_block bb)
-{
-  vec<data_reference_p> drs;
-  drs.create (5);
-  sese_l region = scop->region->region;
-  loop_p nest = outermost_loop_in_sese (region, bb);
-
-  loop_p loop = bb->loop_father;
-  if (!loop_in_sese_p (loop, region))
-    loop = nest;
-
-  gimple_stmt_iterator gsi;
-  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-    {
-      gimple *stmt = gsi_stmt (gsi);
-      if (is_gimple_debug (stmt))
-	continue;
-
-      graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
-    }
-
-  return new_gimple_poly_bb (bb, drs);
-}
-
-/* Returns true if all predecessors of BB, that are not dominated by BB, are
-   marked in MAP.  The predecessors dominated by BB are loop latches and will
-   be handled after BB.  */
-
-bool
-scop_detection::all_non_dominated_preds_marked_p (basic_block bb, sbitmap map)
-{
-  edge e;
-  edge_iterator ei;
-
-  FOR_EACH_EDGE (e, ei, bb->preds)
-    if (!bitmap_bit_p (map, e->src->index)
-	&& !dominated_by_p (CDI_DOMINATORS, e->src, bb))
-      return false;
-
-  return true;
-}
-
-/* Recursive helper function for build_scops_bbs.  */
-
-void
-scop_detection::build_scop_bbs_1 (scop_p scop, sbitmap visited, basic_block bb)
-{
-  if (bitmap_bit_p (visited, bb->index)
-      || !bb_in_sese_p (bb, scop->region->region))
-    return;
-
-  poly_bb_p pbb = new_poly_bb (scop, try_generate_gimple_bb (scop, bb));
-  SCOP_BBS (scop).safe_push (pbb);
-  bitmap_set_bit (visited, bb->index);
-
-  vec<basic_block> dom = get_dominated_by (CDI_DOMINATORS, bb);
-
-  if (!dom.exists ())
-    return;
-
-  graphite_sort_dominated_info (dom);
-
-  while (!dom.is_empty ())
-    {
-      int i;
-      basic_block dom_bb;
-
-      FOR_EACH_VEC_ELT (dom, i, dom_bb)
-	if (all_non_dominated_preds_marked_p (dom_bb, visited))
-	  {
-	    build_scop_bbs_1 (scop, visited, dom_bb);
-	    dom.unordered_remove (i);
-	    break;
-	  }
-    }
-
-  dom.release ();
-}
-
-/* Gather the basic blocks belonging to the SCOP.  */
-
-void
-scop_detection::build_scop_bbs (scop_p scop)
-{
-  sbitmap visited = sbitmap_alloc (last_basic_block_for_fn (cfun));
-  sese_l region = scop->region->region;
-
-  bitmap_clear (visited);
-  build_scop_bbs_1 (scop, visited, region.entry->dest);
-  sbitmap_free (visited);
-}
-
 /* Returns the number of pbbs that are in loops contained in SCOP.  */
 
 int
@@ -1624,7 +1481,7 @@  scop_detection::nb_pbbs_in_loops (scop_p scop)
   poly_bb_p pbb;
   int res = 0;
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     if (loop_in_sese_p (gbb_loop (PBB_BLACK_BOX (pbb)), scop->region->region))
       res++;
 
@@ -1783,28 +1640,57 @@  find_scop_parameters (scop_p scop)
 
   /* Find the parameters used in data accesses.  */
   poly_bb_p pbb;
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     find_params_in_bb (region, PBB_BLACK_BOX (pbb));
 
   int nbp = sese_nb_params (region);
   scop_set_nb_params (scop, nbp);
 }
 
-class sese_dom_walker : public dom_walker
+/* Generates a polyhedral black box only if the bb contains interesting
+   information.  */
+
+static gimple_poly_bb_p
+try_generate_gimple_bb (scop_p scop, basic_block bb)
+{
+  vec<data_reference_p> drs;
+  drs.create (5);
+  sese_l region = scop->region->region;
+  loop_p nest = outermost_loop_in_sese (region, bb);
+
+  loop_p loop = bb->loop_father;
+  if (!loop_in_sese_p (loop, region))
+    loop = nest;
+
+  gimple_stmt_iterator gsi;
+  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+    {
+      gimple *stmt = gsi_stmt (gsi);
+      if (is_gimple_debug (stmt))
+	continue;
+
+      graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
+    }
+
+  return new_gimple_poly_bb (bb, drs);
+}
+
+/* Gather BBs and conditions for a SCOP.  */
+class gather_bbs : public dom_walker
 {
 public:
-  sese_dom_walker (cdi_direction, sese_l);
+  gather_bbs (cdi_direction, scop_p);
 
   virtual void before_dom_children (basic_block);
   virtual void after_dom_children (basic_block);
 
 private:
-  auto_vec<gimple *, 3> m_conditions, m_cases;
-  sese_l m_region;
+  auto_vec<gimple *, 3> conditions, cases;
+  scop_p scop;
 };
 }
-sese_dom_walker::sese_dom_walker (cdi_direction direction, sese_l region)
-  : dom_walker (direction), m_region (region)
+gather_bbs::gather_bbs (cdi_direction direction, scop_p scop)
+  : dom_walker (direction), scop (scop)
 {
 }
 
@@ -1812,50 +1698,48 @@  sese_dom_walker::sese_dom_walker (cdi_direction direction, sese_l region)
    blocks.  */
 
 void
-sese_dom_walker::before_dom_children (basic_block bb)
+gather_bbs::before_dom_children (basic_block bb)
 {
-  gimple_poly_bb_p gbb;
-  gcond *stmt;
-
-  if (!bb_in_sese_p (bb, m_region))
+  if (!bb_in_sese_p (bb, scop->region->region))
     return;
 
-  stmt = single_pred_cond_non_loop_exit (bb);
+  gcond *stmt = single_pred_cond_non_loop_exit (bb);
 
   if (stmt)
     {
       edge e = single_pred_edge (bb);
 
-      m_conditions.safe_push (stmt);
+      conditions.safe_push (stmt);
 
       if (e->flags & EDGE_TRUE_VALUE)
-	m_cases.safe_push (stmt);
+	cases.safe_push (stmt);
       else
-	m_cases.safe_push (NULL);
+	cases.safe_push (NULL);
     }
 
-  gbb = gbb_from_bb (bb);
+  scop->region->bbs.safe_push (bb);
 
-  if (gbb)
-    {
-      GBB_CONDITIONS (gbb) = m_conditions.copy ();
-      GBB_CONDITION_CASES (gbb) = m_cases.copy ();
-    }
+  gimple_poly_bb_p gbb = try_generate_gimple_bb (scop, bb);
+  GBB_CONDITIONS (gbb) = conditions.copy ();
+  GBB_CONDITION_CASES (gbb) = cases.copy ();
+
+  poly_bb_p pbb = new_poly_bb (scop, gbb);
+  scop->pbbs.safe_push (pbb);
 }
 
 /* Call-back for dom_walk executed after visiting the dominated
    blocks.  */
 
 void
-sese_dom_walker::after_dom_children (basic_block bb)
+gather_bbs::after_dom_children (basic_block bb)
 {
-  if (!bb_in_sese_p (bb, m_region))
+  if (!bb_in_sese_p (bb, scop->region->region))
     return;
 
   if (single_pred_cond_non_loop_exit (bb))
     {
-      m_conditions.pop ();
-      m_cases.pop ();
+      conditions.pop ();
+      cases.pop ();
     }
 }
 
@@ -1881,7 +1765,9 @@  build_scops (vec<scop_p> *scops)
     {
       scop_p scop = new_scop (s.entry, s.exit);
 
-      sb.build_scop_bbs (scop);
+      /* Record all basic blocks and their conditions in REGION.  */
+      gather_bbs (CDI_DOMINATORS, scop).walk (cfun->cfg->x_entry_block_ptr);
+
       /* Do not optimize a scop containing only PBBs that do not belong
 	 to any loops.  */
       if (sb.nb_pbbs_in_loops (scop) == 0)
@@ -1892,9 +1778,6 @@  build_scops (vec<scop_p> *scops)
 	}
 
       build_sese_loop_nests (scop->region);
-      /* Record all conditions in REGION.  */
-      sese_dom_walker (CDI_DOMINATORS, scop->region->region).walk
-	(cfun->cfg->x_entry_block_ptr);
 
       find_scop_parameters (scop);
       graphite_dim_t max_dim = PARAM_VALUE (PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS);
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index c9a2964..261e67d 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -329,7 +329,7 @@  build_scop_scattering (scop_p scop)
 
   int i;
   poly_bb_p pbb;
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     {
       gimple_poly_bb_p gbb = PBB_BLACK_BOX (pbb);
       int prefix = 0;
@@ -808,7 +808,7 @@  add_conditions_to_constraints (scop_p scop)
   int i;
   poly_bb_p pbb;
 
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     add_conditions_to_domain (pbb);
 }
 
@@ -904,7 +904,7 @@  build_scop_iteration_domain (scop_p scop)
 				    isl_set_copy (scop->param_context), doms);
 
   poly_bb_p pbb;
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     {
       loop = pbb_loop (pbb);
 
@@ -1138,17 +1138,17 @@  build_scop_drs (scop_p scop)
 
   /* Remove all the PBBs that do not have data references: these basic
      blocks are not handled in the polyhedral representation.  */
-  for (i = 0; SCOP_BBS (scop).iterate (i, &pbb); i++)
+  for (i = 0; scop->pbbs.iterate (i, &pbb); i++)
     if (GBB_DATA_REFS (PBB_BLACK_BOX (pbb)).is_empty ())
       {
 	free_gimple_poly_bb (PBB_BLACK_BOX (pbb));
 	free_poly_bb (pbb);
-	SCOP_BBS (scop).ordered_remove (i);
+	scop->pbbs.ordered_remove (i);
 	i--;
       }
 
   data_reference_p dr;
-  FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
+  FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
     if (pbb)
       FOR_EACH_VEC_ELT (GBB_DATA_REFS (PBB_BLACK_BOX (pbb)), j, dr)
 	scop->drs.safe_push (dr_info (dr, -1, pbb));
@@ -1248,11 +1248,10 @@  new_pbb_from_pbb (scop_p scop, poly_bb_p pbb, basic_block bb)
   gimple_poly_bb_p gbb = PBB_BLACK_BOX (pbb);
   gimple_poly_bb_p gbb1 = new_gimple_poly_bb (bb, drs);
   poly_bb_p pbb1 = new_poly_bb (scop, gbb1);
-  int index, n = SCOP_BBS (scop).length ();
+  int index, n = scop->pbbs.length ();
 
-  /* The INDEX of PBB in SCOP_BBS.  */
   for (index = 0; index < n; index++)
-    if (SCOP_BBS (scop)[index] == pbb)
+    if (scop->pbbs[index] == pbb)
       break;
 
   pbb1->domain = isl_set_copy (pbb->domain);
@@ -1262,7 +1261,7 @@  new_pbb_from_pbb (scop_p scop, poly_bb_p pbb, basic_block bb)
   GBB_PBB (gbb1) = pbb1;
   GBB_CONDITIONS (gbb1) = GBB_CONDITIONS (gbb).copy ();
   GBB_CONDITION_CASES (gbb1) = GBB_CONDITION_CASES (gbb).copy ();
-  SCOP_BBS (scop).safe_insert (index + 1, pbb1);
+  scop->pbbs.safe_insert (index + 1, pbb1);
 }
 
 /* Insert on edge E the assignment "RES := EXPR".  */
diff --git a/gcc/sese.c b/gcc/sese.c
index 6bb1322..aa19c68 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -265,6 +265,7 @@  new_sese_info (edge entry, edge exit)
   SESE_LOOP_NEST (region).create (3);
   SESE_PARAMS (region).create (3);
   region->parameter_rename_map = new parameter_rename_map_t;
+  region->bbs.create (3);
 
   return region;
 }
diff --git a/gcc/sese.h b/gcc/sese.h
index 2cda5e1..d429d58 100644
--- a/gcc/sese.h
+++ b/gcc/sese.h
@@ -78,6 +78,9 @@  typedef struct sese_info_t
   /* Loops completely contained in this SESE.  */
   bitmap loops;
   vec<loop_p> loop_nest;
+
+  /* Basic blocks contained in this SESE.  */
+  vec<basic_block> bbs;
 } *sese_info_p;
 
 #define SESE_PARAMS(S) (S->params)