• Kevin Modzelewski's avatar
    Fairly large refactor: do much more during the CFG lowering. · a404585d
    Kevin Modzelewski authored
    In particular, lower all control-flow-involving expressions (such as boolops,
    list comprehensions, if expressions) into actual control flow.  This requires
    unfolding the AST into a flat structure, since the control-flow-expression can
    be nested inside other expressions, including other control-flow-expressions.
    
    The IRGenerator was doing this before, but was leading to duplication because
    it's very similar to what the CFG generator already has to do.
    
    Doing this earlier in the pipeline means that more analysis passes can work on
    the lowered expressions, rather than having to be taught how they work.  In
    particular, the name analysis does not need to have to special case the fact
    that list comprehensions may set names -- but aren't guaranteed to if they don't
    get executed or the iterator is empty.  I tried implementing list comprehensions
    without doing this, and a bunch of the work was in reimplementing the logic that
    the analyzers already implement.
    
    As a side benefit, deopts become much easier since the AST is already unfolded;
    this change gets rid of the messy fake-variable-setting way that the IRGenerator
    was unfolding the AST to get this same effect.
    a404585d
ast.cpp 29 KB