This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Can we vectorize the code below ?


Hi Lijia,

On 6/12/19 4:22 AM, Li Jia He wrote:
Hi,

I recently did some analysis on the automatic vectorization of gcc, I
found that singed char can not be vectorized in the following code.

---
#define ITERATIONS 1000000

#if defined(do_reduce_signed_char)
#define TYPE signed char
#elif defined(do_reduce_unsigned_char)
#define TYPE unsigned char
#else
#error bad define
#endif

#define SIZE (16384/sizeof(TYPE))

static TYPE x[SIZE] __attribute__ ((aligned (16)));

void obfuscate(void *a, ...);

static void __attribute__((noinline)) do_one(void)
{
     unsigned long i;
     TYPE a = 0;

     obfuscate(x);

     for (i = 0; i < SIZE; i++)
         a += x[i];

     obfuscate(x, a);
}

int main(void)
{
     unsigned long i;

     for (i = 0; i < ITERATIONS; i++)
         do_one();

     return 0;
}
---
If we use the following command line

gcc reduce.c -Ddo_reduce_unsigned_char -Ofast -c -S -fdump-tree-vect-details

We can see that this code can be vectorized under the unsigned char data
type.
If we use the following command

gcc reduce.c -Ddo_reduce_signed_char -Ofast -c -S -fdump-tree-vect-details

We can see that this code cannot be vectorized under the singed char
data type.
I found in the below code for singed char
---
a += x[i];
---
Will do something like the following conversion.
---
a = (signed char) ((unsigned char) x[i] + (unsigned char) a);
---
As a result, the reduction in the code cannot be effectively identified.
Can we vectorize the code like the above when the data type is signed char ?

This looks like the known limitation https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65930

Thanks,

Kyrill



Thanks,
Lijia He



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]