diff --git a/compiler/__main__.py b/compiler/__main__.py index dc02db9..4da8d37 100644 --- a/compiler/__main__.py +++ b/compiler/__main__.py @@ -77,7 +77,7 @@ def main(): intermediate_representation.pretty_print() - print(ir.IRRegister.get_registers()) + ir.IRRegister.pprint() except CompilationError as e: e.location.source = tokens.data diff --git a/compiler/ir.py b/compiler/ir.py index 3f64761..52005b2 100644 --- a/compiler/ir.py +++ b/compiler/ir.py @@ -1,6 +1,7 @@ from __future__ import annotations import abc +import collections from abc import abstractmethod from . import nodes @@ -169,12 +170,17 @@ class IRRegister(IRAssignable): return f"%r{self.id}" @classmethod - def get_registers(cls) -> str: + def pprint(cls): messages = [] + by_codegen = collections.defaultdict(lambda: []) for register in cls.registers.values(): - messages += [f"%r{register.id} -> {register.codegen()}"] + by_codegen[register.codegen()] += [register.id] - return "\n".join(messages) + for remapped_name, registers in by_codegen.items(): + register_names = (f"%r{register}" for register in registers) + messages += [f"Remapped {', '.join(register_names)} to {remapped_name}"] + + print("\n".join(messages)) class IRVariable(IRAssignable):