Skip to content

perf(llvm): limit expensive live range splitting#362

Merged
DaniPopes merged 3 commits intomainfrom
dani/llvm-huge-size-for-split
Apr 28, 2026
Merged

perf(llvm): limit expensive live range splitting#362
DaniPopes merged 3 commits intomainfrom
dani/llvm-huge-size-for-split

Conversation

@DaniPopes
Copy link
Copy Markdown
Collaborator

@DaniPopes DaniPopes commented Apr 28, 2026

This tunes LLVM greedy register allocation for the large single-function modules that revmc generates. Greedy regalloc's global live range splitting can spend seconds on rematerializable values with many live-range segments; lowering huge-size-for-split makes LLVM use its cheaper splitting path for those cases.

Benchmarks

Headline numbers across all benchmarks discovered by ./scripts/bench.py (21 built-ins plus 9 tmp/mainnet contracts): total compile time -27.1%, codegen -32.2%, and total jit size is unchanged. The biggest wins are snailtracer (8.315s to 1.580s total, codegen 4.134s to 668ms), onchain_lm_v2 (4.551s to 1.486s total, codegen 2.060s to 489ms), and burntpix (6.157s to 4.841s total, codegen 2.095s to 1.652s).

The full no-argument benchmark set requires a local CLI fix for multi-contract fixtures that defer JIT finalization until all fixture bytecodes are translated. That fix was applied to both sides of this benchmark, so the comparison below isolates the LLVM flag against main plus that CLI fix.

Codegen statistics

