示例#1
0
    def _transform_toplevel_elems(self, elems: List[Union[ir0.StaticAssert,
                                                          ir0.ConstantDef,
                                                          ir0.Typedef]],
                                  identifier_generator: Iterator[str]):

        name_by_expr = dict()  # type: Dict[ir0.Expr, str]
        replacements = dict()  # type: Dict[str, str]
        type_by_name = dict()  # type: Dict[str, ir0.ExprType]

        result_elems = []
        for elem in elems:
            writer = transform_ir0.ToplevelWriter(identifier_generator,
                                                  allow_template_defns=False)
            NameReplacementTransformation(
                replacements).transform_toplevel_elem(elem, writer)
            [elem] = writer.toplevel_elems

            if isinstance(
                    elem,
                (ir0.ConstantDef, ir0.Typedef)) and elem.expr in name_by_expr:
                replacements[elem.name] = name_by_expr[elem.expr]
                type_by_name[elem.name] = elem.expr.type
            else:
                result_elems.append(elem)
                if isinstance(elem, (ir0.ConstantDef, ir0.Typedef)):
                    name_by_expr[elem.expr] = elem.name

        return result_elems
示例#2
0
def perform_common_subexpression_normalization(
        template_defn: ir0.TemplateDefn, identifier_generator: Iterator[str]):
    writer = transform_ir0.ToplevelWriter(identifier_generator,
                                          allow_toplevel_elems=False)
    CommonSubexpressionEliminationTransformation().transform_template_defn(
        template_defn, writer)
    [template_defn] = writer.template_defns
    return template_defn
示例#3
0
def replace_var_with_expr(elem: ir0.TemplateBodyElement, var: str,
                          expr: ir0.Expr) -> ir0.TemplateBodyElement:
    toplevel_writer = transform_ir0.ToplevelWriter(identifier_generator=[],
                                                   allow_template_defns=False,
                                                   allow_toplevel_elems=False)
    writer = transform_ir0.TemplateBodyWriter(toplevel_writer)
    ReplaceVarWithExprTransformation(var, expr).transform_template_body_elem(
        elem, writer)
    [elem] = writer.elems
    return elem
示例#4
0
    def perform_optimization():
        transformation = TemplateInstantiationInliningTransformation({
            template_name: template_defn_by_name[template_name]
            for template_name in inlineable_refs
        })

        writer = transform_ir0.ToplevelWriter(identifier_generator,
                                              allow_toplevel_elems=False)
        transformation.transform_template_defn(template_defn, writer)
        [new_template_defn] = writer.template_defns
        return new_template_defn
示例#5
0
def perform_constant_folding(
        template_defn: ir0.TemplateDefn, identifier_generator: Iterator[str],
        inline_template_instantiations_with_multiple_references: bool):
    writer = transform_ir0.ToplevelWriter(identifier_generator,
                                          allow_toplevel_elems=False)
    transformation = ConstantFoldingTransformation(
        inline_template_instantiations_with_multiple_references=
        inline_template_instantiations_with_multiple_references)
    transformation.transform_template_defn(template_defn, writer)
    [template_defn] = writer.template_defns
    return template_defn
示例#6
0
def normalize_template_defn(template_defn: ir0.TemplateDefn,
                            identifier_generator: Iterator[str]):
    '''Converts template_defn to an equivalent TemplateDefn where all expressions contain 0 or 1 operations.

  Unlike other constants/typedefs, the exprs that initialize "result" and "error" will always have 0 operations.
  '''
    writer = transform_ir0.ToplevelWriter(identifier_generator,
                                          allow_toplevel_elems=False)
    ExprSimplifyingTransformation().transform_template_defn(
        template_defn, writer)
    [new_template_defn] = writer.template_defns

    return new_template_defn
示例#7
0
def normalize_toplevel_elems(toplevel_elems: List[Union[ir0.StaticAssert,
                                                        ir0.ConstantDef,
                                                        ir0.Typedef]],
                             identifier_generator: Iterator[str]):
    '''Converts template_defn to an equivalent TemplateDefn where all expressions contain 0 or 1 operations.

  Unlike other constants/typedefs, the exprs that initialize "result" and "error" will always have 0 operations.
  '''
    writer = transform_ir0.ToplevelWriter(identifier_generator,
                                          allow_template_defns=False)
    for toplevel_elem in toplevel_elems:
        ExprSimplifyingTransformation().transform_toplevel_elem(
            toplevel_elem, writer)

    return writer.toplevel_elems
示例#8
0
def _elem_can_trigger_static_asserts(stmt: ir0.TemplateBodyElement):
    writer = transform_ir0.ToplevelWriter(identifier_generator=iter([]))
    transformation = CanTriggerStaticAsserts()
    transformation.transform_template_body_elems([stmt], writer)
    return transformation.can_trigger_static_asserts