This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR42781
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 18 Jan 2010 10:53:10 +0100 (CET)
- Subject: [PATCH] Fix PR42781
This fixes an ICE in the alias-oracle caused by not properly
computing and remembering the points-to set when restrict
pointers are involved.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2010-01-17 Richard Guenther <rguenther@suse.de>
PR tree-optimization/42781
* tree-ssa-structalias.c (find_what_var_points_to): Skip
restrict processing only if the original variable was
artificial.
* gfortran.fortran-torture/compile/pr42781.f90: New testcase.
Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c (revision 155981)
--- gcc/tree-ssa-structalias.c (working copy)
*************** set_uids_in_ptset (bitmap into, bitmap f
*** 4776,4793 ****
/* Compute the points-to solution *PT for the variable VI. */
static void
! find_what_var_points_to (varinfo_t vi, struct pt_solution *pt)
{
unsigned int i;
bitmap_iterator bi;
bitmap finished_solution;
bitmap result;
memset (pt, 0, sizeof (struct pt_solution));
/* This variable may have been collapsed, let's get the real
variable. */
! vi = get_varinfo (find (vi->id));
/* Translate artificial variables into SSA_NAME_PTR_INFO
attributes. */
--- 4776,4794 ----
/* Compute the points-to solution *PT for the variable VI. */
static void
! find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt)
{
unsigned int i;
bitmap_iterator bi;
bitmap finished_solution;
bitmap result;
+ varinfo_t vi;
memset (pt, 0, sizeof (struct pt_solution));
/* This variable may have been collapsed, let's get the real
variable. */
! vi = get_varinfo (find (orig_vi->id));
/* Translate artificial variables into SSA_NAME_PTR_INFO
attributes. */
*************** find_what_var_points_to (varinfo_t vi, s
*** 4822,4828 ****
/* Instead of doing extra work, simply do not create
elaborate points-to information for pt_anything pointers. */
if (pt->anything
! && (vi->is_artificial_var
|| !pt->vars_contains_restrict))
return;
--- 4823,4829 ----
/* Instead of doing extra work, simply do not create
elaborate points-to information for pt_anything pointers. */
if (pt->anything
! && (orig_vi->is_artificial_var
|| !pt->vars_contains_restrict))
return;
Index: gcc/testsuite/gfortran.fortran-torture/compile/pr42781.f90
===================================================================
*** gcc/testsuite/gfortran.fortran-torture/compile/pr42781.f90 (revision 0)
--- gcc/testsuite/gfortran.fortran-torture/compile/pr42781.f90 (revision 0)
***************
*** 0 ****
--- 1,59 ----
+ ! ICE with gfortran 4.5 at -O1:
+ !gfcbug98.f90: In function ‘convert_cof’:
+ !gfcbug98.f90:36:0: internal compiler error: in pt_solutions_same_restrict_base,
+ !at tree-ssa-structalias.c:5072
+ module foo
+ implicit none
+ type t_time
+ integer :: secs = 0
+ end type t_time
+ contains
+ elemental function time_cyyyymmddhh (cyyyymmddhh) result (time)
+ type (t_time) :: time
+ character(len=10),intent(in) :: cyyyymmddhh
+ end function time_cyyyymmddhh
+
+ function nf90_open(path, mode, ncid)
+ character(len = *), intent(in) :: path
+ integer, intent(in) :: mode
+ integer, intent(out) :: ncid
+ integer :: nf90_open
+ end function nf90_open
+ end module foo
+ !==============================================================================
+ module gfcbug98
+ use foo
+ implicit none
+
+ type t_fileinfo
+ character(len=10) :: atime = ' '
+ end type t_fileinfo
+
+ type t_body
+ real :: bg(10)
+ end type t_body
+ contains
+ subroutine convert_cof (ifile)
+ character(len=*) ,intent(in) :: ifile
+
+ character(len=5) :: version
+ type(t_fileinfo) :: gattr
+ type(t_time) :: atime
+ type(t_body),allocatable :: tmp_dat(:)
+ real ,allocatable :: BDA(:, :, :)
+
+ call open_input
+ call convert_data
+ contains
+ subroutine open_input
+ integer :: i,j
+ version = ''
+ j = nf90_open(ifile, 1, i)
+ end subroutine open_input
+ !--------------------------------------------------------------------------
+ subroutine convert_data
+ BDA(1,:,1) = tmp_dat(1)% bg(:)
+ atime = time_cyyyymmddhh (gattr% atime)
+ end subroutine convert_data
+ end subroutine convert_cof
+ end module gfcbug98