re PR testsuite/25918 (gcc.dg/vect/vect-reduc-dot-s16.c scan-tree-dump-times vectorized 1 loops 1 and gcc.dg/vect/vect-reduc-pattern-2.c scan-tree-dump-times vectorized 2 loops 1 fail)

testsuite/
2006-02-16  Victor Kaplansky  <victork@il.ibm.com>

	PR tree-opt/25918
	* lib/target-supports.exp
	(check_effective_target_vect_short_mult): New.
	(check_effective_target_vect_char_mult): New.
	(check_effective_target_vect_widen_sum_qi_to_si): New.
	(check_effective_target_vect_widen_sum_qi_to_hi): New.
	(check_effective_target_vect_widen_sum_hi_to_si): New.
	* gcc.dg/vect/vect-reduc-dot-s16.c: Remove, split into
	vect-reduc-dot-s16a.c and vect-reduc-dot-s16b.c
	* vect-reduc-dot-s16a.c: New, split from vect-reduc-dot-s16.c.
	* vect-reduc-dot-s16b.c: New, split from vect-reduc-dot-s16.c.
	* gcc.dg/vect/vect-reduc-pattern-2.c: Remove, split into
	vect-reduc-pattern-2a.c, vect-reduc-pattern-2b.c and
	vect-reduc-pattern-2c.c
	* gcc.dg/vect/vect-reduc-pattern-1.c: Remove, split into
	vect-reduc-pattern-1a.c, vect-reduc-pattern-1b.c and
	vect-reduc-pattern-1c.c

From-SVN: r111135
This commit is contained in:
Victor Kaplansky 2006-02-16 09:59:00 +00:00 committed by Victor Kaplansky
parent ca5b1d2cc7
commit 4035f24587
14 changed files with 486 additions and 222 deletions

View file

@ -1,3 +1,23 @@
2006-02-16 Victor Kaplansky <victork@il.ibm.com>
PR tree-opt/25918
* lib/target-supports.exp
(check_effective_target_vect_short_mult): New.
(check_effective_target_vect_char_mult): New.
(check_effective_target_vect_widen_sum_qi_to_si): New.
(check_effective_target_vect_widen_sum_qi_to_hi): New.
(check_effective_target_vect_widen_sum_hi_to_si): New.
* gcc.dg/vect/vect-reduc-dot-s16.c: Remove, split into
vect-reduc-dot-s16a.c and vect-reduc-dot-s16b.c
* vect-reduc-dot-s16a.c: New, split from vect-reduc-dot-s16.c.
* vect-reduc-dot-s16b.c: New, split from vect-reduc-dot-s16.c.
* gcc.dg/vect/vect-reduc-pattern-2.c: Remove, split into
vect-reduc-pattern-2a.c, vect-reduc-pattern-2b.c and
vect-reduc-pattern-2c.c
* gcc.dg/vect/vect-reduc-pattern-1.c: Remove, split into
vect-reduc-pattern-1a.c, vect-reduc-pattern-1b.c and
vect-reduc-pattern-1c.c
2005-02-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/24557

View file

