From cded4e9ed7d9f793d31303def53d999890a0f5a5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 16 Oct 2012 13:19:37 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr54889.f90 | 10 ++++++++++ gcc/tree-vect-stmts.c | 16 +++++++++++----- 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr54889.f90 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 + + 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 * 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 + + PR tree-optimization/54889 + * gfortran.dg/pr54889.f90: New test. + 2012-10-16 Eric Botcazou * 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)); -- 2.7.4