* module/language/cps/dfg.scm (analyze-reverse-control-flow): Don't
compute and return an order vector; it's not needed.
($dfa): Remove label renaming. We can just rename labels before
returning the DFA.
(dfa-k-idx, dfa-k-sym, dfa-k-count): Adapt.
(compute-live-variables): Adapt, and rename labels before returning.
* module/language/cps.scm ($closure, $program): New CPS types, part of
low-level (first-order) CPS.
(build-cps-exp, build-cps-term, parse-cps, unparse-cps)
(compute-max-label-and-var): Update for new CPS types.
* module/language/cps/closure-conversion.scm: Rewrite to produce a
$program with $closures, and no $funs.
* module/language/cps/reify-primitives.scm:
* module/language/cps/compile-bytecode.scm (compile-fun):
(compile-bytecode): Adapt to new first-order format.
* module/language/cps/dfg.scm (compute-dfg): Add $closure case.
* module/language/cps/renumber.scm (renumber): Allow this pass to work
on either format.
* module/language/cps/slot-allocation.scm (allocate-slots): Add $closure
case.
* module/language/cps.scm (make-global-cont-folder)
(make-local-cont-folder): Separate this macro in two. It's hot and
the difference can be important for perf.
* module/language/cps/dfg.scm (compute-label-and-var-ranges):
* module/language/cps/cse.scm (compute-label-and-var-ranges):
* module/language/cps/dce.scm (compute-live-code): Adapt.
* module/language/cps/compile-bytecode.scm (compile-fun): Change to take
a $kfun $cont instead of a $fun.
(visit-funs): Change likewise, and call the proc on $kfun $cont's, not
$fun's.
(compile-bytecode): Adapt.
* module/language/cps/dfg.scm (analyze-reverse-control-flow): Adapt to
expect a $kfun $cont.
* module/language/cps/dfg.scm (constant-needs-allocation?): Constants
need allocation when they are used as a slot-needing operand, not when
they are not used as an immediate operand. Fixes the case where one
var is used in both ways after CSE, in struct-set!/immediate.
* module/language/cps/dfg.scm (with-fresh-name-state-from-dfg): New
helper.
($dfg, compute-dfg): Store max-var and max-label in the dfg.
* module/language/cps.scm (with-fresh-name-state): Don't raise an error
on recursive invocation; that was mostly useful when finding a bug.
* module/language/cps/arities.scm (fix-arities):
* module/language/cps/specialize-primcalls.scm (specialize-primcalls):
Use the new helper.
* .dir-locals.el: Update.
* module/language/cps/dfg.scm: Remove CFA data type.
(analyze-reverse-control-flow): Take min-label and label-count as
args, and return multiple values instead of returning a CFA object.
(compute-live-variables): Rework to accept multiple values from
analyze-reverse-control-flow.
($dfa): Update comments.
* module/language/cps/dfg.scm ($dfa): Include CFA min-label, k-map, and
k-order inline.
(dfa-k-idx, dfa-k-sym, dfa-k-count): Adapt.
(compute-live-variables): Extract fields of CFA for make-dfa.
(print-dfa): Adapt (and fix positional record matching).
* module/language/cps/dfg.scm (compute-reachable): Reword docstring.
(visit-prompt-control-flow): Likewise.
($dominator-analysis): Change to store min-label instead of CFA.
(compute-idoms, compute-join-edges, mark-loop-body, identify-loops):
Take min-label and label-count, and use the DFG's preds list instead
of requiring a fresh renumbered one.
(analyze-dominators): Adapt to use a DFG with a label range instead of
a CFA.
* module/language/cps/dfg.scm ($cfa): Use a vector to map labels to
indices. Don't export any CFA bindings.
(cfa-k-idx): Adapt.
(compute-reachable, find-prompts, compute-interval):
(find-prompt-bodies, visit-prompt-control-flow): Take a DFG as an
argument instead of a CFA.
(analyze-reverse-control-flow): Refactor from analyze-control-flow, as
it is only used in the reverse case. Simplify accordingly, inlining
the RPO sort.
(compute-live-variables): Adapt to call analyze-reverse-control-flow
instead.
* module/language/cps/dfg.scm (compute-reachable): Fix embarassing bug
where we wouldn't actually iterate to fixpoint. I haven't seen it
yet, but that's just luck...
* module/language/cps/dfg.scm (compute-label-and-var-ranges): Fix to
work with global DFGs -- it wasn't taking $letrec into account for var
ranges.
* module/language/cps/dce.scm (compute-live-code): Use bitvectors to
represent the live var set.
* module/language/cps/dfg.scm ($dfa): Instead of a var-map table an a
syms vector, use the DFG's var numbering.
(dfa-var-idx, dfa-var-sym, compute-live-variables): Adapt.
* module/language/cps/dfg.scm ($dfg): Rename nvars and nlabels fields to
var-count and label-count. Export dfg-min-var, dfg-min-label,
dfg-label-count, dfg-var-count.
* module/language/cps/compile-bytecode.scm (compile-fun): No need to
build a CFA given the renumbering pass. Adapt to treat labels as
ordered small integer in a contiguous vector.
* module/language/cps/dfg.scm (analyze-control-flow): Sort blocks to
preserve order among unordered successors.
(lookup-successors): Choose a more natural order, now that it doesn't
matter.
* module/language/cps.scm ($kclause, $kentry): Instead of having an
entry continuation contain a list of clauses, have the clauses contain
clauses (as in Tree-IL). In some ways it's not as convenient but it
does reflect the continuation tree correctly.
* module/language/cps/arities.scm:
* module/language/cps/closure-conversion.scm:
* module/language/cps/compile-bytecode.scm:
* module/language/cps/constructors.scm:
* module/language/cps/contification.scm:
* module/language/cps/dce.scm:
* module/language/cps/dfg.scm:
* module/language/cps/elide-values.scm:
* module/language/cps/prune-top-level-scopes.scm:
* module/language/cps/reify-primitives.scm:
* module/language/cps/renumber.scm:
* module/language/cps/simplify.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/specialize-primcalls.scm:
* module/language/cps/verify.scm:
* module/language/tree-il/compile-cps.scm: Adapt aaaaaaall users.
* module/language/cps/dfg.scm (lookup-cont, lookup-block):
(lookup-def, constant-needs-allocation?): Rework these accessors to
avoid completely destructuring the $dfg.
* module/language/cps/dfg.scm ($dfg): Change to store conts, blocks, and
use-maps as vectors. A DFG also records the minimum label, minimum
variable, and the number of labels and variables. The first entry in
one of these vectors corresponds to the minimum. This can be
optimum in the local case if the conts and variables have been renamed
appropriately.
Adapt callers.
(compute-live-variables): Adapt. This is currently suboptimal but it
works, so it's a useful base for optimization.
* module/language/cps/dfg.scm (lookup-cont): Change to take a DFG
instead of a cont table.
(build-cont-table): Change to return a vector.
* module/language/cps/arities.scm:
* module/language/cps/contification.scm:
* module/language/cps/dce.scm:
* module/language/cps/effects-analysis.scm:
* module/language/cps/elide-values.scm:
* module/language/cps/reify-primitives.scm:
* module/language/cps/simplify.scm:
* module/language/cps/slot-allocation.scm: Adapt to lookup-cont and
build-cont-table changes.
* module/language/cps.scm ($callk): New expression type, for calls to
known labels. Part of "low CPS".
* module/language/cps/arities.scm:
* module/language/cps/closure-conversion.scm:
* module/language/cps/compile-bytecode.scm:
* module/language/cps/dce.scm:
* module/language/cps/dfg.scm:
* module/language/cps/effects-analysis.scm:
* module/language/cps/simplify.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/verify.scm: Adapt call sites.
* libguile/vm-engine.c (call-label, tail-call-label): New instructions.
Renumber the rest; this is an ABI change.
* libguile/_scm.h (SCM_OBJCODE_MINOR_VERSION):
* module/system/vm/assembler.scm (*bytecode-minor-version*): Bump.
* doc/ref/compiler.texi (CPS in Guile): Document $callk.
* module/language/cps.scm:
* module/language/cps/closure-conversion.scm:
* module/language/cps/compile-bytecode.scm:
* module/language/cps/dfg.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/verify.scm:
* module/language/tree-il/compile-cps.scm: Remove "pop" member from
$prompt data type, as it is no longer used.
* module/language/cps/dfg.scm (compute-live-variables, visit-fun):
Use the new prompt analysis pass in analyze-control-flow instead of
always adding a link in the DFG. Avoids problems if there are
parts of the prompt body that have no path to the pop.
* module/language/cps/dfg.scm (compute-reachable, find-prompts)
(compute-interval, find-prompt-bodies, visit-prompt-control-flow): New
helpers.
(analyze-control-flow): Add a mode that adds on CFA edges
corresponding to non-local control flow in a prompt.
* module/language/cps/dfg.scm ($dfa): Store a CFA instead of a separate
k-map and order.
(dfa-k-idx, dfa-k-sym, dfa-k-count): Adapt.
(compute-live-variables): Use analyze-control-flow instead of rolling
out own RPO numbering. Will allow us to fix some prompt-related
things in a central place.
* module/language/cps/dfg.scm (reverse-post-order): Fold-all-conts is
now a required arg.
(analyze-control-flow): Reverse CFA adds forward-reachable
continuations to the numbering.
* module/language/cps/dfg.scm (constant-needs-allocation?): Use of a
constant in a $values expression of any arity does not cause slot
allocation.
* module/language/cps/compile-bytecode.scm (compile-fun): Allow $values
with a constant value to be compiled in test context. Really we
should fold these in a previous pass!
* libguile/_scm.h (SCM_OBJCODE_MINOR_VERSION): Bump.
* libguile/objcodes.c (process_dynamic_segment): Expect the minor
version to be present and, while we are still banging on the VM,
exactly equal to SCM_OBJCODE_MINOR_VERSION.
* libguile/vm-engine.c: Renumber ops. Remove the general make-vector.
Rename constant-FOO to FOO/immediate. Remove struct-ref and
struct-set!, replace with struct-ref/immediate and
struct-set!/immediate.
* module/Makefile.am:
* module/language/cps/specialize-primcalls.scm: New pass, inlines FOO to
FOO/immediate -- e.g. vector-ref to vector-ref/immediate.
* module/language/cps/arities.scm: Remove struct-set! case, now that
there is no struct-set! opcode.
* module/language/cps/compile-rtl.scm (compile-fun): Remove dispatch to
constant-FOO versus FOO here -- that decision is made by
specialize-primcalls.
(optimize): Add specialize-primcalls pass.
* module/language/cps/dfg.scm (constant-needs-allocation?): Adapt to
name changes.
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
(*primitive-constructors*): Add allocate-struct.
* module/system/vm/assembler.scm (*bytecode-major-version*):
(*bytecode-minor-version*, link-dynamic-section): Write minor version
into resulting image.
* module/language/cps.scm ($continue, $cont): Put source information on
the $continue, not on the $cont. Otherwise it is difficult for CPS
conversion to preserve source information.
($fun): Add a src member to $fun. Otherwise we might miss the source
info for the start of the function.
* .dir-locals.el:
* module/language/cps/arities.scm:
* module/language/cps/closure-conversion.scm:
* module/language/cps/compile-rtl.scm:
* module/language/cps/constructors.scm:
* module/language/cps/contification.scm:
* module/language/cps/dfg.scm:
* module/language/cps/elide-values.scm:
* module/language/cps/reify-primitives.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/verify.scm:
* module/language/tree-il/compile-cps.scm: Update the whole CPS world
for this change.
* module/language/cps/dfg.scm (reverse-post-order): Add an optional
"fold-all-conts" argument.
(compute-live-variables): Take the function as an arg instead of the
start continuation, and implement fold-all-conts so that nodes that
never reach the tail also get liveness information.
* module/language/cps/dfg.scm ($cfa, $dominator-analysis): Remove
dominator things from $cfa, to break out to separate structure.
(cfa-k-idx, cfa-k-count, cfa-k-sym, cfa-predecessors): New public
accessors.
(analyze-control-flow): New public function.
(analyze-dominators): Adapt.
* module/language/cps/dfg.scm ($block): Remove dominator-related things
from $block.
(reverse-post-order, convert-predecessors): Be more abstract, taking
arbitrary identifiers for nodes instead of assuming the nodes are
continuation names.
(make-block-mapping): New helper.
($cfa): New data type, for dominator and loop analysis. Not yet
public.
(analyze-control-flow): Rewrite to only compute the dominator tree in
one direction, but take that direction as an argument. To be public
once there is some code that uses it.
($dfa): Refactor function fields to be hash tables.
(dfa-k-idx, dfa-var-idx): Adapt to refactor.
(compute-live-variables): Adapt to refactor.