Skip to content
Snippets Groups Projects
Commit d3dfaa10 authored by Taddeus Kroes's avatar Taddeus Kroes
Browse files

Added dummy block to prevent DCE in library fucntion calls.

parent 5c33f2be
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,7 @@ from statement import Block
class BasicBlock(Block):
def __init__(self, statements=[]):
def __init__(self, statements=[], dummy=False):
Block.__init__(self, statements)
self.edges_to = []
self.edges_from = []
......@@ -10,6 +10,8 @@ class BasicBlock(Block):
self.dominates = []
self.dominated_by = []
self.dummy = dummy
def add_edge_to(self, block):
if block not in self.edges_to:
self.edges_to.append(block)
......@@ -58,13 +60,18 @@ def find_basic_blocks(statements):
blocks.append(BasicBlock(statements[leaders[-1]:]))
# Add a target block for unknown jump targets
blocks.append(BasicBlock([], dummy=True))
return blocks
def generate_flow_graph(blocks):
"""Add flow graph edge administration of an ordered sequence of basic
blocks."""
for i, b in enumerate(blocks):
dummy_block = blocks[-1]
for i, b in enumerate(blocks[:-1]):
last_statement = b[-1]
if last_statement.is_jump():
......@@ -72,9 +79,17 @@ def generate_flow_graph(blocks):
# Compare the target to all leading labels, add an edge if the
# label matches the jump target
for other in blocks:
target_found = False
for other in blocks[:-1]:
if other[0].is_label(target):
b.add_edge_to(other)
target_found = True
# If the jump target is outside the program, add an edge to the
# dummy block
if not target_found:
b.add_edge_to(dummy_block)
# A branch and jump-and-line instruction also creates an edge to
# the next block
......
......@@ -28,6 +28,11 @@ def create_use_def(block):
used = set()
defined = set()
if block.dummy:
block.use_set = set(['$4', '$5', '$6', '$7'])
block.def_set = set(['$2', '$3'])
return
# Get the last of each definition series and put in in the `def' set
block.use_set = set()
block.def_set = set()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment