summaryrefslogtreecommitdiff
path: root/gcc/sese.c
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-18 06:02:26 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-18 06:02:26 +0000
commit3f6c0a4031ae038d4c2c5639b5da936a5a26165e (patch)
tree96d4902248d6b570e56d9410a0539f2289aba6dd /gcc/sese.c
parent890dcf621cea4d25da4a0a7126727c6533c14e95 (diff)
downloadgcc-3f6c0a4031ae038d4c2c5639b5da936a5a26165e.tar.gz
PR debug/41888
PR debug/41886 * graphite-scop-detection.c (stmt_simple_for_scop_p): Debug stmts are ok. * graphite-sese-to-poly.c (graphite_stmt_p): Likewise. (try_generate_gimple_bb): Skip debug stmts when finding data refs. * sese.c (sese_build_liveouts_bb): Skip debug stmts. (sese_bad_liveouts_use): New. (sese_reset_debug_liveouts_bb): New. (sese_build_liveouts): Use it. (rename_variables_in_stmt): Reset debug stmts rather than creating new vars for them. (expand_scalar_variable_stmt): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154279 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sese.c')
-rw-r--r--gcc/sese.c96
1 files changed, 93 insertions, 3 deletions
diff --git a/gcc/sese.c b/gcc/sese.c
index e2c9eb8848f..2c38b24388c 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -235,8 +235,73 @@ sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
- FOR_EACH_SSA_USE_OPERAND (use_p, gsi_stmt (bsi), iter, SSA_OP_ALL_USES)
- sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
+ {
+ gimple stmt = gsi_stmt (bsi);
+
+ if (is_gimple_debug (stmt))
+ continue;
+
+ FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
+ sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
+ }
+}
+
+/* For a USE in BB, return true if BB is outside REGION and it's not
+ in the LIVEOUTS set. */
+
+static bool
+sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
+ tree use)
+{
+ unsigned ver;
+ basic_block def_bb;
+
+ if (TREE_CODE (use) != SSA_NAME)
+ return false;
+
+ ver = SSA_NAME_VERSION (use);
+
+ /* If it's in liveouts, the variable will get a new PHI node, and
+ the debug use will be properly adjusted. */
+ if (bitmap_bit_p (liveouts, ver))
+ return false;
+
+ def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
+
+ if (!def_bb
+ || !bb_in_sese_p (def_bb, region)
+ || bb_in_sese_p (bb, region))
+ return false;
+
+ return true;
+}
+
+/* Reset debug stmts that reference SSA_NAMES defined in REGION that
+ are not marked as liveouts. */
+
+static void
+sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
+{
+ gimple_stmt_iterator bsi;
+ ssa_op_iter iter;
+ use_operand_p use_p;
+
+ for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
+ {
+ gimple stmt = gsi_stmt (bsi);
+
+ if (!is_gimple_debug (stmt))
+ continue;
+
+ FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
+ if (sese_bad_liveouts_use (region, liveouts, bb,
+ USE_FROM_PTR (use_p)))
+ {
+ gimple_debug_bind_reset_value (stmt);
+ update_stmt (stmt);
+ break;
+ }
+ }
}
/* Build the LIVEOUTS of REGION: the set of variables defined inside
@@ -249,6 +314,9 @@ sese_build_liveouts (sese region, bitmap liveouts)
FOR_EACH_BB (bb)
sese_build_liveouts_bb (region, liveouts, bb);
+ if (MAY_HAVE_DEBUG_INSNS)
+ FOR_EACH_BB (bb)
+ sese_reset_debug_liveouts_bb (region, liveouts, bb);
}
/* Builds a new SESE region from edges ENTRY and EXIT. */
@@ -534,7 +602,19 @@ rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_
|| (TREE_CODE (expr) != SSA_NAME
&& is_gimple_reg (use)))
{
- tree var = create_tmp_var (type_use, "var");
+ tree var;
+
+ if (is_gimple_debug (stmt))
+ {
+ if (gimple_debug_bind_p (stmt))
+ gimple_debug_bind_reset_value (stmt);
+ else
+ gcc_unreachable ();
+
+ break;
+ }
+
+ var = create_tmp_var (type_use, "var");
if (type_use != type_expr)
expr = fold_convert (type_use, expr);
@@ -827,6 +907,16 @@ expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
if (use_expr == use)
continue;
+ if (is_gimple_debug (stmt))
+ {
+ if (gimple_debug_bind_p (stmt))
+ gimple_debug_bind_reset_value (stmt);
+ else
+ gcc_unreachable ();
+
+ break;
+ }
+
if (TREE_CODE (use_expr) != SSA_NAME)
{
tree var = create_tmp_var (type, "var");