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 PR37236, ICE with incomplete alias info


For the PR in question we say that for an incoming no-alias pointer
to an array of one complex var IMAGPART_EXPR<(*a)[1]> cannot touch
the param-no-alias tag.  In general this is incorrect as the pointed-to
type needs not be correct (thus better play safe than be sorry).  Also
we didn't say the same thing for REALPART_EXPR<(*a)[0]> which is
bogus, thus the fixed offset check.

I'll bootstrap and test this on x86_64-unknown-linux-gnu and install it
afterwards.

Richard.

2008-08-29  Richard Guenther  <rguenther@suse.de>

	PR middle-end/37236
	* tree-ssa-structalias.c (intra_create_variable_infos): Mark
	PARAM_NOALIAS tags with is_heapvar.
	* tree-ssa-operands.c (access_can_touch_variable): Offset
	based tests do not apply for heapvars.  Fix offset test.

	* gfortran.fortran-torture/compile/pr37236.f: New testcase.

Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c	(revision 139753)
--- gcc/tree-ssa-structalias.c	(working copy)
*************** intra_create_variable_infos (void)
*** 4551,4556 ****
--- 4551,4557 ----
  	      heapvar_insert (t, heapvar);
  
  	      ann = get_var_ann (heapvar);
+ 	      ann->is_heapvar = 1;
  	      if (flag_argument_noalias == 1)
  		ann->noalias_state = NO_ALIAS;
  	      else if (flag_argument_noalias == 2)
