This is the mail archive of the gcc-patches@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] |
This is an old thread and we are still running into similar issues: Code is not being vectorized on 64-bit target due to scev not being able to optimally analyze overflow condition. While the original test case shown here seems to work now, it does not work if the start value is not a constant and the loop index variable is of unsigned type: Ex void loop2( double const * __restrict__ x_in, double * __restrict__ x_out, double const * __restrict__ c, unsigned int N, unsigned int start) { for(unsigned int i=start; i!=N; ++i) x_out[i] = c[i]*x_in[i]; } Here is our unit test: int foo(int* A, int* B, unsigned start, unsigned B) { int s; for (unsigned k = start; k <start+B; k++) s += A[k] * B[k]; return s; } Our unit test case is extracted from a matrix multiply of a two-dimensional array and all loops are blocked by hand by a factor of B. Even though a bit modified, above loop corresponds to the innermost loop of the blocked matrix multiply. We worked on patch to solve the problem (see attachment.) The attached patch passed bootstrap and make check on x86_64-linux. Ok for trunk? Thanks, Abderrazek Zaafrani
Attachment:
0001-scev-for-vectorization.patch
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |