Skip to content

Commit 788a096

Browse files
committed
Compiler: remove quadratic behavior in enqueue
1 parent a8c5ef5 commit 788a096

File tree

1 file changed

+42
-41
lines changed

1 file changed

+42
-41
lines changed

compiler/lib/generate.ml

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -527,22 +527,6 @@ let access_queue' ~ctx queue x =
527527
(const_p, js), queue
528528
| Pv x -> access_queue queue x
529529

530-
let access_queue_may_flush queue v x =
531-
let tx, queue = access_queue queue x in
532-
let _, instrs, queue =
533-
List.fold_left
534-
queue
535-
~init:(Code.Var.Set.singleton v, [], [])
536-
~f:(fun (deps, instrs, queue) ((y, elt) as eq) ->
537-
if not (Code.Var.Set.disjoint deps elt.deps)
538-
then
539-
( Code.Var.Set.add y deps
540-
, (J.variable_declaration [ J.V y, (elt.ce, elt.loc) ], elt.loc) :: instrs
541-
, queue )
542-
else deps, instrs, eq :: queue)
543-
in
544-
instrs, (tx, List.rev queue)
545-
546530
let should_flush (cond, _) prop = cond <> fst const_p && cond + prop >= fst flush_p
547531

548532
let flush_queue expr_queue prop (l : J.statement_list) =
@@ -566,10 +550,6 @@ let enqueue expr_queue prop x ce loc acc =
566550
else flush_queue expr_queue flush_p []
567551
in
568552
let prop, deps = prop in
569-
let deps =
570-
List.fold_left expr_queue ~init:deps ~f:(fun deps (x', elt) ->
571-
if Code.Var.Set.mem x' deps then Code.Var.Set.union elt.deps deps else deps)
572-
in
573553
instrs @ acc, (x, { prop; deps; ce; loc }) :: expr_queue
574554

575555
(****)
@@ -736,23 +716,38 @@ let visit_all params args =
736716
in
737717
l
738718

739-
let parallel_renaming params args continuation queue =
740-
let l = List.rev (visit_all params args) in
741-
List.fold_left
742-
l
743-
~f:(fun continuation (y, x) queue ->
744-
let instrs, ((px, cx), queue) = access_queue_may_flush queue y x in
745-
let st, queue =
746-
flush_queue
747-
queue
748-
px
749-
(instrs @ [ J.variable_declaration [ J.V y, (cx, J.N) ], J.N ])
750-
in
751-
let never, code = continuation queue in
752-
never, st @ code)
753-
~init:continuation
754-
queue
755-
719+
let parallel_renaming back_edge params args continuation queue =
720+
let l = visit_all params args in
721+
let queue, before, renaming, _ =
722+
List.fold_left
723+
l
724+
~init:(queue, [], [], Code.Var.Set.empty)
725+
~f:(fun (queue, before, renaming, seen) (y, x) ->
726+
let (((_, deps_x) as px), cx), queue = access_queue queue x in
727+
let seen' = Code.Var.Set.add y seen in
728+
if back_edge && not Code.Var.Set.(is_empty (inter seen deps_x))
729+
then
730+
let before, queue =
731+
flush_queue
732+
queue
733+
px
734+
((J.variable_declaration [ J.V x, (cx, J.N) ], J.N) :: before)
735+
in
736+
let renaming =
737+
(J.variable_declaration [ J.V y, (J.EVar (J.V x), J.N) ], J.N) :: renaming
738+
in
739+
queue, before, renaming, seen'
740+
else
741+
let renaming, queue =
742+
flush_queue
743+
queue
744+
px
745+
((J.variable_declaration [ J.V y, (cx, J.N) ], J.N) :: renaming)
746+
in
747+
queue, before, renaming, seen')
748+
in
749+
let never, code = continuation queue in
750+
never, List.rev_append before (List.rev_append renaming code)
756751
(****)
757752

758753
let apply_fun_raw ctx f params exact cps =
@@ -1727,21 +1722,27 @@ and compile_conditional st queue ~fall_through last scope_stack : _ * _ =
17271722
| Switch _ | Cond _ | Pushtrap _ -> Format.eprintf "}@]@;");
17281723
res
17291724

1730-
and compile_argument_passing ctx queue (pc, args) continuation =
1725+
and compile_argument_passing ctx queue (pc, args) back_edge continuation =
17311726
if List.is_empty args
17321727
then continuation queue
17331728
else
17341729
let block = Addr.Map.find pc ctx.Ctx.blocks in
1735-
parallel_renaming block.params args continuation queue
1730+
parallel_renaming back_edge block.params args continuation queue
17361731

17371732
and compile_branch st queue ((pc, _) as cont) scope_stack ~fall_through : bool * _ =
1738-
compile_argument_passing st.ctx queue cont (fun queue ->
1733+
let scope = List.assoc_opt pc scope_stack in
1734+
let back_edge =
1735+
match scope with
1736+
| Some (_l, _used, Loop) -> true
1737+
| None | Some _ -> false
1738+
in
1739+
compile_argument_passing st.ctx queue cont back_edge (fun queue ->
17391740
if match fall_through with
17401741
| Block pc' -> pc' = pc
17411742
| Return -> false
17421743
then false, flush_all queue []
17431744
else
1744-
match List.assoc_opt pc scope_stack with
1745+
match scope with
17451746
| Some (l, used, Loop) ->
17461747
(* Loop back to the beginning of the loop using continue.
17471748
We can skip the label if we're not inside a nested loop. *)

0 commit comments

Comments
 (0)