about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/ir/analysis.py31
-rw-r--r--miasm2/ir/ir.py11
2 files changed, 16 insertions, 26 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
 
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index 12318403..252f0ab3 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -86,17 +86,6 @@ class irbloc(object):
             self.c_in.append(set())
             self.l_out.append(set())
             self.l_in.append(set())
-        # get rw for dst
-        i = self.dst
-        r, w = set(), set()
-        if i is not None:
-            r.update([x for x in i.get_r(True) if isinstance(x, m2_expr.ExprId)])
-        self.r.append(r)
-        self.w.append(w)
-        self.c_out.append(set())
-        self.c_in.append(set())
-        self.l_out.append(set())
-        self.l_in.append(set())
 
     def __str__(self):
         o = []