re PR tree-optimization/39455 (ICE : in compare_values_warnv, at tree-vrp.c:1073)
PR tree-optimization/39455 * tree-ssa-loop-niter.c (number_of_iterations_lt_to_ne): Fix types mismatches for POINTER_TYPE_P (type). (number_of_iterations_le): Likewise. * gcc.dg/pr39455.c: New test. From-SVN: r144885
This commit is contained in:
parent
83c191e155
commit
97b4ba9f89
4 changed files with 56 additions and 5 deletions
|
@ -1,3 +1,10 @@
|
|||
2009-03-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/39455
|
||||
* tree-ssa-loop-niter.c (number_of_iterations_lt_to_ne): Fix types
|
||||
mismatches for POINTER_TYPE_P (type).
|
||||
(number_of_iterations_le): Likewise.
|
||||
|
||||
2009-03-16 Hariharan Sandanagobalane <hariharan@picochip.com>
|
||||
|
||||
* config/picochip/picochip.c: Removed profiling support.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2009-03-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/39455
|
||||
* gcc.dg/pr39455.c: New test.
|
||||
|
||||
2009-03-13 David Ayers <ayers@fsfe.org>
|
||||
|
||||
* objc/execute/trivial.m. New test.
|
||||
|
|
13
gcc/testsuite/gcc.dg/pr39455.c
Normal file
13
gcc/testsuite/gcc.dg/pr39455.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* PR tree-optimization/39455 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fprefetch-loop-arrays -w" } */
|
||||
|
||||
void
|
||||
foo (char *x, unsigned long y, unsigned char *z)
|
||||
{
|
||||
unsigned int c[256], *d;
|
||||
|
||||
for (d = c + 1; d < c + 256; ++d)
|
||||
*d += d[-1];
|
||||
x[--c[z[y]]] = 0;
|
||||
}
|
|
@ -699,8 +699,10 @@ number_of_iterations_lt_to_ne (tree type, affine_iv *iv0, affine_iv *iv1,
|
|||
iv0->base <= iv1->base + MOD. */
|
||||
if (!iv0->no_overflow && !integer_zerop (mod))
|
||||
{
|
||||
bound = fold_build2 (MINUS_EXPR, type,
|
||||
bound = fold_build2 (MINUS_EXPR, type1,
|
||||
TYPE_MAX_VALUE (type1), tmod);
|
||||
if (POINTER_TYPE_P (type))
|
||||
bound = fold_convert (type, bound);
|
||||
assumption = fold_build2 (LE_EXPR, boolean_type_node,
|
||||
iv1->base, bound);
|
||||
if (integer_zerop (assumption))
|
||||
|
@ -708,6 +710,11 @@ number_of_iterations_lt_to_ne (tree type, affine_iv *iv0, affine_iv *iv1,
|
|||
}
|
||||
if (mpz_cmp (mmod, bnds->below) < 0)
|
||||
noloop = boolean_false_node;
|
||||
else if (POINTER_TYPE_P (type))
|
||||
noloop = fold_build2 (GT_EXPR, boolean_type_node,
|
||||
iv0->base,
|
||||
fold_build2 (POINTER_PLUS_EXPR, type,
|
||||
iv1->base, tmod));
|
||||
else
|
||||
noloop = fold_build2 (GT_EXPR, boolean_type_node,
|
||||
iv0->base,
|
||||
|
@ -723,6 +730,8 @@ number_of_iterations_lt_to_ne (tree type, affine_iv *iv0, affine_iv *iv1,
|
|||
{
|
||||
bound = fold_build2 (PLUS_EXPR, type1,
|
||||
TYPE_MIN_VALUE (type1), tmod);
|
||||
if (POINTER_TYPE_P (type))
|
||||
bound = fold_convert (type, bound);
|
||||
assumption = fold_build2 (GE_EXPR, boolean_type_node,
|
||||
iv0->base, bound);
|
||||
if (integer_zerop (assumption))
|
||||
|
@ -730,6 +739,13 @@ number_of_iterations_lt_to_ne (tree type, affine_iv *iv0, affine_iv *iv1,
|
|||
}
|
||||
if (mpz_cmp (mmod, bnds->below) < 0)
|
||||
noloop = boolean_false_node;
|
||||
else if (POINTER_TYPE_P (type))
|
||||
noloop = fold_build2 (GT_EXPR, boolean_type_node,
|
||||
fold_build2 (POINTER_PLUS_EXPR, type,
|
||||
iv0->base,
|
||||
fold_build1 (NEGATE_EXPR,
|
||||
type1, tmod)),
|
||||
iv1->base);
|
||||
else
|
||||
noloop = fold_build2 (GT_EXPR, boolean_type_node,
|
||||
fold_build2 (MINUS_EXPR, type1,
|
||||
|
@ -1084,10 +1100,10 @@ number_of_iterations_le (tree type, affine_iv *iv0, affine_iv *iv1,
|
|||
{
|
||||
if (integer_nonzerop (iv0->step))
|
||||
assumption = fold_build2 (NE_EXPR, boolean_type_node,
|
||||
iv1->base, TYPE_MAX_VALUE (type1));
|
||||
iv1->base, TYPE_MAX_VALUE (type));
|
||||
else
|
||||
assumption = fold_build2 (NE_EXPR, boolean_type_node,
|
||||
iv0->base, TYPE_MIN_VALUE (type1));
|
||||
iv0->base, TYPE_MIN_VALUE (type));
|
||||
|
||||
if (integer_zerop (assumption))
|
||||
return false;
|
||||
|
@ -1097,8 +1113,18 @@ number_of_iterations_le (tree type, affine_iv *iv0, affine_iv *iv1,
|
|||
}
|
||||
|
||||
if (integer_nonzerop (iv0->step))
|
||||
iv1->base = fold_build2 (PLUS_EXPR, type1,
|
||||
iv1->base, build_int_cst (type1, 1));
|
||||
{
|
||||
if (POINTER_TYPE_P (type))
|
||||
iv1->base = fold_build2 (POINTER_PLUS_EXPR, type, iv1->base,
|
||||
build_int_cst (type1, 1));
|
||||
else
|
||||
iv1->base = fold_build2 (PLUS_EXPR, type1, iv1->base,
|
||||
build_int_cst (type1, 1));
|
||||
}
|
||||
else if (POINTER_TYPE_P (type))
|
||||
iv0->base = fold_build2 (POINTER_PLUS_EXPR, type, iv0->base,
|
||||
fold_build1 (NEGATE_EXPR, type1,
|
||||
build_int_cst (type1, 1)));
|
||||
else
|
||||
iv0->base = fold_build2 (MINUS_EXPR, type1,
|
||||
iv0->base, build_int_cst (type1, 1));
|
||||
|
|
Loading…
Add table
Reference in a new issue