From: Richard Guenther Date: Thu, 4 Nov 2010 12:42:57 +0000 (+0000) Subject: re PR tree-optimization/45733 (ICE: verify_stmts failed: invalid conversion in gimple... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2a2651b797f11a4dbe0fb9d9e75a7ca672f934de;p=gcc.git re PR tree-optimization/45733 (ICE: verify_stmts failed: invalid conversion in gimple call with -fstrict-overflow -ftree-vectorize) 2010-11-04 Richard Guenther PR tree-optimization/45733 * tree-vect-stmts.c (reverse_vec_elements): Honor the permute builtins function return type. * gcc.dg/pr45733.c: New testcase. From-SVN: r166308 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 213846d78d9..a2e1cc88391 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-04 Richard Guenther + + PR tree-optimization/45733 + * tree-vect-stmts.c (reverse_vec_elements): Honor the + permute builtins function return type. + 2010-10-04 Joern Rennecke PR middle-end/44765 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66fb730c891..d4bfc69ea3c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-04 Richard Guenther + + PR tree-optimization/45733 + * gcc.dg/pr45733.c: New testcase. + 2010-11-04 Ira Rosen PR tree-optimization/46213 diff --git a/gcc/testsuite/gcc.dg/pr45733.c b/gcc/testsuite/gcc.dg/pr45733.c new file mode 100644 index 00000000000..5c83cd42ca5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr45733.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-overflow -ftree-vectorize" } */ + +typedef __INTPTR_TYPE__ intptr_t; + +intptr_t +foo (void **p, int i) +{ + intptr_t x = 0; + while (i--) + x ^= (intptr_t) p[i]; + return x; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 2dbc0353421..3d18dfe95c1 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -3742,8 +3742,19 @@ reverse_vec_elements (tree x, gimple stmt, gimple_stmt_iterator *gsi) /* Generate the permute statement. */ perm_stmt = gimple_build_call (builtin_decl, 3, x, x, mask_vec); + if (!useless_type_conversion_p (vectype, + TREE_TYPE (TREE_TYPE (builtin_decl)))) + { + tree tem = create_tmp_reg (TREE_TYPE (TREE_TYPE (builtin_decl)), NULL); + tem = make_ssa_name (tem, perm_stmt); + gimple_call_set_lhs (perm_stmt, tem); + vect_finish_stmt_generation (stmt, perm_stmt, gsi); + perm_stmt = gimple_build_assign (NULL_TREE, + build1 (VIEW_CONVERT_EXPR, + vectype, tem)); + } data_ref = make_ssa_name (perm_dest, perm_stmt); - gimple_call_set_lhs (perm_stmt, data_ref); + gimple_set_lhs (perm_stmt, data_ref); vect_finish_stmt_generation (stmt, perm_stmt, gsi); return data_ref;