예제 #1
0
 def test_optimize_block_movab(self):
     move = S('command', 'move', '$regA', '$regB')
     block = B([self.foo,
                move,
                self.bar])
     remove_redundancies(block)
     self.assertEquals(block.statements, [self.foo, move, self.bar])
예제 #2
0
    def test_optimize_block_shift_true(self):
        block = B([self.foo,
                   S('command', 'sll', '$regA', '$regA', 0),
                   self.bar])
        remove_redundancies(block)

        self.assertEquals(block.statements, [self.foo, self.bar])
예제 #3
0
    def test_optimize_block_movinst_false(self):
        statements = [self.foo, \
                      S('command', 'move', '$regA', '$regB'), \
                      S('command', 'addu', '$regD', '$regC', 2), \
                      self.bar]

        block = B(statements)
        remove_redundancies(block)
        self.assertEquals(block.statements, statements)
예제 #4
0
 def test_optimize_block_movinst_true(self):
     block = B([self.foo,
                S('command', 'move', '$regA', '$regB'),
                S('command', 'addu', '$regA', '$regA', 2),
                self.bar])
     remove_redundancies(block)
     self.assertEquals(block.statements, [self.foo,
                S('command', 'addu', '$regA', '$regB', 2),
                self.bar])
예제 #5
0
    def test_optimize_block_mov_mov_false(self):
        arguments = [self.foo, \
                     S('command', 'move', '$regA', '$regB'), \
                     S('command', 'move', '$regB', '$regC'), \
                     self.bar]
        block = B(arguments)
        remove_redundancies(block)

        self.assertEquals(block.statements, arguments)
예제 #6
0
    def test_optimize_block_instr_mov_jal_false(self):
        arguments = [self.foo, \
                     S('command', 'addu', '$regA', '$regC', 2), \
                     S('command', 'move', '$3', '$regA'), \
                     S('command', 'jal', 'L1'), \
                     self.bar]
        block = B(arguments)
        remove_redundancies(block)

        self.assertEquals(block.statements, arguments)
예제 #7
0
    def test_optimize_block_add_lw_true(self):
        block = B([self.foo,
                   S('command', 'addu', '$regA', '$regA', 10),
                   S('command', 'lw', '$regB', '0($regA)'),
                   self.bar])
        remove_redundancies(block)

        self.assertEquals(block.statements, [self.foo,
                   S('command', 'lw', '$regB', '10($regA)'),
                   self.bar])
예제 #8
0
def optimize_block(block):
    """Optimize a basic block using a Program object."""
#    program = Program([])

#    program.blocks = [block]
#    del program.statements

#   program.optimize_blocks()

    remove_redundancies(block)
    eliminate_common_subexpressions(block)
    fold_constants(block)
    copy_propagation(block)

    return program.blocks
예제 #9
0
    def test_optimize_block_shift_false(self):
        arguments = [self.foo, \
                     S('command', 'sll', '$regA', '$regB', 0), \
                     self.bar]
        block = B(arguments)
        remove_redundancies(block)

        self.assertEquals(block.statements, arguments)

        arguments2 = [self.foo, \
                     S('command', 'sll', '$regA', '$regA', 1), \
                     self.bar]
        block2 = B(arguments2)
        remove_redundancies(block2)

        self.assertEquals(block2.statements, arguments2)
예제 #10
0
    def test_optimize_block_add_lw_false(self):
        arguments = [self.foo, \
                     S('command', 'addu', '$regA', '$regA', 10), \
                     S('command', 'lw', '$regB', '0($regC)'), \
                     self.bar]
        block = B(arguments)
        remove_redundancies(block)

        arguments2 = [self.foo, \
                     S('command', 'addu', '$regA', '$regB', 10), \
                     S('command', 'lw', '$regB', '0($regA)'), \
                     self.bar]
        block2 = B(arguments2)

        arguments3 = [self.foo, \
                     S('command', 'addu', '$regA', '$regA', 10), \
                     S('command', 'lw', '$regB', '1($regA)'), \
                     self.bar]
        block3 = B(arguments3)
        remove_redundancies(block3)

        self.assertEquals(block.statements, arguments)
        self.assertEquals(block2.statements, arguments2)
        self.assertEquals(block3.statements, arguments3)