diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.fortran-torture/compile/pr32417.f90 | 15 | ||||
-rw-r--r-- | gcc/tree-affine.c | 22 |
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; } |