view python/testgraph.py @ 279:2ccd57b1d78c

Fix register allocator to do burn2 OK
author Windel Bouwman
date Sat, 12 Oct 2013 09:56:23 +0200
parents 9fca39eebe50
children 02385f62f250
line wrap: on
line source

#!/usr/bin/python

import unittest
import graph
import interferencegraph
import flowgraph
import ir
import irmach


class GraphTestCase(unittest.TestCase):

    def testEdge(self):
        g = graph.Graph()
        n1 = graph.Node(g)
        g.addNode(n1)
        n2 = graph.Node(g)
        g.addNode(n2)
        g.addEdge(n1, n2)
        self.assertTrue(g.hasEdge(n2, n1))
        self.assertTrue(g.hasEdge(n1, n2))
        g.delNode(n1)
        g.delNode(n2)

    def testDegree(self):
        g = graph.Graph()
        n1 = graph.Node(g)
        g.addNode(n1)
        n2 = graph.Node(g)
        g.addNode(n2)
        n3 = graph.Node(g)
        g.addNode(n3)
        g.addEdge(n1, n2)
        g.addEdge(n1, n3)
        self.assertEqual(2, n1.Degree)
        self.assertEqual(1, n2.Degree)
        g.delNode(n2)
        self.assertEqual(1, n1.Degree)


class DigraphTestCase(unittest.TestCase):
    pass
        

class InterferenceGraphTestCase(unittest.TestCase):
    def testNormalUse(self):
        t1 = ir.Temp('t1')
        t2 = ir.Temp('t2')
        t3 = ir.Temp('t3')
        t4 = ir.Temp('t4')
        t5 = ir.Temp('t5')
        t6 = ir.Temp('t6')
        instrs = []
        instrs.append(irmach.makeIns('ld %d', dst=[t1]))
        instrs.append(irmach.makeIns('ld %d', dst=[t2]))
        instrs.append(irmach.makeIns('ld %d', dst=[t3]))
        cfg = flowgraph.FlowGraph(instrs)
        ig = interferencegraph.InterferenceGraph(cfg)

    def testCombine(self):
        t1 = ir.Temp('t1')
        t2 = ir.Temp('t2')
        t3 = ir.Temp('t3')
        t4 = ir.Temp('t4')
        instrs = []
        instrs.append(irmach.makeIns('ld %d0', dst=[t1]))
        instrs.append(irmach.makeIns('ld %d0', dst=[t2]))
        instrs.append(irmach.makeIns('ld %d0', dst=[t3]))
        instrs.append(irmach.makeIns('mov %d0, %s0', dst=[t4], src=[t3]))
        instrs.append(irmach.makeIns('st %s0', src=[t4]))
        instrs.append(irmach.makeIns('st %s0', src=[t1]))
        instrs.append(irmach.makeIns('st %s0', src=[t2]))
        cfg = flowgraph.FlowGraph(instrs)
        ig = interferencegraph.InterferenceGraph(cfg)
        ig.to_txt()
        ig.Combine(ig.getNode(t4), ig.getNode(t3))
        self.assertIs(ig.getNode(t4), ig.getNode(t3))
        print('after')
        ig.to_txt()


if __name__ == '__main__':
    unittest.main()