diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-03-19 14:09:15 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-03-20 16:34:59 +0100 |
| commit | 3d016cab115e57a8a080b93ebb6c5587d5c76a60 (patch) | |
| tree | 7791fb000c3146fe1f7d9b259ffca8dfbf1169a4 /miasm2/ir/analysis.py | |
| parent | 0f559212d30b58a4b9ee15491f7d0a684e59b257 (diff) | |
| download | miasm-3d016cab115e57a8a080b93ebb6c5587d5c76a60.tar.gz miasm-3d016cab115e57a8a080b93ebb6c5587d5c76a60.zip | |
IR/Analysis: remove unucessary fake additional in/out in liveness analysis
Diffstat (limited to 'miasm2/ir/analysis.py')
| -rw-r--r-- | miasm2/ir/analysis.py | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/miasm2/ir/analysis.py b/miasm2/ir/analysis.py index c6fc4948..55e66710 100644 --- a/miasm2/ir/analysis.py +++ b/miasm2/ir/analysis.py @@ -177,21 +177,15 @@ class ira: print 'IN', [str(x) for x in c_in] print 'OUT', [str(x) for x in c_out] - print 'OUT final', [str(x) for x in irb.c_out[-1]] def compute_in_out(self, irb): """Liveness computation for a single bloc @irb: irbloc instance Return True iff bloc state has changed """ - # get out/in from bloc sons modified = False - # set b in - if irb.c_in[-1] != set(irb.r[-1].union(irb.c_out[-1].difference(irb.w[-1]))): - modified = True - irb.c_in[-1] = set(irb.r[-1].union(irb.c_out[-1].difference(irb.w[-1]))) - # set b out + # Compute OUT for last irb entry c_out = set() has_son = False for n_son in self.g.successors(irb.label): @@ -204,20 +198,27 @@ class ira: son_c_in = self.blocs[n_son].c_in[0] c_out.update(son_c_in) if not has_son: - # special case: leaf nodes architecture dependant + # Special case: leaf nodes architecture dependant c_out = self.get_out_regs(irb) - if irb.c_out[-1] != set(c_out): + + if irb.c_out[-1] != c_out: + irb.c_out[-1] = c_out modified = True - irb.c_out[-1] = set(c_out) - # get out/in for bloc + # Compute out/in intra bloc for i in reversed(xrange(len(irb.irs))): - if irb.c_in[i] != set(irb.r[i].union(irb.c_out[i].difference(irb.w[i]))): + new_in = set(irb.r[i].union(irb.c_out[i].difference(irb.w[i]))) + if irb.c_in[i] != new_in: + irb.c_in[i] = new_in modified = True - irb.c_in[i] = set(irb.r[i].union(irb.c_out[i].difference(irb.w[i]))) - if irb.c_out[i] != set(irb.c_in[i + 1]): + + if i >= len(irb.irs) - 1: + # Last out has been previously updated + continue + new_out = set(irb.c_in[i + 1]) + if irb.c_out[i] != new_out: + irb.c_out[i] = new_out modified = True - irb.c_out[i] = set(irb.c_in[i + 1]) return modified |