benchmark unopt.ll opt.ll opt.s jit size i256 loads i256 stores spills reloads
TOTAL = = = = = = = =
Full details
benchmark unopt.ll opt.ll opt.s jit size i256 loads i256 stores spills reloads
fibonacci-calldata 356
356
=
113
113
=
306
306
=
444 B
444 B
=
2
2
=
3
3
=
5
5
=
6
6
=
factorial 348
348
=
115
115
=
348
348
=
601 B
601 B
=
2
2
=
3
3
=
8
8
=
9
9
=
counter 1018
1018
=
343
343
=
541
541
=
876 B
876 B
=
8
8
=
7
7
=
0
0
-
0
0
-
snailtracer 54487
54487
=
20614
20614
=
41289
41289
=
114.6 KiB
114.6 KiB
=
1379
1379
=
2245
2245
=
96
96
=
528
528
=
weth 12758
12758
=
3743
3743
=
6180
6180
=
19.0 KiB
19.0 KiB
=
256
256
=
342
342
=
32
32
=
106
106
=
hash_10k 968
968
=
309
309
=
557
557
=
1.4 KiB
1.4 KiB
=
16
16
=
23
23
=
0
0
-
0
0
-
erc20_transfer 13888
13888
=
4890
4890
=
9826
9826
=
25.7 KiB
25.7 KiB
=
308
308
=
441
441
=
14
14
=
82
82
=
push0_proxy 371
371
=
183
183
=
339
339
=
633 B
633 B
=
1
1
=
15
15
=
0
0
-
0
0
-
usdc_proxy 7162
7162
=
2597
2597
=
4733
4733
=
11.7 KiB
11.7 KiB
=
105
105
=
196
196
=
24
24
=
23
23
=
fiat_token 77617
77617
=
24084
24084
=
43709
43709
=
144.0 KiB
144.0 KiB
=
1773
1773
=
2609
2609
=
173
173
=
748
748
=
uniswap_v2_pair 43815
43815
=
14124
14124
=
24740
24740
=
79.2 KiB
79.2 KiB
=
888
888
=
1373
1373
=
80
80
=
436
436
=
univ2_router 81868
81868
=
26146
26146
=
46130
46087
-0.1% 🟢
164.9 KiB
164.4 KiB
-0.3% 🟢
2009
2009
=
2914
2914
=
272
272
=
537
537
=
seaport 131064
131064
=
50577
50577
=
94440
94440
=
293.2 KiB
293.2 KiB
=
4232
4232
=
5268
5268
=
437
437
=
2483
2483
=
airdrop 27296
27296
=
9377
9377
=
17198
17198
=
47.2 KiB
47.2 KiB
=
560
560
=
841
841
=
57
57
=
340
340
=
bswap64 2119
2119
=
537
537
=
1013
1013
=
2.6 KiB
2.6 KiB
=
29
29
=
53
53
=
0
0
-
0
0
-
bswap64_opt 1807
1807
=
490
490
=
911
911
=
2.5 KiB
2.5 KiB
=
33
33
=
51
51
=
0
0
-
0
0
-
eip4788 597
597
=
224
224
=
409
409
=
716 B
716 B
=
8
8
=
9
9
=
1
1
=
1
1
=
eip2935 542
542
=
196
196
=
398
398
=
739 B
739 B
=
6
6
=
5
5
=
0
0
-
0
0
-
curve_stableswap 23318
23318
=
8645
8645
=
15632
15632
=
28.2 KiB
28.2 KiB
=
522
522
=
812
812
=
25
25
=
106
106
=
onchain_lm_v2 62942
62942
=
21343
21343
=
40361
40361
=
107.6 KiB
107.6 KiB
=
1353
1353
=
1692
1692
=
67
67
=
471
471
=
burntpix 209433
209433
=
71854
71854
=
131782
131821
=
221.1 KiB
221.1 KiB
=
5298
5298
=
6832
6832
=
599
599
=
2708
2709
=
0x184e2e0d92… 133704
133704
=
38862
38862
=
69733
69733
=
228.9 KiB
228.9 KiB
=
2987
2987
=
4492
4492
=
358
358
=
2621
2621
=
0x26f3fa5857… 137618
137618
=
36315
36315
=
75489
75489
=
302.2 KiB
302.2 KiB
=
3594
3594
=
5343
5343
=
619
619
=
2204
2204
=
0x7497bfab49… 138128
138128
=
36592
36592
=
75492
75492
=
301.7 KiB
301.7 KiB
=
3614
3614
=
5337
5337
=
622
622
=
2099
2099
=
0x8819f74c38… 146858
146858
=
41987
41987
=
83042
83405
+0.4% 🔴
312.6 KiB
313.1 KiB
+0.1% 🔴
3910
3910
=
5108
5108
=
755
755
=
2334
2334
=
0x9806ed1505… 121219
121219
=
38239
38239
=
60775
60775
=
201.1 KiB
201.1 KiB
=
2536
2536
=
3463
3463
=
462
462
=
1365
1365
=
0xcc74d4c66f… 120766
120766
=
37192
37192
=
65538
65538
=
208.3 KiB
208.3 KiB
=
2626
2626
=
3546
3546
=
252
252
=
1531
1531
=
0xd450e90507… 130435
130435
=
37588
37588
=
68319
68110
-0.3% 🟢
236.0 KiB
237.1 KiB
+0.5% 🔴
2884
2884
=
4476
4476
=
298
296
-0.7% 🟢
1620
1616
-0.2% 🟢
0xfbbee2ff80… 119343
119343
=
36765
36765
=
64875
64875
=
202.7 KiB
202.7 KiB
=
2595
2595
=
3507
3507
=
249
249
=
1519
1519
=
0xfc5900eac5… 96771
96771
=
28806
28806
=
43735
43735
=
140.5 KiB
140.5 KiB
=
1874
1874
=
2758
2758
=
203
203
=
888
888
=
TOTAL 1898616
1898616
=
592850
592850
=
1087840
1087990
=
3.3 MiB
3.3 MiB
=
45408
45408
=
63764
63764
=
5708
5706
=
24765
24762
=

Compile times

