Commit 334b4842 by Jeff Law Committed by Jeff Law

[PATCH] Remove unnecessary invalidation support in threading

2015-10-29  Jeff Law  <law@redhat.com>

	* tree-ssa-scopedtables.h (const_and_copies): Remove invalidate
	method.
	* tree-ssa-scopedtables.h (const_and_copies::invalidate): Remove.
	* tree-ssa-threadedge.c
	(record_temporary_equivalences_from_stmts_at_dest): Remove
	backedge_seen argument and associated code which invalidated
	equivalences based on the value of that argument.
	(thread_through_normal_block): Corresponding changes.

From-SVN: r229559
parent 5a978b9f
2015-10-29 Jeff Law <law@redhat.com>
* tree-ssa-scopedtables.h (const_and_copies): Remove invalidate
method.
* tree-ssa-scopedtables.h (const_and_copies::invalidate): Remove.
* tree-ssa-threadedge.c
(record_temporary_equivalences_from_stmts_at_dest): Remove
backedge_seen argument and associated code which invalidated
equivalences based on the value of that argument.
(thread_through_normal_block): Corresponding changes.
2015-10-29 Segher Boessenkool <segher@kernel.crashing.org>
* config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Move this
......@@ -669,45 +669,6 @@ const_and_copies::record_const_or_copy (tree x, tree y, tree prev_x)
m_stack.quick_push (x);
}
/* A new value has been assigned to LHS. If necessary, invalidate any
equivalences that are no longer valid. This includes invaliding
LHS and any objects that are currently equivalent to LHS.
Finding the objects that are currently marked as equivalent to LHS
is a bit tricky. We could walk the ssa names and see if any have
SSA_NAME_VALUE that is the same as LHS. That's expensive.
However, it's far more efficient to look at the unwinding stack as
that will have all context sensitive equivalences which are the only
ones that we really have to worry about here. */
void
const_and_copies::invalidate (tree lhs)
{
/* The stack is an unwinding stack. If the current element is NULL
then it's a "stop unwinding" marker. Else the current marker is
the SSA_NAME with an equivalence and the prior entry in the stack
is what the current element is equivalent to. */
for (int i = m_stack.length() - 1; i >= 0; i--)
{
/* Ignore the stop unwinding markers. */
if ((m_stack)[i] == NULL)
continue;
/* We want to check the current value of stack[i] to see if
it matches LHS. If so, then invalidate. */
if (SSA_NAME_VALUE ((m_stack)[i]) == lhs)
record_const_or_copy ((m_stack)[i], NULL_TREE);
/* Remember, we're dealing with two elements in this case. */
i--;
}
/* And invalidate any known value for LHS itself. */
if (SSA_NAME_VALUE (lhs))
record_const_or_copy (lhs, NULL_TREE);
}
bool
expr_elt_hasher::equal (const value_type &p1, const compare_type &p2)
{
......
......@@ -168,12 +168,6 @@ class const_and_copies
value for the first argument. Try to get rid of this in the future. */
void record_const_or_copy (tree, tree, tree);
/* When threading we need to invalidate certain equivalences after
following a loop backedge. The entries we need to invalidate will
always be in this unwindable stack. This entry point handles
finding and invalidating those entries. */
void invalidate (tree);
private:
vec<tree> m_stack;
const_and_copies& operator= (const const_and_copies&);
......
......@@ -215,8 +215,7 @@ static gimple *
record_temporary_equivalences_from_stmts_at_dest (edge e,
const_and_copies *const_and_copies,
avail_exprs_stack *avail_exprs_stack,
pfn_simplify simplify,
bool backedge_seen)
pfn_simplify simplify)
{
gimple *stmt = NULL;
gimple_stmt_iterator gsi;
......@@ -268,22 +267,7 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
&& (gimple_code (stmt) != GIMPLE_CALL
|| gimple_call_lhs (stmt) == NULL_TREE
|| TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME))
{
/* STMT might still have DEFS and we need to invalidate any known
equivalences for them.
Consider if STMT is a GIMPLE_ASM with one or more outputs that
feeds a conditional inside a loop. We might derive an equivalence
due to the conditional. */
tree op;
ssa_op_iter iter;
if (backedge_seen)
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
const_and_copies->invalidate (op);
continue;
}
continue;
/* The result of __builtin_object_size depends on all the arguments
of a phi node. Temporarily using only one edge produces invalid
......@@ -316,14 +300,7 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
if (fndecl
&& (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_OBJECT_SIZE
|| DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P))
{
if (backedge_seen)
{
tree lhs = gimple_get_lhs (stmt);
const_and_copies->invalidate (lhs);
}
continue;
}
continue;
}
/* At this point we have a statement which assigns an RHS to an
......@@ -389,19 +366,12 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
}
/* Record the context sensitive equivalence if we were able
to simplify this statement.
If we have traversed a backedge at some point during threading,
then always enter something here. Either a real equivalence,
or a NULL_TREE equivalence which is effectively invalidation of
prior equivalences. */
to simplify this statement. */
if (cached_lhs
&& (TREE_CODE (cached_lhs) == SSA_NAME
|| is_gimple_min_invariant (cached_lhs)))
const_and_copies->record_const_or_copy (gimple_get_lhs (stmt),
cached_lhs);
else if (backedge_seen)
const_and_copies->invalidate (gimple_get_lhs (stmt));
}
return stmt;
}
......@@ -925,8 +895,7 @@ thread_through_normal_block (edge e,
gimple *stmt
= record_temporary_equivalences_from_stmts_at_dest (e, const_and_copies,
avail_exprs_stack,
simplify,
*backedge_seen_p);
simplify);
/* There's two reasons STMT might be null, and distinguishing
between them is important.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment