When niter may be zero, return a COND_EXPR with the may_be_zero condition.
2010-05-28 Sebastian Pop <sebastian.pop@amd.com> * tree-scalar-evolution.c (set_nb_iterations_in_loop): Inlined in the only place it was called from. (number_of_latch_executions): Do not return chrec_dont_know when the may_be_zero is a runtime condition: instead, return a COND_EXPR including the may_be_zero condition. * cfgloop.h (struct loop): Add a note on COND_EXPRs to the comment of nb_iterations. * tree-ssa-loop-ivopts.c (contains_abnormal_ssa_name_p): Handle COND_EXPRs. * gcc.dg/vect/vect-outer-fir-lb.c: Un-XFAIL-ed. From-SVN: r159992
This commit is contained in:
parent
e7cb8957bf
commit
0a74c7586c
6 changed files with 70 additions and 49 deletions
|
@ -1,3 +1,15 @@
|
|||
2010-05-28 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
* tree-scalar-evolution.c (set_nb_iterations_in_loop): Inlined in the
|
||||
only place it was called from.
|
||||
(number_of_latch_executions): Do not return chrec_dont_know when the
|
||||
may_be_zero is a runtime condition: instead, return a COND_EXPR
|
||||
including the may_be_zero condition.
|
||||
* cfgloop.h (struct loop): Add a note on COND_EXPRs to the comment
|
||||
of nb_iterations.
|
||||
* tree-ssa-loop-ivopts.c (contains_abnormal_ssa_name_p): Handle
|
||||
COND_EXPRs.
|
||||
|
||||
2010-05-28 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
* tree-if-conv.c (replace_phi_with_cond_gimple_assign_stmt): Don't
|
||||
|
|
|
@ -134,11 +134,13 @@ struct GTY ((chain_next ("%h.next"))) loop {
|
|||
/* Auxiliary info specific to a pass. */
|
||||
PTR GTY ((skip (""))) aux;
|
||||
|
||||
/* The number of times the latch of the loop is executed.
|
||||
This is an INTEGER_CST or an expression containing symbolic
|
||||
names. Don't access this field directly:
|
||||
number_of_latch_executions computes and caches the computed
|
||||
information in this field. */
|
||||
/* The number of times the latch of the loop is executed. This can be an
|
||||
INTEGER_CST, or a symbolic expression representing the number of
|
||||
iterations like "N - 1", or a COND_EXPR containing the runtime
|
||||
conditions under which the number of iterations is non zero.
|
||||
|
||||
Don't access this field directly: number_of_latch_executions
|
||||
computes and caches the computed information in this field. */
|
||||
tree nb_iterations;
|
||||
|
||||
/* An integer guaranteed to bound the number of iterations of the loop
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-05-28 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
* gcc.dg/vect/vect-outer-fir-lb.c: Un-XFAIL-ed.
|
||||
|
||||
2010-05-28 Mike Stump <mikestump@comcast.net>
|
||||
|
||||
PR objc/44125
|
||||
|
@ -40,7 +44,7 @@
|
|||
* obj-c++.dg/torture/tls/thr-init-2.mm: Ditto.
|
||||
* obj-c++.dg/torture/tls/thr-init-3.mm: Ditto.
|
||||
* obj-c++.dg/torture/trivial.mm: Ditto.
|
||||
|
||||
|
||||
2010-05-27 Jack Howarth <howarth@bromo.med.uc.edu>
|
||||
|
||||
* g++.dg/lto/20100302_0.C: Skip on darwin.
|
||||
|
|
|
@ -10,10 +10,7 @@ float coeff[M];
|
|||
float out[N];
|
||||
float fir_out[N];
|
||||
|
||||
/* Should be vectorized. Fixed misaligment in the inner-loop. */
|
||||
/* Currently not vectorized because the loop-count for the inner-loop
|
||||
has a maybe_zero component. Will be fixed when we incorporate the
|
||||
"cond_expr in rhs" patch. */
|
||||
/* Vectorized. Fixed misaligment in the inner-loop. */
|
||||
__attribute__ ((noinline))
|
||||
void foo (){
|
||||
int i,j,k;
|
||||
|
@ -30,7 +27,7 @@ void foo (){
|
|||
|
||||
do {
|
||||
diff += in[j+i]*coeff[j];
|
||||
j+=4;
|
||||
j+=4;
|
||||
} while (j < M);
|
||||
|
||||
out[i] += diff;
|
||||
|
@ -39,7 +36,7 @@ void foo (){
|
|||
|
||||
}
|
||||
|
||||
/* Vectorized. Changing misalignment in the inner-loop. */
|
||||
/* Vectorized. Changing misalignment in the inner-loop. */
|
||||
__attribute__ ((noinline))
|
||||
void fir (){
|
||||
int i,j,k;
|
||||
|
@ -68,7 +65,7 @@ int main (void)
|
|||
|
||||
foo ();
|
||||
fir ();
|
||||
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
if (out[i] != fir_out[i])
|
||||
abort ();
|
||||
|
@ -77,6 +74,5 @@ int main (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 2 "vect" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail vect_no_align } } } */
|
||||
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 2 "vect" { xfail vect_no_align } } } */
|
||||
/* { dg-final { cleanup-tree-dump "vect" } } */
|
||||
|
|
|
@ -900,23 +900,6 @@ add_to_evolution (unsigned loop_nb, tree chrec_before, enum tree_code code,
|
|||
return res;
|
||||
}
|
||||
|
||||
/* Helper function. */
|
||||
|
||||
static inline tree
|
||||
set_nb_iterations_in_loop (struct loop *loop,
|
||||
tree res)
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
{
|
||||
fprintf (dump_file, " (set_nb_iterations_in_loop = ");
|
||||
print_generic_expr (dump_file, res, 0);
|
||||
fprintf (dump_file, "))\n");
|
||||
}
|
||||
|
||||
loop->nb_iterations = res;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* This section selects the loops that will be good candidates for the
|
||||
|
@ -2685,8 +2668,11 @@ resolve_mixers (struct loop *loop, tree chrec)
|
|||
/* Entry point for the analysis of the number of iterations pass.
|
||||
This function tries to safely approximate the number of iterations
|
||||
the loop will run. When this property is not decidable at compile
|
||||
time, the result is chrec_dont_know. Otherwise the result is
|
||||
a scalar or a symbolic parameter.
|
||||
time, the result is chrec_dont_know. Otherwise the result is a
|
||||
scalar or a symbolic parameter. When the number of iterations may
|
||||
be equal to zero and the property cannot be determined at compile
|
||||
time, the result is a COND_EXPR that represents in a symbolic form
|
||||
the conditions under which the number of iterations is not zero.
|
||||
|
||||
Example of analysis: suppose that the loop has an exit condition:
|
||||
|
||||
|
@ -2705,37 +2691,53 @@ resolve_mixers (struct loop *loop, tree chrec)
|
|||
tree
|
||||
number_of_latch_executions (struct loop *loop)
|
||||
{
|
||||
tree res, type;
|
||||
edge exit;
|
||||
struct tree_niter_desc niter_desc;
|
||||
tree may_be_zero;
|
||||
tree res;
|
||||
|
||||
/* Determine whether the number_of_iterations_in_loop has already
|
||||
/* Determine whether the number of iterations in loop has already
|
||||
been computed. */
|
||||
res = loop->nb_iterations;
|
||||
if (res)
|
||||
return res;
|
||||
res = chrec_dont_know;
|
||||
|
||||
may_be_zero = NULL_TREE;
|
||||
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, "(number_of_iterations_in_loop\n");
|
||||
fprintf (dump_file, "(number_of_iterations_in_loop = \n");
|
||||
|
||||
res = chrec_dont_know;
|
||||
exit = single_exit (loop);
|
||||
if (!exit)
|
||||
goto end;
|
||||
|
||||
if (!number_of_iterations_exit (loop, exit, &niter_desc, false))
|
||||
goto end;
|
||||
if (exit && number_of_iterations_exit (loop, exit, &niter_desc, false))
|
||||
{
|
||||
may_be_zero = niter_desc.may_be_zero;
|
||||
res = niter_desc.niter;
|
||||
}
|
||||
|
||||
type = TREE_TYPE (niter_desc.niter);
|
||||
if (integer_nonzerop (niter_desc.may_be_zero))
|
||||
res = build_int_cst (type, 0);
|
||||
else if (integer_zerop (niter_desc.may_be_zero))
|
||||
res = niter_desc.niter;
|
||||
if (res == chrec_dont_know
|
||||
|| !may_be_zero
|
||||
|| integer_zerop (may_be_zero))
|
||||
;
|
||||
else if (integer_nonzerop (may_be_zero))
|
||||
res = build_int_cst (TREE_TYPE (res), 0);
|
||||
|
||||
else if (COMPARISON_CLASS_P (may_be_zero))
|
||||
res = fold_build3 (COND_EXPR, TREE_TYPE (res), may_be_zero,
|
||||
build_int_cst (TREE_TYPE (res), 0), res);
|
||||
else
|
||||
res = chrec_dont_know;
|
||||
|
||||
end:
|
||||
return set_nb_iterations_in_loop (loop, res);
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
{
|
||||
fprintf (dump_file, " (set_nb_iterations_in_loop = ");
|
||||
print_generic_expr (dump_file, res, 0);
|
||||
fprintf (dump_file, "))\n");
|
||||
}
|
||||
|
||||
loop->nb_iterations = res;
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Returns the number of executions of the exit condition of LOOP,
|
||||
|
|
|
@ -681,6 +681,11 @@ contains_abnormal_ssa_name_p (tree expr)
|
|||
idx_contains_abnormal_ssa_name_p,
|
||||
NULL);
|
||||
|
||||
if (code == COND_EXPR)
|
||||
return contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 0))
|
||||
|| contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 1))
|
||||
|| contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 2));
|
||||
|
||||
switch (codeclass)
|
||||
{
|
||||
case tcc_binary:
|
||||
|
|
Loading…
Add table
Reference in a new issue