[PATCH 3/6] Add FOR_EACH_INSN_INFO_MW
Richard Sandiford
rdsandiford@googlemail.com
Sat Jun 14 19:45:00 GMT 2014
Similar to patch 1, but for df_mw_hardregs. I think the "S" in "MWS"
is a plural, so I went for "mw" in the variable names for single entries.
Richard
gcc/
* df.h (FOR_EACH_INSN_INFO_MW): New macro.
* df-problems.c (df_note_bb_compute): Use it.
* regstat.c (regstat_bb_compute_ri): Likewise.
Index: gcc/df.h
===================================================================
--- gcc/df.h 2014-06-13 22:29:06.691558913 +0100
+++ gcc/df.h 2014-06-13 22:39:44.653179269 +0100
@@ -766,6 +766,10 @@ #define FOR_EACH_INSN_INFO_EQ_USE(ITER,
for (df_ref *ITER##_ = DF_INSN_INFO_EQ_USES (INSN); (ITER = *ITER##_); \
++ITER##_)
+#define FOR_EACH_INSN_INFO_MW(ITER, INSN) \
+ for (df_mw_hardreg **ITER##_ = DF_INSN_INFO_MWS (INSN); (ITER = *ITER##_); \
+ ++ITER##_)
+
#define FOR_EACH_INSN_DEF(ITER, INSN) \
FOR_EACH_INSN_INFO_DEF(ITER, DF_INSN_INFO_GET (INSN))
Index: gcc/df-problems.c
===================================================================
--- gcc/df-problems.c 2014-06-13 22:29:06.690558904 +0100
+++ gcc/df-problems.c 2014-06-13 22:39:32.271064973 +0100
@@ -3114,7 +3114,7 @@ df_note_bb_compute (unsigned int bb_inde
FOR_BB_INSNS_REVERSE (bb, insn)
{
df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
- struct df_mw_hardreg **mws_rec;
+ df_mw_hardreg *mw;
int debug_insn;
if (!INSN_P (insn))
@@ -3137,17 +3137,11 @@ df_note_bb_compute (unsigned int bb_inde
/* We only care about real sets for calls. Clobbers cannot
be depended on to really die. */
- mws_rec = DF_INSN_INFO_MWS (insn_info);
- while (*mws_rec)
- {
- struct df_mw_hardreg *mws = *mws_rec;
- if ((DF_MWS_REG_DEF_P (mws))
- && !df_ignore_stack_reg (mws->start_regno))
- df_set_unused_notes_for_mw (insn,
- mws, live, do_not_gen,
+ FOR_EACH_INSN_INFO_MW (mw, insn_info)
+ if ((DF_MWS_REG_DEF_P (mw))
+ && !df_ignore_stack_reg (mw->start_regno))
+ df_set_unused_notes_for_mw (insn, mw, live, do_not_gen,
artificial_uses, &debug);
- mws_rec++;
- }
/* All of the defs except the return value are some sort of
clobber. This code is for the return. */
@@ -3168,16 +3162,10 @@ df_note_bb_compute (unsigned int bb_inde
else
{
/* Regular insn. */
- mws_rec = DF_INSN_INFO_MWS (insn_info);
- while (*mws_rec)
- {
- struct df_mw_hardreg *mws = *mws_rec;
- if (DF_MWS_REG_DEF_P (mws))
- df_set_unused_notes_for_mw (insn,
- mws, live, do_not_gen,
- artificial_uses, &debug);
- mws_rec++;
- }
+ FOR_EACH_INSN_INFO_MW (mw, insn_info)
+ if (DF_MWS_REG_DEF_P (mw))
+ df_set_unused_notes_for_mw (insn, mw, live, do_not_gen,
+ artificial_uses, &debug);
FOR_EACH_INSN_INFO_DEF (def, insn_info)
{
@@ -3194,25 +3182,19 @@ df_note_bb_compute (unsigned int bb_inde
}
/* Process the uses. */
- mws_rec = DF_INSN_INFO_MWS (insn_info);
- while (*mws_rec)
- {
- struct df_mw_hardreg *mws = *mws_rec;
- if (DF_MWS_REG_USE_P (mws)
- && !df_ignore_stack_reg (mws->start_regno))
- {
- bool really_add_notes = debug_insn != 0;
-
- df_set_dead_notes_for_mw (insn,
- mws, live, do_not_gen,
- artificial_uses,
- &really_add_notes);
-
- if (really_add_notes)
- debug_insn = -1;
- }
- mws_rec++;
- }
+ FOR_EACH_INSN_INFO_MW (mw, insn_info)
+ if (DF_MWS_REG_USE_P (mw)
+ && !df_ignore_stack_reg (mw->start_regno))
+ {
+ bool really_add_notes = debug_insn != 0;
+
+ df_set_dead_notes_for_mw (insn, mw, live, do_not_gen,
+ artificial_uses,
+ &really_add_notes);
+
+ if (really_add_notes)
+ debug_insn = -1;
+ }
FOR_EACH_INSN_INFO_USE (use, insn_info)
{
Index: gcc/regstat.c
===================================================================
--- gcc/regstat.c 2014-06-13 22:29:06.691558913 +0100
+++ gcc/regstat.c 2014-06-13 22:30:12.519134950 +0100
@@ -153,7 +153,7 @@ regstat_bb_compute_ri (unsigned int bb_i
{
struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
bitmap_iterator bi;
- struct df_mw_hardreg **mws_rec;
+ df_mw_hardreg *mw;
rtx link;
if (!NONDEBUG_INSN_P (insn))
@@ -202,29 +202,26 @@ regstat_bb_compute_ri (unsigned int bb_i
/* We only care about real sets for calls. Clobbers cannot
be depended on.
Only do this if the value is totally dead. */
- for (mws_rec = DF_INSN_INFO_MWS (insn_info); *mws_rec; mws_rec++)
- {
- struct df_mw_hardreg *mws = *mws_rec;
- if (DF_MWS_REG_DEF_P (mws))
- {
- bool all_dead = true;
- unsigned int r;
-
- for (r = mws->start_regno; r <= mws->end_regno; r++)
- if (bitmap_bit_p (artificial_uses, r)
- || bitmap_bit_p (live, r))
- {
- all_dead = false;
- break;
- }
-
- if (all_dead)
+ FOR_EACH_INSN_INFO_MW (mw, insn_info)
+ if (DF_MWS_REG_DEF_P (mw))
+ {
+ bool all_dead = true;
+ unsigned int r;
+
+ for (r = mw->start_regno; r <= mw->end_regno; r++)
+ if (bitmap_bit_p (artificial_uses, r)
+ || bitmap_bit_p (live, r))
{
- regno = mws->start_regno;
- REG_LIVE_LENGTH (regno)++;
+ all_dead = false;
+ break;
}
- }
- }
+
+ if (all_dead)
+ {
+ regno = mw->start_regno;
+ REG_LIVE_LENGTH (regno)++;
+ }
+ }
/* All of the defs except the return value are some sort of
clobber. This code is for the return. */
More information about the Gcc-patches
mailing list