Ejemplo n.º 1
0
def perform_local_optimizations(elems: List,
                                identifier_generator: Iterator[str],
                                apply_transformation: Callable[[List, Transformation], Tuple[List, bool]],
                                describe_elems: Callable[[List], str],
                                inline_template_instantiations_with_multiple_references: bool):
    optimizations = [
        ('remove_no_op_stmts()', RemoveNoOpStmtsTransformation(identifier_generator)),
        ('normalize_template_defn()', NormalizeExpressionsTransformation(identifier_generator)),
        ('perform_common_subexpression_normalization()', CommonSubexpressionEliminationTransformation()),
        ('perform_constant_folding()', ConstantFoldingTransformation(inline_template_instantiations_with_multiple_references)),
        ('perform_expression_simplification()', ExpressionSimplificationTransformation()),
    ]

    optimizations = [lambda elems,
                            optimization_name=optimization_name,
                            transformation=transformation:
                     apply_elem_optimization(elems,
                                             lambda: apply_transformation(elems, transformation),
                                             describe_elems,
                                             optimization_name)
                     for optimization_name, transformation in optimizations]

    return combine_optimizations(elems, optimizations)
Ejemplo n.º 2
0
 def optimize(template_name: str):
     new_template_defns[
         template_name], needs_another_loop = combine_optimizations(
             new_template_defns[template_name], optimizations)
     return None, needs_another_loop
Ejemplo n.º 3
0
def _optimize_header_second_pass(
        header: ir.Header, identifier_generator: Iterator[str],
        context_object_file_content: ObjectFileContent):
    new_template_defns = {elem.name: elem for elem in header.template_defns}

    template_dependency_graph = compute_template_dependency_graph(
        header.template_defns, new_template_defns)

    template_dependency_graph_transitive_closure = nx.transitive_closure(
        template_dependency_graph)
    assert isinstance(template_dependency_graph_transitive_closure, nx.DiGraph)

    optimizations = [
        lambda template_defn: perform_template_inlining(
            template_defn, {
                other_node
                for other_node in template_dependency_graph_transitive_closure.
                successors(template_defn.name)
                if not template_dependency_graph_transitive_closure.has_edge(
                    other_node, template_defn.name)
            }, new_template_defns, identifier_generator,
            context_object_file_content),
        lambda template_defn: perform_local_optimizations_on_template_defn(
            template_defn,
            identifier_generator,
            inline_template_instantiations_with_multiple_references=False),
    ]

    for connected_component in reversed(
            list(
                compute_condensation_in_topological_order(
                    template_dependency_graph))):

        def optimize(template_name: str):
            new_template_defns[
                template_name], needs_another_loop = combine_optimizations(
                    new_template_defns[template_name], optimizations)
            return None, needs_another_loop

        _iterate_optimization(
            None, lambda _: optimize_list(
                sorted(connected_component,
                       key=lambda node: new_template_defns[node].name), lambda
                template_name: optimize(template_name)),
            len(connected_component), lambda _: '\n'.join(
                template_defn_to_cpp_simple(new_template_defns[template_name],
                                            identifier_generator)
                for template_name in connected_component))

    optimizations = [
        lambda toplevel_content: perform_template_inlining_on_toplevel_elems(
            toplevel_content, new_template_defns.keys(), new_template_defns,
            identifier_generator, context_object_file_content),
        lambda toplevel_content: perform_local_optimizations_on_toplevel_elems(
            toplevel_content,
            identifier_generator,
            inline_template_instantiations_with_multiple_references=False),
    ]

    toplevel_content = _iterate_optimization(
        header.toplevel_content, lambda toplevel_content:
        combine_optimizations(toplevel_content, optimizations),
        len(header.toplevel_content), lambda toplevel_content: '\n'.join(
            toplevel_elem_to_cpp_simple(elem, identifier_generator)
            for elem in toplevel_content))

    return ir.Header(
        template_defns=tuple(new_template_defns[template_defn.name]
                             for template_defn in header.template_defns),
        toplevel_content=toplevel_content,
        public_names=header.public_names,
        split_template_name_by_old_name_and_result_element_name=header.
        split_template_name_by_old_name_and_result_element_name,
        check_if_error_specializations=header.check_if_error_specializations)