Hi Xingxing,

I'm a little confused by your reasons for adding testcases marked XFAIL.

On Thu, Mar 05, 2015 at 01:34:25PM +0000, Xingxing Pan wrote:
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> xfail *-*-* } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { xfail *-*-* 
> } } } */

Why XFAIL here? Maybe I have not properly understood what you are checking
for, can this not be rewritten in to something we expect to PASS?

If you are testing that the pattern doesn't get recognized, use:

   { dg-final { scan-tree-dump-not "pattern recognized.*w\\\+" "vect" } }

Or is the reason that the pattern should be recognised in future but
currently is not? 

In any case, a comment on why these tests should be expected to fail
would be useful, even if that just means moving the comment you already
have in the testcase up beside these dg-directives.

Thanks,
James

> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef signed char STYPE1;
> +typedef signed short STYPE2;
> +
> +#define N 128
> +STYPE1 sdata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +ssum ()
> +{
> +  int i;
> +  STYPE2 sum = 0;
> +  STYPE2 check_sum = 0;
> +
> +  /* widenning sum: sum chars into short.
> +
> +     Like gcc.dg/vect/vect-reduc-pattern-2c.c, the widening-summation pattern
> +     is currently not detected because of this patch:
> +
> +     2005-12-26  Kazu Hirata  <k...@codesourcery.com>
> +        PR tree-optimization/25125
> +   */
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      sdata[i] = i*2;
> +      check_sum += sdata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += sdata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  ssum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-s.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-s.c
> new file mode 100644
> index 0000000..de53f5c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-s.c
> @@ -0,0 +1,64 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize -fdump-tree-vect-details 
> -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> xfail *-*-* } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { xfail *-*-* 
> } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef signed char STYPE1;
> +typedef signed short STYPE2;
> +
> +#define N 128
> +STYPE1 sdata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +ssum ()
> +{
> +  int i;
> +  STYPE2 sum = 0;
> +  STYPE2 check_sum = 0;
> +
> +  /* widenning sum: sum chars into short.
> +
> +     Like gcc.dg/vect/vect-reduc-pattern-2c.c, the widening-summation pattern
> +     is currently not detected because of this patch:
> +
> +     2005-12-26  Kazu Hirata  <k...@codesourcery.com>
> +        PR tree-optimization/25125
> +   */
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      sdata[i] = i*2;
> +      check_sum += sdata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += sdata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  ssum ();
> +  return 0;
> +}
> diff --git 
> a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-u-d.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-u-d.c
> new file mode 100644
> index 0000000..bfa17d5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-u-d.c
> @@ -0,0 +1,55 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize 
> -mvectorize-with-neon-double -fdump-tree-vect-details -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> target { arm_neon } } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { target { 
> arm_neon } } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef unsigned char UTYPE1;
> +typedef unsigned short UTYPE2;
> +
> +#define N 128
> +UTYPE1 udata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +usum ()
> +{
> +  int i;
> +  UTYPE2 sum = 0;
> +  UTYPE2 check_sum = 0;
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      udata[i] = i*2;
> +      check_sum += udata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += udata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  usum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-u.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-u.c
> new file mode 100644
> index 0000000..38d8179
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-char2short-u.c
> @@ -0,0 +1,55 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize -fdump-tree-vect-details 
> -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> target { arm_neon } } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { target { 
> arm_neon } } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef unsigned char UTYPE1;
> +typedef unsigned short UTYPE2;
> +
> +#define N 128
> +UTYPE1 udata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +usum ()
> +{
> +  int i;
> +  UTYPE2 sum = 0;
> +  UTYPE2 check_sum = 0;
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      udata[i] = i*2;
> +      check_sum += udata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += udata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  usum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-s-d.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-s-d.c
> new file mode 100644
> index 0000000..7aef5d1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-s-d.c
> @@ -0,0 +1,55 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize 
> -mvectorize-with-neon-double -fdump-tree-vect-details -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> target { arm_neon } } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { target 
> arm_neon } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef signed short STYPE1;
> +typedef signed int STYPE2;
> +
> +#define N 128
> +STYPE1 sdata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +ssum ()
> +{
> +  int i;
> +  STYPE2 sum = 0;
> +  STYPE2 check_sum = 0;
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      sdata[i] = i*2;
> +      check_sum += sdata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += sdata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  ssum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-s.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-s.c
> new file mode 100644
> index 0000000..914ad09
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-s.c
> @@ -0,0 +1,55 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize -fdump-tree-vect-details 
> -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> target { arm_neon } } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { target { 
> arm_neon } } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef signed short STYPE1;
> +typedef signed int STYPE2;
> +
> +#define N 128
> +STYPE1 sdata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +ssum ()
> +{
> +  int i;
> +  STYPE2 sum = 0;
> +  STYPE2 check_sum = 0;
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      sdata[i] = i*2;
> +      check_sum += sdata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += sdata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  ssum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-u-d.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-u-d.c
> new file mode 100644
> index 0000000..6f4a29b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-u-d.c
> @@ -0,0 +1,55 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize 
> -mvectorize-with-neon-double -fdump-tree-vect-details -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> target { arm_neon } } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { target { 
> arm_neon } } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef unsigned short UTYPE1;
> +typedef unsigned int UTYPE2;
> +
> +#define N 128
> +UTYPE1 udata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +usum ()
> +{
> +  int i;
> +  UTYPE2 sum = 0;
> +  UTYPE2 check_sum = 0;
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      udata[i] = i*2;
> +      check_sum += udata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += udata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  usum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-u.c 
> b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-u.c
> new file mode 100644
> index 0000000..194b260
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/neon/vect-widen-sum-short2int-u.c
> @@ -0,0 +1,55 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target arm_neon_hw } */
> +/* { dg-options "-O2 -ffast-math -ftree-vectorize -fdump-tree-vect-details 
> -fdump-rtl-expand" } */
> +/* { dg-add-options arm_neon } */
> +
> +/* { dg-final { scan-tree-dump-times "pattern recognized.*w\\\+" 1 "vect" { 
> target { arm_neon } } } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +/* { dg-final { scan-rtl-dump-times "UNSPEC_VPADAL" 1 "expand" { target { 
> arm_neon } } } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> +
> +#include <stdlib.h>
> +
> +typedef unsigned short UTYPE1;
> +typedef unsigned int UTYPE2;
> +
> +#define N 128
> +UTYPE1 udata[N];
> +
> +volatile int y = 0;
> +
> +__attribute__ ((noinline)) int
> +usum ()
> +{
> +  int i;
> +  UTYPE2 sum = 0;
> +  UTYPE2 check_sum = 0;
> +
> +  for (i = 0; i < N; i++)
> +    {
> +      udata[i] = i*2;
> +      check_sum += udata[i];
> +      /* Avoid vectorization.  */
> +      if (y)
> +     abort ();
> +    }
> +
> +  /* widenning sum: sum chars into int.  */
> +  for (i = 0; i < N; i++)
> +    {
> +      sum += udata[i];
> +    }
> +
> +  /* check results:  */
> +  if (sum != check_sum)
> +    abort ();
> +
> +  return 0;
> +}
> +
> +int
> +main (void)
> +{
> +  usum ();
> +  return 0;
> +}
> diff --git a/gcc/testsuite/lib/target-supports.exp 
> b/gcc/testsuite/lib/target-supports.exp
> index 6b957de..eaccb83 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -3767,6 +3767,7 @@ proc 
> check_effective_target_vect_widen_sum_hi_to_si_pattern { } {
>      } else {
>          set et_vect_widen_sum_hi_to_si_pattern_saved 0
>          if { [istarget powerpc*-*-*]
> +             || ([istarget arm*-*-*] && [check_effective_target_arm_neon_ok])
>               || [istarget ia64-*-*] } {
>              set et_vect_widen_sum_hi_to_si_pattern_saved 1
>          }
> @@ -3790,7 +3791,8 @@ proc check_effective_target_vect_widen_sum_hi_to_si { } 
> {
>      } else {
>          set et_vect_widen_sum_hi_to_si_saved 
> [check_effective_target_vect_unpack]
>          if { [istarget powerpc*-*-*] 
> -          || [istarget ia64-*-*] } {
> +             || ([istarget arm*-*-*] && [check_effective_target_arm_neon_ok])
> +             || [istarget ia64-*-*] } {
>              set et_vect_widen_sum_hi_to_si_saved 1
>          }
>      }
> @@ -3813,7 +3815,7 @@ proc check_effective_target_vect_widen_sum_qi_to_hi { } 
> {
>      } else {
>          set et_vect_widen_sum_qi_to_hi_saved 0
>       if { [check_effective_target_vect_unpack] 
> -          || [check_effective_target_arm_neon_ok]
> +          || ([istarget arm*-*-*] && [check_effective_target_arm_neon_ok])
>            || [istarget ia64-*-*] } {
>              set et_vect_widen_sum_qi_to_hi_saved 1
>       }

Reply via email to