Const-link stable vars under whole-program; direct-link cfunction roots
direct-var? now treats a cfunction root the same as a function root, so a call/ref to a native fn (clojure.math/sqrt et al.) embeds the value instead of a per-call cell deref. This was the hot indirection in the ray tracer — sqrt runs every bounce — and it applies in every direct-link build, not just whole-program. const-link? is new and whole-program-only: in a closed world every non-dynamic var has a stable root, so embed it as a constant (quoted unless it's already callable) rather than reading the cell each reference. Covers what direct-var? can't — ^:redef vars (reloading is off under the flag), data defs, and record type/ctor roots. Dynamic vars stay indirect; a nil (not-yet-defined) root stays indirect and the whole-program re-emit picks it up once the root is in place. Measured on the records ray tracer: hot-path indirect refs (sqrt + data vars) gone; the only indirect refs left are cold defrecord self-references. whole- program-test now also checks a ^:redef fn and a data def so the per-ns vs whole-program comparison guards const-link soundness.
This commit is contained in:
parent
840f699f54
commit
4018eb87ed
2 changed files with 32 additions and 3 deletions
|
|
@ -13,10 +13,15 @@
|
|||
(spit (string dir "/wputil.clj")
|
||||
(string "(ns wputil)\n"
|
||||
"(defrecord V [x y z])\n"
|
||||
# const-link targets (jolt-rvt): a data def and a ^:redef fn are
|
||||
# indirect (cell deref) per-ns but embedded as constants under
|
||||
# whole-program. Soundness => both modes must give the same answer.
|
||||
"(def scale 2.0)\n"
|
||||
"(defn ^:redef bump [x] (+ x 1.0))\n"
|
||||
# recursive => never inlined; params proven only whole-program
|
||||
"(defn dot [a b n]\n"
|
||||
" (if (<= n 0) 0.0\n"
|
||||
" (+ (* (:x a) (:x b)) (* (:y a) (:y b)) (* (:z a) (:z b)) (dot a b (dec n)))))\n"))
|
||||
" (+ (* (:x a) (:x b)) (* (:y a) (:y b)) (* (:z a) (:z b)) (bump (* scale (dot a b (dec n)))))))\n"))
|
||||
(spit (string dir "/wpmain.clj")
|
||||
(string "(ns wpmain (:require [wputil :as v]))\n"
|
||||
"(defn -main []\n"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue