dotnet/roslyn

Remove unneccessary instructions from variable-less filter

Open

#4,388 opened on Aug 6, 2015

View on GitHub
 (4 comments) (0 reactions) (0 assignees)C# (4,257 forks)batch import
Area-CompilersConcept-Continuous ImprovementFeature Requesthelp wanted

Repository metrics

Stars
 (20,414 stars)
PR merge metrics
 (Avg merge 6d 17h) (256 merged PRs in 30d)

Description

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