Skip to content

Commit 8d342cd

Browse files
committed
jit: observe first-attachment requests in pre-MT native loops
1 parent 77dff65 commit 8d342cd

92 files changed

Lines changed: 9341 additions & 6 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
[
2+
{
3+
"command": [
4+
"taskset",
5+
"-c",
6+
"0-15",
7+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/luajit",
8+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/bench-diagnostic.lua",
9+
"numeric"
10+
],
11+
"LUA_PATH": "/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/?.lua;/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/?/init.lua;;",
12+
"exit": 0,
13+
"seconds": 0.008279687997855945
14+
},
15+
{
16+
"command": [
17+
"taskset",
18+
"-c",
19+
"0-15",
20+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/luajit",
21+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/bench-diagnostic.lua",
22+
"ffi_struct"
23+
],
24+
"LUA_PATH": "/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/?.lua;/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/?/init.lua;;",
25+
"exit": 0,
26+
"seconds": 0.010000849000789458
27+
},
28+
{
29+
"command": [
30+
"taskset",
31+
"-c",
32+
"0-15",
33+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/luajit",
34+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/bench-diagnostic.lua",
35+
"table_read"
36+
],
37+
"LUA_PATH": "/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/?.lua;/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/base-normal/src/?/init.lua;;",
38+
"exit": 0,
39+
"seconds": 0.008363126002222998
40+
},
41+
{
42+
"command": [
43+
"taskset",
44+
"-c",
45+
"0-15",
46+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/luajit",
47+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/bench-diagnostic.lua",
48+
"numeric"
49+
],
50+
"LUA_PATH": "/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/?.lua;/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/?/init.lua;;",
51+
"exit": 0,
52+
"seconds": 0.008147628999722656
53+
},
54+
{
55+
"command": [
56+
"taskset",
57+
"-c",
58+
"0-15",
59+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/luajit",
60+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/bench-diagnostic.lua",
61+
"ffi_struct"
62+
],
63+
"LUA_PATH": "/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/?.lua;/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/?/init.lua;;",
64+
"exit": 0,
65+
"seconds": 0.0096651509993535
66+
},
67+
{
68+
"command": [
69+
"taskset",
70+
"-c",
71+
"0-15",
72+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/luajit",
73+
"/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/bench-diagnostic.lua",
74+
"table_read"
75+
],
76+
"LUA_PATH": "/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/?.lua;/tmp/lj-mode0-poll-fix-20260905-qn7zwzl_/fix-normal/src/?/init.lua;;",
77+
"exit": 0,
78+
"seconds": 0.008597928001108812
79+
}
80+
]
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
local jit = require('jit')
2+
local util = require('jit.util')
3+
local case = assert(arg[1])
4+
local work, input, n, expected
5+
local exits = 0
6+
local function witness() exits = exits + 1 end
7+
jit.off(witness)
8+
jit.opt.start('hotloop=1', 'hotexit=255')
9+
jit.attach(witness, 'texit')
10+
11+
if case == 'numeric' then
12+
n = 500000000
13+
work = function(count)
14+
local s = 0
15+
for i = 1, count do s = s + 1 end
16+
return s
17+
end
18+
expected = function(count) return count end
19+
elseif case == 'ffi_struct' then
20+
input = require('ffi').new('struct { double x; double y; }', 0, 1)
21+
n = 50000000
22+
work = function(count, p)
23+
p.x = 0
24+
local s = 0
25+
for i = 1, count do p.x = p.x + 1; s = p.x + p.y end
26+
return s
27+
end
28+
expected = function(count) return count + 1 end
29+
elseif case == 'table_read' then
30+
input = { 1, 2 }
31+
n = 100000000
32+
work = function(count, p)
33+
local s = 0
34+
for i = 1, count do s = s + p[1] + p[2] end
35+
return s
36+
end
37+
expected = function(count) return count * 3 end
38+
else
39+
error('unknown case')
40+
end
41+
42+
assert(work(1000, input) == expected(1000))
43+
assert(exits > 0 and util.traceinfo(1), 'real native warm witness')
44+
do
45+
local bit = require('bit')
46+
local names = require('jit.vmdef').irnames
47+
local info = assert(util.traceinfo(1))
48+
local polls = 0
49+
print('case', case, 'nins', info.nins)
50+
for ref = 1, info.nins do
51+
local mode, ot, a, b = util.traceir(1, ref)
52+
if ot then
53+
local offset = bit.rshift(ot, 8) * 6
54+
local op = names:sub(offset+1, offset+6)
55+
print(ref, op, a, b)
56+
if op:match('^XPOLL') then assert(a == 0); polls = polls + 1 end
57+
end
58+
end
59+
assert(polls > 0)
60+
local mcode, address, loop = util.tracemc(1)
61+
print('mcode', #mcode, 'loop-offset', loop)
62+
require('jit.dis_x64').disass(mcode, address)
63+
return
64+
end
65+
local samples, best = {}, math.huge
66+
for i = 1, 5 do
67+
local start = os.clock()
68+
local result = work(n, input)
69+
local elapsed = os.clock() - start
70+
assert(result == expected(n))
71+
samples[i] = string.format('%.9f', elapsed)
72+
best = math.min(best, elapsed)
73+
end
74+
print(case, n, string.format('%.9f', best), table.concat(samples, ','), exits)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
local jit = require('jit')
2+
local util = require('jit.util')
3+
local case = assert(arg[1])
4+
local work, input, n, expected
5+
local exits = 0
6+
local function witness() exits = exits + 1 end
7+
jit.off(witness)
8+
jit.opt.start('hotloop=1', 'hotexit=255')
9+
jit.attach(witness, 'texit')
10+
11+
if case == 'numeric' then
12+
n = 500000000
13+
work = function(count)
14+
local s = 0
15+
for i = 1, count do s = s + 1 end
16+
return s
17+
end
18+
expected = function(count) return count end
19+
elseif case == 'ffi_struct' then
20+
input = require('ffi').new('struct { double x; double y; }', 0, 1)
21+
n = 50000000
22+
work = function(count, p)
23+
p.x = 0
24+
local s = 0
25+
for i = 1, count do p.x = p.x + 1; s = p.x + p.y end
26+
return s
27+
end
28+
expected = function(count) return count + 1 end
29+
elseif case == 'table_read' then
30+
input = { 1, 2 }
31+
n = 100000000
32+
work = function(count, p)
33+
local s = 0
34+
for i = 1, count do s = s + p[1] + p[2] end
35+
return s
36+
end
37+
expected = function(count) return count * 3 end
38+
else
39+
error('unknown case')
40+
end
41+
42+
assert(work(1000, input) == expected(1000))
43+
assert(exits > 0 and util.traceinfo(1), 'real native warm witness')
44+
local samples, best = {}, math.huge
45+
for i = 1, 5 do
46+
local start = os.clock()
47+
local result = work(n, input)
48+
local elapsed = os.clock() - start
49+
assert(result == expected(n))
50+
samples[i] = string.format('%.9f', elapsed)
51+
best = math.min(best, elapsed)
52+
end
53+
print(case, n, string.format('%.9f', best), table.concat(samples, ','), exits)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"date": "2026-09-05",
3+
"cpu": 30,
4+
"rounds": 7,
5+
"samples_per_process": 5,
6+
"clock": "os.clock CPU seconds",
7+
"GC": "enabled, unchanged defaults",
8+
"host": {
9+
"system": "Linux",
10+
"node": "7f3bd9b38fd8",
11+
"release": "7.2.1-ogc4.1.fc44.x86_64",
12+
"version": "#1 SMP PREEMPT_DYNAMIC Tue Sep 1 22:10:56 UTC 2026",
13+
"machine": "x86_64",
14+
"processor": ""
15+
},
16+
"benchmark_sha256": "2c0bddf908f20b822ee227866734ac7bbe94da0b856f43038fb0f45839d60255",
17+
"binaries": {
18+
"base-normal": "692a47bfd7e06cd7e62c0746148b3550c020dc30a7c021b1a03303d10d654424",
19+
"fix-normal": "4a2fcffb7a64b8e70699175b25421b6e851c43934d7d0f52aa6f5a964509d097"
20+
}
21+
}

0 commit comments

Comments
 (0)