<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>I have a significant # of numerical routines that make use of vectors, matrices, etc.   I have observed that mono --llvm does seem not inline access in some situations where it reasonably could.   This means for a difference in performance of about 25% in my code.</div><div><br></div><div>I am using a 3rd party library for vector / matrix functionality that has a generic class  Vector<T>.   I have created a number of specializations of this class, such as:</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>class SpecialVector : Vector<double></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>...</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>public override double this[int i]</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>get { return _data[i]; }</div><div><span class="Apple-tab-span" style="white-space:pre">                     </span>set { _data[i] = value; }</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">           </span>public override double[] Data</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>{ get { return _data; } }</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">           </span>...</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">         </span>private double[] _data;</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div><br></div><div><br></div><div>I have a rather tight-looped numerical algorithm on a number of these vectors.  Such as:</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; "><font class="Apple-style-span" color="#113afc"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span style="color: rgb(17, 58, 252); "><span class="Apple-tab-span" style="white-space: pre; ">   </span>for</span> (<span style="color: rgb(17, 58, 252); ">int</span> i = <span style="color: rgb(187, 75, 211); ">0</span> ; i < len ; i++)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>{</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">             </span><span style="color: rgb(17, 58, 252); ">var</span> x = x[i];</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">               </span>...</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(106, 162, 24); font-family: Helvetica; font-size: medium; "><span class="Apple-style-span" style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">               </span><span style="color: rgb(17, 58, 252); ">for</span> (<span style="color: rgb(17, 58, 252); ">int</span> k = ileft; k <= iright; k++) </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">               </span>{</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                     </span><span style="color: rgb(17, 58, 252); ">var</span> xk = x[k];</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                      </span><span style="color: rgb(17, 58, 252); ">var</span> yk = y[k];</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                      </span>..</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">            </span>}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">             </span>...</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; "> </span>}</div><div><br></div></font></div></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; ">Where,  <b>x</b> and <b>y</b> are instances of these vectors.   x[i] and y[i] call the this[int] accessor on their respective vectors.   <b>Vector<double></b> defines <b>double this[int i]</b> as a virtual function.   </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; "><b><br></b></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; "><b>SpecialVector</b> is a sealed class, however.   Nevertheless, I realize a 25% increase in performance if I do the following:</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; "><br></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-tab-span" style="white-space:pre">        </span><b>var vx = x.Data;</b></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-tab-span" style="white-space:pre">  </span><b>var vy = y.Data;</b></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span style="color: rgb(17, 58, 252); "><span class="Apple-tab-span" style="white-space: pre; ">  </span>for</span> (<span style="color: rgb(17, 58, 252); ">int</span> i = <span style="color: rgb(187, 75, 211); ">0</span> ; i < len ; i++)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">     </span>{</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">          </span><span style="color: rgb(17, 58, 252); ">var</span> x = <b>vx</b>[i];</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                </span>...</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; color: rgb(106, 162, 24); font-family: Helvetica; font-size: medium; "><span class="Apple-style-span" style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">               </span><span style="color: rgb(17, 58, 252); ">for</span> (<span style="color: rgb(17, 58, 252); ">int</span> k = ileft; k <= iright; k++) </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">            </span>{</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                  </span><span style="color: rgb(17, 58, 252); ">var</span> xk = <b>vx</b>[k];</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                       </span><span style="color: rgb(17, 58, 252); ">var</span> yk = <b>vy</b>[k];</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">                       </span>..</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">         </span>}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">          </span>...</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Monaco; min-height: 15px; font-family: Helvetica; font-size: medium; "><span class="Apple-tab-span" style="white-space: pre; ">      </span>}</div><div><br></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; ">I suspect that mono / LLVM is not attempting inline <b>this[int i] </b>since is a virtual method, in spite of being trivially determined to be leaf class.  OR is there another reason why this is not inlined?</span></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; "><br></span></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; ">Should this be reported as a bug or feature request?  </span></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; "><br></span></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; ">Thanks</span></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; "><br></span></div><div><span class="Apple-style-span" style="font-family: Helvetica; font-size: medium; ">Jonathan</span></div></div></body></html>