<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p>Thanks for the analysis Roland. If I understand correctly, even
      if this analysis is not supported today, in principle it could be
      done, right?</p>
    <p>After all, we know ia/oa (e.g. their addresses) and the ranges
      we're going to access these at (otherwise we could not hoist bound
      checks outside the loop).</p>
    <p>So, we might be able, in principle, to check that - perhaps the
      issue is that (as in this case) all the addresses are completely
      dynamic, so you really need a disjointness runtime check (outside
      the loop), which might be more expensive than the incremental
      benefit added by vectorization?</p>
    <p>Maurizio<br>
    </p>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 20/03/2024 16:26, Roland Westrelin
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:8734sklvhu.fsf@redhat.com">
      <pre>is that the compiler can't prove it's legal to vectorize. Doubles are
read from ia and oa and then added and written back to oa. There's no
way for the compiler to tell that the off heap areas pointed to by ia
and oa don't overlap. So possibly, the value written to:

oa + 8*i

is going to be read back at the next iteration with:

ia + 8*i

(ia could be oa+8)

The autovectorizer would need to insert a runtime check that the 2 areas
don't overlap but there's no support for that at this point. I suppose
the same issue exists with the MemorySegment API when memory is off
heap.
</pre>
    </blockquote>
  </body>
</html>