code: def optimize(node):
    
    node = dead_code_elimination(node)
    node = constant_folding(node)
    node = assignment_propagation(node)
    return node
docs: Perform a series of optimization passes.
  
    This function performs a series of optimizations (dead code elimination,
    constant folding, variable folding) on the given AST.
    It optimizes the code repeatedly until reaching a fixed point. The fixed
    point is determine roughly by checking whether the number of lines of
    generated source code changed after the latest pass.
  
    Args:
      node: The AST to optimize.
    Returns:
      The optimized AST.