about summary refs log tree commit diff stats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/analysis/unssa.py52
-rw-r--r--test/ir/reduce_graph.py41
2 files changed, 52 insertions, 41 deletions
diff --git a/test/analysis/unssa.py b/test/analysis/unssa.py
index ae9566ee..a796f3b6 100644
--- a/test/analysis/unssa.py
+++ b/test/analysis/unssa.py
@@ -1,14 +1,10 @@
 """ Test cases for dead code elimination"""
-from pdb import pm
-from pprint import pprint as pp
 from miasm2.expression.expression import ExprId, ExprInt, ExprAssign, ExprMem, \
-    ExprCond, ExprOp, ExprLoc
+    ExprCond, ExprLoc
 from miasm2.core.locationdb import LocationDB
-from miasm2.analysis.data_flow import DiGraphLivenessSSA, dead_simp, PropagateExpr
+from miasm2.analysis.simplifier import IRCFGSimplifierSSA
 from miasm2.ir.analysis import ira
 from miasm2.ir.ir import IRCFG, IRBlock, AssignBlock
-from miasm2.analysis.ssa import SSADiGraph
-from miasm2.analysis.outofssa import UnSSADiGraph
 
 loc_db = LocationDB()
 
@@ -595,6 +591,18 @@ def add_out_reg_end(ir_arch_a, ircfg_a):
 ir_arch_a = IRAOutRegs(loc_db)
 
 
+class CustomIRCFGSimplifierSSA(IRCFGSimplifierSSA):
+    def get_forbidden_regs(self):
+        """
+        Return a set of immutable register during SSA transformation
+        """
+        regs = set(
+            [
+                self.ir_arch.pc,
+                self.ir_arch.IRDst,
+            ]
+        )
+        return regs
 
 for test_nb, ircfg in enumerate(
         [
@@ -620,34 +628,8 @@ for test_nb, ircfg in enumerate(
 
     # SSA
     head = LBL0
-    ssa = SSADiGraph(ircfg)
-    ssa.transform(head)
-
-    ir_arch_a.ssa_var = ssa.ssa_variable_to_expr
-    dead_simp(ir_arch_a, ssa.graph)
-
-    open("ssa_%d.dot" % test_nb, "wb").write(ssa.graph.dot())
-
-
-
-    # Un SSA
-    ir_arch_a.ssa_var = ssa.ssa_variable_to_expr
-
-    propagate_expr = PropagateExpr()
-    modified = True
-    while modified:
-        modified = False
-        modified |= propagate_expr.propagate(ssa, head)
-
-    open('tmp_%d.dot' % test_nb, 'w').write(ssa.graph.dot())
-
-    cfg_liveness = DiGraphLivenessSSA(ssa.graph)
-    cfg_liveness.init_var_info(ir_arch_a)
-    cfg_liveness.compute_liveness()
-
-    open('liveness_%d.dot' % test_nb, 'w').write(cfg_liveness.dot())
-
-    unssa = UnSSADiGraph(ssa, head, cfg_liveness)
-    open('final_%d.dot' % test_nb, 'w').write(unssa.ssa.graph.dot())
+    simplifier = CustomIRCFGSimplifierSSA(ir_arch_a)
+    ircfg = simplifier(ircfg, head)
+    open('final_%d.dot' % test_nb, 'w').write(ircfg.dot())
 
     # XXX TODO: add real regression test
diff --git a/test/ir/reduce_graph.py b/test/ir/reduce_graph.py
index 29a3501f..75ff3410 100644
--- a/test/ir/reduce_graph.py
+++ b/test/ir/reduce_graph.py
@@ -321,17 +321,27 @@ G4_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
+        ]
+    ]
+)
+
+
+G4_RES_IRB1 = gen_irblock(
+    LBL1,
+    [
+        [
             ExprAssign(A, C),
         ],
         [
             ExprAssign(D, A),
-            ExprAssign(IRDst, ExprLoc(LBL0, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
 
 
-for irb in [G4_RES_IRB0 ]:
+for irb in [G4_RES_IRB0, G4_RES_IRB1 ]:
     G4_RES.add_irblock(irb)
 
 
@@ -389,15 +399,25 @@ for irb in [G5_IRB0, G5_IRB1, G5_IRB2, G5_IRB3]:
 # Result
 G5_RES = IRA.new_ircfg()
 
+
 G5_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
+        ]
+    ]
+)
+
+G5_RES_IRB1 = gen_irblock(
+    LBL1,
+    [
+        [
             ExprAssign(A, C),
         ],
         [
             ExprAssign(D, A),
-            ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL0, 32), ExprLoc(LBL3, 32))),
+            ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL1, 32), ExprLoc(LBL3, 32))),
         ]
     ]
 )
@@ -413,7 +433,7 @@ G5_RES_IRB3 = gen_irblock(
     ]
 )
 
-for irb in [G5_RES_IRB0, G5_RES_IRB3 ]:
+for irb in [G5_RES_IRB0, G5_RES_IRB1, G5_RES_IRB3 ]:
     G5_RES.add_irblock(irb)
 
 
@@ -605,14 +625,23 @@ G8_RES_IRB0 = gen_irblock(
     LBL0,
     [
         [
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
+        ]
+    ]
+)
+
+G8_RES_IRB1 = gen_irblock(
+    LBL1,
+    [
+        [
             ExprAssign(A, C),
-            ExprAssign(IRDst, ExprLoc(LBL0, 32)),
+            ExprAssign(IRDst, ExprLoc(LBL1, 32)),
         ]
     ]
 )
 
 
-for irb in [G8_RES_IRB0]:
+for irb in [G8_RES_IRB0, G8_RES_IRB1]:
     G8_RES.add_irblock(irb)