From 9e5b7a23bfd817b665c31f8f4879b1edc31ccbc3 Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 8 Sep 2010 11:17:31 +0000 Subject: [PATCH] 2010-09-08 Richard Guenther 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 | 8 ++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/pr45578.f90 | 53 +++++++++++++++++++++++++++++++++++ gcc/tree-ssa-loop-ivopts.c | 49 ++++++++++++++++++++++++-------- 4 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr45578.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 347e0ae..6da2bc4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2010-09-08 Richard Guenther + 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 + * tree.h (TYPE_ORIG_SIZE_TYPE): Remove. * c-typeck.c (comptypes_internal): Remove TYPE_ORIG_SIZE_TYPE checks. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4a8bc50..1f2cb92 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-09-08 Richard Guenther + PR tree-optimization/45578 + * gfortran.dg/pr45578.f90: New testcase. + +2010-09-08 Richard Guenther + 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 index 0000000..da8863d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr45578.f90 @@ -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 diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index a2abc81..432b3f9 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -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) -- 2.7.4