aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir
Commit message (Collapse)AuthorAgeFilesLines
* 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.
* regalloc+emit: get rid of xsave/xrestore hack lemon2025-12-182-51/+63
| | | | | | | Was used for situation where we needed to spill more than 1 temporary and have to use a register that is already used. Instead of push/pop, we can just allocate and set aside specific stack slots for this purpose. Also, reworked linearscan() interval sets to separate FPR/GPR intervals.
* rega: implement stack<->stack swap for parallel moves lemon2025-12-181-29/+34
|
* x86_64: for vararg calls, write to EAX in isel lemon2025-12-181-8/+25
| | | | Also, in regalloc ensure fixed intervals are sorted
* x86-64/emit: implement single-exit-point ret with jump threading lemon2025-12-162-1/+3
|
* bitset: better implementation of bsiter() and stuff lemon2025-12-162-2/+2
| | | | Also changed the type to size_t for portability
* mem2reg: fix obvious inefficiency lemon2025-12-161-16/+10
| | | | | | | deltrivialphis() was iterating over every variably instead of just looking at the variable being examined. And I'd been wondering why mem2reg was such a bottleneck for a testcase like sqlite3 amalgamation.. it's easy to miss the forest for the trees.
* create distinct interned string type lemon2025-12-153-10/+10
| | | | | | | | | | | | | | Interned strings are used pervasively, so it's a good idea to add a layer of type safety to differentiate them from general cstrs and avoid potential bugs from comparing non-interned and interned strings. Not that that's happened so far that I can remember, but it could. I'm 90% sure it's legal to alias `struct {char c;}` pointers with `char` pointers. This specific typedef gives type safety but with a simple one-way `internstr -> const char *` typecast (with `&istr->c`). Converting the other way around is more intentional: a straight up cast `(internstr)cstr` which sticks out as unchecked and probably wrong, or calling the intern(cstr) function, which is the right way.
* move intern() to mem.c lemon2025-12-151-1/+0
| | | | | Being in lex.c was vestigial, since it was being used all over the frontend and backend.