2010-09-08 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Sep 2010 11:17:31 +0000 (11:17 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Sep 2010 11:17:31 +0000 (11:17 +0000)
PR tree-optimization/45578
* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr):
Be more careful when transfering alignment information to
the new induction variable.
(copy_ref_info): Likewise.

* gfortran.dg/pr45578.f90: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163997 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr45578.f90 [new file with mode: 0644]
gcc/tree-ssa-loop-ivopts.c

index 347e0ae..6da2bc4 100644 (file)
@@ -1,5 +1,13 @@
 2010-09-08  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/45578
+       * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr):
+       Be more careful when transfering alignment information to
+       the new induction variable.
+       (copy_ref_info): Likewise.
+
+2010-09-08  Richard Guenther  <rguenther@suse.de>
+
        * tree.h (TYPE_ORIG_SIZE_TYPE): Remove.
        * c-typeck.c (comptypes_internal): Remove TYPE_ORIG_SIZE_TYPE
        checks.
index 4a8bc50..1f2cb92 100644 (file)
@@ -1,5 +1,10 @@
 2010-09-08  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/45578
+       * gfortran.dg/pr45578.f90: New testcase.
+
+2010-09-08  Richard Guenther  <rguenther@suse.de>
+
        PR testsuite/45590
        * gcc.dg/graphite/pr44391.c: Remove -m32 option.
 
diff --git a/gcc/testsuite/gfortran.dg/pr45578.f90 b/gcc/testsuite/gfortran.dg/pr45578.f90
new file mode 100644 (file)
index 0000000..da8863d
--- /dev/null
@@ -0,0 +1,53 @@
+! { dg-do run }
+!*==CENTCM.spg  processed by SPAG 6.55Dc at 09:26 on 23 Sep 2005
+      SUBROUTINE CENTCM
+      IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+      PARAMETER (NM=16384)
+      PARAMETER (NG=100)
+      PARAMETER (NH=100)
+      PARAMETER (MU=20)
+      PARAMETER (NL=1)
+      PARAMETER (LL=10*NM)
+      PARAMETER (KP=2001,KR=2001,KG=2001)
+      COMMON /LCS   / X0(3,-2:NM) , X(3,-2:NM,5) , XIN(3,-2:NM)
+      COMMON /MOLEC / LPBc(3) , MOLsp , MOLsa , NBX , NBY , NBZ , NPLa ,&
+     &                LPBcsm
+      cm1 = 0.D0
+      cm2 = 0.D0
+      cm3 = 0.D0
+      DO i = 1 , MOLsa
+         cm1 = cm1 + X0(1,i)
+         cm2 = cm2 + X0(2,i)
+         cm3 = cm3 + X0(3,i)
+      ENDDO
+      cm1 = cm1/MOLsa
+      cm2 = cm2/MOLsa
+      cm3 = cm3/MOLsa
+      IF ( (cm1.EQ.0.D0) .AND. (cm2.EQ.0.D0) .AND. (cm3.EQ.0.D0) )      &
+     &     RETURN
+      DO i = 1 , MOLsa
+        X0(1,i) = X0(1,i) - cm1
+        X0(2,i) = X0(2,i) - cm2
+        X0(3,i) = X0(3,i) - cm3
+        XIN(1,i) = XIN(1,i) - cm1
+        XIN(2,i) = XIN(2,i) - cm2
+        XIN(3,i) = XIN(3,i) - cm3
+      ENDDO
+      CONTINUE
+      END
+      PROGRAM test
+      IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+      PARAMETER (NM=16384)
+      PARAMETER (NG=100)
+      PARAMETER (NH=100)
+      PARAMETER (MU=20)
+      PARAMETER (NL=1)
+      PARAMETER (LL=10*NM)
+      PARAMETER (KP=2001,KR=2001,KG=2001)
+      COMMON /LCS   / X0(3,-2:NM) , X(3,-2:NM,5) , XIN(3,-2:NM)
+      COMMON /MOLEC / LPBc(3) , MOLsp , MOLsa , NBX , NBY , NBZ , NPLa ,&
+     &                LPBcsm
+      MOLsa = 10
+      X0 = 1.
+      CALL CENTCM
+      END
index a2abc81..432b3f9 100644 (file)
@@ -5863,7 +5863,16 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
       comp = force_gimple_operand_gsi (&bsi, comp, true, NULL_TREE,
                                       true, GSI_SAME_STMT);
       if (POINTER_TYPE_P (TREE_TYPE (tgt)))
