diff options
| author | 2026-04-17 21:21:55 +0200 | |
|---|---|---|
| committer | 2026-04-17 21:21:55 +0200 | |
| commit | 3cd04b7ea9e7d33ec6b50524f97ada82ecdfebbe (patch) | |
| tree | fa7898bf7da28689244daa4e8b534574b8ca4c83 /src/ir_inliner.c | |
| parent | 8a78aee7e3d55399d9de3086632bb367c4bea676 (diff) | |
support extern inline "definitions"
Diffstat (limited to 'src/ir_inliner.c')
| -rw-r--r-- | src/ir_inliner.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/ir_inliner.c b/src/ir_inliner.c index c3ebab4..ad7c680 100644 --- a/src/ir_inliner.c +++ b/src/ir_inliner.c @@ -26,12 +26,14 @@ maybeinlinee(Function *fn) { extern int ninstrtab, nfreeinstr; - // TODO better heuristics - if (ccopt.o < OPT1) return 0; - if (!(fn->inlin || (ccopt.o >= OPT2))) return 0; - if (ninstrtab - nfreeinstr > MAX_INLINED_FN_NINS) return 0; - if (fn->nblk > MAX_INLINED_FN_NBLK) return 0; - if (fn->nabiret > 1) return 0; /* TODO 2reg scalar return */ + if (!(fn->inlin && fn->globl)) { + // TODO better heuristics + if (ccopt.o < OPT1) return 0; + if (!(fn->inlin || (ccopt.o >= OPT2))) return 0; + if (ninstrtab - nfreeinstr > MAX_INLINED_FN_NINS) return 0; + if (fn->nblk > MAX_INLINED_FN_NBLK) return 0; + if (fn->nabiret > 1) return 0; /* TODO 2reg scalar return */ + } if (!savearena) { enum { N = 1<<12 }; @@ -51,7 +53,9 @@ maybeinlinee(Function *fn) sv->nabiarg = fn->nabiarg; sv->nabiret = fn->nabiret; memcpy(sv->abiret, fn->abiret, sizeof sv->abiret); - Block *bmap[MAX_INLINED_FN_NBLK]; + Block *_bmap[MAX_INLINED_FN_NBLK], + **bmap = fn->nblk < MAX_INLINED_FN_NBLK + ? _bmap : alloc(&savearena, fn->nblk * sizeof *bmap, 0); Block *b = fn->entry; int id = 0; do { |