--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-march=armv9-a -O3 -mmax-vectorization -msve-vector-bits=128 -mautovec-preference=sve-only -fdump-tree-vect-details" } */
+
+struct partition_elem
+{
+ int class_element;
+ struct partition_elem* next;
+ unsigned class_count;
+};
+
+typedef struct partition_def
+{
+ int num_elements;
+ struct partition_elem elements[1];
+} *partition;
+
+partition part;
+
+partition
+partition_new (int num_elements)
+{
+ int e;
+
+ /* No need to allocate memory, just a compile test. */
+ for (e = 0; e < num_elements; ++e)
+ {
+ part->elements[e].class_element = e;
+ part->elements[e].next = &(part->elements[e]);
+ part->elements[e].class_count = 1;
+ }
+
+ return part;
+}
+
+/* { dg-final { scan-tree-dump-not "\\{ 0, 576 \\}" "vect" } } */
(&stmts, ls.supported_offset_vectype, vec_offset);
if (ls.supported_scale)
{
- tree mult_cst = build_int_cst
- (TREE_TYPE (TREE_TYPE (vec_offset)),
- SLP_TREE_GS_SCALE (slp_node) / ls.supported_scale);
- tree mult = build_vector_from_val
- (TREE_TYPE (vec_offset), mult_cst);
- vec_offset = gimple_build
- (&stmts, MULT_EXPR, TREE_TYPE (vec_offset),
- vec_offset, mult);
+ /* Only scale the vec_offset if we haven't already. */
+ if (STMT_VINFO_GATHER_SCATTER_P (stmt_info)
+ || j == 0)
+ {
+ tree mult_cst = build_int_cst
+ (TREE_TYPE (TREE_TYPE (vec_offset)),
+ SLP_TREE_GS_SCALE (slp_node) / ls.supported_scale);
+ tree mult = build_vector_from_val
+ (TREE_TYPE (vec_offset), mult_cst);
+ vec_offset = gimple_build
+ (&stmts, MULT_EXPR, TREE_TYPE (vec_offset),
+ vec_offset, mult);
+ }
scale = size_int (ls.supported_scale);
}
gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
(&stmts, ls.supported_offset_vectype, vec_offset);
if (ls.supported_scale)
{
- tree mult_cst = build_int_cst
- (TREE_TYPE (TREE_TYPE (vec_offset)),
- SLP_TREE_GS_SCALE (slp_node) / ls.supported_scale);
- tree mult = build_vector_from_val
- (TREE_TYPE (vec_offset), mult_cst);
- vec_offset = gimple_build
- (&stmts, MULT_EXPR, TREE_TYPE (vec_offset),
- vec_offset, mult);
+ /* Only scale the vec_offset if we haven't already. */
+ if (STMT_VINFO_GATHER_SCATTER_P (stmt_info)
+ || i == 0)
+ {
+ tree mult_cst = build_int_cst
+ (TREE_TYPE (TREE_TYPE (vec_offset)),
+ SLP_TREE_GS_SCALE (slp_node) / ls.supported_scale);
+ tree mult = build_vector_from_val
+ (TREE_TYPE (vec_offset), mult_cst);
+ vec_offset = gimple_build
+ (&stmts, MULT_EXPR, TREE_TYPE (vec_offset),
+ vec_offset, mult);
+ }
scale = size_int (ls.supported_scale);
}
gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);