@ -4,61 +4,45 @@
#include "tree-vect.h"
#define N 64
#define DOT1 43680
#define DOT2 43680
#define DOT 43680
signed short X[N] __attribute__ ((__aligned__(16)));
signed short Y[N] __attribute__ ((__aligned__(16)));
/* short->short->int dot product.
Not detected as a dot-product pattern.
Currently fails to be vectorized due to presence of type conversions. */
int
foo1(int len) {
int i;
int result = 0;
short prod;
for (i=0; i<len; i++) {
prod = X[i] * Y[i];
result += prod;
}
return result;
}
/* short->int->int dot product.
Detected as a dot-product pattern.
Vectorized on targets that support dot-product for signed shorts. */
Vectorized on targets that support dot-product for signed shorts. */
int
foo2(int len) {
foo (int len)
{
int i;
int result = 0;
for (i=0; i<len; i++) {
result += (X[i] * Y[i]);
}
for (i = 0; i < len; i++)
{
result += (X[i] * Y[i]);
}
return result;
}
int main (void)
int
main (void)
{
int i, dot1, dot2;
int i;
int dot;
check_vect ();
for (i=0; i<N; i++) {
X[i] = i;
Y[i] = 64-i;
}
for (i = 0; i < N; i++)
{
X[i] = i;
Y[i] = N - i;
}
dot1 = foo1 (N);
if (dot1 != DOT1)
abort ();
dot2 = foo2 (N);
if (dot2 != DOT2)
dot = foo (N);
if (dot != DOT)
abort ();
return 0;

View file

@ -0,0 +1,56 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 64
#define DOT 43680
signed short X[N] __attribute__ ((__aligned__(16)));
signed short Y[N] __attribute__ ((__aligned__(16)));
/* short->short->int dot product. Should be vectorized on architectures
supporting vectorized multiplication of two short args with short result,
e.g "mulv4hi3" and widenning sum */
int
foo (int len)
{
int i;
int result = 0;
short prod;
for (i = 0; i < len; i++)
{
prod = X[i] * Y[i];
result += prod;
}
return result;
}
int
main (void)
{
int i, dot;
check_vect ();
for (i = 0; i < N; i++)
{
X[i] = i;
Y[i] = 64 - i;
}
dot = foo (N);
if (dot != DOT)
abort ();
return 0;
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { vect_short_mult && vect_widen_sum_hi_to_si } } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_short_mult } } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_hi_to_si } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -1,60 +0,0 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
#define SH_SUM 210
#define CH_SUM 120
int main1 ()
{
int i;
unsigned short udata_sh[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28};
unsigned char udata_ch[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
unsigned int intsum = 0;
unsigned short shortsum = 0;
/* widenning sum: sum shorts into int. */
for (i = 0; i < N; i++){
intsum += udata_sh[i];
}
/* check results: */
if (intsum != SH_SUM)
abort ();
/* widenning sum: sum chars into int. */
intsum = 0;
for (i = 0; i < N; i++){
intsum += udata_ch[i];
}
/* check results: */
if (intsum != CH_SUM)
abort ();
/* widenning sum: sum chars into short.
pattern detected, but not vectorized yet. */
for (i = 0; i < N; i++){
shortsum += udata_ch[i];
}
/* check results: */
if (shortsum != CH_SUM)
abort ();
return 0;
}
int main (void)
{
check_vect ();
return main1 ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 3 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_widen_sum } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,40 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
unsigned short udata_sh[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
unsigned int intsum = 0;
/* widenning sum: sum shorts into int. */
for (i = 0; i < N; i++)
{
intsum += udata_sh[i];
}
/* check results: */
if (intsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_hi_to_si } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_hi_to_si } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,40 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
unsigned char udata_ch[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
unsigned int intsum = 0;
/* widenning sum: sum chars into int. */
for (i = 0; i < N; i++)
{
intsum += udata_ch[i];
}
/* check results: */
if (intsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_si } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_si } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,40 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
unsigned char udata_ch[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
unsigned short shortsum = 0;
/* widenning sum: sum chars into short. */
for (i = 0; i < N; i++)
{
shortsum += udata_ch[i];
}
/* check results: */
if (shortsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_hi } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -1,67 +0,0 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
#define SH_SUM 210
#define CH_SUM 120
int main1 ()
{
int i;
signed short data_sh[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28};
signed char data_ch[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
signed int intsum = 0;
signed short shortsum = 0;
/* widenning sum: sum shorts into int. */
for (i = 0; i < N; i++){
intsum += data_sh[i];
}
/* check results: */
if (intsum != SH_SUM)
abort ();
/* widenning sum: sum chars into int. */
intsum = 0;
for (i = 0; i < N; i++){
intsum += data_ch[i];
}
/* check results: */
if (intsum != CH_SUM)
abort ();
/* widenning sum: sum chars into short.
The widening-summation pattern is currently not detected because of this
patch:
2005-12-26 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/25125
*/
for (i = 0; i < N; i++){
shortsum += data_ch[i];
}
/* check results: */
if (shortsum != CH_SUM)
abort ();
return 0;
}
int main (void)
{
check_vect ();
return main1 ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 3 "vect" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 2 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_widen_sum } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,40 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
signed short data_sh[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
signed int intsum = 0;
/* widenning sum: sum shorts into int. */
for (i = 0; i < N; i++)
{
intsum += data_sh[i];
}
/* check results: */
if (intsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_hi_to_si } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_hi_to_si } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,40 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
signed char data_ch[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
signed int intsum = 0;
/* widenning sum: sum chars into int. */
for (i = 0; i < N; i++)
{
intsum += data_ch[i];
}
/* check results: */
if (intsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_si } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_si } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,48 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
signed char data_ch[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
signed short shortsum = 0;
/* widenning sum: sum chars into short.
The widening-summation pattern is currently not detected because of this
patch:
2005-12-26 Kazu Hirata <kazu@codesourcery.com>
PR tree-optimization/25125
*/
for (i = 0; i < N; i++)
{
shortsum += data_ch[i];
}
/* check results: */
if (shortsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -1,59 +0,0 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
#define SH_SUM 210
#define CH_SUM 120
int main1 ()
{
int i;
signed short data_sh[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28};
signed char data_ch[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
signed int intsum = 0;
signed short shortsum = 0;
/* widenning sum: sum shorts into int. */
for (i = 0; i < N; i++){
intsum += data_sh[i];
}
/* check results: */
if (intsum != SH_SUM)
abort ();
/* widenning sum: sum chars into int. */
intsum = 0;
for (i = 0; i < N; i++){
intsum += data_ch[i];
}
/* check results: */
if (intsum != CH_SUM)
abort ();
/* widenning sum: sum chars into short. */
for (i = 0; i < N; i++){
shortsum += data_ch[i];
}
/* check results: */
if (shortsum != CH_SUM)
abort ();
return 0;
}
int main (void)
{
check_vect ();
return main1 ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 3 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect_widen_sum } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -0,0 +1,41 @@
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define N 16
signed char data_ch[N] =
{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
#define SUM 210
int
foo ()
{
int i;
signed short shortsum = 0;
/* widenning sum: sum chars into short. */
for (i = 0; i < N; i++)
{
shortsum += data_ch[i];
}
/* check results: */
if (shortsum != SUM)
abort ();
return 0;
}
int
main (void)
{
check_vect ();
return foo ();
}
/* { dg-final { scan-tree-dump-times "vect_recog_widen_sum_pattern: detected" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_widen_sum_qi_to_hi } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" { target { ! vect_widen_sum_qi_to_hi } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View file

@ -1434,6 +1434,67 @@ proc check_effective_target_vect_no_bitwise { } {
return $et_vect_no_bitwise_saved
}
# Return 1 if the target plus current options supports a vector
# widening summation of *short* args into *int* result, 0 otherwise.
#
# This won't change for different subtargets so cache the result.
proc check_effective_target_vect_widen_sum_hi_to_si { } {
global et_vect_widen_sum_hi_to_si
if [info exists et_vect_widen_sum_hi_to_si_saved] {
verbose "check_effective_target_vect_widen_sum_hi_to_si: using cached result" 2
} else {
set et_vect_widen_sum_hi_to_si_saved 0
if { [istarget powerpc*-*-*]
|| [istarget ia64-*-*] } {
set et_vect_widen_sum_hi_to_si_saved 1
}
}
verbose "check_effective_target_vect_widen_sum_hi_to_si: returning $et_vect_widen_sum_hi_to_si_saved" 2
return $et_vect_widen_sum_hi_to_si_saved
}
# Return 1 if the target plus current options supports a vector
# widening summation of *char* args into *short* result, 0 otherwise.
#
# This won't change for different subtargets so cache the result.
proc check_effective_target_vect_widen_sum_qi_to_hi { } {
global et_vect_widen_sum_qi_to_hi
if [info exists et_vect_widen_sum_qi_to_hi_saved] {
verbose "check_effective_target_vect_widen_sum_qi_to_hi: using cached result" 2
} else {
set et_vect_widen_sum_qi_to_hi_saved 0
if { [istarget ia64-*-*] } {
set et_vect_widen_sum_qi_to_hi_saved 1
}
}
verbose "check_effective_target_vect_widen_sum_qi_to_hi: returning $et_vect_widen_sum_qi_to_hi_saved" 2
return $et_vect_widen_sum_qi_to_hi_saved
}
# Return 1 if the target plus current options supports a vector
# widening summation of *char* args into *int* result, 0 otherwise.
#
# This won't change for different subtargets so cache the result.
proc check_effective_target_vect_widen_sum_qi_to_si { } {
global et_vect_widen_sum_qi_to_si
if [info exists et_vect_widen_sum_qi_to_si_saved] {
verbose "check_effective_target_vect_widen_sum_qi_to_si: using cached result" 2
} else {
set et_vect_widen_sum_qi_to_si_saved 0
if { [istarget powerpc*-*-*] } {
set et_vect_widen_sum_qi_to_si_saved 1
}
}
verbose "check_effective_target_vect_widen_sum_qi_to_si: returning $et_vect_widen_sum_qi_to_si_saved" 2
return $et_vect_widen_sum_qi_to_si_saved
}
# Return 1 if the target plus current options supports a vector
# widening summation, 0 otherwise.
#
@ -1583,6 +1644,46 @@ proc check_effective_target_vect_condition { } {
return $et_vect_cond_saved
}
# Return 1 if the target supports vector char multiplication, 0 otherwise.
proc check_effective_target_vect_char_mult { } {
global et_vect_char_mult_saved
if [info exists et_vect_char_mult_saved] {
verbose "check_effective_target_vect_char_mult: using cached result" 2
} else {
set et_vect_char_mult_saved 0
if { [istarget ia64-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*] } {
set et_vect_char_mult_saved 1
}
}
verbose "check_effective_target_vect_char_mult: returning $et_vect_char_mult_saved" 2
return $et_vect_char_mult_saved
}
# Return 1 if the target supports vector short multiplication, 0 otherwise.
proc check_effective_target_vect_short_mult { } {
global et_vect_short_mult_saved
if [info exists et_vect_short_mult_saved] {
verbose "check_effective_target_vect_short_mult: using cached result" 2
} else {
set et_vect_short_mult_saved 0
if { [istarget ia64-*-*]
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*] } {
set et_vect_short_mult_saved 1
}
}
verbose "check_effective_target_vect_short_mult: returning $et_vect_short_mult_saved" 2
return $et_vect_short_mult_saved
}
# Return 1 if the target supports vector int multiplication, 0 otherwise.
proc check_effective_target_vect_int_mult { } {