From e412ece4ce3a815d22cb408a2467d4e3b835f9a3 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 25 May 2016 10:57:53 +0000 Subject: [PATCH] re PR tree-optimization/71264 (ICE in convert_move) 2016-05-25 Richard Biener PR tree-optimization/71264 * tree-vect-stmts.c (vect_init_vector): Properly deal with vector type val. * gcc.dg/vect/pr71264.c: New testcase. From-SVN: r236699 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/pr71264.c | 20 ++++++++++++++++++++ gcc/tree-vect-stmts.c | 15 +++++++++++---- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr71264.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cad9dab8cbc..121804eca70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-25 Richard Biener + + PR tree-optimization/71264 + * tree-vect-stmts.c (vect_init_vector): Properly deal with + vector type val. + 2016-05-25 Martin Liska PR tree-optimization/71239 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad5f0b66a79..897f0f03e50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-25 Richard Biener + + PR tree-optimization/71264 + * gcc.dg/vect/pr71264.c: New testcase. + 2016-05-25 Paolo Carlini PR c++/55992 diff --git a/gcc/testsuite/gcc.dg/vect/pr71264.c b/gcc/testsuite/gcc.dg/vect/pr71264.c new file mode 100644 index 00000000000..4f6381e323a --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr71264.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +typedef unsigned char uint8_t; +typedef uint8_t footype __attribute__((vector_size(4))); + +void test(uint8_t *ptr, uint8_t *mask) +{ + footype mv; + __builtin_memcpy(&mv, mask, sizeof(mv)); + for (unsigned i = 0; i < 16; i += 4) + { + footype temp; + __builtin_memcpy(&temp, &ptr[i], sizeof(temp)); + temp ^= mv; + __builtin_memcpy(&ptr[i], &temp, sizeof(temp)); + } +} + +/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */ diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index f11f22e3eb8..d2e16d0b929 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -1256,10 +1256,11 @@ vect_init_vector (gimple *stmt, tree val, tree type, gimple_stmt_iterator *gsi) gimple *init_stmt; tree new_temp; - if (TREE_CODE (type) == VECTOR_TYPE - && TREE_CODE (TREE_TYPE (val)) != VECTOR_TYPE) + /* We abuse this function to push sth to a SSA name with initial 'val'. */ + if (! useless_type_conversion_p (type, TREE_TYPE (val))) { - if (!types_compatible_p (TREE_TYPE (type), TREE_TYPE (val))) + gcc_assert (TREE_CODE (type) == VECTOR_TYPE); + if (! types_compatible_p (TREE_TYPE (type), TREE_TYPE (val))) { /* Scalar boolean value should be transformed into all zeros or all ones value before building a vector. */ @@ -1284,7 +1285,13 @@ vect_init_vector (gimple *stmt, tree val, tree type, gimple_stmt_iterator *gsi) else { new_temp = make_ssa_name (TREE_TYPE (type)); - init_stmt = gimple_build_assign (new_temp, NOP_EXPR, val); + if (! INTEGRAL_TYPE_P (TREE_TYPE (val))) + init_stmt = gimple_build_assign (new_temp, + fold_build1 (VIEW_CONVERT_EXPR, + TREE_TYPE (type), + val)); + else + init_stmt = gimple_build_assign (new_temp, NOP_EXPR, val); vect_init_vector_1 (stmt, init_stmt, gsi); val = new_temp; } -- 2.30.2