diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-03-25 23:20:27 +0100 |
|---|---|---|
| committer | serpilliere <serpilliere@droids-corp.org> | 2020-02-14 21:42:38 +0100 |
| commit | 4ef1b5106662ea83da8309749402f267a4a9946c (patch) | |
| tree | fb187496699f11bf87cc388104a512626440a089 | |
| parent | 84eb94e9c72b67360ee3e1b8f1f089fe48fbacd8 (diff) | |
| download | miasm-4ef1b5106662ea83da8309749402f267a4a9946c.tar.gz miasm-4ef1b5106662ea83da8309749402f267a4a9946c.zip | |
DataFlow: fix updt phi
| -rw-r--r-- | miasm/analysis/data_flow.py | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/miasm/analysis/data_flow.py b/miasm/analysis/data_flow.py index e5aa2222..d8519bcd 100644 --- a/miasm/analysis/data_flow.py +++ b/miasm/analysis/data_flow.py @@ -1575,18 +1575,24 @@ def update_phi_with_deleted_edges(ircfg, edges_to_del): @edges_to_del: edges to delete """ + + phi_locs_to_srcs = {} + for loc_src, loc_dst in edges_to_del: + phi_locs_to_srcs.setdefault(loc_dst, set()).add(loc_src) + modified = False blocks = dict(ircfg.blocks) - for loc_src, loc_dst in edges_to_del: + for loc_dst, loc_srcs in viewitems(phi_locs_to_srcs): block = ircfg.blocks[loc_dst] - assert block.assignblks + if not irblock_has_phi(block): + continue assignblks = list(block) assignblk = assignblks[0] out = {} for dst, phi_sources in viewitems(assignblk): if not phi_sources.is_op('Phi'): - out = assignblk - break + out[dst] = phi_sources + continue var_to_parents = get_phi_sources_parent_block( ircfg, loc_dst, @@ -1595,7 +1601,8 @@ def update_phi_with_deleted_edges(ircfg, edges_to_del): to_keep = set(phi_sources.args) for src in phi_sources.args: parents = var_to_parents[src] - if loc_src in parents: + remaining = parents.difference(loc_srcs) + if not remaining: to_keep.discard(src) modified = True assert to_keep |