From 0b90de2e773f439fa606ddf2bc403d2f42fa4c3d Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 18 Feb 2026 18:17:14 +0100 Subject: ir: basic inlining pass implementation --- ir/simpl.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'ir/simpl.c') diff --git a/ir/simpl.c b/ir/simpl.c index c52f809..a01879a 100644 --- a/ir/simpl.c +++ b/ir/simpl.c @@ -82,7 +82,7 @@ divmodk(struct instr *ins, struct block *blk, int *curi) } static int -ins(struct instr *ins, struct block *blk, int *curi) +doins(struct instr *ins, struct block *blk, int *curi) { int narg = opnarg[ins->op]; if (oisarith(ins->op)) { @@ -257,7 +257,11 @@ simpl(struct function *fn) int curi = 0; DoIns: for (; curi < blk->ins.n; ++curi) { - inschange += ins(&instrtab[blk->ins.p[curi]], blk, &curi); + struct instr *ins = &instrtab[blk->ins.p[curi]]; + if (ins->op != Onop) { + if (!(fn->prop & FNUSE)) filluses(fn); + inschange += doins(ins, blk, &curi); + } } if (blk->s2 && isintcon(blk->jmp.arg[0])) { @@ -272,8 +276,9 @@ simpl(struct function *fn) } } - /* thread jumps.. */ - if (!blk->phi.n && !blk->ins.n) { + if (blk != fn->entry && blk->npred == 0) { + freeblk(fn, blk); + } else if (!blk->phi.n && !blk->ins.n) { /* thread jumps.. */ if (blk->jmp.t == Jb && !blk->s2) { jmpfind(jmpfinal, &blk->s1); if (blk->s1 != blk) { -- cgit v1.2.3