aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-10-16 13:19:37 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-10-16 13:19:37 +0200
commitcded4e9ed7d9f793d31303def53d999890a0f5a5 (patch)
treeddeae4a074044091ad624bc53856955eaf820414 /gcc
parentc7fb4c7aaed8a053dd0a6f2bca0c5f54fa34f155 (diff)
downloadgcc-cded4e9ed7d9f793d31303def53d999890a0f5a5.zip
gcc-cded4e9ed7d9f793d31303def53d999890a0f5a5.tar.gz
gcc-cded4e9ed7d9f793d31303def53d999890a0f5a5.tar.bz2
re PR tree-optimization/54889 (Revision 191983 gives compfail for 465.tonto in SPEC CPU 2006 when use -O3 -mavx)
PR tree-optimization/54889 * tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if ARRAY_REF newref doesn't have compatible type with vectype element type, use vectype element type for MEM_REF. * gfortran.dg/pr54889.f90: New test. From-SVN: r192493
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr54889.f9010
-rw-r--r--gcc/tree-vect-stmts.c16
4 files changed, 33 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 52ef532..dfbc611 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-10-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/54889
+ * tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if
+ ARRAY_REF newref doesn't have compatible type with vectype element
+ type, use vectype element type for MEM_REF.
+
2012-10-16 Steven Bosscher <steven@gcc.gnu.org>
* combine.c (record_dead_and_set_regs): Iterate over hard register set
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index adeeb3e..babeba6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-10-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/54889
+ * gfortran.dg/pr54889.f90: New test.
+
2012-10-16 Eric Botcazou <ebotcazou@adacore.com>
* g++.dg/other/dump-ada-spec-2.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr54889.f90 b/gcc/testsuite/gfortran.dg/pr54889.f90
new file mode 100644
index 0000000..68c6bee
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr54889.f90
@@ -0,0 +1,10 @@
+! PR tree-optimization/54889
+! { dg-do compile }
+! { dg-options "-O3" }
+! { dg-additional-options "-mavx" { target { i?86-*-* x86_64-*-* } } }
+
+subroutine foo(x,y,z)
+ logical, pointer :: x(:,:)
+ integer :: y, z
+ x=x(1:y,1:z)
+end subroutine
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index e1b7b7a..70bcebb 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -4743,12 +4743,18 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
tree newref, newoff;
gimple incr;
if (TREE_CODE (ref) == ARRAY_REF)
- newref = build4 (ARRAY_REF, TREE_TYPE (ref),
- unshare_expr (TREE_OPERAND (ref, 0)),
- running_off,
- NULL_TREE, NULL_TREE);
+ {
+ newref = build4 (ARRAY_REF, TREE_TYPE (ref),
+ unshare_expr (TREE_OPERAND (ref, 0)),
+ running_off,
+ NULL_TREE, NULL_TREE);
+ if (!useless_type_conversion_p (TREE_TYPE (vectype),
+ TREE_TYPE (newref)))
+ newref = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (vectype),
+ newref);
+ }
else
- newref = build2 (MEM_REF, TREE_TYPE (ref),
+ newref = build2 (MEM_REF, TREE_TYPE (vectype),
running_off,
TREE_OPERAND (ref, 1));