Commit a2133db3 authored by Jayke Meijer's avatar Jayke Meijer

Fixed merge conflict.

parents a2a424d0 030e9754
acron
clinpack
dhrystone
pi
slalom
whet
...@@ -6,11 +6,14 @@ ...@@ -6,11 +6,14 @@
# -mgas -mgpOPT # -mgas -mgpOPT
# Cc1 arguments (-G value = 8, Cpu = default, ISA = 1): # Cc1 arguments (-G value = 8, Cpu = default, ISA = 1):
# -quiet -dumpbase -o # -quiet -dumpbase -O0 -o
gcc2_compiled.: gcc2_compiled.:
__gnu_compiled_c: __gnu_compiled_c:
.sdata .sdata
.align 2
$LC2:
.ascii "e: %d\n\000"
.align 3 .align 3
$LC0: $LC0:
.word 0x00000000 # 2 .word 0x00000000 # 2
...@@ -25,7 +28,7 @@ $LC1: ...@@ -25,7 +28,7 @@ $LC1:
.text .text
.loc 1 2 .loc 1 3
.ent main .ent main
main: main:
.frame $fp,64,$31 # vars= 40, regs= 2/0, args= 16, extra= 0 .frame $fp,64,$31 # vars= 40, regs= 2/0, args= 16, extra= 0
...@@ -53,6 +56,9 @@ main: ...@@ -53,6 +56,9 @@ main:
s.d $f0,40($fp) s.d $f0,40($fp)
li $2,0x00000061 # 97 li $2,0x00000061 # 97
sb $2,48($fp) sb $2,48($fp)
la $4,$LC2
lw $5,28($fp)
jal printf
move $2,$0 move $2,$0
j $L1 j $L1
$L1: $L1:
......
int main(void) #include <stdio.h>
{
int main(void) {
int x = 1, b = 5, d = x + b, e = x + 10; int x = 1, b = 5, d = x + b, e = x + 10;
double y = 2., z = 3.5; double y = 2., z = 3.5;
char c = 'a'; char c = 'a';
printf("e: %d\n", e); // 11
return 0; return 0;
} }
...@@ -11,6 +11,10 @@ class BasicBlock(Block): ...@@ -11,6 +11,10 @@ class BasicBlock(Block):
self.dominates = [] self.dominates = []
self.dominated_by = [] self.dominated_by = []
self.in_set = set([])
self.out_set = set([])
self.gen_set = set([])
self.kill_set = set([])
def add_edge_to(self, block): def add_edge_to(self, block):
if block not in self.edges_to: if block not in self.edges_to:
...@@ -23,17 +27,38 @@ class BasicBlock(Block): ...@@ -23,17 +27,38 @@ class BasicBlock(Block):
block.dominated_by.append(self) block.dominated_by.append(self)
def get_gen(self): def get_gen(self):
pass for s in self.statements:
if s.is_arith():
self.gen_set.add(s[0])
print 'added: ', s[0]
return self.gen_set
def get_kill(self): def get_kill(self):
pass # if self.edges_from != []:
for backw in self.edges_from:
self.kill_set = self.kill_set | backw.get_kill()
self.kill_set = self.kill_set - self.get_gen()
print 'get_kill_set', self.kill_set
return self.kill_set
def get_in(self): def get_in(self):
pass for backw in self.edges_from:
self.in_set = self.in_set | backw.get_out()
print 'in_set', self.in_set
return self.in_set
def get_out(self): def get_out(self):
pass print 'gen_set', self.gen_set
print 'get_in', self.get_in()
print 'get_kill', self.get_kill()
self.out_set = self.gen_set | (self.get_in() - self.get_kill())
def reaching_definition(blocks):
generate_flow_graph(blocks)
def find_leaders(statements): def find_leaders(statements):
"""Determine the leaders, which are: """Determine the leaders, which are:
......
...@@ -8,6 +8,11 @@ def create_variable(): ...@@ -8,6 +8,11 @@ def create_variable():
def eliminate_common_subexpressions(block): def eliminate_common_subexpressions(block):
""" """
Common subexpression elimination: Common subexpression elimination:
x = a + b -> u = a + b
y = a + b x = u
y = u
The algorithm used is as follows:
- Traverse through the statements in reverse order. - Traverse through the statements in reverse order.
- If the statement can be possibly be eliminated, walk further collecting - If the statement can be possibly be eliminated, walk further collecting
all other occurrences of the expression until one of the arguments is all other occurrences of the expression until one of the arguments is
...@@ -65,7 +70,11 @@ def to_hex(value): ...@@ -65,7 +70,11 @@ def to_hex(value):
def fold_constants(block): def fold_constants(block):
""" """
Constant folding: Constant folding:
- An immidiate load defines a register value: x = 3 + 5 -> x = 8
y = x * 2 y = 16
To keep track of constant values, the following assumptions are made:
- An immediate load defines a register value:
li $reg, XX -> register[$reg] = XX li $reg, XX -> register[$reg] = XX
- Integer variable definition is of the following form: - Integer variable definition is of the following form:
li $reg, XX -> constants[VAR] = XX li $reg, XX -> constants[VAR] = XX
......
...@@ -23,6 +23,35 @@ class TestDataflow(unittest.TestCase): ...@@ -23,6 +23,35 @@ class TestDataflow(unittest.TestCase):
self.assertEqual(map(lambda b: b.statements, find_basic_blocks(s)), \ self.assertEqual(map(lambda b: b.statements, find_basic_blocks(s)), \
[B(s[:2]).statements, B(s[2:4]).statements, \ [B(s[:2]).statements, B(s[2:4]).statements, \
B(s[4:]).statements]) B(s[4:]).statements])
# def test_get_gen(self):
# b1 = B([S('command', 'add', '$1', '$2', '$3'), \
# S('command', 'add', '$2', '$3', '$4'), \
# S('command', 'add', '$1', '$4', '$5')])
#
# self.assertEqual(b1.get_gen(), ['$1', '$2'])
# def test_get_out(self):
# b1 = B([S('command', 'add', '$1', '$2', '$3'), \
# S('command', 'add', '$2', '$3', '$4'), \
# S('command', 'add', '$1', '$4', '$5'), \
# S('command', 'j', 'b2')])
#
# b2 = B([S('command', 'add', '$3', '$5', '$6'), \
# S('command', 'add', '$1', '$2', '$3'), \
# S('command', 'add', '$6', '$4', '$5')])
#
# blocks = [b1, b2]
#
# for block in blocks:
# block.out_set = block.get_gen()
# print 'block.out_set', block.out_set
# generate_flow_graph(blocks)
# print b1.get_gen()
# print b2.get_gen()
# print b2.get_out()
def test_generate_flow_graph_simple(self): def test_generate_flow_graph_simple(self):
b1 = B([S('command', 'foo'), S('command', 'j', 'b2')]) b1 = B([S('command', 'foo'), S('command', 'j', 'b2')])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment