We're making vector construction extra costly but too much
because we up to now do not know the actual vector composition
type used. This makes use of this now available information.
Prerequesites changed in this [v2], we now get vec_deconstruct,
counting only once instead of nunits time. I've checked this
works out and I now see
XPASS: gcc.target/i386/pr89618-2.c scan-tree-dump vect "loop vectorized
using 16 byte vectors"
which I'll double-check before removing the XFAIL. I do want to
get rid of that
+ stmt_cost *= (GET_MODE_BITSIZE (TYPE_MODE (ls_type))
+ / GET_MODE_BITSIZE (TYPE_MODE (ls_eltype)) + 1);
scaling, at least at this very place, and at most keep an overall
counter of construction/deconstructions to apply a penalty at
the end. For V2SI (de-)composition counting 3 times the actual cost
is overzealous at least.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
OK in principle?
I'm waiting on the other target maintainers for the
vec_deconstruct prerequesite.
* config/i386/i386.cc (ix86_vector_costs::add_stmt_cost):
Use vector construction scaling also for mult-lane
VMAT_STRIDED_SLP but use vector composition type recorded
to avoid excessive over-costing.
---
gcc/config/i386/i386.cc | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index c0a0204b9b6..2b4d878a550 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -26731,15 +26731,20 @@ ix86_vector_costs::add_stmt_cost (int count,
vect_cost_for_stmt kind,
if ((kind == vec_construct || kind == vec_deconstruct)
&& ((node
&& (((SLP_TREE_MEMORY_ACCESS_TYPE (node) == VMAT_ELEMENTWISE
- || (SLP_TREE_MEMORY_ACCESS_TYPE (node) == VMAT_STRIDED_SLP
- && SLP_TREE_LANES (node) == 1))
+ || SLP_TREE_MEMORY_ACCESS_TYPE (node) == VMAT_STRIDED_SLP)
&& (TREE_CODE (DR_STEP (STMT_VINFO_DATA_REF
(SLP_TREE_REPRESENTATIVE (node))))
!= INTEGER_CST))
|| mat_gather_scatter_p (SLP_TREE_MEMORY_ACCESS_TYPE (node))))))
{
- stmt_cost = ix86_default_vector_cost (kind, mode);
- stmt_cost *= (TYPE_VECTOR_SUBPARTS (vectype) + 1);
+ auto lsdata = static_cast<vect_load_store_data *> (node->data);
+ tree ls_type = lsdata->ls_type ? lsdata->ls_type : vectype;
+ tree ls_eltype
+ = lsdata->ls_eltype ? lsdata->ls_eltype : TREE_TYPE (ls_type);
+ stmt_cost = ix86_vector_cd_cost (TYPE_MODE (ls_type),
+ TYPE_MODE (ls_eltype));
+ stmt_cost *= (GET_MODE_BITSIZE (TYPE_MODE (ls_type))
+ / GET_MODE_BITSIZE (TYPE_MODE (ls_eltype)) + 1);
}
else if ((kind == vec_construct || kind == scalar_to_vec)
&& node
--
2.51.0