Commit 852c19aa by Sebastian Pop Committed by Sebastian Pop

re PR tree-optimization/23386 (bitmap.c is being miscompiled (VRP))

	PR 23386
 	* tree-data-ref.c (estimate_niter_from_size_of_data): When
 	step is negative compute the estimation from init downwards to
 	zero.

	* testsuite/gcc.dg/tree-ssa/pr23386.c: New.

From-SVN: r103106
parent 309b0e42
2005-08-15 Sebastian Pop <pop@cri.ensmp.fr>
PR 23386
* tree-data-ref.c (estimate_niter_from_size_of_data): When
step is negative compute the estimation from init downwards to zero.
2005-08-14 James A. Morrison <phython@gcc.gnu.org> 2005-08-14 James A. Morrison <phython@gcc.gnu.org>
* fold-const (fold_binary): Call fold_build2 instead of fold (build. * fold-const (fold_binary): Call fold_build2 instead of fold (build.
......
/* { dg-do run } */
/* { dg-options "-O2" } */
int f[100];
int g[100];
unsigned char
f1 (int a, int b)
{
__SIZE_TYPE__ ix;
if (a)
return 1;
for (ix = 4; ix--;)
if (f[ix] != g[ix])
return 0;
return 1;
}
int main(void)
{
if (!f1 (0, 2))
__builtin_abort();
return 0;
}
...@@ -751,7 +751,7 @@ estimate_niter_from_size_of_data (struct loop *loop, ...@@ -751,7 +751,7 @@ estimate_niter_from_size_of_data (struct loop *loop,
tree access_fn, tree access_fn,
tree stmt) tree stmt)
{ {
tree estimation; tree estimation = NULL_TREE;
tree array_size, data_size, element_size; tree array_size, data_size, element_size;
tree init, step; tree init, step;
...@@ -773,10 +773,27 @@ estimate_niter_from_size_of_data (struct loop *loop, ...@@ -773,10 +773,27 @@ estimate_niter_from_size_of_data (struct loop *loop,
&& TREE_CODE (init) == INTEGER_CST && TREE_CODE (init) == INTEGER_CST
&& TREE_CODE (step) == INTEGER_CST) && TREE_CODE (step) == INTEGER_CST)
{ {
tree i_plus_s = fold_build2 (PLUS_EXPR, integer_type_node, init, step);
tree sign = fold_build2 (GT_EXPR, boolean_type_node, i_plus_s, init);
if (sign == boolean_true_node)
estimation = fold_build2 (CEIL_DIV_EXPR, integer_type_node, estimation = fold_build2 (CEIL_DIV_EXPR, integer_type_node,
fold_build2 (MINUS_EXPR, integer_type_node, fold_build2 (MINUS_EXPR, integer_type_node,
data_size, init), step); data_size, init), step);
/* When the step is negative, as in PR23386: (init = 3, step =
0ffffffff, data_size = 100), we have to compute the
estimation as ceil_div (init, 0 - step) + 1. */
else if (sign == boolean_false_node)
estimation =
fold_build2 (PLUS_EXPR, integer_type_node,
fold_build2 (CEIL_DIV_EXPR, integer_type_node,
init,
fold_build2 (MINUS_EXPR, unsigned_type_node,
integer_zero_node, step)),
integer_one_node);
if (estimation)
record_estimate (loop, estimation, boolean_true_node, stmt); record_estimate (loop, estimation, boolean_true_node, stmt);
} }
} }
......
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