aboutsummaryrefslogtreecommitdiffhomepage
path: root/optmem.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-07-07 09:38:49 +0200
committerlemon <lsof@mailbox.org>2023-07-07 09:38:49 +0200
commit3a7675d100c8559bf53ef8043d446661b72f2e4e (patch)
tree24eb5dec386aadfc21fff56053a6764ab4d908a6 /optmem.c
parent40f1c14f7594f6e979316ad8f6bfff51341ad33d (diff)
mem2reg; style
Diffstat (limited to 'optmem.c')
-rw-r--r--optmem.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/optmem.c b/optmem.c
index 7489e2a..d733a70 100644
--- a/optmem.c
+++ b/optmem.c
@@ -136,18 +136,17 @@ readvar(struct ssabuilder *sb, int var, enum irclass cls, struct block *blk)
}
static bool
-tryseal(struct ssabuilder *sb, struct block *blk)
+trysealrec(struct ssabuilder *sb, struct block *blk)
{
-
vec_of(struct pendingphi) *pending;
if (bstest(sb->sealed, blk->id)) return 1;
if (blk->id > sb->lastvisit) return 0;
- if (wasvisited(blk)) return 1;
markvisited(blk);
for (int i = 0; i < blk->npred; ++i) {
struct block *p = blkpred(blk, i);
- if (!tryseal(sb, p)) return 0;
+ if (wasvisited(p)) continue;
+ if (!trysealrec(sb, p)) return 0;
}
bsset(sb->sealed, blk->id);
@@ -157,11 +156,18 @@ tryseal(struct ssabuilder *sb, struct block *blk)
mkref(RTMP, pending->p[i].phi));
}
vfree(pending);
- if (blk->s1) tryseal(sb, blk->s1);
- if (blk->s2) tryseal(sb, blk->s2);
+ if (blk->s1) trysealrec(sb, blk->s1);
+ if (blk->s2) trysealrec(sb, blk->s2);
return 1;
}
+static void
+tryseal(struct ssabuilder *sb, struct block *blk)
+{
+ startbbvisit();
+ trysealrec(sb, blk);
+}
+
/* require use, blkid; keeps use */
void
mem2reg(struct function *fn)
@@ -239,7 +245,6 @@ mem2reg(struct function *fn)
assert(sb.lastvisit == blk->id);
++sb.lastvisit;
- startbbvisit();
tryseal(&sb, blk);
} while ((blk = blk->lnext) != fn->entry);