diff mbox

[3/4] Add a pass_copy_prop following pass_ch_vect

Message ID 1450703608-8617-4-git-send-email-alan.lawrence@arm.com
State New
Headers show

Commit Message

Alan Lawrence Dec. 21, 2015, 1:13 p.m. UTC
This fixes the missed vectorization of gcc.dg/vect/pr65947-2.c following the
previous patch, by cleaning up:

  i_49 = 1;
  ...
    goto <bb 3>;

  <bb 3>:

  <bb 4>: <--- LOOP HEADER
  # i_53 = PHI <i_42(7), i_49(3)>

into:

<bb 3>:
  # i_53 = PHI <i_42(4), 1(2)>

Allowing scalar evolution and vectorization to proceed.

A similar sequence of partial peeling, header-copying, and constant propagation
also leads to pr65947-9.c successfully vectorizing (it previously didn't as
the iteration count was too high) when inlined and so using known data.

I'm not sure whether adding a pass_copy_prop is the right thing here, but since
loop-header-copying can create such opportunities, it seems good to take them!

gcc/ChangeLog:

	* passes.def: Add a pass_copy_prop following pass_ch_vect.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/pr65947-9.c: Add __attribute__ ((noinline)).

--Alan
---
 gcc/passes.def                        | 1 +
 gcc/testsuite/gcc.dg/vect/pr65947-9.c | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

Comments

Richard Biener Dec. 26, 2015, 5:58 p.m. UTC | #1
On Mon, Dec 21, 2015 at 2:13 PM, Alan Lawrence <alan.lawrence@arm.com> wrote:
> This fixes the missed vectorization of gcc.dg/vect/pr65947-2.c following the
> previous patch, by cleaning up:
>
>   i_49 = 1;
>   ...
>     goto <bb 3>;
>
>   <bb 3>:
>
>   <bb 4>: <--- LOOP HEADER
>   # i_53 = PHI <i_42(7), i_49(3)>
>
> into:
>
> <bb 3>:
>   # i_53 = PHI <i_42(4), 1(2)>
>
> Allowing scalar evolution and vectorization to proceed.
>
> A similar sequence of partial peeling, header-copying, and constant propagation
> also leads to pr65947-9.c successfully vectorizing (it previously didn't as
> the iteration count was too high) when inlined and so using known data.
>
> I'm not sure whether adding a pass_copy_prop is the right thing here, but since
> loop-header-copying can create such opportunities, it seems good to take them!

Aww.  I'd rather have general infrastructure (like SCEV) deal with
those non-propagated
copies.

There are likely other missed propagation / folding opportunities
caused from partial peeling.

Richard.

> gcc/ChangeLog:
>
>         * passes.def: Add a pass_copy_prop following pass_ch_vect.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/vect/pr65947-9.c: Add __attribute__ ((noinline)).
>
> --Alan
> ---
>  gcc/passes.def                        | 1 +
>  gcc/testsuite/gcc.dg/vect/pr65947-9.c | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/passes.def b/gcc/passes.def
> index 624d121..1043548 100644
> --- a/gcc/passes.def
> +++ b/gcc/passes.def
> @@ -269,6 +269,7 @@ along with GCC; see the file COPYING3.  If not see
>               NEXT_PASS (pass_expand_omp_ssa);
>           POP_INSERT_PASSES ()
>           NEXT_PASS (pass_ch_vect);
> +         NEXT_PASS (pass_copy_prop);
>           NEXT_PASS (pass_if_conversion);
>           /* pass_vectorize must immediately follow pass_if_conversion.
>              Please do not add any other passes in between.  */
> diff --git a/gcc/testsuite/gcc.dg/vect/pr65947-9.c b/gcc/testsuite/gcc.dg/vect/pr65947-9.c
> index d0da13f..c7aac8d 100644
> --- a/gcc/testsuite/gcc.dg/vect/pr65947-9.c
> +++ b/gcc/testsuite/gcc.dg/vect/pr65947-9.c
> @@ -7,7 +7,7 @@ extern void abort (void) __attribute__ ((noreturn));
>  /* Condition reduction with maximum possible loop size.  Will fail to
>     vectorize because the vectorisation requires a slot for default values.  */
>
> -char
> +__attribute__ ((noinline)) char
>  condition_reduction (char *a, char min_v)
>  {
>    char last = -72;
> --
> 1.9.1
>
diff mbox

Patch

diff --git a/gcc/passes.def b/gcc/passes.def
index 624d121..1043548 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -269,6 +269,7 @@  along with GCC; see the file COPYING3.  If not see
 	      NEXT_PASS (pass_expand_omp_ssa);
 	  POP_INSERT_PASSES ()
 	  NEXT_PASS (pass_ch_vect);
+	  NEXT_PASS (pass_copy_prop);
 	  NEXT_PASS (pass_if_conversion);
 	  /* pass_vectorize must immediately follow pass_if_conversion.
 	     Please do not add any other passes in between.  */
diff --git a/gcc/testsuite/gcc.dg/vect/pr65947-9.c b/gcc/testsuite/gcc.dg/vect/pr65947-9.c
index d0da13f..c7aac8d 100644
--- a/gcc/testsuite/gcc.dg/vect/pr65947-9.c
+++ b/gcc/testsuite/gcc.dg/vect/pr65947-9.c
@@ -7,7 +7,7 @@  extern void abort (void) __attribute__ ((noreturn));
 /* Condition reduction with maximum possible loop size.  Will fail to
    vectorize because the vectorisation requires a slot for default values.  */
 
-char
+__attribute__ ((noinline)) char
 condition_reduction (char *a, char min_v)
 {
   char last = -72;