Handle SLP_TREE_LANE_PERMUTATION in scalar costing

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

Commit Message

Richard Biener June 19, 2020, 11:41 a.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.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.y

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);