tree-vect-generic.c (expand_vector_operations_1): When using vector/ vector optab...
authorUlrich Weigand <uweigand@de.ibm.com>
Mon, 3 Jan 2011 13:25:25 +0000 (13:25 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Mon, 3 Jan 2011 13:25:25 +0000 (13:25 +0000)
* tree-vect-generic.c (expand_vector_operations_1): When using vector/
vector optab to expand vector/scalar shift, update gimple to vector.

From-SVN: r168423

gcc/ChangeLog
gcc/tree-vect-generic.c

index 517704f58bae385ac07a702349ccc13f952d4431..477380f12b0c46dd7c26499dedfbaf2e35332ce5 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-03  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * tree-vect-generic.c (expand_vector_operations_1): When using vector/
+       vector optab to expand vector/scalar shift, update gimple to vector.
+
 2011-01-03  Martin Jambor  <mjambor@suse.cz>
 
        * cgraphunit.c (verify_cgraph_node): Verify there is no direct call to
index 3f582402443dc05fcc22f2f61031bca62906a74a..82fc61518fb72f6e334891d1a1458f6c2e279816 100644 (file)
@@ -520,7 +520,24 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
       /* Try for a vector/scalar shift, and if we don't have one, see if we
          have a vector/vector shift */
       else if (!vector_scalar_shift)
-        op = optab_for_tree_code (code, type, optab_vector);
+       {
+         op = optab_for_tree_code (code, type, optab_vector);
+
+         if (op && (optab_handler (op, TYPE_MODE (type)) 
+                    != CODE_FOR_nothing))
+           {
+             /* Transform vector <op> scalar => vector <op> {x,x,x,x}.  */
+             int n_parts = TYPE_VECTOR_SUBPARTS (type);
+             int part_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (type)), 1);
+             tree part_type = lang_hooks.types.type_for_size (part_size, 1);
+             tree vect_type = build_vector_type (part_type, n_parts);
+
+             rhs2 = fold_convert (part_type, rhs2);
+             rhs2 = build_vector_from_val (vect_type, rhs2);
+             gimple_assign_set_rhs2 (stmt, rhs2);
+             update_stmt (stmt);
+           }
+       }
     }
   else
     op = optab_for_tree_code (code, type, optab_default);