Skip to content

Commit 6c51f50

Browse files
committed
ASTI: prune variables not used from the lifting
1 parent 875e336 commit 6c51f50

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

chb/astinterface/ASTICodeTransformer.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ class ASTICodeTransformer(ASTIdentityTransformer):
4747

4848
def __init__(
4949
self,
50-
astinterface: "ASTInterface") -> None:
50+
astinterface: "ASTInterface",
51+
variablesused: List[str] = []) -> None:
5152
self._astinterface = astinterface
53+
self._variablesused = variablesused
5254

5355
@property
5456
def astinterface(self) -> "ASTInterface":
@@ -58,6 +60,10 @@ def astinterface(self) -> "ASTInterface":
5860
def provenance(self) -> "ASTIProvenance":
5961
return self.astinterface.astiprovenance
6062

63+
@property
64+
def variables_used(self) -> List[str]:
65+
return self._variablesused
66+
6167
def transform_stmt(self, stmt: AST.ASTStmt) -> AST.ASTStmt:
6268
return stmt.transform(self)
6369

@@ -98,12 +104,6 @@ def transform_instruction_sequence_stmt(
98104
and not self.provenance.has_expose_instruction(instr.instrid)):
99105
chklogger.logger.info(
100106
"Remove [%s]: has ssa value", str(instr))
101-
elif self.provenance.has_active_lval_defuse_high(instr.lhs.lvalid):
102-
chklogger.logger.info(
103-
"Transform [%s]: active lval_defuse_high: %s",
104-
str(instr),
105-
self.provenance.active_lval_defuse_high(instr.lhs.lvalid))
106-
instrs.append(instr)
107107
elif self.provenance.has_lval_store(instr.lhs.lvalid):
108108
chklogger.logger.info(
109109
"Transform [%s]: lval_store", str(instr))
@@ -116,6 +116,15 @@ def transform_instruction_sequence_stmt(
116116
chklogger.logger.info(
117117
"Transform [%s]: global lhs", str(instr))
118118
instrs.append(instr)
119+
elif str(instr.lhs) not in self.variables_used:
120+
chklogger.logger.info(
121+
"Remove [%s]: lhs is not used")
122+
elif self.provenance.has_active_lval_defuse_high(instr.lhs.lvalid):
123+
chklogger.logger.info(
124+
"Transform [%s]: active lval_defuse_high: %s",
125+
str(instr),
126+
self.provenance.active_lval_defuse_high(instr.lhs.lvalid))
127+
instrs.append(instr)
119128
else:
120129
chklogger.logger.info("Transform [%s]: remove", str(instr))
121130
else:

chb/astinterface/ASTInterface.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -561,12 +561,14 @@ def add_symbol(
561561
name: str,
562562
vtype: Optional[AST.ASTTyp] = None,
563563
parameter: Optional[int] = None,
564-
globaladdress: Optional[int] = None) -> AST.ASTVarInfo:
564+
globaladdress: Optional[int] = None,
565+
ssa:bool = False) -> AST.ASTVarInfo:
565566
return self.astree.add_symbol(
566567
name,
567568
vtype=vtype,
568569
parameter=parameter,
569-
globaladdress=globaladdress)
570+
globaladdress=globaladdress,
571+
ssa=ssa)
570572

571573
def add_formal(
572574
self,
@@ -1050,7 +1052,7 @@ def mk_ssa_register_varinfo(
10501052
ssaid = self._ssa_prefix_counters[ssaprefix]
10511053
self._ssa_prefix_counters[ssaprefix] += 1
10521054
vname = ssaprefix + "_" + str(ssaid)
1053-
varinfo = self.add_symbol(vname, vtype=vtype)
1055+
varinfo = self.add_symbol(vname, vtype=vtype, ssa=True)
10541056
self._ssa_intros.setdefault(iaddr, {})
10551057
self._ssa_intros[iaddr][name] = varinfo
10561058
if save_loc:

chb/astinterface/ASTInterfaceFunction.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,13 @@ def mk_high_level_ast(
222222
annotations=self.astinterface.annotations)
223223
print(iprettyprinter.to_c(ast))
224224

225-
codetransformer = ASTICodeTransformer(self.astinterface)
225+
variablesused = ast.variables_used()
226+
227+
codetransformer = ASTICodeTransformer(self.astinterface, list(variablesused))
228+
transformedcode = codetransformer.transform_stmt(ast)
229+
230+
variablesused = transformedcode.variables_used()
231+
codetransformer = ASTICodeTransformer(self.astinterface, list(variablesused))
226232
transformedcode = codetransformer.transform_stmt(ast)
227233

228234
if self.verbose:

0 commit comments

Comments
 (0)