diff options
author | Andrew Pinski <andrew_pinski@playstation.sony.com> | 2007-07-30 09:28:14 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2007-07-30 02:28:14 -0700 |
commit | 5c24ddaf36be1236f276269d356257d59ff860b3 (patch) | |
tree | 2bc849178633a1d10806791d26cd3af88a6bcfa0 | |
parent | cef44ee25f2609eaa6104a6d4be11b08380bd57e (diff) | |
download | gcc-5c24ddaf36be1236f276269d356257d59ff860b3.zip gcc-5c24ddaf36be1236f276269d356257d59ff860b3.tar.gz gcc-5c24ddaf36be1236f276269d356257d59ff860b3.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/tree-affine.c | 19 | ||||
-rw-r--r-- | gcc/tree-affine.h | 3 |
3 files changed, 20 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 715e423..73cc1e4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/tree-affine.c b/gcc/tree-affine.c index 972d442..7528188 100644 --- a/gcc/tree-affine.c +++ b/gcc/tree-affine.c @@ -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)) diff --git a/gcc/tree-affine.h b/gcc/tree-affine.h index 9bcfa5e..5da34be 100644 --- a/gcc/tree-affine.h +++ b/gcc/tree-affine.h @@ -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; |