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
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
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
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
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
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
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
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