aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-09-08 11:17:31 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-09-08 11:17:31 +0000
commitb5c878a5159f7d60f0c451b25888bcb2af4025e5 (patch)
treed55011734cc9ed57533d95ea89e04d8136321642 /gcc
parent88a2722e1fd941a7d02575a6663641d0739939a5 (diff)
downloadgcc-b5c878a5159f7d60f0c451b25888bcb2af4025e5.zip
gcc-b5c878a5159f7d60f0c451b25888bcb2af4025e5.tar.gz
gcc-b5c878a5159f7d60f0c451b25888bcb2af4025e5.tar.bz2
re PR tree-optimization/45578 (The polyhedron test mdbx is miscompiled with -O2 -ftree-vectorize at revision 163915)
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. * gfortran.dg/pr45578.f90: New testcase. From-SVN: r163997
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr45578.f9053
-rw-r--r--gcc/tree-ssa-loop-ivopts.c49
4 files changed, 104 insertions, 11 deletions
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 <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.
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 <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
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)