From 7d24f650fa1886c29e2431c969e5b7e6f8a50836 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 27 Mar 2013 10:38:29 +0000 Subject: [PATCH] re PR tree-optimization/37021 (Fortran Complex reduction / multiplication not vectorized) 2013-03-27 Richard Biener PR tree-optimization/37021 * tree-vect-data-refs.c (vect_check_strided_load): Allow REALPART/IMAGPART_EXPRs around the supported refs. * tree-ssa-structalias.c (find_func_aliases): Assume that floating-point values are not used to transfer pointers. * gfortran.dg/vect/fast-math-pr37021.f90: New testcase. From-SVN: r197158 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ .../gfortran.dg/vect/fast-math-pr37021.f90 | 17 +++++++++++++++++ gcc/tree-ssa-structalias.c | 6 +++++- gcc/tree-vect-data-refs.c | 4 ++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/vect/fast-math-pr37021.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f00cb045ab2..b90cc6738ca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-03-27 Richard Biener + + PR tree-optimization/37021 + * tree-vect-data-refs.c (vect_check_strided_load): Allow + REALPART/IMAGPART_EXPRs around the supported refs. + * tree-ssa-structalias.c (find_func_aliases): Assume that + floating-point values are not used to transfer pointers. + 2013-03-27 Alexander Ivchenko * gcc/target.def (TARGET_HAS_IFUNC_P): New target hook. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5b26dad3f2a..17d588908bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-03-27 Richard Biener + + PR tree-optimization/37021 + * gfortran.dg/vect/fast-math-pr37021.f90: New testcase. + 2013-03-27 Alexander Ivchenko * g++.dg/ipa/ivinline-1.C: Add target nonpic. diff --git a/gcc/testsuite/gfortran.dg/vect/fast-math-pr37021.f90 b/gcc/testsuite/gfortran.dg/vect/fast-math-pr37021.f90 new file mode 100644 index 00000000000..d2eebd43574 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/fast-math-pr37021.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } + +subroutine to_product_of(self,a,b,a1,a2) + complex(kind=8) :: self (:) + complex(kind=8), intent(in) :: a(:,:) + complex(kind=8), intent(in) :: b(:) + integer a1,a2 + self = ZERO + do i = 1,a1 + do j = 1,a2 + self(i) = self(i) + a(i,j)*b(j) + end do + end do +end subroutine + +! { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } +! { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 236b86a9bdd..c588e876b2b 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -4631,7 +4631,11 @@ find_func_aliases (gimple origt) get_constraint_for (lhsop, &lhsc); - if (code == POINTER_PLUS_EXPR) + if (FLOAT_TYPE_P (TREE_TYPE (lhsop))) + /* If the operation produces a floating point result then + assume the value is not produced to transfer a pointer. */ + ; + else if (code == POINTER_PLUS_EXPR) get_constraint_for_ptr_offset (gimple_assign_rhs1 (t), gimple_assign_rhs2 (t), &rhsc); else if (code == BIT_AND_EXPR diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 579f6032280..188581f6246 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -2798,6 +2798,10 @@ vect_check_strided_load (gimple stmt, loop_vec_info loop_vinfo) base = DR_REF (dr); + if (TREE_CODE (base) == REALPART_EXPR + || TREE_CODE (base) == IMAGPART_EXPR) + base = TREE_OPERAND (base, 0); + if (TREE_CODE (base) == ARRAY_REF) { off = TREE_OPERAND (base, 1); -- 2.30.2