Handle SLP_TREE_LANE_PERMUTATION in scalar costing

Message ID nycvar.YFH.7.76.2006191643040.4397@zhemvz.fhfr.qr
State New
Headers show
Series
  • Handle SLP_TREE_LANE_PERMUTATION in scalar costing
Related show

Commit Message

Richard Biener June 19, 2020, 2:43 p.m.
This properly handles a lane permutation in scalar costing.
For the current only use this doesn't matter much but with
permutes that change the number of lanes it will eventually
ICE.

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

Richard,

2020-06-19  Richard Biener  <rguenther@suse.de>

	* tree-vect-slp.c (vect_bb_slp_scalar_cost): Adjust
	for lane permutations.
---
 gcc/tree-vect-slp.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

-- 
2.25.1

Patch

diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 84b97270cd1..5c169f37022 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2969,7 +2969,22 @@  vect_bb_slp_scalar_cost (vec_info *vinfo,
 	{
 	  /* Do not directly pass LIFE to the recursive call, copy it to
 	     confine changes in the callee to the current child/subtree.  */
-	  subtree_life.safe_splice (*life);
+	  if (SLP_TREE_CODE (node) == VEC_PERM_EXPR)
+	    {
+	      subtree_life.safe_grow_cleared (SLP_TREE_LANES (child));
+	      for (unsigned j = 0;
+		   j < SLP_TREE_LANE_PERMUTATION (node).length (); ++j)
+		{
+		  auto perm = SLP_TREE_LANE_PERMUTATION (node)[j];
+		  if (perm.first == i)
+		    subtree_life[perm.second] = (*life)[j];
+		}
+	    }
+	  else
+	    {
+	      gcc_assert (SLP_TREE_LANES (node) == SLP_TREE_LANES (child));
+	      subtree_life.safe_splice (*life);
+	    }
 	  vect_bb_slp_scalar_cost (vinfo, child, &subtree_life, cost_vec,
 				   visited);
 	  subtree_life.truncate (0);