This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]