summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/compile/pr32417.f9015
-rw-r--r--gcc/tree-affine.c22
4 files changed, 43 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 81a57a8967f..f1ff6307220 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-06-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
+ PR tree-opt/32417
+ * tree-affine.c (aff_combination_add_elt): Handle
+ pointer addition specially.
+
2007-06-28 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Ensure
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a1c05626a4e..9d5b05d0684 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
+ PR tree-opt/32417
+ * gfortran.fortran-torture/compile/pr32417.f90: New test.
+
2007-06-28 Dorit Nuzman <dorit@il.ibm.com>
* gcc.dg/vect/vect-iv-4.c: Test now passes on vect_pack_trunc
diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr32417.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr32417.f90
new file mode 100644
index 00000000000..913ce949829
--- /dev/null
+++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr32417.f90
@@ -0,0 +1,15 @@
+! PR tree-opt/32417
+! this used to crash while running IV-opts
+! aff_combination_add_elt was not ready to handle pointers correctly
+
+SUBROUTINE ONEINTS()
+ COMMON /INFOA / NAT,NUM
+ DIMENSION TINT(NUM*NUM,NAT,3,3,3),TINTM(NUM,NUM,NAT,3,3,3)
+
+ CALL TINTS(IC)
+ DO ID=1,3
+ DO IC=1,NAT
+ TINTM(J,I,IC,IAN,INU,ID) = TINT((I-1)*NUM+J,IC,IAN,INU,ID)
+ ENDDO
+ ENDDO
+END
diff --git a/gcc/tree-affine.c b/gcc/tree-affine.c
index de4cf4ad59f..ec2ad8f1389 100644
--- a/gcc/tree-affine.c
+++ b/gcc/tree-affine.c
@@ -130,6 +130,7 @@ void
aff_combination_add_elt (aff_tree *comb, tree elt, double_int scale)
{
unsigned i;
+ tree type;
scale = double_int_ext_for_comb (scale, comb);
if (double_int_zero_p (scale))
@@ -169,15 +170,26 @@ aff_combination_add_elt (aff_tree *comb, tree elt, double_int scale)
return;
}
+ type = comb->type;
+ if (POINTER_TYPE_P (type))
+ type = sizetype;
+
if (double_int_one_p (scale))
- elt = fold_convert (comb->type, elt);
+ elt = fold_convert (type, elt);
else
- elt = fold_build2 (MULT_EXPR, comb->type,
- fold_convert (comb->type, elt),
- double_int_to_tree (comb->type, scale));
+ elt = fold_build2 (MULT_EXPR, type,
+ fold_convert (type, elt),
+ double_int_to_tree (type, scale));
if (comb->rest)
- comb->rest = fold_build2 (PLUS_EXPR, comb->type, comb->rest, elt);
+ {
+ 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);
+ }
else
comb->rest = elt;
}