|
288 | 288 | module SimplVector = struct
|
289 | 289 | open Cfg
|
290 | 290 | open CL.Instr
|
| 291 | + open CL.R |
| 292 | + open CL.I |
291 | 293 |
|
292 | 294 | let rec int_of_ty = function
|
293 | 295 | | CL.Uint n -> n
|
@@ -576,6 +578,64 @@ module SimplVector = struct
|
576 | 578 | | _ -> h :: remove_nops t
|
577 | 579 | end
|
578 | 580 |
|
| 581 | + let rec get_evars epred = |
| 582 | + let rec aux e = |
| 583 | + begin |
| 584 | + match e with |
| 585 | + | Iconst _ -> [] |
| 586 | + | Ivar v -> [v] |
| 587 | + | Iunop (_, e') -> aux e' |
| 588 | + | Ibinop (e1, _, e2) -> |
| 589 | + (aux e1) @ (aux e2) |
| 590 | + | Ilimbs (_, el) -> List.flatten (List.map aux el) |
| 591 | + | IUnPack _ -> assert false |
| 592 | + end |
| 593 | + in |
| 594 | + match epred with |
| 595 | + | Eeq (e1, e2) -> |
| 596 | + let vl1 = aux e1 in |
| 597 | + let vl2 = aux e2 in |
| 598 | + vl1 @ vl2 |
| 599 | + | Eeqmod (e1, e2, eps) -> |
| 600 | + let vl1 = aux e1 in |
| 601 | + let vl2 = aux e2 in |
| 602 | + let vl3 = List.flatten (List.map aux eps) in |
| 603 | + vl1 @ vl2 @ vl3 |
| 604 | + |
| 605 | + let rec get_rvars rpred = |
| 606 | + let rec aux e = |
| 607 | + begin |
| 608 | + match e with |
| 609 | + | Rvar v -> [v] |
| 610 | + | Rconst _ -> [] |
| 611 | + | Ruext (e', _) -> aux e' |
| 612 | + | Rsext (e', _) -> aux e' |
| 613 | + | Runop (_, e') -> aux e' |
| 614 | + | Rbinop (e1, _, e2) -> (aux e1) @ (aux e2) |
| 615 | + | RVget (v, _) -> [v] |
| 616 | + | UnPack _ -> assert false |
| 617 | + | Rlimbs (_, el) -> List.flatten (List.map aux el) |
| 618 | + end |
| 619 | + in |
| 620 | + match rpred with |
| 621 | + | RPcmp (e1, _, e2) -> |
| 622 | + let vl1 = aux e1 in |
| 623 | + let vl2 = aux e2 in |
| 624 | + vl1 @ vl2 |
| 625 | + | RPnot e -> get_rvars e |
| 626 | + | RPand rps -> List.flatten (List.map get_rvars rps) |
| 627 | + | RPor rps -> List.flatten (List.map get_rvars rps) |
| 628 | + | RPeqsmod (e1, e2, e3) -> |
| 629 | + let vl1 = aux e1 in |
| 630 | + let vl2 = aux e2 in |
| 631 | + let vl3 = aux e3 in |
| 632 | + vl1 @ vl2 @ vl3 |
| 633 | + |
| 634 | + let get_ret_vars epreds rpreds = |
| 635 | + let epred_rvars = List.flatten (List.map get_evars epreds) in |
| 636 | + let rpred_vars = List.flatten (List.map get_rvars rpreds) in |
| 637 | + epred_rvars @ rpred_vars (* FIXME: remove dups *) |
| 638 | + |
579 | 639 | let simpl_cfg cfg ret_vars =
|
580 | 640 | sr_lvals cfg;
|
581 | 641 | let nI = getPrevI cfg in
|
|
0 commit comments