dotnet/roslyn

Remove unneccessary instructions from variable-less filter

Open

#4.388 aberto em 6 de ago. de 2015

Ver no GitHub
 (4 comments) (0 reactions) (0 assignees)C# (4.257 forks)batch import
Area-CompilersConcept-Continuous ImprovementFeature Requesthelp wanted

Métricas do repositório

Stars
 (20.414 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (256 fundiu PRs em 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.

Guia do colaborador