This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR45733


This fixes PR45733, we have to assume that target builtins may not
exactly match the types we need.  As we verify return types insert
conversions appropriately here.

Bootstrapped and tested on x86_64-unknown-linxu-gnu, applied.

Richard.

2010-11-04  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/45733
	* tree-vect-stmts.c (reverse_vec_elements): Honor the
	permute builtins function return type.

	* gcc.dg/pr45733.c: New testcase.

Index: gcc/tree-vect-stmts.c
===================================================================
*** gcc/tree-vect-stmts.c	(revision 166304)
--- gcc/tree-vect-stmts.c	(working copy)
*************** reverse_vec_elements (tree x, gimple stm
*** 3742,3749 ****
  
    /* Generate the permute statement.  */
    perm_stmt = gimple_build_call (builtin_decl, 3, x, x, mask_vec);
    data_ref = make_ssa_name (perm_dest, perm_stmt);
!   gimple_call_set_lhs (perm_stmt, data_ref);
    vect_finish_stmt_generation (stmt, perm_stmt, gsi);
  
    return data_ref;
--- 3742,3760 ----
  
    /* 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_set_lhs (perm_stmt, data_ref);
    vect_finish_stmt_generation (stmt, perm_stmt, gsi);
  
    return data_ref;
Index: gcc/testsuite/gcc.dg/pr45733.c
===================================================================
*** gcc/testsuite/gcc.dg/pr45733.c	(revision 0)
--- gcc/testsuite/gcc.dg/pr45733.c	(revision 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;
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]