forked from M-Labs/artiq
remove legacy compiler test
This commit is contained in:
parent
6388b82455
commit
2d5114f32d
@ -1,166 +0,0 @@
|
||||
import unittest
|
||||
from artiq.compiler.analyses.domination import DominatorTree, PostDominatorTree
|
||||
|
||||
class MockBasicBlock:
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self._successors = []
|
||||
self._predecessors = []
|
||||
|
||||
def successors(self):
|
||||
return self._successors
|
||||
|
||||
def predecessors(self):
|
||||
return self._predecessors
|
||||
|
||||
def set_successors(self, successors):
|
||||
self._successors = list(successors)
|
||||
for block in self._successors:
|
||||
block._predecessors.append(self)
|
||||
|
||||
class MockFunction:
|
||||
def __init__(self, entry, basic_blocks):
|
||||
self._entry = entry
|
||||
self.basic_blocks = basic_blocks
|
||||
|
||||
def entry(self):
|
||||
return self._entry
|
||||
|
||||
def makefn(entry_name, graph):
|
||||
blocks = {}
|
||||
for block_name in graph:
|
||||
blocks[block_name] = MockBasicBlock(block_name)
|
||||
for block_name in graph:
|
||||
successors = list(map(lambda name: blocks[name], graph[block_name]))
|
||||
blocks[block_name].set_successors(successors)
|
||||
return MockFunction(blocks[entry_name], blocks.values())
|
||||
|
||||
def dom(function, domtree):
|
||||
dom = {}
|
||||
for block in function.basic_blocks:
|
||||
dom[block.name] = [dom_block.name for dom_block in domtree.dominators(block)]
|
||||
return dom
|
||||
|
||||
def idom(function, domtree):
|
||||
idom = {}
|
||||
for block in function.basic_blocks:
|
||||
idom_block = domtree.immediate_dominator(block)
|
||||
idom[block.name] = idom_block.name if idom_block else None
|
||||
return idom
|
||||
|
||||
class TestDominatorTree(unittest.TestCase):
|
||||
def test_linear(self):
|
||||
func = makefn('A', {
|
||||
'A': ['B'],
|
||||
'B': ['C'],
|
||||
'C': []
|
||||
})
|
||||
domtree = DominatorTree(func)
|
||||
self.assertEqual({
|
||||
'C': 'B', 'B': 'A', 'A': 'A'
|
||||
}, idom(func, domtree))
|
||||
self.assertEqual({
|
||||
'C': ['C', 'B', 'A'], 'B': ['B', 'A'], 'A': ['A']
|
||||
}, dom(func, domtree))
|
||||
|
||||
def test_diamond(self):
|
||||
func = makefn('A', {
|
||||
'A': ['C', 'B'],
|
||||
'B': ['D'],
|
||||
'C': ['D'],
|
||||
'D': []
|
||||
})
|
||||
domtree = DominatorTree(func)
|
||||
self.assertEqual({
|
||||
'D': 'A', 'C': 'A', 'B': 'A', 'A': 'A'
|
||||
}, idom(func, domtree))
|
||||
|
||||
def test_combined(self):
|
||||
func = makefn('A', {
|
||||
'A': ['B', 'D'],
|
||||
'B': ['C'],
|
||||
'C': ['E'],
|
||||
'D': ['E'],
|
||||
'E': []
|
||||
})
|
||||
domtree = DominatorTree(func)
|
||||
self.assertEqual({
|
||||
'A': 'A', 'B': 'A', 'C': 'B', 'D': 'A', 'E': 'A'
|
||||
}, idom(func, domtree))
|
||||
|
||||
def test_figure_2(self):
|
||||
func = makefn(5, {
|
||||
5: [3, 4],
|
||||
4: [1],
|
||||
3: [2],
|
||||
2: [1],
|
||||
1: [2]
|
||||
})
|
||||
domtree = DominatorTree(func)
|
||||
self.assertEqual({
|
||||
1: 5, 2: 5, 3: 5, 4: 5, 5: 5
|
||||
}, idom(func, domtree))
|
||||
|
||||
def test_figure_4(self):
|
||||
func = makefn(6, {
|
||||
6: [4, 5],
|
||||
5: [1],
|
||||
4: [3, 2],
|
||||
3: [2],
|
||||
2: [1, 3],
|
||||
1: [2]
|
||||
})
|
||||
domtree = DominatorTree(func)
|
||||
self.assertEqual({
|
||||
1: 6, 2: 6, 3: 6, 4: 6, 5: 6, 6: 6
|
||||
}, idom(func, domtree))
|
||||
|
||||
class TestPostDominatorTree(unittest.TestCase):
|
||||
def test_linear(self):
|
||||
func = makefn('A', {
|
||||
'A': ['B'],
|
||||
'B': ['C'],
|
||||
'C': []
|
||||
})
|
||||
domtree = PostDominatorTree(func)
|
||||
self.assertEqual({
|
||||
'A': 'B', 'B': 'C', 'C': None
|
||||
}, idom(func, domtree))
|
||||
|
||||
def test_diamond(self):
|
||||
func = makefn('A', {
|
||||
'A': ['B', 'D'],
|
||||
'B': ['C'],
|
||||
'C': ['E'],
|
||||
'D': ['E'],
|
||||
'E': []
|
||||
})
|
||||
domtree = PostDominatorTree(func)
|
||||
self.assertEqual({
|
||||
'E': None, 'D': 'E', 'C': 'E', 'B': 'C', 'A': 'E'
|
||||
}, idom(func, domtree))
|
||||
|
||||
def test_multi_exit(self):
|
||||
func = makefn('A', {
|
||||
'A': ['B', 'C'],
|
||||
'B': [],
|
||||
'C': []
|
||||
})
|
||||
domtree = PostDominatorTree(func)
|
||||
self.assertEqual({
|
||||
'A': None, 'B': None, 'C': None
|
||||
}, idom(func, domtree))
|
||||
|
||||
def test_multi_exit_diamond(self):
|
||||
func = makefn('A', {
|
||||
'A': ['B', 'C'],
|
||||
'B': ['D'],
|
||||
'C': ['D'],
|
||||
'D': ['E', 'F'],
|
||||
'E': [],
|
||||
'F': []
|
||||
})
|
||||
domtree = PostDominatorTree(func)
|
||||
self.assertEqual({
|
||||
'A': 'D', 'B': 'D', 'C': 'D', 'D': None, 'E': None, 'F': None
|
||||
}, idom(func, domtree))
|
Loading…
Reference in New Issue
Block a user