Hi Sergei,<br><br><div class="gmail_quote">On Thu, Mar 11, 2010 at 8:30 PM, Sergei Dyshel <span dir="ltr">&lt;<a href="mailto:qyron.private@gmail.com">qyron.private@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello,<br>
I&#39;m doing some research on vectorization using Mono. I&#39;ve noticed that<br>
code generated by Mono&#39;s JIT contains many unnecessary memory loads<br>
and stores. Here is simple example, the full code is attached:<br>
<br>
public static unsafe int sum(int* a, int size) {<br>
 Vector4i temp = new Vector4i();<br>
 Vector4i* p = (Vector4i*) a;<br>
 for (int i = 0; i &lt; size/4; i++) {<br>
   temp += *p;<br>
   p += 1;<br>
 }<br>
 return temp.X + temp.Y + temp.Z + temp.W;<br>
}<br>
<br></blockquote><div><br> <br></div></div>The problem you&#39;re seen of going to memory when not needed is due to the fact that<br>mono lacks a working global register allocator. If you use a value in a single basic block,<br>
you&#39;ll notice that it&#39;s kept in memory the whole time.<br><br>We don&#39;t eliminate a lot of redundancies, even under SSA, because our JIT doesn&#39;t know how<br>to handle SIMD ops under that form. It&#39;s an open problem requiring some work. The same<br>
applies to our global register allocator.<br>