forked from M-Labs/artiq
transforms.cfg_simplifier: implement.
This allows error reporting in LocalAccessValidator to proceed even when the predecessor is an empty block with only a branch.
This commit is contained in:
parent
57ebd57ddb
commit
8822db089f
|
@ -55,6 +55,7 @@ class Module:
|
||||||
artiq_ir_generator = transforms.ARTIQIRGenerator(engine=self.engine,
|
artiq_ir_generator = transforms.ARTIQIRGenerator(engine=self.engine,
|
||||||
module_name=src.name,
|
module_name=src.name,
|
||||||
ref_period=ref_period)
|
ref_period=ref_period)
|
||||||
|
cfg_simplifier = transforms.CFGSimplifier(engine=self.engine)
|
||||||
dead_code_eliminator = transforms.DeadCodeEliminator(engine=self.engine)
|
dead_code_eliminator = transforms.DeadCodeEliminator(engine=self.engine)
|
||||||
local_access_validator = validators.LocalAccessValidator(engine=self.engine)
|
local_access_validator = validators.LocalAccessValidator(engine=self.engine)
|
||||||
devirtualization = analyses.Devirtualization()
|
devirtualization = analyses.Devirtualization()
|
||||||
|
@ -70,6 +71,7 @@ class Module:
|
||||||
devirtualization.visit(src.typedtree)
|
devirtualization.visit(src.typedtree)
|
||||||
self.artiq_ir = artiq_ir_generator.visit(src.typedtree)
|
self.artiq_ir = artiq_ir_generator.visit(src.typedtree)
|
||||||
artiq_ir_generator.annotate_calls(devirtualization)
|
artiq_ir_generator.annotate_calls(devirtualization)
|
||||||
|
cfg_simplifier.process(self.artiq_ir)
|
||||||
local_access_validator.process(self.artiq_ir)
|
local_access_validator.process(self.artiq_ir)
|
||||||
dead_code_eliminator.process(self.artiq_ir)
|
dead_code_eliminator.process(self.artiq_ir)
|
||||||
interleaver.process(self.artiq_ir)
|
interleaver.process(self.artiq_ir)
|
||||||
|
|
|
@ -4,5 +4,6 @@ from .int_monomorphizer import IntMonomorphizer
|
||||||
from .iodelay_estimator import IODelayEstimator
|
from .iodelay_estimator import IODelayEstimator
|
||||||
from .artiq_ir_generator import ARTIQIRGenerator
|
from .artiq_ir_generator import ARTIQIRGenerator
|
||||||
from .dead_code_eliminator import DeadCodeEliminator
|
from .dead_code_eliminator import DeadCodeEliminator
|
||||||
|
from .cfg_simplifier import CFGSimplifier
|
||||||
from .llvm_ir_generator import LLVMIRGenerator
|
from .llvm_ir_generator import LLVMIRGenerator
|
||||||
from .interleaver import Interleaver
|
from .interleaver import Interleaver
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
"""
|
||||||
|
:class:`CFGSimplifier` is a simple control flow graph
|
||||||
|
simplification transform: it removes empty basic blocks.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .. import ir
|
||||||
|
|
||||||
|
class CFGSimplifier:
|
||||||
|
def __init__(self, engine):
|
||||||
|
self.engine = engine
|
||||||
|
|
||||||
|
def process(self, functions):
|
||||||
|
for func in functions:
|
||||||
|
self.process_function(func)
|
||||||
|
|
||||||
|
def process_function(self, func):
|
||||||
|
for block in list(func.basic_blocks):
|
||||||
|
if len(block.instructions) == 1 and \
|
||||||
|
isinstance(block.terminator(), ir.Branch):
|
||||||
|
successor, = block.successors()
|
||||||
|
block.replace_all_uses_with(successor)
|
||||||
|
block.erase()
|
Loading…
Reference in New Issue