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>
* 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,
tree access_fn,
tree stmt)
{
tree estimation;
tree estimation = NULL_TREE;
tree array_size, data_size, element_size;
tree init, step;
......@@ -773,11 +773,28 @@ estimate_niter_from_size_of_data (struct loop *loop,
&& TREE_CODE (init) == INTEGER_CST
&& TREE_CODE (step) == INTEGER_CST)
{
estimation = fold_build2 (CEIL_DIV_EXPR, integer_type_node,
fold_build2 (MINUS_EXPR, integer_type_node,
data_size, init), step);
record_estimate (loop, estimation, boolean_true_node, stmt);
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,
fold_build2 (MINUS_EXPR, integer_type_node,
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);
}
}
......
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