re PR tree-optimization/32527 (ICE in build2_stat, at tree.c:3074)

2007-07-30  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/32527
        * tree-affine.h (aff_tree): The type of rest is sizetype for types
        of pointers.
        * tree-affine.c (aff_combination_scale): If type is a pointer type,
        use sizetype for rest.
        (aff_combination_add_elt): Likewise. Don't specialize pointer types.
        (aff_combination_convert): Don't convert rest for pointer types.

From-SVN: r127058
This commit is contained in:
Andrew Pinski 2007-07-30 09:28:14 +00:00 committed by Andrew Pinski
parent cef44ee25f
commit 5c24ddaf36
3 changed files with 20 additions and 12 deletions

View File

@ -1,3 +1,13 @@
2007-07-30 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR tree-opt/32527
* tree-affine.h (aff_tree): The type of rest is sizetype for types
of pointers.
* tree-affine.c (aff_combination_scale): If type is a pointer type,
use sizetype for rest.
(aff_combination_add_elt): Likewise. Don't specialize pointer types.
(aff_combination_convert): Don't convert rest for pointer types.
2007-07-28 Daniel Berlin <dberlin@dberlin.org>
* Makefile.in (tree-ssa-alias.o): Add alloc-pool.h

View File

@ -110,6 +110,9 @@ aff_combination_scale (aff_tree *comb, double_int scale)
if (comb->rest)
{
tree type = comb->type;
if (POINTER_TYPE_P (type))
type = sizetype;
if (comb->n < MAX_AFF_ELTS)
{
comb->elts[comb->n].coef = scale;
@ -118,8 +121,8 @@ aff_combination_scale (aff_tree *comb, double_int scale)
comb->n++;
}
else
comb->rest = fold_build2 (MULT_EXPR, comb->type, comb->rest,
double_int_to_tree (comb->type, scale));
comb->rest = fold_build2 (MULT_EXPR, type, comb->rest,
double_int_to_tree (type, scale));
}
}
@ -181,14 +184,8 @@ aff_combination_add_elt (aff_tree *comb, tree elt, double_int scale)
double_int_to_tree (type, scale));
if (comb->rest)
{
if (POINTER_TYPE_P (comb->type))
comb->rest = fold_build2 (POINTER_PLUS_EXPR, comb->type,
comb->rest, elt);
else
comb->rest = fold_build2 (PLUS_EXPR, comb->type, comb->rest,
elt);
}
comb->rest = fold_build2 (PLUS_EXPR, type, comb->rest,
elt);
else
comb->rest = elt;
}
@ -231,7 +228,7 @@ aff_combination_convert (aff_tree *comb, tree type)
}
comb->type = type;
if (comb->rest)
if (comb->rest && !POINTER_TYPE_P (type))
comb->rest = fold_convert (type, comb->rest);
if (TYPE_PRECISION (type) == TYPE_PRECISION (comb_type))

View File

@ -53,7 +53,8 @@ typedef struct affine_tree_combination
struct aff_comb_elt elts[MAX_AFF_ELTS];
/* Remainder of the expression. Usually NULL, used only if there are more
than MAX_AFF_ELTS elements. Type of REST must be TYPE. */
than MAX_AFF_ELTS elements. Type of REST will be either sizetype for
TYPE of POINTER_TYPEs or TYPE. */
tree rest;
} aff_tree;