From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14996 invoked by alias); 5 Mar 2015 14:16:28 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 14961 invoked by uid 89); 5 Mar 2015 14:16:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.7 required=5.0 tests=AWL,BAYES_50,MEDICAL_SUBJECT,RCVD_IN_DNSWL_LOW,SPF_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: cam-smtp0.cambridge.arm.com Received: from fw-tnat.cambridge.arm.com (HELO cam-smtp0.cambridge.arm.com) (217.140.96.140) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 05 Mar 2015 14:16:16 +0000 Received: from arm.com (e106375-lin.cambridge.arm.com [10.2.206.37]) by cam-smtp0.cambridge.arm.com (8.13.8/8.13.8) with ESMTP id t25EG63f007204; Thu, 5 Mar 2015 14:16:06 GMT Date: Thu, 05 Mar 2015 14:16:00 -0000 From: James Greenhalgh To: Xingxing Pan Cc: "julian@codesourcery.com" , Kyrylo Tkachov , Ramana Radhakrishnan , Richard Earnshaw , "nickc@redhat.com" , Xinyu Qi , Liping Gao , Joey Ye , "gcc-patches@gcc.gnu.org" Subject: Re: [PATCH] [ARM] Fix widen-sum pattern in neon.md. Message-ID: <20150305141606.GA1412@arm.com> References: <54F85B61.8090901@marvell.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54F85B61.8090901@marvell.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes X-SW-Source: 2015-03/txt/msg00287.txt.bz2 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 > + > +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 > + 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 > + > +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 > + 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 > + > +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 > + > +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 > + > +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 > + > +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 > + > +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 > + > +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 > }