dotnet/roslyn

Remove unneccessary instructions from variable-less filter

Open

#4.388 geöffnet am 6. Aug. 2015

Auf GitHub ansehen
 (4 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)C# (4.257 Forks)batch import
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.

Contributor Guide