#include "dce.h"
#include "vecprim.h"
+/* Note that turning REG_DEAD_DEBUGGING on will cause
+ gcc.c-torture/unsorted/dump-noaddr.c to fail because it prints
+ addresses in the dumps. */
#if 0
#define REG_DEAD_DEBUGGING
#endif
bb_info->out = BITMAP_ALLOC (&problem_data->ru_bitmaps);
}
}
+ df_ru->optional_p = true;
}
NULL, /* Incremental solution verify start. */
NULL, /* Incremental solution verfiy end. */
NULL, /* Dependent problem. */
- TV_DF_RU /* Timing variable. */
+ TV_DF_RU, /* Timing variable. */
+ true /* Reset blocks on dropping out of blocks_to_analyze. */
};
bb_info->out = BITMAP_ALLOC (&problem_data->rd_bitmaps);
}
}
+ df_rd->optional_p = true;
}
NULL, /* Incremental solution verify start. */
NULL, /* Incremental solution verfiy end. */
NULL, /* Dependent problem. */
- TV_DF_RD /* Timing variable. */
+ TV_DF_RD, /* Timing variable. */
+ true /* Reset blocks on dropping out of blocks_to_analyze. */
};
bb_info->ause = NULL;
}
}
+
+ df_lr->optional_p = false;
}
}
}
#endif
+
+ /* If the df_live problem is not defined, such as at -O0 and -O1, we
+ still need to keep the luids up to date. This is normally done
+ in the df_live problem since this problem has a forwards
+ scan. */
+ if (!df_live)
+ df_recompute_luids (bb);
}
df_lr_verify_solution_start,/* Incremental solution verify start. */
df_lr_verify_solution_end, /* Incremental solution verify end. */
NULL, /* Dependent problem. */
- TV_DF_LR /* Timing variable. */
+ TV_DF_LR, /* Timing variable. */
+ false /* Reset blocks on dropping out of blocks_to_analyze. */
};
bb_info->out = BITMAP_ALLOC (NULL);
}
}
+ df_live->optional_p = (optimize <= 1);
}
df_live_verify_solution_start,/* Incremental solution verify start. */
df_live_verify_solution_end, /* Incremental solution verify end. */
&problem_LR, /* Dependent problem. */
- TV_DF_LIVE /* Timing variable. */
+ TV_DF_LIVE, /* Timing variable. */
+ false /* Reset blocks on dropping out of blocks_to_analyze. */
};
}
+/* Set all of the blocks as dirty. This needs to be done if this
+ problem is added after all of the insns have been scanned. */
+
+void
+df_live_set_all_dirty (void)
+{
+ basic_block bb;
+ FOR_ALL_BB (bb)
+ bitmap_set_bit (df_live->out_of_date_transfer_functions,
+ bb->index);
+}
+
+
/* Verify that all of the lr related info is consistent and
correct. */
bb_info->earlyclobber = BITMAP_ALLOC (NULL);
}
}
+ df_urec->optional_p = true;
}
NULL, /* Incremental solution verify start. */
NULL, /* Incremental solution verfiy end. */
&problem_LR, /* Dependent problem. */
- TV_DF_UREC /* Timing variable. */
+ TV_DF_UREC, /* Timing variable. */
+ false /* Reset blocks on dropping out of blocks_to_analyze. */
};
df_chain_remove_problem ();
df_chain->block_pool = create_alloc_pool ("df_chain_block pool",
sizeof (struct df_link), 50);
+ df_chain->optional_p = true;
}
NULL, /* Incremental solution verify start. */
NULL, /* Incremental solution verfiy end. */
&problem_RD, /* Dependent problem. */
- TV_DF_CHAIN /* Timing variable. */
+ TV_DF_CHAIN, /* Timing variable. */
+ false /* Reset blocks on dropping out of blocks_to_analyze. */
};
This pass computes REG_DEAD and REG_UNUSED notes.
----------------------------------------------------------------------------*/
+static void
+df_note_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
+{
+ df_note->optional_p = true;
+}
+
#ifdef REG_DEAD_DEBUGGING
static void
df_print_note (const char *prefix, rtx insn, rtx note)
/* Only do this if the value is totally dead. */
}
else
- for (r=mws->start_regno; r <= mws->end_regno; r++)
+ for (r = mws->start_regno; r <= mws->end_regno; r++)
{
-
- if ((!bitmap_bit_p (live, r))
- && (!bitmap_bit_p (artificial_uses, r)))
+ if (!bitmap_bit_p (live, r)
+ && !bitmap_bit_p (artificial_uses, r))
{
old = df_set_note (REG_UNUSED, insn, old, regno_reg_rtx[r]);
#ifdef REG_DEAD_DEBUGGING
else
{
for (r = mws->start_regno; r <= mws->end_regno; r++)
- {
- if ((!bitmap_bit_p (live, r))
- && (!bitmap_bit_p (artificial_uses, r))
- && (!bitmap_bit_p (do_not_gen, r)))
- {
- old = df_set_note (REG_DEAD, insn, old, regno_reg_rtx[r]);
+ if (!bitmap_bit_p (live, r)
+ && !bitmap_bit_p (artificial_uses, r)
+ && !bitmap_bit_p (do_not_gen, r))
+ {
+ old = df_set_note (REG_DEAD, insn, old, regno_reg_rtx[r]);
#ifdef REG_DEAD_DEBUGGING
- df_print_note ("adding 2: ", insn, REG_NOTES (insn));
+ df_print_note ("adding 2: ", insn, REG_NOTES (insn));
#endif
- }
- }
+ }
}
return old;
}
df_print_regset (dump_file, live);
}
#endif
- /* We only care about real sets for calls. Clobbers only
- may clobbers cannot be depended on. */
+ /* We only care about real sets for calls. Clobbers cannot
+ be depended on to really die. */
mws_rec = DF_INSN_UID_MWS (uid);
while (*mws_rec)
{
= df_create_unused_note (insn, old_unused_notes,
def, live, do_not_gen,
artificial_uses);
+
+ /* However a may or must clobber still needs to kill the
+ reg so that REG_DEAD notes are later placed
+ appropriately. */
+ else
+ bitmap_clear_bit (live, DF_REF_REGNO (def));
}
}
else
{
DF_NOTE, /* Problem id. */
DF_NONE, /* Direction. */
- NULL, /* Allocate the problem specific data. */
+ df_note_alloc, /* Allocate the problem specific data. */
NULL, /* Reset global information. */
NULL, /* Free basic block info. */
df_note_compute, /* Local compute function. */
but it will produce information if built one of uninitialized
register problems (UR, UREC) is also run. */
&problem_LR, /* Dependent problem. */
- TV_DF_NOTE /* Timing variable. */
+ TV_DF_NOTE, /* Timing variable. */
+ false /* Reset blocks on dropping out of blocks_to_analyze. */
};