aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir
diff options
context:
space:
mode:
Diffstat (limited to 'ir')
-rw-r--r--ir/abi0.c4
-rw-r--r--ir/ir.c3
-rw-r--r--ir/regalloc.c17
3 files changed, 17 insertions, 7 deletions
diff --git a/ir/abi0.c b/ir/abi0.c
index fe1a7e3..4462be9 100644
--- a/ir/abi0.c
+++ b/ir/abi0.c
@@ -437,7 +437,9 @@ abi0(struct function *fn)
blk->id = id++;
} while ((blk = blk->lnext) != fn->entry);
- /* vaargs might break */
+
+ /* vaargs might break these */
+ if (!(fn->prop & FNUSE)) filluses(fn);
fn->prop &= ~(FNBLKID | FNRPO);
if (ccopt.dbg.a) {
diff --git a/ir/ir.c b/ir/ir.c
index 3b37405..412d0f9 100644
--- a/ir/ir.c
+++ b/ir/ir.c
@@ -326,7 +326,7 @@ blksplitafter(struct function *fn, struct block *blk, int idx)
memset(blk->jmp.arg, 0, sizeof blk->jmp.arg);
for (int i = 0; i < 2; ++i) {
struct block *s = (&blk->s1)[i];
- for (int i = 0; i < s->npred; ++i) {
+ if (s) for (int i = 0; i < s->npred; ++i) {
if (blkpred(s, i) == blk)
blkpred(s, i) = new;
}
@@ -334,6 +334,7 @@ blksplitafter(struct function *fn, struct block *blk, int idx)
new->s1 = blk->s1, new->s2 = blk->s2;
blk->s1 = new, blk->s2 = NULL;
addpred(new, blk);
+ fn->prop &= ~FNUSE;
return new;
}
diff --git a/ir/regalloc.c b/ir/regalloc.c
index d3c1ee0..e060ebf 100644
--- a/ir/regalloc.c
+++ b/ir/regalloc.c
@@ -517,11 +517,18 @@ usereg(struct rega *ra, int reg, struct block *blk, int pos)
{
struct fixinterval *fxit;
if (rstest(mctarg->rglob, reg)) return; /* regalloc never allocates globally live regs, so don't need intervals for those */
- for (struct fixinterval *fxit = ra->intervals.fixed; fxit; fxit = fxit->next) {
+ for (struct fixinterval *prev = NULL, *fxit = ra->intervals.fixed; fxit; prev = fxit, fxit = fxit->next) {
if (fxit->range.from > pos) break;
if (fxit->rs == 1<<reg && fxit->range.from <= pos && pos < fxit->range.to) {
/* contained by existing interval */
fxit->range.from = blk->inumstart;
+ /* insert at head */
+ //DBG(">>>extend REG %s range %d-%d\n", mctarg->rnames[reg], fxit->range.from, fxit->range.to);
+ if (prev) {
+ prev->next = fxit->next;
+ fxit->next = ra->intervals.fixed;
+ ra->intervals.fixed = fxit;
+ }
return;
}
}
@@ -539,7 +546,7 @@ defreg(struct rega *ra, int reg, int pos) {
if (fxit->rs == 1<<reg) {
assert(fxit->range.from <= pos);
fxit->range.from = pos;
- // DBG(">>>REG %s range @%d: %d-%d\n", mctarg->rnames[reg], fxit->range.from.blk, fxit->range.from.ins, fxit->range.to.ins);
+ //DBG(">>>def REG %s range %d-%d\n", mctarg->rnames[reg], fxit->range.from, fxit->range.to);
return;
}
}
@@ -643,9 +650,9 @@ buildintervals(struct rega *ra)
ra->intervals.fixed = fxit;
}
for (int j = call->narg - 1; j >= 0; --j) {
- int reg = call->abiarg[j].reg;
- if (reg >= 0) {
- usereg(ra, reg, blk, pos);
+ struct abiarg abi = call->abiarg[j];
+ if (!abi.isstk) {
+ usereg(ra, abi.reg, blk, pos);
}
}
}