@@ -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-
546530let should_flush (cond , _ ) prop = cond <> fst const_p && cond + prop > = fst flush_p
547531
548532let 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
758753let 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
17371732and 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