diff --git a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-docs.factor b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-docs.factor index cb9bbfec27..56a86ae2a5 100644 --- a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-docs.factor +++ b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-docs.factor @@ -8,7 +8,8 @@ HELP: { "vreg" "virtual register" } { "live-interval" live-interval-state } } -{ $description "Creates a new live interval for a virtual register. Initially the range is empty." } ; +{ $description "Creates a new live interval for a virtual register. Initially the ranges are empty and it has no uses." } +{ $see-also vreg>live-interval } ; HELP: block-from { $values { "bb" basic-block } { "n" integer } } @@ -36,9 +37,9 @@ HELP: find-use } { $description "Finds the live intervals " { $link vreg-use } " at the given instruction number, if it has one." } ; -HELP: finish-live-intervals -{ $values { "live-intervals" sequence } } -{ $description "Since live intervals are computed in a backward order, we have to reverse some sequences, and compute the start and end." } ; +HELP: finish-live-interval +{ $values { "live-interval" live-interval-state } } +{ $description "Reverses the 'ranges' and 'uses' of the live-interval since those are computed in the reverse order." } ; HELP: from { $var-description "An integer representing a sequence number one lower than all numbers in the currently processed block." } ; @@ -51,6 +52,10 @@ HELP: intervals-intersect? } { $description "Checks if two live intervals intersect each other." } ; +HELP: last-use? +{ $values { "insn#" integer } { "uses" sequence } { "use/f" $maybe vreg-use } } +{ $description "Maybe gets the last " { $link vreg-use } " of a " { $link live-interval-state } "." } ; + HELP: live-interval-state { $class-description "A class encoding the \"liveness\" of a virtual register. It has the following slots:" { $table @@ -90,13 +95,13 @@ HELP: record-temp { $description "Assigns the interval [n,n] to vreg:s live interval." } ; HELP: sync-point -{ $class-description "A location where all registers have to be spilled. For example when garbage collection is run or an alien ffi call is invoked. Figuring out where in the " { $link cfg } " the sync points are is done in the " { $link compute-live-intervals } " step. The tuple has the following slots:" +{ $class-description "A location where all live registers have to be spilled. For example when garbage collection is run or an alien ffi call is invoked. Figuring out where in the " { $link cfg } " the sync points are is done in the " { $link compute-live-intervals } " step. The tuple has the following slots:" { $table { { $slot "n" } { "Set from an instructions sequence number." } } { { $slot "keep-dst?" } { "Boolean that determines whether registers are spilled around this sync point." } } } } -{ $see-also insn } ; +{ $see-also cfg>sync-points insn } ; HELP: to { $var-description "An integer representing a sequence number equal to the highest number in the currently processed block." } ; diff --git a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor index 59787f2f82..4d6b57955b 100644 --- a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor +++ b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor @@ -33,6 +33,13 @@ IN: compiler.cfg.linear-scan.live-intervals.tests dup finish-live-interval ranges>> ] unit-test +! insn>sync-point +{ f f t } [ + T{ ##call-gc } insn>sync-point keep-dst?>> + T{ ##callback-outputs } insn>sync-point keep-dst?>> + T{ ##unbox } insn>sync-point keep-dst?>> +] unit-test + ! intervals-intersect? { t f f } [ { { 4 20 } } diff --git a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor index c612129b74..2c506f745b 100644 --- a/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor +++ b/basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor @@ -134,22 +134,14 @@ ERROR: bad-live-interval live-interval ; dup live-interval-start -1 = [ bad-live-interval ] [ drop ] if ; : finish-live-interval ( live-interval -- ) - [ ranges>> reverse! drop ] [ uses>> reverse! drop ] [ check-start ] tri ; - -: finish-live-intervals ( live-intervals -- ) - [ finish-live-interval ] each ; + [ ranges>> reverse! ] [ uses>> reverse! ] [ check-start ] tri 2drop ; TUPLE: sync-point n keep-dst? ; -C: sync-point - GENERIC: insn>sync-point ( insn -- sync-point/f ) -M: hairy-clobber-insn insn>sync-point - insn#>> f ; - M: clobber-insn insn>sync-point - insn#>> t ; + [ insn#>> ] [ hairy-clobber-insn? not ] bi sync-point boa ; M: insn insn>sync-point drop f ; @@ -159,7 +151,7 @@ M: insn insn>sync-point drop f ; : cfg>live-intervals ( cfg -- live-intervals ) H{ } clone live-intervals set linearization-order [ compute-live-intervals-step ] each - live-intervals get values dup finish-live-intervals ; + live-intervals get values dup [ finish-live-interval ] each ; : compute-live-intervals ( cfg -- intervals/sync-points ) [ cfg>live-intervals ] [ cfg>sync-points ] bi append ;