Fix permute handling when vectorising scatters
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 9 Jan 2018 14:30:27 +0000 (14:30 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 9 Jan 2018 14:30:27 +0000 (14:30 +0000)
As mentioned in https://gcc.gnu.org/ml/gcc-patches/2017-11/msg01575.html ,
the scatter handling in vectorizable_store seems to be dead code at the
moment.  Enabling it with the vect_analyze_data_ref_access part of
that patch triggered an ICE in the avx512f-scatter-*.c tests (which
previously didn't use scatters).  The problem was that the NARROW
and WIDEN handling uses permute_vec_elements to marshal the inputs,
and permute_vec_elements expected the lhs of the stmt to be an SSA_NAME,
which of course it isn't for stores.

This patch makes permute_vec_elements create a fresh variable in this case.

2018-01-09  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* tree-vect-stmts.c (permute_vec_elements): Create a fresh variable
if the destination isn't an SSA_NAME.

From-SVN: r256383

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

index f908b7cc2cc13e12df23b2f60e27adc62832289b..d3c313d8329cd55d411c50006696ac238b5adbe2 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-09  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * tree-vect-stmts.c (permute_vec_elements): Create a fresh variable
+       if the destination isn't an SSA_NAME.
+
 2018-01-09  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/83668
index 16088b080fee6a0411d818e1dad7c91cbae9caf4..a4f2d7139599106ce3321566303a4c82d62ba353 100644 (file)
@@ -6585,7 +6585,11 @@ permute_vec_elements (tree x, tree y, tree mask_vec, gimple *stmt,
   tree perm_dest, data_ref;
   gimple *perm_stmt;
 
-  perm_dest = vect_create_destination_var (gimple_get_lhs (stmt), vectype);
+  tree scalar_dest = gimple_get_lhs (stmt);
+  if (TREE_CODE (scalar_dest) == SSA_NAME)
+    perm_dest = vect_create_destination_var (scalar_dest, vectype);
+  else
+    perm_dest = vect_get_new_vect_var (vectype, vect_simple_var, NULL);
   data_ref = make_ssa_name (perm_dest);
 
   /* Generate the permute statement.  */