diff options
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/graphite-scop-detection.c | 3 | ||||
-rw-r--r-- | gcc/graphite-sese-to-poly.c | 7 | ||||
-rw-r--r-- | gcc/sese.c | 96 |
4 files changed, 118 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c3115b17821..d12b7724a3d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,21 @@ 2009-11-18 Alexandre Oliva <aoliva@redhat.com> + 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. + +2009-11-18 Alexandre Oliva <aoliva@redhat.com> + * df-scan.c (df_ref_create): Don't mark BB as dirty on debug insns. (df_ref_remove): Likewise. diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 9fdf6b373e5..596a3341337 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -372,6 +372,9 @@ stmt_simple_for_scop_p (basic_block scop_entry, loop_p outermost_loop, || (gimple_code (stmt) == GIMPLE_ASM)) return false; + if (is_gimple_debug (stmt)) + return true; + if (!stmt_has_simple_data_refs_p (outermost_loop, stmt)) return false; diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 2eb50df2575..2c842a054f6 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -232,6 +232,7 @@ graphite_stmt_p (sese region, basic_block bb, switch (gimple_code (stmt)) { + case GIMPLE_DEBUG: /* Control flow expressions can be ignored, as they are represented in the iteration domains and will be regenerated by graphite. */ @@ -338,7 +339,11 @@ try_generate_gimple_bb (scop_p scop, basic_block bb) gimple_stmt_iterator gsi; for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - graphite_find_data_references_in_stmt (nest, gsi_stmt (gsi), &drs); + { + gimple stmt = gsi_stmt (gsi); + if (!is_gimple_debug (stmt)) + graphite_find_data_references_in_stmt (nest, stmt, &drs); + } if (!graphite_stmt_p (SCOP_REGION (scop), bb, drs)) free_data_refs (drs); 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"); |