[llvm-dev] LoopVectorize fails to vectorize more complex loops
Caballero, Diego via llvm-dev
llvm-dev at lists.llvm.org
Fri Jul 6 20:37:17 PDT 2018
Agreed on the aliasing issue. You could also rewrite your loop like this:
for (j = 0; j < m; j++)
{
TYPE red = 0.0;
for (i = 0; i < n; i++)
red += data[j][i];
mean[j] = red;
}
Diego
> -----Original Message-----
> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of
> Nema, Ashutosh via llvm-dev
> Sent: Friday, July 6, 2018 7:48 PM
> To: Alex Susu <alex.susu at gmail.com>
> Cc: llvm-dev at lists.llvm.org
> Subject: Re: [llvm-dev] LoopVectorize fails to vectorize more complex loops
>
> Hi Alex,
>
> This seems like LICM problem, where it's not able to promote the memory
> reference to scalar because of unknown aliasing.
> This result recurrence store remain in the loop body and loop vectorization
> fails to vectorize.
> Loop Versioning LICM pass can help in this case.
>
> - Ashutosh
>
> -----Original Message-----
> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of Alex
> Susu via llvm-dev
> Sent: Saturday, July 7, 2018 6:22 AM
> To: llvm-dev <llvm-dev at lists.llvm.org>
> Subject: [llvm-dev] LoopVectorize fails to vectorize more complex loops
>
> Hello.
> Could you please tell me why the first loop of the following program (also
> maybe the commented loop) doesn't get vectorized with LoopVectorize
> (from a recent LLVM build from the SVN repository from Jun 2018)?
>
> typedef short TYPE;
> TYPE data[1400][1200];
>
> void kernel_covariance(int m, int n, TYPE mean[1200]) {
> int i, j, k;
>
> for (j = 0; j < m; j++)
> {
> mean[j] = 0.0;
> for (i = 0; i < n; i++)
> mean[j] += data[j][i];
> //mean[j] /= float_n;
> }
>
> // This loop gets vectorized
> for (i = 0; i < n; i++)
> for (j = 0; j < m; j++)
> data[i][j] -= mean[j];
>
> /*
> // This loop doesn't get vectorized either:
> for (i = 0; i < m; i++)
> for (j = i; j < m; j++)
> {
> cov[i][j] = 0.0;
> for (k = 0; k < n; k++)
> cov[i][j] += data[i][k] * data[j][k];
> sum += data[i][k] * data[j][k];
> cov[i][j] /= (float_n - 1.0);
> cov[j][i] = cov[i][j];
> }
> */
> }
>
> For the first loop I get the following debug info from clang and opt:
> LV: Checking a loop in "kernel_covariance" from test.c:10:7
> LV: Loop hints: force=? width=0 unroll=0
> LV: Found a loop: for.body3.us
> LV: PHI is not a poly recurrence.
> LV: PHI is not a poly recurrence.
> LV: Found an unidentified PHI. %2 = phi i16 [ 0, %for.body.us ], [ %add.us,
> %for.body3.us ], !dbg !48
> LV: Can't vectorize the instructions or CFG
> LV: Not vectorizing: Cannot prove legality.
>
> Thank you,
> Alex
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list