{
   unsigned i, j;
   slp_tree child;
-  gimple *stmt, *s;
+  gimple *stmt;
   stmt_vec_info stmt_info;
   tree lhs;
-  unsigned group_size = SLP_INSTANCE_GROUP_SIZE (instance);
 
   /* Recurse down the SLP tree.  */
   FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
                               node, prologue_cost_vec, body_cost_vec);
       else
        {
-         int i;
          gcc_checking_assert (DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info)));
-         /* If the load is permuted then the alignment is determined by
-            the first group element not by the first scalar stmt DR.  */
          if (SLP_TREE_LOAD_PERMUTATION (node).exists ())
            {
+             /* If the load is permuted then the alignment is determined by
+                the first group element not by the first scalar stmt DR.  */
              stmt = GROUP_FIRST_ELEMENT (stmt_info);
              stmt_info = vinfo_for_stmt (stmt);
+             /* Record the cost for the permutation.  */
+             record_stmt_cost (body_cost_vec, ncopies_for_cost, vec_perm,
+                               stmt_info, 0, vect_body);
+             /* And adjust the number of loads performed.  */
+             unsigned nunits
+               = TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info));
+             ncopies_for_cost
+               = (GROUP_SIZE (stmt_info) - GROUP_GAP (stmt_info)
+                  + nunits - 1) / nunits;
+             ncopies_for_cost *= SLP_INSTANCE_UNROLLING_FACTOR (instance);
            }
+         /* Record the cost for the vector loads.  */
          vect_model_load_cost (stmt_info, ncopies_for_cost, false,
                                node, prologue_cost_vec, body_cost_vec);
-         /* If the load is permuted record the cost for the permutation.
-            ???  Loads from multiple chains are let through here only
-            for a single special case involving complex numbers where
-            in the end no permutation is necessary.  */
-         FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, s)
-           if ((STMT_VINFO_GROUP_FIRST_ELEMENT (vinfo_for_stmt (s))
-                == STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_info))
-               && vect_get_place_in_interleaving_chain
-                    (s, STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_info)) != i)
-             {
-               record_stmt_cost (body_cost_vec, group_size, vec_perm,
-                                 stmt_info, 0, vect_body);
-               break;
-             }
        }
+      return;
     }
-  else
+
+  record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt,
+                   stmt_info, 0, vect_body);
+  if (SLP_TREE_TWO_OPERATORS (node))
     {
       record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt,
                        stmt_info, 0, vect_body);
-      if (SLP_TREE_TWO_OPERATORS (node))
-       {
-         record_stmt_cost (body_cost_vec, ncopies_for_cost, vector_stmt,
-                           stmt_info, 0, vect_body);
-         record_stmt_cost (body_cost_vec, ncopies_for_cost, vec_perm,
-                           stmt_info, 0, vect_body);
-       }
+      record_stmt_cost (body_cost_vec, ncopies_for_cost, vec_perm,
+                       stmt_info, 0, vect_body);
     }
 
   /* Push SLP node def-type to stmts.  */