dotnet/roslyn
Auf GitHub ansehenRemove unneccessary instructions from variable-less filter
Open
#4.388 geöffnet am 6. Aug. 2015
Area-CompilersConcept-Continuous ImprovementFeature Requesthelp wanted
Repository-Metriken
- Stars
- (20.414 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 6T 17h) (256 gemergte PRs in 30 T)
Beschreibung
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.