Skip to content

Commit 4d67af7

Browse files
authored
Compiler: better deps tracking for expressions queue (#1394)
1 parent 7603591 commit 4d67af7

File tree

3 files changed

+14
-38
lines changed

3 files changed

+14
-38
lines changed

compiler/lib/generate.ml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -411,17 +411,17 @@ let (e, expr_queue) = ... in
411411
flush_queue expr_queue e
412412
*)
413413

414-
let const_p = 0
414+
let const_p = 0, Var.Set.empty
415415

416-
let mutable_p = 1
416+
let mutable_p = 1, Var.Set.empty
417417

418-
let mutator_p = 2
418+
let mutator_p = 2, Var.Set.empty
419419

420-
let flush_p = 3
420+
let flush_p = 3, Var.Set.empty
421421

422-
let or_p p q = max p q
422+
let or_p (p, s1) (q, s2) = max p q, Var.Set.union s1 s2
423423

424-
let is_mutable p = p >= mutable_p
424+
let is_mutable (p, _) = p >= fst mutable_p
425425

426426
let kind k =
427427
match k with
@@ -523,13 +523,13 @@ let access_queue queue x =
523523
try
524524
let elt = List.assoc x queue in
525525
if elt.cardinal = 1
526-
then (elt.prop, elt.ce), List.remove_assoc x queue
526+
then ((elt.prop, elt.deps), elt.ce), List.remove_assoc x queue
527527
else
528-
( (elt.prop, elt.ce)
528+
( ((elt.prop, elt.deps), elt.ce)
529529
, List.map queue ~f:(function
530530
| x', elt when Var.equal x x' -> x', { elt with cardinal = pred elt.cardinal }
531531
| x -> x) )
532-
with Not_found -> (const_p, var x), queue
532+
with Not_found -> ((fst const_p, Code.Var.Set.singleton x), var x), queue
533533

534534
let access_queue' ~ctx queue x =
535535
match x with
@@ -547,7 +547,7 @@ let access_queue_may_flush queue v x =
547547
queue
548548
~init:(Code.Var.Set.singleton v, [], [])
549549
~f:(fun (deps, instrs, queue) ((y, elt) as eq) ->
550-
if Code.Var.Set.exists (fun p -> Code.Var.Set.mem p deps) elt.deps
550+
if not (Code.Var.Set.disjoint deps elt.deps)
551551
then
552552
( Code.Var.Set.add y deps
553553
, (J.Variable_statement [ J.V y, Some (elt.ce, elt.loc) ], elt.loc) :: instrs
@@ -556,11 +556,11 @@ let access_queue_may_flush queue v x =
556556
in
557557
instrs, (tx, List.rev queue)
558558

559-
let should_flush cond prop = cond <> const_p && cond + prop >= flush_p
559+
let should_flush (cond, _) prop = cond <> fst const_p && cond + prop >= fst flush_p
560560

561561
let flush_queue expr_queue prop (l : J.statement_list) =
562562
let instrs, expr_queue =
563-
if prop >= flush_p
563+
if fst prop >= fst flush_p
564564
then expr_queue, []
565565
else List.partition ~f:(fun (_, elt) -> should_flush prop elt.prop) expr_queue
566566
in
@@ -578,12 +578,12 @@ let enqueue expr_queue prop x ce loc cardinal acc =
578578
then if is_mutable prop then flush_queue expr_queue prop [] else [], expr_queue
579579
else flush_queue expr_queue flush_p []
580580
in
581-
let deps = Js_simpl.get_variable Code.Var.Set.empty ce in
581+
let prop, deps = prop in
582582
let deps =
583583
List.fold_left expr_queue ~init:deps ~f:(fun deps (x', elt) ->
584584
if Code.Var.Set.mem x' deps then Code.Var.Set.union elt.deps deps else deps)
585585
in
586-
instrs @ acc, (x, { prop; ce; loc; cardinal; deps }) :: expr_queue
586+
instrs @ acc, (x, { prop; deps; ce; loc; cardinal }) :: expr_queue
587587

588588
(****)
589589

compiler/lib/js_simpl.ml

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -237,25 +237,3 @@ let if_statement e loc iftrue truestop iffalse falsestop =
237237
iftrue'
238238
falsestop
239239
| _ -> if_statement_2 e loc iftrue truestop iffalse falsestop
240-
241-
let rec get_variable acc = function
242-
| J.ESeq (e1, e2) | J.EBin (_, e1, e2) | J.EAccess (e1, e2) ->
243-
get_variable (get_variable acc e1) e2
244-
| J.ECond (e1, e2, e3) -> get_variable (get_variable (get_variable acc e1) e2) e3
245-
| J.EUn (_, e1) | J.EDot (e1, _) | J.ENew (e1, None) -> get_variable acc e1
246-
| J.ECall (e1, el, _) | J.ENew (e1, Some el) ->
247-
(e1, `Not_spread) :: el
248-
|> List.map ~f:(fun (a, _) -> a)
249-
|> List.fold_left ~init:acc ~f:get_variable
250-
| J.EVar (J.V v) -> Code.Var.Set.add v acc
251-
| J.EVar (J.S _) -> acc
252-
| J.EFun _ | J.EStr _ | J.EBool _ | J.ENum _ | J.ERegexp _ -> acc
253-
| J.EArr a ->
254-
List.fold_left
255-
~f:(fun acc i ->
256-
match i with
257-
| None -> acc
258-
| Some e1 -> get_variable acc e1)
259-
~init:acc
260-
a
261-
| J.EObj l -> List.fold_left ~f:(fun acc (_, e1) -> get_variable acc e1) ~init:acc l

compiler/lib/js_simpl.mli

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ val if_statement :
2929
-> bool
3030
-> (statement * location) list
3131

32-
val get_variable : Code.Var.Set.t -> expression -> Code.Var.Set.t
33-
3432
val block : (Javascript.statement * location) list -> Javascript.statement * location
3533

3634
val unblock : Javascript.statement * location -> (Javascript.statement * location) list

0 commit comments

Comments
 (0)