[LLVMdev] Missed vectorization opportunities?

mats petersson mats at planetcatfish.com
Wed Apr 22 04:16:33 PDT 2015


In your first case, I fail to see what the obvious vectorisation would
be - you are reading one and writing one of the every other element -
that is not very easy to made into vectorized operatioons - have you
tried writing code for that, and confirmed that it's actually better
than just straight loop?

--
Mats

On 22 April 2015 at 12:01, Vaivaswatha N <vaivaswatha at yahoo.co.in> wrote:
> Hi,
>
> I am trying to understand the limitations of the current vectorizer, and
> came upon these test cases that fail to get vectorized.
>
> 1. loop1 below (note the increment by 2) fails to get vectorized because the
> access a[j+1] is considered to wrap around (the corresponding SCEV doesn't
> have nsw/nuw set) and hence isStridedPtr() in LoopAccessAnalysis.cpp return
> false.
>
> #define SIZE 100000
> void loop1 (float a[SIZE])
> {
>   long t, j;
>   float cc = 23, dd = 34, ee = 233;
> #pragma clang loop vectorize(enable)
>   for (j = 1; j < SIZE-1; j += 2) {
>     float x;
>     x = a[j+1] + ee;
>     x = x / dd;
>     x = (cc + x) / dd;
>     a[j] = x + 2 ;
>   }
> }
>
> 2. Of the two loops below, the loop "works" gets vectorized, while the loop
> "fails" does not get vectorized.
> #define SIZE 10000
> int a[SIZE+4] = {};
> void works(unsigned long m, unsigned long n)
> {
>   long j;
>   // SCEV can compute the exit value for this loop
>   for (j = m; j < n+1; j += 1) {
>     a[j] = a[j+1] + 2;
>   }
> }
> void fails(unsigned long m, unsigned long n)
> {
>   long j;
>   // SCEV cannot compute the exit value for this loop
>   for (j = m; j <= n; j += 1) {
>     a[j] = a[j+1] + 2;
>   }
> }
>
> The only difference between the two loops is the loop exit condition, both
> semantically same. Scalar Evolution is unable to determine the exit value of
> the second loop, leading to the vectorizer failing to vectorize. It seemed
> to me that this is due to ScalarEvolution::SimplifyICmpOperands failing to
> canonicalize the corresponding ICMP_ULE instruction.
>
> Thanks,
>
> - Vaivaswatha
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list