/* Post reload partially redundant load elimination
- Copyright (C) 2004, 2005, 2006, 2007, 2008
+ Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "toplev.h"
+#include "diagnostic-core.h"
#include "rtl.h"
#include "tree.h"
#include "regs.h"
#include "hard-reg-set.h"
#include "flags.h"
-#include "real.h"
#include "insn-config.h"
#include "recog.h"
#include "basic-block.h"
const struct expr *const exp1 = (const struct expr *) exp1p;
const struct expr *const exp2 = (const struct expr *) exp2p;
int equiv_p = exp_equiv_p (exp1->expr, exp2->expr, 0, true);
-
+
gcc_assert (!equiv_p || exp1->hash == exp2->hash);
return equiv_p;
}
slot = (struct expr **) htab_find_slot_with_hash (expr_table, cur_expr,
hash, INSERT);
-
+
if (! (*slot))
/* The expression isn't found, so insert it. */
*slot = cur_expr;
/* Search for another occurrence in the same basic block. */
avail_occr = cur_expr->avail_occr;
- while (avail_occr && BLOCK_NUM (avail_occr->insn) != BLOCK_NUM (insn))
+ while (avail_occr
+ && BLOCK_FOR_INSN (avail_occr->insn) != BLOCK_FOR_INSN (insn))
{
/* If an occurrence isn't found, save a pointer to the end of
the list. */
if (! MEM_P (dest))
return;
- if (true_dependence (dest, GET_MODE (dest), mem_op,
- rtx_addr_varies_p))
+ if (true_dependence (dest, GET_MODE (dest), mem_op))
mems_conflict_p = 1;
}
\f
if ((pred->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (pred))
return false;
+ if ((pred->flags & EDGE_ABNORMAL_CALL) && cfun->has_nonlocal_label)
+ return false;
+
if (JUMP_TABLE_DATA_P (BB_END (pred->src)))
return false;
}
avail_insn = a_occr->insn;
avail_reg = get_avail_load_store_reg (avail_insn);
gcc_assert (avail_reg);
-
+
/* Make sure we can generate a move from register avail_reg to
dest. */
extract_insn (gen_move_insn (copy_rtx (dest),
if (/* No load can be replaced by copy. */
npred_ok == 0
- /* Prevent exploding the code. */
+ /* Prevent exploding the code. */
|| (optimize_bb_for_size_p (bb) && npred_ok > 1)
- /* If we don't have profile information we cannot tell if splitting
+ /* If we don't have profile information we cannot tell if splitting
a critical edge is profitable or not so don't do it. */
|| ((! profile_info || ! flag_branch_probabilities
|| targetm.cannot_modify_jumps_p ())
discover additional redundancies, so mark it for later deletion. */
for (a_occr = get_bb_avail_insn (bb, expr->avail_occr);
a_occr && (a_occr->insn != insn);
- a_occr = get_bb_avail_insn (bb, a_occr->next));
+ a_occr = get_bb_avail_insn (bb, a_occr->next))
+ ;
if (!a_occr)
{
/* Are the operands unchanged since the start of the
block? */
&& oprs_unchanged_p (src, insn, false)
- && !(flag_non_call_exceptions && may_trap_p (src))
+ && !(cfun->can_throw_non_call_exceptions && may_trap_p (src))
&& !side_effects_p (src)
/* Is the expression recorded? */
&& (expr = lookup_expr_in_table (src)) != NULL)
fprintf (dump_file, "insns deleted: %d\n", stats.insns_deleted);
fprintf (dump_file, "\n\n");
}
+
+ statistics_counter_event (cfun, "copies inserted",
+ stats.copies_inserted);
+ statistics_counter_event (cfun, "moves inserted",
+ stats.moves_inserted);
+ statistics_counter_event (cfun, "insns deleted",
+ stats.insns_deleted);
}
-
+
/* We are finished with alias. */
end_alias_analysis ();
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- TODO_dump_func | TODO_verify_rtl_sharing
+ TODO_verify_rtl_sharing
| TODO_verify_flow | TODO_ggc_collect /* todo_flags_finish */
}
};
-