Enable IR inlining: splice small defns at call sites (lever 1/4)
jolt.passes.inline was fully written but dormant — it fetched bodies via the inline-ir host hook, which was a stub returning nil. Wire it up: run-passes stashes each inline-eligible defn (single fixed arity) as its form is optimized, and inline-ir hands the body back at call sites under --opt. The catch was the ^double/^long coercion: an inlined fn drops its param-entry and return coercion, so (work 3 4) on a ^double fn would return 25 instead of 25.0. New :coerce IR node carries the coercion inside the spliced body — the inline pass wraps a hinted param's arg and the return in :coerce, the back end lowers it (exact->inexact / jolt->fx), and jolt.passes.numeric reads its :kind. So an inlined call matches the called one and the body's fl*/fx* fast path still fires. Only under --opt (closed world); the seed mint and -e don't inline, so selfhost and the corpus are unaffected. test/chez/inline-test.ss 12/12 (make inline); full make test green, 0 new corpus divergences. Bench (hot loop, body is a ^double helper call): direct-link 500ms -> --opt (inlined) 184ms = 2.7x, by eliminating the call + coercion wrappers and letting Chez fuse the fl-ops unboxed. ~26x over the default dispatched build.
This commit is contained in:
parent
9927fd7f74
commit
79fa22eeab
9 changed files with 365 additions and 240 deletions
|
|
@ -300,7 +300,15 @@
|
|||
(define hc-optimize? #f)
|
||||
(define (set-optimize! on) (set! hc-optimize? on))
|
||||
(define (hc-inline-enabled? ctx) hc-optimize?)
|
||||
(define (hc-inline-ir ctx ns-name nm) jolt-nil)
|
||||
;; Inline-body registry: jolt.passes stashes an inline-eligible defn's
|
||||
;; {:params :body :nhints :ret} here (keyed ns/name) as its form is optimized;
|
||||
;; jolt.passes.inline fetches it to splice the body at a call site. The stash is an
|
||||
;; opaque jolt value to the host — IR maps round-tripping through the table.
|
||||
(define inline-stash-table (make-hashtable string-hash string=?))
|
||||
(define (hc-stash-inline! ctx ns-name nm m)
|
||||
(hashtable-set! inline-stash-table (string-append ns-name "/" nm) m) jolt-nil)
|
||||
(define (hc-inline-ir ctx ns-name nm)
|
||||
(or (hashtable-ref inline-stash-table (string-append ns-name "/" nm) #f) jolt-nil))
|
||||
|
||||
;; --- declare the hot clojure.core primitives so resolve-global sees them ------
|
||||
;; (mirrors backend_scheme.clj native-ops keys — the emitter lowers these inline,
|
||||
|
|
@ -354,6 +362,7 @@
|
|||
(def-var! "jolt.host" "record-ctor-key" hc-record-ctor-key)
|
||||
(def-var! "jolt.host" "record-shapes" hc-record-shapes)
|
||||
(def-var! "jolt.host" "inline-enabled?" hc-inline-enabled?)
|
||||
(def-var! "jolt.host" "inline-ir" hc-inline-ir))
|
||||
(def-var! "jolt.host" "inline-ir" hc-inline-ir)
|
||||
(def-var! "jolt.host" "stash-inline!" hc-stash-inline!))
|
||||
|
||||
(hc-install!)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue