aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir
Commit message (Collapse)AuthorAgeFilesLines
* regalloc: improve spilling and cleanup lemon2026-03-163-349/+396
| | | | | | | | Instead of spilling current interval when running out of registers, spill the longest-lived active interval with a lower spill cost than current. Spill costs are estimated based on multiplicative loop depth. Also cleanup regalloc.c somewhat. Update todo.txt too.
* ir: blk loop index for spill cost lemon2026-03-163-4/+39
|
* eval & fold: handle division overflow for MIN/-1 lemon2026-03-141-2/+6
|
* c: static eval refactoring lemon2026-03-142-4/+7
| | | | | Explicit node for static symbol (addresses). Should not break with edge cases like the previous ad-hoc approach. And some other bugfixes
* ir/fold: fix float conversion overflows lemon2026-03-081-4/+14
|
* ir: fix inlining getting stuck on complex recursive call sequences lemon2026-03-081-8/+17
| | | | | By maintaining a proper stack of inline expansions and refusing to expand callers already present in the stack.
* ir: increase per-function stack size limit lemon2026-03-061-1/+1
|
* ir/dump: fix dumping data in .text lemon2026-03-041-4/+16
|
* regalloc: fix minor regression with storing of regs into spilled stack slots lemon2026-03-041-1/+1
|
* add bswap16/32/64 lemon2026-03-023-0/+9
| | | | | - frontend: __builtin_bswapX intrinsics - backend: ObswapX instructions
* ir: make address ref hash table resizable lemon2026-02-284-21/+43
| | | | Would hit the limit on very large functions (thanks csmith).
* backend: fix edgecases where imm32 immediate overflows lemon2026-02-281-0/+1
|
* regalloc: fix defn of spilled var with immediate lemon2026-02-281-1/+14
| | | | | | With `i64 %a = copy 0xabcdef12345`, if `%a` was spilled, this would turn into a `storei64` instruction with an unencondable immediate operand (larger than 32 bits in x86, non-zero in aarch64).
* fix various warnings lemon2026-02-243-9/+7
|
* inline: fix undefined value returns lemon2026-02-241-1/+2
| | | | | | Previously if an inlined function has a return statement with no value (control flow reaching the closing brace of the function), would use an invalid null reference in the inlined body. Turn it into undef.
* IR: just use an array for extended constants lemon2026-02-195-37/+25
| | | | | The extra work of using a hashtable to intern them is probably unnecessary.
* cfg: dominator computation should ignore blocks with no predecessors lemon2026-02-191-1/+1
| | | | | | | These didn't show up atp before but with inlining, for example, a noreturn function, they could be introduced. And the pass ordering means they wouldn't have been cleaned up before filldom(). An unreachable block having no dominator makes sense too.
* ir: regalloc & x86-64 isel bugfixes lemon2026-02-181-1/+1
|
* ir/dump: sanity check lemon2026-02-181-0/+1
|
* ir/rpo: sanity checks lemon2026-02-181-4/+7
|
* ir: basic inlining pass implementation lemon2026-02-184-11/+333
|
* simpl: fix simplifying known cond branches lemon2026-01-111-8/+3
|
* ir/simpl: stub out some code that wasn't properly tested and broken lemon2026-01-091-0/+2
| | | | I'll figure it out later, but I better not have a broken trunk
* codegen: eliminate redudant consecutive ret sequences lemon2026-01-081-0/+1
|
* ir: only stub out float <-> u64 cvt on x86 lemon2026-01-081-4/+3
| | | | hackish..
* irsimpl: optimize away cond branches after constant propagation lemon2026-01-071-21/+69
|
* basic CSE lemon2026-01-044-0/+119
|
* ir bugfixes lemon2026-01-042-4/+14
|
* rega: fix spill copy of i32 -> i64 lemon2026-01-043-6/+6
|
* backend: separate instrs for integer/float store lemon2025-12-317-19/+30
|
* aarch64 isel syms with offset lemon2025-12-311-6/+3
|
* ir/builder: fix bug optiminzg x+x as x-x -> 0 lemon2025-12-261-2/+3
|
* avoid GOT relocations in unnecessary instances lemon2025-12-253-7/+12
| | | | | Also change xcon to have a flagset for symbols (whether it's a function, locally defined; later: thread local, etc).
* ir: arena-backed linked list for uselists lemon2025-12-243-115/+90
| | | | | Is much simpler than the growable buffers, seems to be just as efficient if not a little faster when benchmarked.
* abi0: get rid of manual instruse reordering lemon2025-12-241-12/+1
| | | | Vestigial, wasn't enough and we're sorting uses in mem2reg now.
* lower alloca as a separate pass before isel lemon2025-12-234-0/+46
|
* ir: use BIT macro for regset (1<< is wrong for u64) lemon2025-12-232-6/+8
|
* simpl: handle multiplication by negative po2 too lemon2025-12-221-5/+9
|
* simpl: optimize unsigned & signed division by power of 2 lemon2025-12-213-19/+66
|
* ir: simpl: optimize some constant multiplications lemon2025-12-212-18/+61
| | | | Reuse irbinop() and irunop() for the constant results cases.
* rega: fix 3ff0bfcb lemon2025-12-211-4/+1
|
* driver: -fsyntax-only lemon2025-12-201-1/+1
|
* rega: fix infinite loop when compiling infinite loop lemon2025-12-201-1/+4
|
* some static assertions for packed type sizes lemon2025-12-201-0/+2
|
* backend: unify pass memory allocation strategies lemon2025-12-207-31/+21
| | | | | | It was all over the place for temporary data structures used by individual passes. Now there is an arena specifically for that, which is nicer.
* backend: general simplification pass skeleton lemon2025-12-203-1/+154
|
* copyopt: optimize same-arg phis with multiple preds lemon2025-12-201-2/+6
|
* ir/regalloc: struct alloc -> union alloc lemon2025-12-201-16/+15
|
* ir: move some filluses() to ir.c, rename optmem.c -> mem2reg.c lemon2025-12-194-30/+29
|
* ir: move cls2load to interface lemon2025-12-183-7/+7
| | | | | There's plenty of code duplication like this around I'm looking to reduce.