-       duplicate_ssa_name_ptr_info (comp, SSA_NAME_PTR_INFO (tgt));
+       {
+         duplicate_ssa_name_ptr_info (comp, SSA_NAME_PTR_INFO (tgt));
+         /* As this isn't a plain copy we have to reset alignment
+            information.  */
+         if (SSA_NAME_PTR_INFO (comp))
+           {
+             SSA_NAME_PTR_INFO (comp)->align = BITS_PER_UNIT;
+             SSA_NAME_PTR_INFO (comp)->misalign = 0;
+           }
+       }
     }
 
   if (gimple_code (use->stmt) == GIMPLE_PHI)
@@ -5891,26 +5900,44 @@ copy_ref_info (tree new_ref, tree old_ref)
   TREE_SIDE_EFFECTS (new_ref) = TREE_SIDE_EFFECTS (old_ref);
   TREE_THIS_VOLATILE (new_ref) = TREE_THIS_VOLATILE (old_ref);
 
-  if (TREE_CODE (new_ref) == TARGET_MEM_REF)
-    new_ptr_base = TMR_BASE (new_ref);
-  else if (TREE_CODE (new_ref) == MEM_REF)
-    new_ptr_base = TREE_OPERAND (new_ref, 0);
+  new_ptr_base = TREE_OPERAND (new_ref, 0);
 
   /* We can transfer points-to information from an old pointer
      or decl base to the new one.  */
   if (new_ptr_base
       && TREE_CODE (new_ptr_base) == SSA_NAME
-      && POINTER_TYPE_P (TREE_TYPE (new_ptr_base))
       && !SSA_NAME_PTR_INFO (new_ptr_base))
     {
       tree base = get_base_address (old_ref);
       if (!base)
        ;
-      else if ((INDIRECT_REF_P (base)
-               || TREE_CODE (base) == MEM_REF)
-              && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
-       duplicate_ssa_name_ptr_info
-         (new_ptr_base, SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)));
+      else if ((TREE_CODE (base) == MEM_REF
+               || TREE_CODE (base) == TARGET_MEM_REF)
+              && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
+              && SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)))
+       {
+         struct ptr_info_def *new_pi;
+         duplicate_ssa_name_ptr_info
+           (new_ptr_base, SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)));
+         new_pi = SSA_NAME_PTR_INFO (new_ptr_base);
+         /* We have to be careful about transfering alignment information.  */
+         if (TREE_CODE (old_ref) == MEM_REF
+             && !(TREE_CODE (new_ref) == TARGET_MEM_REF
+                  && (TMR_INDEX2 (new_ref)
+                      || (TMR_STEP (new_ref)
+                          && (TREE_INT_CST_LOW (TMR_STEP (new_ref))
+                              < new_pi->align)))))
+           {
+             new_pi->misalign += double_int_sub (mem_ref_offset (old_ref),
+                                                 mem_ref_offset (new_ref)).low;
+             new_pi->misalign &= (new_pi->align - 1);
+           }
+         else
+           {
+             new_pi->align = BITS_PER_UNIT;
+             new_pi->misalign = 0;
+           }
+       }
       else if (TREE_CODE (base) == VAR_DECL
               || TREE_CODE (base) == PARM_DECL
               || TREE_CODE (base) == RESULT_DECL)