benchmark total parse translate finalize codegen
fibonacci-calldata +3.6% 🔴 +4.5% 🔴 -1.1% 🟢 +2.1% 🔴 +7.2% 🔴
factorial +2.2% 🔴 -3.1% 🟢 +7.4% 🔴 +2.7% 🔴 +0.8% 🔴
counter +2.9% 🔴 -7.8% 🟢 +1.2% 🔴 +2.4% 🔴 +4.9% 🔴
snailtracer -81.0% 🟢 -0.4% 🟢 +7.7% 🔴 -78.5% 🟢 -83.8% 🟢
weth -0.8% 🟢 +4.7% 🔴 +9.4% 🔴 -2.0% 🟢 +0.6% 🔴
erc20_transfer -0.3% 🟢 -3.6% 🟢 -7.0% 🟢 -0.9% 🟢 +1.0% 🔴
push0_proxy +0.8% 🔴 -4.6% 🟢 +6.5% 🔴 +2.1% 🔴 -2.0% 🟢
usdc_proxy -3.9% 🟢 -3.5% 🟢 -3.9% 🟢 -2.7% 🟢 -5.8% 🟢
fiat_token +2.7% 🔴 -1.0% 🟢 +13.4% 🔴 +0.2% 🔴 +6.4% 🔴
uniswap_v2_pair +2.1% 🔴 +10.1% 🔴 +11.0% 🔴 +1.5% 🔴 +2.8% 🔴
seaport -6.6% 🟢 +3.5% 🔴 +15.8% 🔴 -6.4% 🟢 -7.9% 🟢
bswap64 -4.1% 🟢 -5.6% 🟢 -6.9% 🟢 -3.5% 🟢 -4.7% 🟢
bswap64_opt -5.9% 🟢 -7.6% 🟢 -2.4% 🟢 -7.3% 🟢 -3.6% 🟢
eip4788 -4.6% 🟢 -5.4% 🟢 -5.6% 🟢 -7.6% 🟢 +1.2% 🔴
eip2935 -9.1% 🟢 -3.0% 🟢 -9.8% 🟢 -11.4% 🟢 -5.1% 🟢
curve_stableswap -5.5% 🟢 -1.8% 🟢 +4.4% 🔴 -4.2% 🟢 -8.1% 🟢
onchain_lm_v2 -67.3% 🟢 -4.7% 🟢 -12.1% 🟢 -66.8% 🟢 -76.3% 🟢
burntpix -21.4% 🟢 -1.0% 🟢 -12.4% 🟢 -21.8% 🟢 -21.1% 🟢
0x184e2e0d92… -7.8% 🟢 +1.1% 🔴 -1.5% 🟢 -1.2% 🟢 -18.2% 🟢
0x26f3fa5857… -6.5% 🟢 -1.5% 🟢 +2.2% 🔴 -13.1% 🟢 +4.4% 🔴
0x7497bfab49… -26.5% 🟢 +1.3% 🔴 -2.9% 🟢 -37.5% 🟢 -3.0% 🟢
0x8819f74c38… +3.1% 🔴 -2.4% 🟢 -6.1% 🟢 = +8.3% 🔴
0x9806ed1505… +9.1% 🔴 +5.0% 🔴 +2.5% 🔴 +13.5% 🔴 +1.5% 🔴
0xcc74d4c66f… -0.2% 🟢 -4.1% 🟢 -10.1% 🟢 +0.6% 🔴 -1.0% 🟢
0xd450e90507… -16.2% 🟢 -3.3% 🟢 -7.7% 🟢 -13.3% 🟢 -21.0% 🟢
0xfbbee2ff80… -12.7% 🟢 -4.1% 🟢 -5.4% 🟢 -15.5% 🟢 -7.7% 🟢
TOTAL -27.1% 🟢 -2.3% 🟢 -2.2% 🟢 -24.5% 🟢 -32.2% 🟢
Full compile times
benchmark total parse translate finalize codegen
fibonacci-calldata 9.51ms
9.85ms
+3.6% 🔴
195.4µs
204.3µs
+4.5% 🔴
488.1µs
482.6µs
-1.1% 🟢
5.80ms
5.92ms
+2.1% 🔴
3.03ms
3.25ms
+7.2% 🔴
factorial 10.3ms
10.6ms
+2.2% 🔴
186.5µs
180.7µs
-3.1% 🟢
470.2µs
505.1µs
+7.4% 🔴
6.15ms
6.32ms
+2.7% 🔴
3.52ms
3.55ms
+0.8% 🔴
counter 13.6ms
14.0ms
+2.9% 🔴
367.2µs
338.5µs
-7.8% 🟢
611.4µs
618.7µs
+1.2% 🔴
8.13ms
8.33ms
+2.4% 🔴
4.51ms
4.73ms
+4.9% 🔴
snailtracer 8.315s
1.580s
-81.0% 🟢
8.41ms
8.37ms
-0.4% 🟢
10.1ms
10.9ms
+7.7% 🔴
4.162s
893.0ms
-78.5% 🟢
4.134s
668.0ms
-83.8% 🟢
weth 164.1ms
162.8ms
-0.8% 🟢
2.20ms
2.30ms
+4.7% 🔴
2.79ms
3.05ms
+9.4% 🔴
97.9ms
95.9ms
-2.0% 🟢
61.2ms
61.5ms
+0.6% 🔴
hash_10k 14.6ms
15.1ms
+3.8% 🔴
297.7µs
308.4µs
+3.6% 🔴
606.7µs
624.1µs
+2.9% 🔴
8.88ms
9.21ms
+3.6% 🔴
4.79ms
5.00ms
+4.2% 🔴
erc20_transfer 318.6ms
317.8ms
-0.3% 🟢
2.41ms
2.33ms
-3.6% 🟢
3.17ms
2.94ms
-7.0% 🟢
187.3ms
185.5ms
-0.9% 🟢
125.7ms
127.0ms
+1.0% 🔴
push0_proxy 9.65ms
9.73ms
+0.8% 🔴
177.5µs
169.3µs
-4.6% 🟢
460.5µs
490.3µs
+6.5% 🔴
5.76ms
5.88ms
+2.1% 🔴
3.26ms
3.19ms
-2.0% 🟢
usdc_proxy 110.4ms
106.1ms
-3.9% 🟢
1.44ms
1.39ms
-3.5% 🟢
1.90ms
1.82ms
-3.9% 🟢
66.3ms
64.5ms
-2.7% 🟢
40.8ms
38.4ms
-5.8% 🟢
fiat_token 1.238s
1.271s
+2.7% 🔴
15.7ms
15.5ms
-1.0% 🟢
14.5ms
16.5ms
+13.4% 🔴
739.8ms
741.3ms
+0.2% 🔴
467.8ms
497.6ms
+6.4% 🔴
uniswap_v2_pair 721.1ms
736.5ms
+2.1% 🔴
7.24ms
7.96ms
+10.1% 🔴
8.28ms
9.19ms
+11.0% 🔴
463.8ms
470.8ms
+1.5% 🔴
241.8ms
248.5ms
+2.8% 🔴
univ2_router 1.374s
1.353s
-1.5% 🟢
14.3ms
14.9ms
+4.5% 🔴
16.1ms
15.8ms
-2.1% 🟢
819.9ms
812.4ms
-0.9% 🟢
523.8ms
509.5ms
-2.7% 🟢
seaport 3.344s
3.122s
-6.6% 🟢
20.4ms
21.2ms
+3.5% 🔴
24.7ms
28.7ms
+15.8% 🔴
2.190s
2.050s
-6.4% 🟢
1.110s
1.022s
-7.9% 🟢
airdrop 494.7ms
483.1ms
-2.3% 🟢
4.72ms
4.61ms
-2.5% 🟢
5.64ms
5.58ms
-1.1% 🟢
330.1ms
324.4ms
-1.7% 🟢
154.2ms
148.5ms
-3.7% 🟢
bswap64 22.9ms
22.0ms
-4.1% 🟢
532.5µs
502.4µs
-5.6% 🟢
871.9µs
811.4µs
-6.9% 🟢
13.7ms
13.2ms
-3.5% 🟢
7.83ms
7.46ms
-4.7% 🟢
bswap64_opt 21.7ms
20.4ms
-5.9% 🟢
455.6µs
421.1µs
-7.6% 🟢
751.5µs
733.3µs
-2.4% 🟢
13.1ms
12.1ms
-7.3% 🟢
7.42ms
7.15ms
-3.6% 🟢
eip4788 11.6ms
11.1ms
-4.6% 🟢
242.8µs
229.7µs
-5.4% 🟢
547.2µs
516.4µs
-5.6% 🟢
7.06ms
6.52ms
-7.6% 🟢
3.77ms
3.81ms
+1.2% 🔴
eip2935 11.3ms
10.2ms
-9.1% 🟢
227.9µs
221.1µs
-3.0% 🟢
561.4µs
506.4µs
-9.8% 🟢
6.82ms
6.04ms
-11.4% 🟢
3.66ms
3.48ms
-5.1% 🟢
curve_stableswap 397.2ms
375.3ms
-5.5% 🟢
4.03ms
3.95ms
-1.8% 🟢
4.54ms
4.74ms
+4.4% 🔴
244.7ms
234.3ms
-4.2% 🟢
144.0ms
132.3ms
-8.1% 🟢
onchain_lm_v2 4.551s
1.486s
-67.3% 🟢
261.7ms
249.4ms
-4.7% 🟢
15.7ms
13.8ms
-12.1% 🟢
2.214s
734.4ms
-66.8% 🟢
2.060s
488.5ms
-76.3% 🟢
burntpix 6.157s
4.841s
-21.4% 🟢
38.6ms
38.2ms
-1.0% 🟢
47.5ms
41.6ms
-12.4% 🟢
3.976s
3.110s
-21.8% 🟢
2.095s
1.652s
-21.1% 🟢
0x184e2e0d92… 2.510s
2.313s
-7.8% 🟢
24.5ms
24.8ms
+1.1% 🔴
26.5ms
26.1ms
-1.5% 🟢
1.480s
1.462s
-1.2% 🟢
978.6ms
800.1ms
-18.2% 🟢
0x26f3fa5857… 2.062s
1.929s
-6.5% 🟢
23.9ms
23.5ms
-1.5% 🟢
26.4ms
27.0ms
+2.2% 🔴
1.269s
1.103s
-13.1% 🟢
742.4ms
775.2ms
+4.4% 🔴
0x7497bfab49… 2.666s
1.960s
-26.5% 🟢
22.6ms
22.9ms
+1.3% 🔴
26.5ms
25.8ms
-2.9% 🟢
1.821s
1.139s
-37.5% 🟢
796.1ms
772.2ms
-3.0% 🟢
0x8819f74c38… 2.422s
2.496s
+3.1% 🔴
25.8ms
25.2ms
-2.4% 🟢
28.5ms
26.8ms
-6.1% 🟢
1.452s
1.452s
=
916.3ms
992.6ms
+8.3% 🔴
0x9806ed1505… 2.197s
2.397s
+9.1% 🔴
19.1ms
20.1ms
+5.0% 🔴
22.6ms
23.1ms
+2.5% 🔴
1.387s
1.574s
+13.5% 🔴
768.7ms
779.9ms
+1.5% 🔴
0xcc74d4c66f… 1.993s
1.989s
-0.2% 🟢
20.7ms
19.9ms
-4.1% 🟢
25.0ms
22.5ms
-10.1% 🟢
1.227s
1.234s
+0.6% 🔴
719.6ms
712.2ms
-1.0% 🟢
0xd450e90507… 2.371s
1.986s
-16.2% 🟢
21.3ms
20.6ms
-3.3% 🟢
25.9ms
23.9ms
-7.7% 🟢
1.379s
1.196s
-13.3% 🟢
943.9ms
746.0ms
-21.0% 🟢
0xfbbee2ff80… 2.306s
2.014s
-12.7% 🟢
20.5ms
19.7ms
-4.1% 🟢
23.6ms
22.3ms
-5.4% 🟢
1.486s
1.255s
-15.5% 🟢
776.7ms
717.2ms
-7.7% 🟢
0xfc5900eac5… 1.532s
1.512s
-1.3% 🟢
16.9ms
16.5ms
-2.2% 🟢
21.0ms
20.8ms
-1.1% 🟢
954.3ms
941.6ms
-1.3% 🟢
540.0ms
532.8ms
-1.3% 🟢
TOTAL 47.369s
34.554s
-27.1% 🟢
579.0ms
565.7ms
-2.3% 🟢
386.4ms
378.0ms
-2.2% 🟢
28.022s
21.147s
-24.5% 🟢
18.382s
12.463s
-32.2% 🟢

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 28, 2026

Merging this PR will not alter performance

✅ 65 untouched benchmarks
⏩ 24 skipped benchmarks1


Comparing dani/llvm-huge-size-for-split (8e57c45) with main (03a9a10)

Open in CodSpeed

Footnotes

  1. 24 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@DaniPopes DaniPopes merged commit 4c678ea into main Apr 28, 2026
18 checks passed
@DaniPopes DaniPopes deleted the dani/llvm-huge-size-for-split branch April 28, 2026 23:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant