[Bug tree-optimization/57512] New: Vectorizer: cannot handle accumulation loop of signed char type
bmei at broadcom dot com
gcc-bugzilla@gcc.gnu.org
Mon Jun 3 14:01:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57512
Bug ID: 57512
Summary: Vectorizer: cannot handle accumulation loop of signed
char type
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: bmei at broadcom dot com
Created attachment 30249
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30249&action=edit
Unvectorized with signed char type.
GCC (I used 4.7.2 x86-64 target) cannot vectorize this accumulation loop.
gcc tst.c -O2 -S -ftree-vectorize -fdump-tree-vect-details
signed short mac_char (signed char * __restrict__ in1, signed char *
__restrict__ in2)
{
unsigned i;
signed short sum = 0;
for (i = 0; i < 256; i++)
{
signed char d1 = in1[i];
signed char d2 = in2[i];
sum += ((signed short)d1 * (signed short)d2);
}
return sum;
}
If I change signed char to unsigned char, vectorization does work.
unsigned short mac_uchar (unsigned char * __restrict__ in1, unsigned char *
__restrict__ in2)
{
unsigned i;
unsigned short sum = 0;
for (i = 0; i < 256; i++)
{
unsigned char d1 = in1[i];
unsigned char d2 = in2[i];
sum += ((unsigned short)d1 * d2);
}
return sum;
}
Looking into .vect file, I think the problem is with handling following gimple
stmts. GCC converts short additions to unsigned short additions and then
converts result back to short because of integer promotion. This confuses
vectorizer so it cannot find correct vector reduction patterns.
D.3015_14 = (short unsigned int) D.3014_13;
sum.0_15 = (short unsigned int) sum_25;
D.3017_16 = D.3015_14 + sum.0_15;
sum_17 = (short int) D.3017_16;
More information about the Gcc-bugs
mailing list