Chris Fallin
f27abc9c48
Remove infinite-loop check: it is not a high enough bound in some pathological cases (e.g., gc::many_live_refs test in wasmtime), and it has served its purpose in testing. We can rely on more detailed assertions, e.g. that splits actually shrink bundles and that bundles evict only lower-priority bundles, instead.
2021-06-22 12:06:12 -07:00
Chris Fallin
245c212289
Revert "Add fixed-non-allocatable operand support."
...
This feature needs more thought; for now we will of course continue to
support pinned vregs, but perhaps we can do better for
"pass-through-and-forget" operands that are given non-allocatable
registers.
This reverts commit 736f636c36 .
2021-06-20 23:03:44 -07:00
Chris Fallin
21fb233809
reduce nesting level in DESIGN.md to make pandoc-to-pdf happy
2021-06-19 13:41:26 -07:00
Chris Fallin
a58d36fd94
TODO update: make note on idea for large-input support
2021-06-19 13:20:11 -07:00
Chris Fallin
22eed0a6ae
Make bitvec public; it is used by regalloc.rs shim too.
2021-06-19 12:47:02 -07:00
Chris Fallin
736f636c36
Add fixed-non-allocatable operand support.
2021-06-19 12:17:18 -07:00
Chris Fallin
50eb6fc42f
Keep internal modules private, but re-export under fuzzing feature flag
2021-06-19 12:08:37 -07:00
Chris Fallin
caf7274efd
Remove unused pred_pos
2021-06-19 11:48:54 -07:00
Chris Fallin
36975b8b6f
Add doc-comment note on Edit that stack-to-stack moves are never generated.
2021-06-19 11:34:05 -07:00
Chris Fallin
b36a563d69
Cleanup: split allocator implemntation into 11 files of more reasonable size.
2021-06-18 16:51:41 -07:00
Chris Fallin
6944bc4735
Fix typo (thanks @bjorn3).
...
Co-authored-by: bjorn3 <bjorn3@users.noreply.github.com >
2021-06-18 15:24:11 -07:00
Chris Fallin
6ec6207717
Add design document.
2021-06-18 13:59:12 -07:00
Chris Fallin
a686d5a513
Always recompute prio when recomputing bundle properties; otherwise is zero on new bundles and causes spill weight to be zeroed
2021-06-11 13:21:50 -07:00
Chris Fallin
ea814225a2
Update TODO list
2021-06-10 23:34:18 -07:00
Chris Fallin
1bd1248cb5
Avoid stack-to-stack moves by allocating an extra spillslot and re-using the scratch reg instead.
2021-06-10 22:36:02 -07:00
Chris Fallin
09b2dd4e73
TODO list update
2021-06-10 17:34:04 -07:00
Chris Fallin
fcbf384d74
Use hashset to avoid linear scan in conflict-bundle-set deduplication
2021-06-09 23:53:54 -07:00
Chris Fallin
4ba7b2f57e
Improve redundant-move elimination: don't skip the case where we don't hvae vreg metadata within a BB. Instead, keep the checker happy by feeding more metadata to it on every move.
2021-06-09 23:29:48 -07:00
Chris Fallin
2851ac80c7
Working redundant-move elimination
2021-06-09 23:03:16 -07:00
Chris Fallin
f898b8dcbd
Some fuzzbug fixes
2021-06-09 20:58:54 -07:00
Chris Fallin
e33790d8e7
do not remove redundant move if we don't have local (within-basic-block) vreg tags, as this might throw off the checker
2021-06-08 01:30:29 -07:00
Chris Fallin
0f270e5bcc
WIP.
2021-06-08 01:14:10 -07:00
Chris Fallin
940bc40fae
Redundant move eliminator.
2021-06-08 00:08:28 -07:00
Chris Fallin
c6bcd3c941
WIP: redundant-move elimination.
2021-06-07 21:15:32 -07:00
Chris Fallin
2be7bdbc22
Split-at-first-conflict: first conflict is first of (start of our range), (start of conflict range), not just the latter; otherwise we have a too-early split sometimes
2021-06-07 12:27:58 -07:00
Chris Fallin
0eaa0fde06
Fix to checker: analyze all blocks, even if out-state of entry block is empty
2021-06-05 14:47:55 -07:00
Chris Fallin
30f42a8717
Fix fuzzbug: properly detect too-many-live-regs condition on fuzzing input. Must be careful in how we probe the BTree when we have multiple "equal" (overlapping) keys.
2021-06-03 23:48:33 -07:00
Chris Fallin
5560499b80
Adaptive commitment-map scanning: re-probe from root if we skip too many entries in linear BTree scan
2021-06-03 18:17:28 -07:00
Chris Fallin
00e4240c93
merge bundles much faster by just concatenating range-lists and unstable-sorting, rather than a merge-sort-like traversal. Rust stdlib sort is very optimized. clang.wasm 9.1s -> 6.8s now.
2021-06-03 17:34:19 -07:00
Chris Fallin
6a0739b62a
Implement spill-bundle: move all empty ranges, and empty leading/trailing pieces surrounding split points, to a single spill bundle, in an attempt to avoid excessive movement
2021-06-03 00:18:27 -07:00
Chris Fallin
dc2b0d1913
Add a perf idea to TODO list
2021-06-01 23:13:08 -07:00
Chris Fallin
2fe276ca04
BTreeMap probe fix (fuzzbug): BTree does not interact nicely with LiveRangeKey definition of equality; need to probe with one-less-than start to get proper range
2021-06-01 23:10:34 -07:00
Chris Fallin
a2a770ec50
Fuzzbug fix
2021-06-01 18:57:07 -07:00
Chris Fallin
2614eac21e
fuzzbug fix: restore clean error exit required by regalloc.rs fuzzer on too-many-live-regs error
2021-06-01 16:31:33 -07:00
Chris Fallin
e49727dc75
Fuzzbug fix: fix some weirdness with BTree iteration inner loop
2021-06-01 15:32:12 -07:00
Chris Fallin
44ca1893c3
Fuzzbug fix: properly check for conflicting reqs before merging bundles (cached values are not computed yet)
2021-06-01 14:52:59 -07:00
Chris Fallin
f49167e0fe
emit annotations at Info level, for easier selective perf-debugging
2021-05-28 18:40:39 -07:00
Chris Fallin
789651f947
Rework inner allocation-loop code: choose more wisely between splitting and evicting based on costs (and unify the fixed-reg-constraint case)
2021-05-28 17:36:06 -07:00
Chris Fallin
43d7095cbd
Properly split when we hit a fixed conflict
2021-05-28 16:49:32 -07:00
Chris Fallin
7171624750
Don't generate r1->scratch,scratch-r1 sequence for cyclic moves of r1->r1 that are generated to change vreg ownership and keep the checker happy. Seems to eliminate a bit of braindeadness and improve bz2 by ~5-10%.
2021-05-26 21:35:43 -07:00
Chris Fallin
13bde99d7d
bugfix with clean-spill opt: avoid if liverange starts at start of block (this is like a def) or if has starts-at-def flag.
2021-05-26 18:08:41 -07:00
Chris Fallin
e521811b88
Avoid re-spilling to spillslot when still clean: intra-block edition (inter-block needs more analysis and careful thought)
2021-05-26 17:08:14 -07:00
Chris Fallin
dcf6f473ca
inline some things
2021-05-26 00:48:41 -07:00
Chris Fallin
4e0dd1f296
little tweak to avoid a div/mod on every iter of a PReg alloc loop
2021-05-26 00:38:53 -07:00
Chris Fallin
b3dc2b25a5
Alloc spillsets for whole vreg, not just spilled LRs. This is a prerequisite to allowing a "clean" value to remain in spillslot while also in reg and avoiding the re-spill. It should also reduce stack-to-stack moves (though they can still come from progmoves).
2021-05-25 18:19:25 -07:00
Chris Fallin
ca5f24f6b7
Hint the same PReg for both halves of a split
2021-05-24 23:49:47 -07:00
Chris Fallin
7cdcb2031e
Split heuristic: split before entering deeper loop nest
2021-05-24 23:09:05 -07:00
Chris Fallin
8887077b59
small fix: preserve starts-at-def flag when setting liverange weight
2021-05-24 22:45:25 -07:00
Chris Fallin
3382f9a2e8
Split based on first conflict of lowest-weight conflict, not first conflict. Also stop scanning PRegs when max bundle weight in conflict bundle list exceeds current best option.
2021-05-24 22:26:57 -07:00
Chris Fallin
5b47462e0c
Loop depth instead of hot/cold, with fast O(n) loop-depth computation. Use this to compute use weights.
2021-05-24 22:09:41 -07:00