&& (loc->expr == expr
|| operand_equal_p (loc->expr, expr, 0)))
{
- /* If the assertion NAME COMP_CODE VAL has already been
- registered at a basic block that dominates DEST_BB, then
- we don't need to insert the same assertion again. Note
- that we don't check strict dominance here to avoid
- replicating the same assertion inside the same basic
- block more than once (e.g., when a pointer is
- dereferenced several times inside a block).
-
- An exception to this rule are edge insertions. If the
- new assertion is to be inserted on edge E, then it will
- dominate all the other insertions that we may want to
- insert in DEST_BB. So, if we are doing an edge
- insertion, don't do this dominance check. */
- if (e == NULL
- && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
- return;
-
- /* Otherwise, if E is not a critical edge and DEST_BB
+ /* If E is not a critical edge and DEST_BB
dominates the existing location for the assertion, move
the assertion up in the dominance tree by updating its
location information. */
{
gimple_stmt_iterator si;
gimple last;
- gimple phi;
bool need_assert;
need_assert = false;
/* Traverse all the statements in BB marking used names and looking
for statements that may infer assertions for their used operands. */
- for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
+ for (si = gsi_last_bb (bb); !gsi_end_p (si); gsi_prev (&si))
{
gimple stmt;
tree op;
tree value;
enum tree_code comp_code;
- /* Mark OP in our live bitmap. */
- SET_BIT (live, SSA_NAME_VERSION (op));
+ /* If op is not live beyond this stmt, do not bother to insert
+ asserts for it. */
+ if (!TEST_BIT (live, SSA_NAME_VERSION (op)))
+ continue;
/* If OP is used in such a way that we can infer a value
range for it, and we don't find a previous assertion for
}
}
- /* If OP is used only once, namely in this STMT, don't
- bother creating an ASSERT_EXPR for it. Such an
- ASSERT_EXPR would do nothing but increase compile time. */
- if (!has_single_use (op))
- {
- register_new_assert_for (op, op, comp_code, value,
- bb, NULL, si);
- need_assert = true;
- }
+ register_new_assert_for (op, op, comp_code, value, bb, NULL, si);
+ need_assert = true;
}
}
+
+ /* Update live. */
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
+ SET_BIT (live, SSA_NAME_VERSION (op));
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
+ RESET_BIT (live, SSA_NAME_VERSION (op));
}
- /* Traverse all PHI nodes in BB marking used operands. */
+ /* Traverse all PHI nodes in BB, updating live. */
for (si = gsi_start_phis (bb); !gsi_end_p(si); gsi_next (&si))
{
use_operand_p arg_p;
ssa_op_iter i;
- phi = gsi_stmt (si);
+ gimple phi = gsi_stmt (si);
+ tree res = gimple_phi_result (phi);
+
+ if (virtual_operand_p (res))
+ continue;
FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
{
if (TREE_CODE (arg) == SSA_NAME)
SET_BIT (live, SSA_NAME_VERSION (arg));
}
+
+ RESET_BIT (live, SSA_NAME_VERSION (res));
}
return need_assert;