Commit 806f2c1b by Alan Lawrence Committed by Alan Lawrence

Enhance SCEV to follow copies of SSA_NAMEs.

(Fixes missed vectorization of gcc.dg/vect/pr65947-2.c.)

        * tree-scalar-evolution.c (follow_copies_to_constant): New.
        (analyze_initial_condition, analyze_scalar_evolution_1): Call previous.

From-SVN: r232509
parent 70c1e886
2016-01-18 Alan Lawrence <alan.lawrence@arm.com> 2016-01-18 Alan Lawrence <alan.lawrence@arm.com>
* tree-scalar-evolution.c (follow_copies_to_constant): New.
(analyze_initial_condition, analyze_scalar_evolution_1): Call previous.
2016-01-18 Alan Lawrence <alan.lawrence@arm.com>
PR target/63679 PR target/63679
* tree-ssa-scopedtables.c (avail_expr_hash): Hash MEM_REF and ARRAY_REF * tree-ssa-scopedtables.c (avail_expr_hash): Hash MEM_REF and ARRAY_REF
using get_ref_base_and_extent. using get_ref_base_and_extent.
......
...@@ -1522,6 +1522,34 @@ analyze_evolution_in_loop (gphi *loop_phi_node, ...@@ -1522,6 +1522,34 @@ analyze_evolution_in_loop (gphi *loop_phi_node,
return evolution_function; return evolution_function;
} }
/* Looks to see if VAR is a copy of a constant (via straightforward assignments
or degenerate phi's). If so, returns the constant; else, returns VAR. */
static tree
follow_copies_to_constant (tree var)
{
tree res = var;
while (TREE_CODE (res) == SSA_NAME)
{
gimple *def = SSA_NAME_DEF_STMT (res);
if (gphi *phi = dyn_cast <gphi *> (def))
{
if (tree rhs = degenerate_phi_result (phi))
res = rhs;
else
break;
}
else if (gimple_assign_single_p (def))
/* Will exit loop if not an SSA_NAME. */
res = gimple_assign_rhs1 (def);
else
break;
}
if (CONSTANT_CLASS_P (res))
return res;
return var;
}
/* Given a loop-phi-node, return the initial conditions of the /* Given a loop-phi-node, return the initial conditions of the
variable on entry of the loop. When the CCP has propagated variable on entry of the loop. When the CCP has propagated
constants into the loop-phi-node, the initial condition is constants into the loop-phi-node, the initial condition is
...@@ -1574,21 +1602,9 @@ analyze_initial_condition (gphi *loop_phi_node) ...@@ -1574,21 +1602,9 @@ analyze_initial_condition (gphi *loop_phi_node)
if (init_cond == chrec_not_analyzed_yet) if (init_cond == chrec_not_analyzed_yet)
init_cond = chrec_dont_know; init_cond = chrec_dont_know;
/* During early loop unrolling we do not have fully constant propagated IL. /* We may not have fully constant propagated IL. Handle degenerate PHIs here
Handle degenerate PHIs here to not miss important unrollings. */ to not miss important early loop unrollings. */
if (TREE_CODE (init_cond) == SSA_NAME) init_cond = follow_copies_to_constant (init_cond);
{
gimple *def = SSA_NAME_DEF_STMT (init_cond);
if (gphi *phi = dyn_cast <gphi *> (def))
{
tree res = degenerate_phi_result (phi);
if (res != NULL_TREE
/* Only allow invariants here, otherwise we may break
loop-closed SSA form. */
&& is_gimple_min_invariant (res))
init_cond = res;
}
}
if (dump_file && (dump_flags & TDF_SCEV)) if (dump_file && (dump_flags & TDF_SCEV))
{ {
...@@ -1968,8 +1984,8 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res) ...@@ -1968,8 +1984,8 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
if (bb == NULL if (bb == NULL
|| !flow_bb_inside_loop_p (loop, bb)) || !flow_bb_inside_loop_p (loop, bb))
{ {
/* Keep the symbolic form. */ /* Keep symbolic form, but look through obvious copies for constants. */
res = var; res = follow_copies_to_constant (var);
goto set_and_end; goto set_and_end;
} }
......
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