Index: gcc/tree-ssa-operands.c
===================================================================
*** gcc/tree-ssa-operands.c	(revision 139753)
--- gcc/tree-ssa-operands.c	(working copy)
*************** access_can_touch_variable (tree ref, tre
*** 1247,1272 ****
       D.874_2 = (*my_char_ref_1)[1]{lb: 1 sz: 1};
    */
    if (ref 
! 	   && flag_strict_aliasing
! 	   && TREE_CODE (ref) != INDIRECT_REF
! 	   && !MTAG_P (alias)
! 	   && base
! 	   && (TREE_CODE (base) != INDIRECT_REF
! 	       || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
! 	   && (TREE_CODE (base) != INDIRECT_REF
! 	       || TREE_CODE (ref) != ARRAY_REF
! 	       || offset != 0
! 	       || (DECL_SIZE (alias)
! 		   && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
! 		   && size != -1
! 		   && (unsigned HOST_WIDE_INT)size
! 		      != TREE_INT_CST_LOW (DECL_SIZE (alias))))
! 	   && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
! 	   && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
! 	   && !var_ann (alias)->is_heapvar
! 	   /* When the struct has may_alias attached to it, we need not to
! 	      return true.  */
! 	   && get_alias_set (base))
      {
  #ifdef ACCESS_DEBUGGING
        fprintf (stderr, "Access to ");
--- 1247,1272 ----
       D.874_2 = (*my_char_ref_1)[1]{lb: 1 sz: 1};
    */
    if (ref 
!       && flag_strict_aliasing
!       && TREE_CODE (ref) != INDIRECT_REF
!       && !MTAG_P (alias)
!       && base
!       && (TREE_CODE (base) != INDIRECT_REF
! 	  || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
!       && (TREE_CODE (base) != INDIRECT_REF
! 	  || TREE_CODE (ref) != ARRAY_REF
! 	  || offset != 0
! 	  || (DECL_SIZE (alias)
! 	      && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
! 	      && size != -1
! 	      && (unsigned HOST_WIDE_INT)size
! 	      != TREE_INT_CST_LOW (DECL_SIZE (alias))))
!       && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
!       && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
!       && !var_ann (alias)->is_heapvar
!       /* When the struct has may_alias attached to it, we need not to
! 	 return true.  */
!       && get_alias_set (base))
      {
  #ifdef ACCESS_DEBUGGING
        fprintf (stderr, "Access to ");
*************** access_can_touch_variable (tree ref, tre
*** 1285,1295 ****
  	   && flag_strict_aliasing
  	   && TREE_CODE (ref) != INDIRECT_REF
  	   && !MTAG_P (alias)
  	   && !POINTER_TYPE_P (TREE_TYPE (alias))
  	   && offsetgtz
  	   && DECL_SIZE (alias)
  	   && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
! 	   && uoffset > TREE_INT_CST_LOW (DECL_SIZE (alias)))
      {
  #ifdef ACCESS_DEBUGGING
        fprintf (stderr, "Access to ");
--- 1285,1296 ----
  	   && flag_strict_aliasing
  	   && TREE_CODE (ref) != INDIRECT_REF
  	   && !MTAG_P (alias)
+ 	   && !var_ann (alias)->is_heapvar
  	   && !POINTER_TYPE_P (TREE_TYPE (alias))
  	   && offsetgtz
  	   && DECL_SIZE (alias)
  	   && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
! 	   && uoffset >= TREE_INT_CST_LOW (DECL_SIZE (alias)))
      {
  #ifdef ACCESS_DEBUGGING
        fprintf (stderr, "Access to ");
Index: gcc/testsuite/gfortran.fortran-torture/compile/pr37236.f
===================================================================
*** gcc/testsuite/gfortran.fortran-torture/compile/pr37236.f	(revision 0)
--- gcc/testsuite/gfortran.fortran-torture/compile/pr37236.f	(revision 0)
***************
*** 0 ****
--- 1,82 ----
+ C
+       SUBROUTINE FFTRC  (A,N,X,IWK,WK)
+ C                                  SPECIFICATIONS FOR ARGUMENTS
+       INTEGER            N,IWK(1)
+       REAL*8             A(N),WK(1)
+       COMPLEX*16         X(1)
+ C                                  SPECIFICATIONS FOR LOCAL VARIABLES
+       INTEGER            ND2P1,ND2,I,MTWO,M,IMAX,ND4,NP2,K,NMK,J
+       REAL*8             RPI,ZERO,ONE,HALF,THETA,TP,G(2),B(2),Z(2),AI,
+      1                   AR
+       COMPLEX*16         XIMAG,ALPH,BETA,GAM,S1,ZD
+       EQUIVALENCE        (GAM,G(1)),(ALPH,B(1)),(Z(1),AR),(Z(2),AI),
+      1                   (ZD,Z(1))
+       DATA               ZERO/0.0D0/,HALF/0.5D0/,ONE/1.0D0/,IMAX/24/
+       DATA               RPI/3.141592653589793D0/
+ C                                  FIRST EXECUTABLE STATEMENT
+       IF (N .NE. 2) GO TO 5
+ C                                  N EQUAL TO 2
+       ZD = DCMPLX(A(1),A(2))
+       THETA = AR
+       TP = AI
+       X(2) = DCMPLX(THETA-TP,ZERO)
+       X(1) = DCMPLX(THETA+TP,ZERO)
+       GO TO 9005
+     5 CONTINUE
+ C                                  N GREATER THAN 2
+       ND2 = N/2
+       ND2P1 = ND2+1
+ C                                  MOVE A TO X
+       J = 1
+       DO 6 I=1,ND2
+          X(I) = DCMPLX(A(J),A(J+1))
+          J = J+2
+     6 CONTINUE
+ C                                  COMPUTE THE CENTER COEFFICIENT
+       GAM = DCMPLX(ZERO,ZERO)
+       DO 10 I=1,ND2
+          GAM = GAM + X(I)
+    10 CONTINUE
+       TP = G(1)-G(2)
+       GAM = DCMPLX(TP,ZERO)
+ C                                  DETERMINE THE SMALLEST M SUCH THAT
+ C                                  N IS LESS THAN OR EQUAL TO 2**M
+       MTWO = 2
+       M = 1
+       DO 15 I=1,IMAX
+          IF (ND2 .LE. MTWO) GO TO 20
+          MTWO = MTWO+MTWO
+          M = M+1
+    15 CONTINUE
+    20 IF (ND2 .EQ. MTWO) GO TO 25
+ C                                  N IS NOT A POWER OF TWO, CALL FFTCC
+       CALL FFTCC (X,ND2,IWK,WK)
+       GO TO 30
+ C                                  N IS A POWER OF TWO, CALL FFT2C
+    25 CALL FFT2C (X,M,IWK)
+    30 ALPH = X(1)
+       X(1) = B(1) + B(2)
+       ND4 = (ND2+1)/2
+       IF (ND4 .LT. 2) GO TO 40
+       NP2 = ND2 + 2
+       THETA = RPI/ND2
+       TP = THETA
+       XIMAG = DCMPLX(ZERO,ONE)
+ C                                  DECOMPOSE THE COMPLEX VECTOR X
+ C                                  INTO THE COMPONENTS OF THE TRANSFORM
+ C                                  OF THE INPUT DATA.
+       DO 35 K = 2,ND4
+          NMK = NP2 - K
+          S1 = DCONJG(X(NMK))
+          ALPH = X(K) + S1
+          BETA = XIMAG*(S1-X(K))
+          S1 = DCMPLX(DCOS(THETA),DSIN(THETA))
+          X(K) = (ALPH+BETA*S1)*HALF
+          X(NMK) = DCONJG(ALPH-BETA*S1)*HALF
+          THETA = THETA + TP
+    35 CONTINUE
+    40 CONTINUE
+       X(ND2P1) = GAM
+  9005 RETURN
+       END
+ 


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