Fixing the wrapping issue
Sebastian Pop
sebastian.pop@cri.ensmp.fr
Mon Aug 15 00:40:00 GMT 2005
This patch should solve PR23386. I'm bootstrapping and testing this
on amd64 and i686.
Sebastian
* tree-data-ref.c (estimate_niter_from_size_of_data): When
step is negative compute the estimation from init downwards to
zero.
Index: tree-data-ref.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-data-ref.c,v
retrieving revision 2.37
diff -d -u -p -r2.37 tree-data-ref.c
--- tree-data-ref.c 14 Aug 2005 06:28:03 -0000 2.37
+++ tree-data-ref.c 14 Aug 2005 23:50:37 -0000
@@ -751,7 +751,7 @@ estimate_niter_from_size_of_data (struct
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
&& 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);
+ 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);
- record_estimate (loop, estimation, boolean_true_node, stmt);
+ 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);
}
}
More information about the Gcc-patches
mailing list