aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-19 05:47:08 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-19 05:47:08 +0000
commit71a1642add35018ac03a1269ee18a6d380b2afca (patch)
tree916c6fa73b50df556718ff698b0db743f87c7adc
parent88282f10ef1c8b55a48b320ddea2653a8528e54c (diff)
* df-scan.c (df_insn_rescan_1): Rename back to...var-tracking-assignments-merge-132391-before
(df_insn_rescan): This. Remove wrapper. (df_insn_rescan_debug_internal): New implementation. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/var-tracking-assignments-branch@132411 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.vta6
-rw-r--r--gcc/df-scan.c67
2 files changed, 57 insertions, 16 deletions
diff --git a/gcc/ChangeLog.vta b/gcc/ChangeLog.vta
index e51abb9976a..7ee9f56983a 100644
--- a/gcc/ChangeLog.vta
+++ b/gcc/ChangeLog.vta
@@ -1,5 +1,11 @@
2008-02-19 Alexandre Oliva <aoliva@redhat.com>
+ * df-scan.c (df_insn_rescan_1): Rename back to...
+ (df_insn_rescan): This. Remove wrapper.
+ (df_insn_rescan_debug_internal): New implementation.
+
+2008-02-19 Alexandre Oliva <aoliva@redhat.com>
+
* cfgexpand.c (expand_debug_expr): Avoid VIEW_CONVERT_EXPR
infinite recursion more trivially. Suggested by Eric Botcazou.
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index db826ae5860..ea60fee7650 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -1120,12 +1120,10 @@ df_free_collection_rec (struct df_collection_rec *collection_rec)
pool_free (problem_data->mw_reg_pool, *mw);
}
-/* Rescan INSN. Return TRUE if the rescanning produced any changes.
- If KEEPCLEAN is false, don't mark the basic block as dirty even if
- there have been changes. */
+/* Rescan INSN. Return TRUE if the rescanning produced any changes. */
-static bool
-df_insn_rescan_1 (rtx insn, bool keepclean)
+bool
+df_insn_rescan (rtx insn)
{
unsigned int uid = INSN_UID (insn);
struct df_insn_info *insn_info = NULL;
@@ -1212,8 +1210,7 @@ df_insn_rescan_1 (rtx insn, bool keepclean)
}
df_refs_add_to_chains (&collection_rec, bb, insn);
- if (!keepclean)
- df_set_bb_dirty (bb);
+ df_set_bb_dirty (bb);
safe_free_vec (&collection_rec, def);
safe_free_vec (&collection_rec, use);
@@ -1223,22 +1220,60 @@ df_insn_rescan_1 (rtx insn, bool keepclean)
return true;
}
-/* Rescan INSN. Return TRUE if the rescanning produced any changes. */
-
-bool
-df_insn_rescan (rtx insn)
-{
- return df_insn_rescan_1 (insn, false);
-}
-
/* Same as df_insn_rescan, but don't mark the basic block as
dirty. */
bool
df_insn_rescan_debug_internal (rtx insn)
{
+ unsigned int uid = INSN_UID (insn);
+ struct df_insn_info *insn_info;
+
gcc_assert (DEBUG_INSN_P (insn));
- return df_insn_rescan_1 (insn, true);
+ gcc_assert (VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)));
+
+ if (!df)
+ return false;
+
+ insn_info = DF_INSN_GET (insn);
+ if (!insn_info)
+ return false;
+
+ if (dump_file)
+ fprintf (dump_file, "deleting debug_insn with uid = %d.\n", uid);
+
+ bitmap_clear_bit (df->insns_to_delete, uid);
+ bitmap_clear_bit (df->insns_to_rescan, uid);
+ bitmap_clear_bit (df->insns_to_notes_rescan, uid);
+
+ if (!insn_info->defs)
+ return false;
+
+ if (insn_info->defs == df_null_ref_rec
+ && insn_info->uses == df_null_ref_rec
+ && insn_info->eq_uses == df_null_ref_rec
+ && insn_info->mw_hardregs == df_null_mw_rec)
+ return false;
+
+ df_mw_hardreg_chain_delete (insn_info->mw_hardregs);
+
+ if (df_chain)
+ {
+ df_ref_chain_delete_du_chain (insn_info->defs);
+ df_ref_chain_delete_du_chain (insn_info->uses);
+ df_ref_chain_delete_du_chain (insn_info->eq_uses);
+ }
+
+ df_ref_chain_delete (insn_info->defs);
+ df_ref_chain_delete (insn_info->uses);
+ df_ref_chain_delete (insn_info->eq_uses);
+
+ insn_info->defs = df_null_ref_rec;
+ insn_info->uses = df_null_ref_rec;
+ insn_info->eq_uses = df_null_ref_rec;
+ insn_info->mw_hardregs = df_null_mw_rec;
+
+ return true;
}