aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-09-09 10:46:18 +0200
committerlemon <lsof@mailbox.org>2025-09-09 10:46:18 +0200
commit3bac8a6bc4f04ed9d302896264809b191477e11b (patch)
tree1d82dcf2f92d84ba214c1aa0466ab87c8ccadcba
parente043811980db560fc2507bb53b644e54c80527dc (diff)
fixes, delnops
-rw-r--r--amd64/emit.c4
-rw-r--r--common.h1
-rw-r--r--ir.c34
-rw-r--r--ir.h1
-rw-r--r--main.c1
-rw-r--r--regalloc.c2
-rw-r--r--ssa.c1
-rw-r--r--test/fib.c2
8 files changed, 40 insertions, 6 deletions
diff --git a/amd64/emit.c b/amd64/emit.c
index 74dcebe..5c9fb2a 100644
--- a/amd64/emit.c
+++ b/amd64/emit.c
@@ -416,10 +416,10 @@ static void Xmov(uchar **pcode, enum irclass k, struct oper dst, struct oper src
{4|8, PMEM, PI32, "\xC7", EN_MI32}, /* MOV m32/64, imm */
{ 8, PGPR, PU32, "\xB8", EN_OI, .norexw=1}, /* MOV r64, uimm */
{ 8, PGPR, PI32, "\xC7", EN_RI32}, /* MOV r64, imm */
- {4, PFPR, PFPR, "\xF3\x0F\x10", EN_RR}, /* MOVSS xmm, xmm */
+ {4, PFPR, PFPR, "\x0F\x28", EN_RR}, /* MOVPS xmm, xmm */
{4, PFPR, PMEM, "\xF3\x0F\x10", EN_RM}, /* MOVSS xmm, m32 */
{4, PMEM, PFPR, "\xF3\x0F\x11", EN_MR}, /* MOVSS m32, xmm */
- {8, PFPR, PFPR, "\xF2\x0F\x10", EN_RR}, /* MOVSD xmm, xmm */
+ {8, PFPR, PFPR, "\x0F\x28", EN_RR}, /* MOVPS xmm, xmm */
{8, PFPR, PMEM, "\xF2\x0F\x10", EN_RM}, /* MOVSD xmm, m64 */
{8, PMEM, PFPR, "\xF2\x0F\x11", EN_MR}, /* MOVSS m64, xmm */
{4|8, PFPR, PGPR, "\x66\x0F\x6E", EN_RR}, /* MOVD/Q xmm, r64/32 */
diff --git a/common.h b/common.h
index fb1be31..0079163 100644
--- a/common.h
+++ b/common.h
@@ -127,6 +127,7 @@ struct option {
bool p : 1, /* after parsing */
a : 1, /* after abi0 */
m : 1, /* after mem */
+ o : 1, /* after optimizations */
i : 1, /* after isel */
l : 1, /* after liveness fixup */
r : 1; /* after regalloc */
diff --git a/ir.c b/ir.c
index 2f65192..9ffac50 100644
--- a/ir.c
+++ b/ir.c
@@ -427,7 +427,7 @@ delinstr(struct block *blk, int idx)
memcpy(&instrtab[t], &instrfreelist, sizeof(int));
instrfreelist = t;
deluses(t);
- for (int i = idx; i < blk->ins.n-1; ++i)
+ for (int i = idx; i < blk->ins.n - 1; ++i)
blk->ins.p[i] = blk->ins.p[i + 1];
--blk->ins.n;
}
@@ -440,12 +440,38 @@ delphi(struct block *blk, int idx)
memcpy(&instrtab[t], &instrfreelist, sizeof(int));
instrfreelist = t;
deluses(t);
- for (int i = idx; i < blk->phi.n; ++i)
+ for (int i = idx; i < blk->phi.n - 1; ++i)
blk->phi.p[i] = blk->phi.p[i + 1];
--blk->phi.n;
}
void
+delnops(struct block *blk)
+{
+ int i, n, t;
+ /* delete trailing nops */
+ while (blk->ins.n > 0 && instrtab[t = blk->ins.p[blk->ins.n - 1]].op == Onop) {
+ --blk->ins.n;
+ memcpy(&instrtab[t], &instrfreelist, sizeof(int));
+ instrfreelist = t;
+ }
+ /* delete rest of nops */
+ for (i = blk->ins.n - 2, n = 0; i >= 0; --i) {
+ if (instrtab[t = blk->ins.p[i]].op == Onop) {
+ memcpy(&instrtab[t], &instrfreelist, sizeof(int));
+ instrfreelist = t;
+ ++n;
+ } else if (n) {
+ memmove(blk->ins.p+i+1, blk->ins.p+i+1+n, (blk->ins.n - n - i)*sizeof *blk->ins.p);
+ blk->ins.n -= n;
+ n = 0;
+ }
+ }
+ if (n)
+ memmove(blk->ins.p, blk->ins.p + n, (blk->ins.n -= n)*sizeof *blk->ins.p);
+}
+
+void
fillblkids(struct function *fn)
{
int i = 0;
@@ -568,6 +594,10 @@ irfini(struct function *fn)
lowerintrin(fn);
mem2reg(fn);
copyopt(fn);
+ if (ccopt.dbg.o) {
+ efmt("<< Before isel >>\n");
+ irdump(fn);
+ }
mctarg->isel(fn);
regalloc(fn);
if (!ccopt.dbg.any)
diff --git a/ir.h b/ir.h
index eb31542..f12bccd 100644
--- a/ir.h
+++ b/ir.h
@@ -237,6 +237,7 @@ void replcuses(union ref from, union ref to);
void deluses(int ins);
void delinstr(struct block *, int idx);
void delphi(struct block *, int idx);
+void delnops(struct block *blk);
void fillblkids(struct function *);
#define startbbvisit() (void)(++visitmark)
#define wasvisited(blk) ((blk)->visit == visitmark)
diff --git a/main.c b/main.c
index 3ec4f95..bf178d3 100644
--- a/main.c
+++ b/main.c
@@ -121,6 +121,7 @@ optparse(char **args)
case 'p': ccopt.dbg.p = 1; break;
case 'a': ccopt.dbg.a = 1; break;
case 'i': ccopt.dbg.i = 1; break;
+ case 'o': ccopt.dbg.o = 1; break;
case 'l': ccopt.dbg.l = 1; break;
case 'r': ccopt.dbg.r = 1; break;
case 'm': ccopt.dbg.m = 1; break;
diff --git a/regalloc.c b/regalloc.c
index a922f10..7d215dd 100644
--- a/regalloc.c
+++ b/regalloc.c
@@ -877,7 +877,7 @@ regalloc(struct function *fn)
fillblkids(fn);
if (ccopt.dbg.r) {
- DBG("<< Before linear scan >>\n");
+ efmt("<< Before linear scan >>\n");
irdump(fn);
}
diff --git a/ssa.c b/ssa.c
index 5e9ac84..6c1255a 100644
--- a/ssa.c
+++ b/ssa.c
@@ -26,6 +26,7 @@ copyopt(struct function *fn)
deluses(var.i);
}
}
+ delnops(blk);
} while ((blk = blk->lnext) != fn->entry);
}
diff --git a/test/fib.c b/test/fib.c
index 0c02171..806b416 100644
--- a/test/fib.c
+++ b/test/fib.c
@@ -1,6 +1,6 @@
unsigned fib(unsigned x) {
unsigned r = 0, q = 1;
- while (x-- > 1) {
+ for (; x > 1; --x) {
unsigned s = r + q;
r = q;
q = s;