Prior to CLR 4.0 developers have no way of knowing why the runtime decided to disallow inlining or tail calls. Event tracing may provide the vehicle to inspect more closely what the CLR is doing.
There are a couple of new events exposed by the JIT to enable performance junkies to hurt themselves
This will create 2 files: dumpfile.xml and summary.txt.
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-DotNETRuntime" Guid="{e13c0d23-ccbc-4e12-931b-d9cc2eee27e4}" /> <EventID>185</EventID>
<Version>0</Version>
<Level>5</Level>
<Task>9</Task>
<Opcode>83</Opcode>
<Keywords>0x1000</Keywords>
<TimeCreated SystemTime="2009-04-14T14:31:52.168851900Z" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> <Execution ProcessID="15476" ThreadID="16936" ProcessorID="3" KernelTime="90" UserTime="60" />
<Channel />
<Computer />
</System>
<UserData>
<MethodJitInliningSucceeded xmlns='myNs'>
<MethodBeingCompiledNamespace>Factorial</MethodBeingCompiledNamespace>
<MethodBeingCompiledName>Main</MethodBeingCompiledName>
<MethodBeingCompiledNameSignature>void (class System.String[])</MethodBeingCompiledNameSignature>
<InlinerNamespace>Factorial</InlinerNamespace>
<InlinerName>Main</InlinerName>
<InlinerNameSignature>void (class System.String[])</InlinerNameSignature>
<InlineeNamespace>Factorial</InlineeNamespace>
<InlineeName>fact</InlineeName>
<InlineeNameSignature>unsigned int32 (unsigned int32)</InlineeNameSignature>
<ClrInstanceID>13</ClrInstanceID>
</MethodJitInliningSucceeded>
</UserData>
<RenderingInfo Culture="en-US">
<Level>Verbose </Level>
<Opcode>JitInliningSucceeded </Opcode>
<Keywords>
<Keyword>JitTracingKeyword </Keyword>
</Keywords>
<Task>CLR Method </Task>
<Message>MethodBeingCompiledNamespace=Factorial; MethodBeingCompiledName=Main;
MethodBeingCompiledNameSignature=void (class System.String[]); InlinerNamespace=Factorial;
InlinerName=Main; InlinerNameSignature=void (class System.String[]); InlineeNamespace=Factorial;
InlineeName=fact; InlineeNameSignature=unsigned int32 (unsigned int32); ClrInstanceID=13 </Message>
</RenderingInfo>
</Event>
The idea here is that you have visibility into how the code is jit-ed in the CLR.