• A
    Remove RemoveUnneededReferences from LamdaRewriter (#21367) · caa78300
    Andy Gocke 提交于
    Currently, the lambda rewriter has an early optimization pass in
    analysis that tries to find all local functions that only capture 'this'
    and remove references to local functions that do the same. There are two
    problems with this approach:
    
        1) Generally, removing information from the tree is a bad idea
        because it hurts further analysis passes that may have needed that
        information.
    
        2) The optimization strategy itself is very tricky and has a number
        of complex corner cases. This has lead to bugs, for example #19033.
    
    This PR deletes the current method and adds a new optimization routine
    at the end of the analysis, operating on assigned scopes and
    environments rather than removing captured variable analysis. The new
    optimization is as follows: if we end up with an environment containing
    only 'this', the environment can be removed, all containing methods can
    be moved to the top-level type, and all environments which capture the
    'this' environment can instead directly capture the 'this' parameter.
    This produces almost the same results as the previous optimization, but
    is easier to validate as an algebraic equivalence.
    
    The baseline changes come from the new optimization being less aggressive 
    about moving functions which only capture 'this' to the top level. This
    appears to be a wash -- some codegen gets slightly better, some gets
    slightly worse.
    
    Fixes #19033
    Fixes #20577
    caa78300
PDBLambdaTests.cs 54.9 KB