-
Notifications
You must be signed in to change notification settings - Fork 0
/
my_trivial_dce.py
83 lines (72 loc) · 2.1 KB
/
my_trivial_dce.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import json
import sys
def get_basic_blocks(_code):
blocks = dict()
for func in _code["functions"]:
blocks[func["name"]] = []
new_block = []
fun_len = len(func["instrs"]) - 1
for instr_idx, instr in enumerate(func["instrs"]):
if "label" in instr:
if not new_block == []:
blocks[func["name"]].append(new_block)
new_block = [instr]
continue
new_block.append(instr)
if is_breaking_block(instr):
blocks[func["name"]].append(new_block)
new_block = []
continue
if instr_idx == fun_len:
blocks[func["name"]].append(new_block)
new_block = []
continue
if not new_block == []:
blocks[func["name"]].append(new_block)
return blocks
def is_breaking_block(_instr):
is_breaking = False
if _instr["op"] == "jmp" or _instr["op"] == "br" or _instr["op"] == "ret":
is_breaking = True
return is_breaking
def dce(_code):
for func_idx, func in enumerate(_code["functions"]):
defs = []
uses = []
for instr_idx, instr in enumerate(func["instrs"]):
if "dest" in instr:
defs.append(instr["dest"])
if "args" in instr:
for arg in instr["args"]:
if not arg in uses:
uses.append(arg)
for instr_idx, instr in enumerate(func["instrs"]):
if "dest" in instr:
if not instr["dest"] in uses:
del _code["functions"][func_idx]["instrs"][instr_idx]
return _code
def convert_to_Bril(_blocks, _org_code):
opt_code = {}
opt_code["functions"] = []
funcs = list(_blocks.keys())
for func_idx, func in enumerate(funcs):
new_func = {}
new_func["name"] = func
if "args" in _org_code["functions"][func_idx]:
new_func["args"] = _org_code["functions"][func_idx]["args"]
if "type" in _org_code["functions"][func_idx]:
new_func["type"] = _org_code["functions"][func_idx]["type"]
instrs = []
for _block in _blocks[func]:
instrs = instrs + _block
new_func["instrs"] = instrs
opt_code["functions"].append(new_func)
return opt_code
if __name__ == "__main__":
code = json.load(sys.stdin)
output = dce(code)
#print("after")
#print(output)
#print("Output is")
#print(output)
json.dump(output, sys.stdout, indent=2, sort_keys=True)