aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/analyzer.zc
diff options
context:
space:
mode:
authorGravatar zinc <zinc@downsta.ir> 2026-10-15 07:30:53 +0330
committerGravatar zinc <zinc@downsta.ir> 2026-10-15 07:30:53 +0330
commit63ff1aacf764e692a7a29a7c0043278f637f1dbb (patch)
tree4aa3e31f2b3892def6cc00dfb73eb243311c0adc /src/compiler/analyzer.zc
parentrt: recycle, new_k and own without helper calls or || chains (diff)
x86-64 jit: inline new_k, recycle_leaf and own fast paths, in o3 regions and plain blocks
a call to rt.new_k / rt.recycle_leaf with a constant class, or to rt.own, does its class-list pop or push (or owner store) inline and goes on after the call; an empty list, memdebug, a held range, a block outside memory, a translated word or a type/class mismatch takes the ordinary call. in a region this replaces the o3_invoke round trip. o3 frees of leaf objects now use recycle_leaf too (new_k stamps the type inside o3 since b86db60). ZYNOFASTALLOC=1 turns it off; ZYPERFMAP=1 writes a perf map of translated code. tests/programs/o3_freelist.zc: reuse, zeroing, an empty list, untyped neighbours, memdebug; jit vs ZYNOFASTALLOC vs ZYO3INTERP.
Diffstat (limited to 'src/compiler/analyzer.zc')
-rw-r--r--src/compiler/analyzer.zc4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/compiler/analyzer.zc b/src/compiler/analyzer.zc
index 8ceaf09..42cb7b5 100644
--- a/src/compiler/analyzer.zc
+++ b/src/compiler/analyzer.zc
@@ -1004,7 +1004,7 @@ int freevar(int i) {
if (o3on && fchk && ldroppable(i)) cerrn(i, "has drop and can't end inside an o3 region");
if (local_captured && local_captured[i]) { lit(0); laddr(lslot[i]); op(O_ST); return 0; }
vaddr(i); op(O_LD);
- if (lleaf[i] && !o3on && !dry && lookup(s_recycle_leaf) >= 0) {
+ if (lleaf[i] && !dry && lookup(s_recycle_leaf) >= 0) { // o3 too: new_k stamps the type there as well
lit(lleaf[i]);
lit(szclass(lnsz[i]));
callname(s_recycle_leaf);
@@ -1434,7 +1434,7 @@ int reassign_free(int i, int rc, int bor) {
// freevar without its clearing store: the new value is stored next, through
// the address taken before the right side (a captured local's slot holds its cell)
vaddr(i); op(O_LD);
- if (lleaf[i] && !o3on && !dry && lookup(s_recycle_leaf) >= 0) { lit(lleaf[i]); lit(szclass(lnsz[i])); callname(s_recycle_leaf); }
+ if (lleaf[i] && !dry && lookup(s_recycle_leaf) >= 0) { lit(lleaf[i]); lit(szclass(lnsz[i])); callname(s_recycle_leaf); }
else callname(s_recycle);
op(O_DROP);
end_owner(i);