PR83753 was about a case in which we ended up trying to "vectorise"
a group of loads ore stores using single-element vectors. The problem
was that we were classifying the load or store as VMAT_CONTIGUOUS_PERMUTE
rather than VMAT_CONTIGUOUS, even though it doesn't make sense to permute
a single-element vector.
In that PR it was enough to change get_group_load_store_type,
because vectorisation ended up being unprofitable and so we didn't
take things further. But when vectorisation is profitable, the same
fix is needed in vectorizable_load and vectorizable_store.
2018-02-08 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
PR tree-optimization/84265
* tree-vect-stmts.c (vectorizable_store): Don't treat
VMAT_CONTIGUOUS accesses as grouped.
(vectorizable_load): Likewise.
gcc/testsuite/
PR tree-optimization/84265
* gcc.dg/vect/pr84265.c: New test.
From-SVN: r257492
2018-02-08 Richard Sandiford <richard.sandiford@linaro.org>
+ PR tree-optimization/84265
+ * tree-vect-stmts.c (vectorizable_store): Don't treat
+ VMAT_CONTIGUOUS accesses as grouped.
+ (vectorizable_load): Likewise.
+
+2018-02-08 Richard Sandiford <richard.sandiford@linaro.org>
+
PR tree-optimization/81635
* wide-int.h (wi::round_down_for_mask, wi::round_up_for_mask): Declare.
* wide-int.cc (wi::round_down_for_mask, wi::round_up_for_mask)
2018-02-08 Richard Sandiford <richard.sandiford@linaro.org>
+ PR tree-optimization/84265
+ * gcc.dg/vect/pr84265.c: New test.
+
+2018-02-08 Richard Sandiford <richard.sandiford@linaro.org>
+
PR tree-optimization/81635
* gcc.dg/vect/bb-slp-pr81635-3.c: New test.
* gcc.dg/vect/bb-slp-pr81635-4.c: Likewise.
--- /dev/null
+/* { dg-do compile } */
+
+struct a
+{
+ unsigned long b;
+ unsigned long c;
+ int d;
+ int *e;
+ char f;
+};
+
+struct
+{
+ int g;
+ struct a h[];
+} i;
+
+int j, k;
+void l ()
+{
+ for (; k; k++)
+ j += (int) (i.h[k].c - i.h[k].b);
+}
}
grouped_store = (STMT_VINFO_GROUPED_ACCESS (stmt_info)
- && memory_access_type != VMAT_GATHER_SCATTER);
+ && memory_access_type != VMAT_GATHER_SCATTER
+ && (slp || memory_access_type != VMAT_CONTIGUOUS));
if (grouped_store)
{
first_stmt = GROUP_FIRST_ELEMENT (stmt_info);
return true;
}
- if (memory_access_type == VMAT_GATHER_SCATTER)
+ if (memory_access_type == VMAT_GATHER_SCATTER
+ || (!slp && memory_access_type == VMAT_CONTIGUOUS))
grouped_load = false;
if (grouped_load)