| Commit message (Collapse) | Author | Age | Files | Lines | |
|---|---|---|---|---|---|
| * | frontend: accept zero size arrays and empty aggregates | 2026-04-13 | 4 | -31/+67 | |
| | | | | | | | GNU extension. Previously was overloading arraylength==0 to mean unsized array, now they are distinct with the type flag TFUNKNOWN marking unsized arrays & aggregates. | ||||
| * | test/csmith.sh: remove hardcoded memory limit | 2026-04-12 | 1 | -1/+1 | |
| | | | | | This was a temporary workaround before d40371b615 | ||||
| * | get rid of other warnings | 2026-04-12 | 2 | -5/+4 | |
| | | |||||
| * | ir_simpl: remove unused variable | 2026-04-12 | 1 | -3/+2 | |
| | | |||||
| * | aarch64: align leaf func stacks too | 2026-04-12 | 1 | -2/+2 | |
| | | |||||
| * | aarch64: fix stack frame layout, again | 2026-04-12 | 2 | -35/+37 | |
| | | | | | | Turns out hardware enforces SP 16-bit alignment in every SP relative load/store, but QEMU doesn't emulate this. | ||||
| * | test/csmith.sh: add --no-packed-struct | 2026-04-11 | 1 | -1/+1 | |
| | | | | | We don't support #pragma pack yet | ||||
| * | frontend: always narrow assignment expression used as value | 2026-04-11 | 1 | -2/+2 | |
| | | |||||
| * | 0.2.5 | 2026-04-11 | 1 | -2/+2 | |
| | | |||||
| * | testing: script for csmith fuzz testing | 2026-04-11 | 1 | -0/+90 | |
| | | |||||
| * | irdump: dont print instr numbers by default | 2026-04-11 | 1 | -6/+21 | |
| | | |||||
| * | backend: fix memory leak from not calling deluses() after replcuses in some ↵ | 2026-04-11 | 4 | -12/+11 | |
| | | | | | places | ||||
| * | backend: run mem2reg after inlining | 2026-04-11 | 3 | -2/+8 | |
| | | |||||
| * | x86-64/emit: fix stack arg offset for edgecases | 2026-04-11 | 1 | -1/+2 | |
| | | | | | | It was wrong for functions that didn't use the frame pointer but took arguments in the stack | ||||
| * | c: fix bitfields in unions | 2026-04-10 | 1 | -4/+6 | |
| | | |||||
| * | x86-64/isel: always test for ZF after shift | 2026-04-09 | 1 | -3/+3 | |
| | | | | | | The shift instructions do not update flags if the shift amount was zero, so can't realiably do this micro optimization | ||||
| * | backend: inlining improvements | 2026-04-09 | 3 | -13/+29 | |
| | | |||||
| * | mkintcon: bugfix clamp i32 to i32 range | 2026-04-09 | 2 | -3/+5 | |
| | | |||||
| * | x86-64/isel: fix stack addr regression from 8b79b61ae7 | 2026-04-09 | 1 | -2/+4 | |
| | | | | | Checks for RADDR should also look for RSTACK when fusing addresses | ||||
| * | x86-64/isel: use integer stores for storing float constants | 2026-04-09 | 1 | -2/+16 | |
| | | | | | | Because the integer mov can have immediate operands, avoids a round trip through an XMM register. | ||||
| * | aarch64 handle more cases of stack relative addressing | 2026-04-09 | 2 | -3/+21 | |
| | | |||||
| * | 0.2.4 | 2026-04-08 | 1 | -2/+2 | |
| | | |||||
| * | Implement basic aarch64 struct arg passing ABI | 2026-04-08 | 10 | -139/+204 | |
| | | | | | | | | | | | - Missing: vaargs, >2 member HFAs - Reworked the way stack allocation references are lowered. Now RSTACK persists throughout all passes until emit. This allows deferring stack frame layouting until the end in a less messy way than before, which was emiting frame-pointer relative addresses @ isel time and patching them up later in emit to account for actual stack frame layout. | ||||
| * | x86-64: redzone optimization for leaf functions | 2026-03-27 | 2 | -9/+12 | |
| | | | | | Don't use frame pointer or explicitly modify stack pointer for these | ||||
| * | aarch64: GOT relocations | 2026-03-26 | 3 | -18/+49 | |
| | | |||||
| * | driver: try to autodetect crosscc includs | 2026-03-25 | 1 | -0/+21 | |
| | | |||||
| * | inliner: fix UB when ninstrtab==0 | 2026-03-25 | 1 | -1/+1 | |
| | | |||||
| * | abi: fix use bug preventing mem2reg optimization of struct return | 2026-03-25 | 2 | -4/+5 | |
| | | |||||
| * | aarch64 struct arg passing ABI wip | 2026-03-25 | 5 | -11/+127 | |
| | | |||||
| * | *skip | 2026-03-24 | 1 | -1/+1 | |
| | | |||||
| * | cpp: support directives within macro argument list | 2026-03-24 | 3 | -55/+93 | |
| | | | | | Undefined behavior by the standard but a GNU extension. | ||||
| * | driver: -pthread -> -D_REENTRANT & -lpthread | 2026-03-24 | 1 | -1/+4 | |
| | | |||||
| * | regalloc: remove dead code for liveness fixup | 2026-03-24 | 1 | -100/+22 | |
| | | | | | | | I tested it and it seems this wasn't doing anything. Maybe at some point in the past it was needed to fix up a worse implementation of mem2reg? So turn it into a check. Maybe it's wrong and it can be necessary. | ||||
| * | ir_inliner: redundant check | 2026-03-24 | 1 | -1/+0 | |
| | | |||||
| * | Update todo | 2026-03-24 | 1 | -2/+4 | |
| | | |||||
| * | get rid of imap (was only used for mem2reg, no longer) | 2026-03-24 | 2 | -111/+0 | |
| | | |||||
| * | mem2reg rewrite | 2026-03-24 | 2 | -108/+74 | |
| | | | | | | | | Do it in 2 passes: 1. gather variables, 2. step thru RPO transforming loads/stores to each variable. More elegant solution to f9e3a52eaa. More efficient since all variable usages are visited in CFG order, which matters due to block sealing. | ||||
| * | 0.2.3 | 2026-03-23 | 1 | -2/+2 | |
| | | |||||
| * | IR: emit inline function standalone bodies lazily | 2026-03-23 | 10 | -41/+139 | |
| | | | | | | | | If a function is stashed for inlining and inlined in all of its callsites or unused, it never ends up in the object file. If any symbol reference to it is emitted, then it must be de-inlined (rematerialized), and this is done near the end before emitting the actual object file. | ||||
| * | IR: mark free'd instructions as such | 2026-03-23 | 8 | -44/+54 | |
| | | | | | | That way they are not copied when inlining. Also rename ninstr -> ninstrtab. opnarg -> opnoper | ||||
| * | 4f2fb9ba5f fix | 2026-03-23 | 1 | -1/+2 | |
| | | |||||
| * | <iso646.h>, test for libc headers | 2026-03-23 | 3 | -4/+62 | |
| | | |||||
| * | tests: don't rely on unportable %p output | 2026-03-23 | 2 | -7/+11 | |
| | | |||||
| * | rega/devirt: don't assume unused operands are zeroinitialized | 2026-03-23 | 1 | -1/+1 | |
| | | |||||
| * | c: recognize __alignof__ and __alignas__ | 2026-03-23 | 1 | -2/+2 | |
| | | |||||
| * | c: __attribute__ after declarator | 2026-03-23 | 1 | -0/+1 | |
| | | |||||
| * | io: use FILE* for buf fp impl | 2026-03-23 | 2 | -8/+10 | |
| | | |||||
| * | c: __attribute__ in more places | 2026-03-23 | 1 | -0/+2 | |
| | | |||||
| * | c: remove inline 'backing' type tag for enums | 2026-03-23 | 3 | -9/+4 | |
| | | | | | | | | | | | It was meant as a micro-optimization but actually keeping it in sync was annoying. This for example was broken: ``` extern enum foo { ... } g_foo; enum foo g_foo; ``` | ||||
| * | style: change uvlong -> u64int, vlong -> s64int | 2026-03-22 | 22 | -125/+125 | |
| | | | | | | Is much nicer. I don't know whether I want to do it for the other int types too. char and uchar are fine as bytes. u/short -> u/s16int, maybe. | ||||