[Mono-dev] mono / llvm inlining situations (or failures thereof)

Jonathan Shore jonathan.shore at gmail.com
Tue Jul 17 13:49:14 UTC 2012


Thanks, I have verified that the indexer below does not inline, even when setting MONO_INLINELIMIT.  Will try to construct a test case.  

I noticed that Vector<T> (from the OSS MathNet.Numerics project) does have 2 statically initialized values.  I am not sure if either of these would block inlining:

http://mathnetnumerics.codeplex.com/SourceControl/changeset/view/b3dd68f35869#src%2fNumerics%2fLinearAlgebra%2fGeneric%2fVector.cs

	private static readonly T Zero = default(T);
	private static readonly T One = Common.SetOne<T>();

If these are the blockers and there is no reasonably simple way to address, I may have to switch matrix libraries.   Not being able to have inlined operations on the accessor reduces my performance by about 80% (my previous assessment of 25% was wrong).


On Jul 16, 2012, at 2:45 PM, Rodrigo Kumpera wrote:

> You can use the MONO_VERBOSE_METHOD env var. 
> It takes a method name but try a method spec to further narrow the massive JIT spew this produces if you have multiple matches.
> 
> 
> On Mon, Jul 16, 2012 at 3:29 PM, Jonathan Shore <jonathan.shore at gmail.com> wrote:
> 
> On Jul 16, 2012, at 2:11 PM, Rodrigo Kumpera wrote:
> 
>> 
>> 
>> On Mon, Jul 16, 2012 at 2:45 PM, Jonathan Shore <jonathan.shore at gmail.com> wrote:
>> Hi Rodrigo,
>> 
>> I have played with the MONO_INLINELIMIT env variable (just discovered in the mono code a couple of days ago).  It solved some of my other inlining issues.   The AggressiveInlining option should be helpful for methods in 4.5 (I'm still on 4.0), though I don't believe the attribute can be used on properties, even though they are effectively methods (or am I wrong here).
>> 
>> 
>> You mentioned "we don't inline methods that call other methods" and suggested might be the case in my code.   I am simply indexing the get method in:
>> 
>> public override double this[int i]
>> {
>> 	get { return _data[i]; }
>> 	set { _data[i]  = value; }
>> }
>> 
>> I thought that since this is an override, though on a leaf / sealed class, perhaps mono could not handle this case.   Not sure where indexing on this property would hit the "call another method" case.
>> 
>> This should probably inline fine. Can you provide a small and complete sample where this does happen? Your problem sounds really odd.
> 
> I did not try the MONO_INLINELIMIT with this particular problem.  I manually inlined this one prior to posting and later applied the env variable for a different inlining issue after posting.   It seems like the default limit is perhaps too low (or too low for my application, I am OK with using the env variable however).  
> 
> I'll reverse the change and give the env variable a go with the above.   Also, let me check the hierarchy of this class and see whether there is any static construction.   
> 
> If there is nothing obvious, will try to arrange a test case over the next few days.   Will be a bit tricky to arrange test, possibly, due to the class environment.   With luck, can demonstrate with a simple test.
> 
> Finally, how do I see the generated llvm x86 code.  Can I do this with monodis?   I know I can see the IL   Thus far have been testing by noting the runtime.
> 
>> 
>>  
>> If I understand this better, I can investigate / suggest some new feature re: inlining.
>> 
>>  
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20120717/f8d0f5e9/attachment-0001.html>


More information about the Mono-devel-list mailing list