This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 4/4] S/390: Disable peeling for alignment.
On Tue, Nov 29, 2016 at 11:38:15AM +0100, Richard Biener wrote:
> So - please instead of setting this param provide
> TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST.
Right, that's way better.
gcc/ChangeLog:
2016-11-29 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc/config/s390/s390.c (s390_builtin_vectorization_cost): New
function.
(TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST): Define target
macro.
gcc/testsuite/ChangeLog:
2016-11-29 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.target/s390/vector/vec-nopeel-1.c: New test.
---
gcc/config/s390/s390.c | 38 ++++++++++++++++++++++
.../gcc.target/s390/vector/vec-nopeel-1.c | 17 ++++++++++
2 files changed, 55 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index dab4f43..82aca3f 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -3674,6 +3674,41 @@ s390_address_cost (rtx addr, machine_mode mode ATTRIBUTE_UNUSED,
return ad.indx? COSTS_N_INSNS (1) + 1 : COSTS_N_INSNS (1);
}
+/* Implement targetm.vectorize.builtin_vectorization_cost. */
+static int
+s390_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
+ tree vectype,
+ int misalign ATTRIBUTE_UNUSED)
+{
+ switch (type_of_cost)
+ {
+ case scalar_stmt:
+ case scalar_load:
+ case scalar_store:
+ case vector_stmt:
+ case vector_load:
+ case vector_store:
+ case vec_to_scalar:
+ case scalar_to_vec:
+ case cond_branch_not_taken:
+ case vec_perm:
+ case vec_promote_demote:
+ return 1;
+ case unaligned_load:
+ case unaligned_store:
+ return 2;
+
+ case cond_branch_taken:
+ return 3;
+
+ case vec_construct:
+ return TYPE_VECTOR_SUBPARTS (vectype) - 1;
+
+ default:
+ gcc_unreachable ();
+ }
+}
+
/* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
otherwise return 0. */
@@ -15428,6 +15463,9 @@ s390_excess_precision (enum excess_precision_type type)
#define TARGET_REGISTER_MOVE_COST s390_register_move_cost
#undef TARGET_MEMORY_MOVE_COST
#define TARGET_MEMORY_MOVE_COST s390_memory_move_cost
+#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
+#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
+ s390_builtin_vectorization_cost
#undef TARGET_MACHINE_DEPENDENT_REORG
#define TARGET_MACHINE_DEPENDENT_REORG s390_reorg
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c b/gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
new file mode 100644
index 0000000..5f370a2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mzarch -march=z13" } */
+/* { dg-require-effective-target vector } */
+
+int
+foo (int * restrict a, int n)
+{
+ int i, result = 0;
+
+ for (i = 0; i < n * 4; i++)
+ result += a[i];
+ return result;
+}
+
+/* We do NOT want this loop to get peeled to reach better alignment.
+ Without peeling no scalar memory add should appear. */
+/* { dg-final { scan-assembler-not "\ta\t" } } */
--
2.9.1