From c12e2a5fcbca7f11586b1a1734f00ce7bbdeb8c8 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Wed, 9 Jun 2010 22:09:35 +0000 Subject: [PATCH] Do not gather loop exit conditions on the basic blocks outside the loop. 2010-06-09 Sebastian Pop * graphite-sese-to-poly.c (single_pred_cond): Renamed single_pred_cond_non_loop_exit. Return NULL for loop exit edges. (build_sese_conditions_before): Renamed call to single_pred_cond. (build_sese_conditions_after): Same. From-SVN: r160509 --- gcc/ChangeLog | 7 +++++++ gcc/graphite-sese-to-poly.c | 19 +++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dddb0d6967d..111d1e57a5e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-06-09 Sebastian Pop + + * graphite-sese-to-poly.c (single_pred_cond): Renamed + single_pred_cond_non_loop_exit. Return NULL for loop exit edges. + (build_sese_conditions_before): Renamed call to single_pred_cond. + (build_sese_conditions_after): Same. + 2010-06-09 Sebastian Pop * graphite-poly.h: Fix comments and indentation. diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 617c57b8f17..b73517d2b40 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -1379,21 +1379,28 @@ struct bsc sese region; }; -/* Returns non NULL when BB has a single predecessor and the last - statement of that predecessor is a COND_EXPR. */ +/* Returns a COND_EXPR statement when BB has a single predecessor, the + edge between BB and its predecessor is not a loop exit edge, and + the last statement of the single predecessor is a COND_EXPR. */ static gimple -single_pred_cond (basic_block bb) +single_pred_cond_non_loop_exit (basic_block bb) { if (single_pred_p (bb)) { edge e = single_pred_edge (bb); basic_block pred = e->src; - gimple stmt = last_stmt (pred); + gimple stmt; + + if (loop_depth (pred->loop_father) > loop_depth (bb->loop_father)) + return NULL; + + stmt = last_stmt (pred); if (stmt && gimple_code (stmt) == GIMPLE_COND) return stmt; } + return NULL; } @@ -1413,7 +1420,7 @@ build_sese_conditions_before (struct dom_walk_data *dw_data, if (!bb_in_sese_p (bb, data->region)) return; - stmt = single_pred_cond (bb); + stmt = single_pred_cond_non_loop_exit (bb); if (stmt) { @@ -1450,7 +1457,7 @@ build_sese_conditions_after (struct dom_walk_data *dw_data, if (!bb_in_sese_p (bb, data->region)) return; - if (single_pred_cond (bb)) + if (single_pred_cond_non_loop_exit (bb)) { VEC_pop (gimple, *conditions); VEC_pop (gimple, *cases); -- 2.30.2