diff options
| author | 2026-02-18 18:17:14 +0100 | |
|---|---|---|
| committer | 2026-02-18 18:19:11 +0100 | |
| commit | 0b90de2e773f439fa606ddf2bc403d2f42fa4c3d (patch) | |
| tree | 2b7b6600d8bbbe08735c1f2d6d3e6b2885c0e5e0 /ir/ir.c | |
| parent | 886fdfe8c856ee778103661b832b28cf3e6aed7e (diff) | |
ir: basic inlining pass implementation
Diffstat (limited to 'ir/ir.c')
| -rw-r--r-- | ir/ir.c | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -100,7 +100,7 @@ newaddr(const struct addr *addr) } } -static int +int newcon(const struct xcon *con) { uint h = hashb(0, con, sizeof *con); @@ -292,8 +292,8 @@ freeblk(struct function *fn, struct block *blk) vfree(&blk->ins); if (blk->id != -1) --fn->nblk; - if (blk->lnext) blk->lnext->lprev = blk->lprev; if (blk->lprev) blk->lprev->lnext = blk->lnext; + if (blk->lnext) blk->lnext->lprev = blk->lprev; blk->id = 1u<<31; } @@ -330,9 +330,14 @@ blksplitafter(struct function *fn, struct block *blk, int idx) new->lnext = blk->lnext; blk->lnext = new; new->lnext->lprev = new; - if (idx < blk->ins.n-1) - vpushn(&new->ins, &blk->ins.p[idx+1], blk->ins.n-idx-1); - blk->ins.n -= new->ins.n; + if (idx == -1) { + new->ins = blk->ins; + memset(&blk->ins, 0, sizeof blk->ins); + } else { + if (idx < blk->ins.n-1) + vpushn(&new->ins, &blk->ins.p[idx+1], blk->ins.n-idx-1); + blk->ins.n -= new->ins.n; + } new->jmp = blk->jmp; blk->jmp.t = Jb; memset(blk->jmp.arg, 0, sizeof blk->jmp.arg); @@ -647,12 +652,17 @@ irfini(struct function *fn) copyopt(fn); } if (ccopt.o >= OPT1) { + doinline(fn); filldom(fn); + if (!(fn->prop & FNUSE)) filluses(fn); cselim(fn); freearena(fn->passarena); simpl(fn); freearena(fn->passarena); } + if (maybeinlinee(fn)) { + // goto Fin; XXX do this by having inline function rematerialization when symbol is actually referenced + } lowerstack(fn); freearena(fn->passarena); if (ccopt.dbg.o) { @@ -665,6 +675,7 @@ irfini(struct function *fn) if (objout.code) mctarg->emit(fn); +Fin: freearena(fn->passarena); freefn(fn); } |