| Index: gcc/gcc/dce.c
|
| diff --git a/gcc/gcc/dce.c b/gcc/gcc/dce.c
|
| index f6a10d6197e77a3ab06a022b324ce106d21bbc83..bc2de83b298b92c1bdb0df5377a3d153ae68e690 100644
|
| --- a/gcc/gcc/dce.c
|
| +++ b/gcc/gcc/dce.c
|
| @@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see
|
| #include "regs.h"
|
| #include "hard-reg-set.h"
|
| #include "flags.h"
|
| +#include "except.h"
|
| #include "df.h"
|
| #include "cselib.h"
|
| #include "dce.h"
|
| @@ -35,9 +36,6 @@ along with GCC; see the file COPYING3. If not see
|
| #include "dbgcnt.h"
|
| #include "tm_p.h"
|
|
|
| -DEF_VEC_I(int);
|
| -DEF_VEC_ALLOC_I(int,heap);
|
| -
|
|
|
| /* -------------------------------------------------------------------------
|
| Core mark/delete routines
|
| @@ -81,13 +79,7 @@ deletable_insn_p_1 (rtx body)
|
| return false;
|
|
|
| default:
|
| - if (volatile_refs_p (body))
|
| - return false;
|
| -
|
| - if (flag_non_call_exceptions && may_trap_p (body))
|
| - return false;
|
| -
|
| - return true;
|
| + return !volatile_refs_p (body);
|
| }
|
| }
|
|
|
| @@ -115,13 +107,19 @@ deletable_insn_p (rtx insn, bool fast, bitmap arg_stores)
|
| && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)))
|
| return find_call_stack_args (insn, false, fast, arg_stores);
|
|
|
| + /* Don't delete jumps, notes and the like. */
|
| if (!NONJUMP_INSN_P (insn))
|
| return false;
|
|
|
| + /* Don't delete insns that can throw. */
|
| + if (!insn_nothrow_p (insn))
|
| + return false;
|
| +
|
| body = PATTERN (insn);
|
| switch (GET_CODE (body))
|
| {
|
| case USE:
|
| + case VAR_LOCATION:
|
| return false;
|
|
|
| case CLOBBER:
|
| @@ -352,8 +350,8 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast,
|
| }
|
| for (byte = off; byte < off + INTVAL (MEM_SIZE (mem)); byte++)
|
| {
|
| - gcc_assert (!bitmap_bit_p (sp_bytes, byte - min_sp_off));
|
| - bitmap_set_bit (sp_bytes, byte - min_sp_off);
|
| + if (!bitmap_set_bit (sp_bytes, byte - min_sp_off))
|
| + gcc_unreachable ();
|
| }
|
| }
|
|
|
| @@ -440,9 +438,8 @@ find_call_stack_args (rtx call_insn, bool do_mark, bool fast,
|
| {
|
| if (byte < min_sp_off
|
| || byte >= max_sp_off
|
| - || !bitmap_bit_p (sp_bytes, byte - min_sp_off))
|
| + || !bitmap_clear_bit (sp_bytes, byte - min_sp_off))
|
| break;
|
| - bitmap_clear_bit (sp_bytes, byte - min_sp_off);
|
| }
|
|
|
| if (!deletable_insn_p (insn, fast, NULL))
|
| @@ -625,7 +622,7 @@ mark_artificial_uses (void)
|
|
|
| FOR_ALL_BB (bb)
|
| {
|
| - for (use_rec = df_get_artificial_uses (bb->index);
|
| + for (use_rec = df_get_artificial_uses (bb->index);
|
| *use_rec; use_rec++)
|
| for (defs = DF_REF_CHAIN (*use_rec); defs; defs = defs->next)
|
| if (! DF_REF_IS_ARTIFICIAL (defs->ref))
|
| @@ -642,6 +639,9 @@ mark_reg_dependencies (rtx insn)
|
| struct df_link *defs;
|
| df_ref *use_rec;
|
|
|
| + if (DEBUG_INSN_P (insn))
|
| + return;
|
| +
|
| for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
|
| {
|
| df_ref use = *use_rec;
|
| @@ -738,9 +738,9 @@ struct rtl_opt_pass pass_ud_rtl_dce =
|
| {
|
| {
|
| RTL_PASS,
|
| - "dce", /* name */
|
| - gate_ud_dce, /* gate */
|
| - rest_of_handle_ud_dce, /* execute */
|
| + "ud dce", /* name */
|
| + gate_ud_dce, /* gate */
|
| + rest_of_handle_ud_dce, /* execute */
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| @@ -825,7 +825,7 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au)
|
| mark_insn (insn, true);
|
| goto quickexit;
|
| }
|
| -
|
| +
|
| last = start + len;
|
| while (start < last)
|
| if (bitmap_bit_p (local_live, start++))
|
| @@ -834,9 +834,9 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au)
|
| goto quickexit;
|
| }
|
| }
|
| -
|
| - quickexit:
|
| -
|
| +
|
| + quickexit:
|
| +
|
| /* No matter if the instruction is needed or not, we remove
|
| any regno in the defs from the live set. */
|
| df_byte_lr_simulate_defs (insn, local_live);
|
| @@ -848,12 +848,12 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au)
|
|
|
| if (dump_file)
|
| {
|
| - fprintf (dump_file, "finished processing insn %d live out = ",
|
| + fprintf (dump_file, "finished processing insn %d live out = ",
|
| INSN_UID (insn));
|
| df_print_byte_regset (dump_file, local_live);
|
| }
|
| }
|
| -
|
| +
|
| df_byte_lr_simulate_artificial_refs_at_top (bb, local_live);
|
|
|
| block_changed = !bitmap_equal_p (local_live, DF_BYTE_LR_IN (bb));
|
| @@ -913,10 +913,10 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au)
|
| needed = true;
|
| break;
|
| }
|
| -
|
| +
|
| if (needed)
|
| mark_insn (insn, true);
|
| -
|
| +
|
| /* No matter if the instruction is needed or not, we remove
|
| any regno in the defs from the live set. */
|
| df_simulate_defs (insn, local_live);
|
| @@ -926,7 +926,7 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au)
|
| if (marked_insn_p (insn))
|
| df_simulate_uses (insn, local_live);
|
| }
|
| -
|
| +
|
| df_simulate_finalize_backwards (bb, local_live);
|
|
|
| block_changed = !bitmap_equal_p (local_live, DF_LR_IN (bb));
|
| @@ -986,15 +986,15 @@ fast_dce (bool byte_level)
|
| }
|
|
|
| if (byte_level)
|
| - local_changed
|
| + local_changed
|
| = byte_dce_process_block (bb, bitmap_bit_p (redo_out, index),
|
| bb_has_eh_pred (bb) ? au_eh : au);
|
| else
|
| - local_changed
|
| + local_changed
|
| = dce_process_block (bb, bitmap_bit_p (redo_out, index),
|
| bb_has_eh_pred (bb) ? au_eh : au);
|
| bitmap_set_bit (processed, index);
|
| -
|
| +
|
| if (local_changed)
|
| {
|
| edge e;
|
| @@ -1010,7 +1010,7 @@ fast_dce (bool byte_level)
|
| bitmap_set_bit (redo_out, e->src->index);
|
| }
|
| }
|
| -
|
| +
|
| if (global_changed)
|
| {
|
| /* Turn off the RUN_DCE flag to prevent recursive calls to
|
| @@ -1023,11 +1023,11 @@ fast_dce (bool byte_level)
|
| sbitmap_zero (marked);
|
| bitmap_clear (processed);
|
| bitmap_clear (redo_out);
|
| -
|
| +
|
| /* We do not need to rescan any instructions. We only need
|
| to redo the dataflow equations for the blocks that had a
|
| change at the top of the block. Then we need to redo the
|
| - iteration. */
|
| + iteration. */
|
| if (byte_level)
|
| df_analyze_problem (df_byte_lr, all_blocks, postorder, n_blocks);
|
| else
|
| @@ -1090,9 +1090,9 @@ run_fast_df_dce (void)
|
| /* If dce is able to delete something, it has to happen
|
| immediately. Otherwise there will be problems handling the
|
| eq_notes. */
|
| - enum df_changeable_flags old_flags
|
| - = df_clear_flags (DF_DEFER_INSN_RESCAN + DF_NO_INSN_RESCAN);
|
| -
|
| + int old_flags =
|
| + df_clear_flags (DF_DEFER_INSN_RESCAN + DF_NO_INSN_RESCAN);
|
| +
|
| df_in_progress = true;
|
| rest_of_handle_fast_dce ();
|
| df_in_progress = false;
|
| @@ -1123,7 +1123,7 @@ struct rtl_opt_pass pass_fast_rtl_dce =
|
| {
|
| {
|
| RTL_PASS,
|
| - "dce", /* name */
|
| + "rtl dce", /* name */
|
| gate_fast_dce, /* gate */
|
| rest_of_handle_fast_dce, /* execute */
|
| NULL, /* sub */
|
|
|