diff options
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 |