Resolve entry loop condition for the edge remaining in the loop.

There is a known failure for gfortran.dg/vector_subscript_1.f90.  It
was previously failing for all optimization levels except -Os.
Getting the loop header copying right, now makes it fail for all
levels :-).

Tested on x86-64 Linux.

Co-authored-by: Richard Biener <rguenther@suse.de>

gcc/ChangeLog:

	* tree-ssa-loop-ch.c (entry_loop_condition_is_static): Resolve
	statically to the edge remaining in the loop.
This commit is contained in:
Aldy Hernandez 2021-11-11 11:27:07 +01:00
parent a5fed4063f
commit 3e5a190533
1 changed files with 15 additions and 1 deletions

View File

@ -57,10 +57,24 @@ entry_loop_condition_is_static (class loop *l, path_range_query *query)
|| !irange::supports_type_p (TREE_TYPE (gimple_cond_lhs (last))))
return false;
edge true_e, false_e;
extract_true_false_edges_from_block (e->dest, &true_e, &false_e);
/* If neither edge is the exit edge, this is not a case we'd like to
special-case. */
if (!loop_exit_edge_p (l, true_e) && !loop_exit_edge_p (l, false_e))
return false;
tree desired_static_value;
if (loop_exit_edge_p (l, true_e))
desired_static_value = boolean_false_node;
else
desired_static_value = boolean_true_node;
int_range<2> r;
query->compute_ranges (e);
query->range_of_stmt (r, last);
return r == int_range<2> (boolean_true_node, boolean_true_node);
return r == int_range<2> (desired_static_value, desired_static_value);
}
/* Check whether we should duplicate HEADER of LOOP. At most *LIMIT