From 1bea0f26630c2c7fc35968a6e646bd67a706bf08 Mon Sep 17 00:00:00 2001 From: Bill Schmidt Date: Thu, 11 May 2017 20:16:02 +0000 Subject: [PATCH] re PR target/80695 (gratuitous use of stxvx to store multiple pointers) [gcc] 2017-05-11 Bill Schmidt PR target/80695 * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): Account for direct move costs for vec_construct of integer vectors. [gcc/testsuite] 2017-05-11 Bill Schmidt PR target/80695 * gcc.target/powerpc/pr80695-p8.c: New file. * gcc.target/powerpc/pr80695-p9.c: New file. From-SVN: r247928 --- gcc/ChangeLog | 7 +++++++ gcc/config/rs6000/rs6000.c | 14 +++++++++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.target/powerpc/pr80695-p8.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.target/powerpc/pr80695-p9.c | 18 ++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr80695-p8.c create mode 100644 gcc/testsuite/gcc.target/powerpc/pr80695-p9.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5db55057fd0..24af7d1711b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-05-11 Bill Schmidt + + PR target/80695 + * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): + Account for direct move costs for vec_construct of integer + vectors. + 2017-05-11 Uros Bizjak PR target/80706 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index d55e552f492..292742aeb60 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5850,8 +5850,20 @@ rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, if (SCALAR_FLOAT_TYPE_P (elem_type) && TYPE_PRECISION (elem_type) == 32) return 5; + /* On POWER9, integer vector types are built up in GPRs and then + use a direct move (2 cycles). For POWER8 this is even worse, + as we need two direct moves and a merge, and the direct moves + are five cycles. */ + else if (INTEGRAL_TYPE_P (elem_type)) + { + if (TARGET_P9_VECTOR) + return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 2; + else + return TYPE_VECTOR_SUBPARTS (vectype) - 1 + 11; + } else - return max (2, TYPE_VECTOR_SUBPARTS (vectype) - 1); + /* V2DFmode doesn't need a direct move. */ + return 2; default: gcc_unreachable (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9fba93cff2f..7fbf899d65e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-05-11 Bill Schmidt + + PR target/80695 + * gcc.target/powerpc/pr80695-p8.c: New file. + * gcc.target/powerpc/pr80695-p9.c: New file. + 2017-05-11 Uros Bizjak Jakub Jelinek diff --git a/gcc/testsuite/gcc.target/powerpc/pr80695-p8.c b/gcc/testsuite/gcc.target/powerpc/pr80695-p8.c new file mode 100644 index 00000000000..165079a3a6c --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr80695-p8.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-require-effective-target vect_int } */ +/* { dg-options "-mcpu=power8 -O3 -fdump-tree-slp-details" } */ + +/* PR80695: Verify cost model for vec_construct on POWER8. */ + +long a[10] __attribute__((aligned(16))); + +void foo (long i, long j, long k, long l) +{ + a[6] = i; + a[7] = j; + a[8] = k; + a[9] = l; +} + +/* { dg-final { scan-tree-dump-times "vectorization is not profitable" 1 "slp2" } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr80695-p9.c b/gcc/testsuite/gcc.target/powerpc/pr80695-p9.c new file mode 100644 index 00000000000..a81f90ac3c4 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr80695-p9.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */ +/* { dg-require-effective-target vect_int } */ +/* { dg-options "-mcpu=power9 -O3 -fdump-tree-slp-details" } */ + +/* PR80695: Verify cost model for vec_construct on POWER9. */ + +long a[10] __attribute__((aligned(16))); + +void foo (long i, long j, long k, long l) +{ + a[6] = i; + a[7] = j; + a[8] = k; + a[9] = l; +} + +/* { dg-final { scan-tree-dump-times "vectorization is not profitable" 1 "slp2" } } */ -- 2.30.2