dotnet/roslyn
GitHub で見るRemove unneccessary instructions from variable-less filter
Open
#4,388 opened on 2015年8月6日
Area-CompilersConcept-Continuous ImprovementFeature Requesthelp wanted
Repository metrics
- Stars
- (20,414 stars)
- PR merge metrics
- (平均マージ 6d 17h) (30d で 256 merged PRs)
説明
When an exception filter doesn’t specify the exception variable, for example:
try { … } catch when (F()) { … }
we emit
filter
{
IL_0006: isinst [mscorlib]System.Object
IL_000b: dup
IL_000c: brtrue.s IL_0012
IL_000e: pop
IL_000f: ldc.i4.0
IL_0010: br.s IL_001b
IL_0012: pop
IL_0013: call bool ConsoleApplication1.Program::F()
IL_0018: ldc.i4.0
IL_0019: cgt.un
IL_001b: endfilter
} // end filter
The Object type check is unnecessary. The following IL sequence is verifiable and works equally well imo:
filter
{
IL_0012: pop
IL_0013: call bool ConsoleApplication1.Program::F()
IL_0018: ldc.i4.0
IL_0019: cgt.un
IL_001b: endfilter
} // end filter
Avoiding implicit reference to System.Object would simplify some low-level .NET Native scenarios that are layered below CoreFX and thus can't have a dependency on System.Object.