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 /gcc/tree-affine.c | |
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
Diffstat (limited to 'gcc/tree-affine.c')
-rw-r--r-- | gcc/tree-affine.c | 19 |
1 files changed, 8 insertions, 11 deletions
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)) |