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 PRs 33816, 32921 (again, different)


This "fixes" PR33816 by making get_alias_set not remember alias sets
it gives out for incomplete types.  And by returning alias set zero
(or the alias set for the element type in case of arrays) for incomplete
types.

This way we should not run into the layout_type () path that forces
the alias set back to zero.  Verified by an assert.

Bootstrap & testing in progress.

I would appreciate someone more familiar with GCCs history to have a look
at those PRs and review this patch.  It might be that Fortran actually
_using_ these "incomplete" array types is the real bug here.

Ok for mainline if this one finally works out?

Thanks,
Richard.

2007-10-19  Richard Guenther  <rguenther@suse.de>

	PR middle-end/33816
	PR middle-end/32921
	* stor-layout.c (layout_type): Assert that aggregates do not
	have their alias sets set.
	* alias.c (get_alias_set): Return alias set zero for incomplete
	types, return the alias set of the element for incomplete array
	types, but do not remember these.

	* gfortran.dg/pr32921.f: New testcase.

Index: stor-layout.c
===================================================================
*** stor-layout.c	(revision 129486)
--- stor-layout.c	(working copy)
*************** layout_type (tree type)
*** 1891,1898 ****
       This is too conservative, but we cannot call record_component_aliases
       here because some frontends still change the aggregates after
       layout_type.  */
!   if (AGGREGATE_TYPE_P (type) && TYPE_ALIAS_SET_KNOWN_P (type))
!     TYPE_ALIAS_SET (type) = 0;
  }
  
  /* Create and return a type for signed integers of PRECISION bits.  */
--- 1891,1898 ----
       This is too conservative, but we cannot call record_component_aliases
       here because some frontends still change the aggregates after
       layout_type.  */
!   if (AGGREGATE_TYPE_P (type))
!     gcc_assert (!TYPE_ALIAS_SET_KNOWN_P (type));
  }
  
  /* Create and return a type for signed integers of PRECISION bits.  */
Index: alias.c
===================================================================
*** alias.c	(revision 129486)
--- alias.c	(working copy)
*************** get_alias_set (tree t)
*** 611,616 ****
--- 611,628 ----
    if (TYPE_ALIAS_SET_KNOWN_P (t))
      return TYPE_ALIAS_SET (t);
  
+   /* We don't want to set TYPE_ALIAS_SET for incomplete types.  */
+   if (!COMPLETE_TYPE_P (t))
+     {
+       /* For arrays with unknown size the conservative answer is the
+ 	 alias set of the element type.  */
+       if (TREE_CODE (t) == ARRAY_TYPE)
+ 	return get_alias_set (TREE_TYPE (t));
+ 
+       /* But return zero as a conservative answer for incomplete types.  */
+       return 0;
+     }
+ 
    /* See if the language has special handling for this type.  */
    set = lang_hooks.get_alias_set (t);
    if (set != -1)
Index: testsuite/gfortran.dg/pr32921.f
===================================================================
*** testsuite/gfortran.dg/pr32921.f	(revision 0)
--- testsuite/gfortran.dg/pr32921.f	(revision 0)
***************
*** 0 ****
--- 1,49 ----
+ ! { dg-do compile }
+ ! { dg-options "-O2 -fdump-tree-lim" }
+ ! gfortran -c -m32 -O2 -S junk.f
+ !
+       MODULE LES3D_DATA
+ 
+       IMPLICIT REAL*8 (A-H,O-Z)
+ 
+       PARAMETER ( NSPECI = 1, ND = 7 + NSPECI )
+ 
+       INTEGER IMAX
+ 
+       DOUBLE PRECISION,ALLOCATABLE,DIMENSION(:,:,:) ::
+      >         UAV,QAV
+ 
+ 
+       END MODULE LES3D_DATA
+ !---------------------------------------------------------------------
+ !------------------------------------------------------------------------
+       SUBROUTINE FLUXI()
+ 
+       USE LES3D_DATA
+       IMPLICIT REAL*8(A-H,O-Z)
+ 
+       ALLOCATABLE QS(:)
+ 
+       ALLOCATE( QS(0:IMAX))
+       QS=0D0
+ 
+       RETURN
+       END
+ !------------------------------------------------------------------------
+ !------------------------------------------------------------------------
+       SUBROUTINE EXTRAPI()
+ 
+       USE LES3D_DATA
+       IMPLICIT REAL*8(A-H,O-Z)
+ 
+       I1 = 0
+       I2 = IMAX - 1
+ 
+             DO I = I1, I2
+                UAV(I,1,2) = QAV(I,1,2)
+             END DO
+ 
+       RETURN
+       END
+ ! { dg-final { scan-tree-dump-times "stride" 6 "lim" } }
+ ! { dg-final { cleanup-tree-dump "lim" } }


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