mirror of
https://github.com/janet-lang/janet
synced 2024-11-25 01:37:19 +00:00
Add recursion to the pruning optimization.
This commit is contained in:
parent
4782a76bca
commit
fcca9bbab3
@ -177,6 +177,10 @@ void janet_bytecode_remove_noops(JanetFuncDef *def) {
|
|||||||
* noops. Input is assumed valid bytecode. */
|
* noops. Input is assumed valid bytecode. */
|
||||||
void janet_bytecode_movopt(JanetFuncDef *def) {
|
void janet_bytecode_movopt(JanetFuncDef *def) {
|
||||||
JanetcRegisterAllocator ra;
|
JanetcRegisterAllocator ra;
|
||||||
|
int recur = 1;
|
||||||
|
|
||||||
|
/* Iterate this until no more instructions can be removed. */
|
||||||
|
while (recur) {
|
||||||
janetc_regalloc_init(&ra);
|
janetc_regalloc_init(&ra);
|
||||||
|
|
||||||
/* Look for slots that have writes but no reads (and aren't in the closure bitset). */
|
/* Look for slots that have writes but no reads (and aren't in the closure bitset). */
|
||||||
@ -330,6 +334,7 @@ void janet_bytecode_movopt(JanetFuncDef *def) {
|
|||||||
/* Iterate and set noops on instructions that make writes that no one ever reads.
|
/* Iterate and set noops on instructions that make writes that no one ever reads.
|
||||||
* Only set noops for instructions with no side effects - moves, loads, etc. that can't
|
* Only set noops for instructions with no side effects - moves, loads, etc. that can't
|
||||||
* raise errors (outside of systemic errors like oom or stack overflow). */
|
* raise errors (outside of systemic errors like oom or stack overflow). */
|
||||||
|
recur = 0;
|
||||||
for (int32_t i = 0; i < def->bytecode_length; i++) {
|
for (int32_t i = 0; i < def->bytecode_length; i++) {
|
||||||
uint32_t instr = def->bytecode[i];
|
uint32_t instr = def->bytecode[i];
|
||||||
switch (instr & 0x7F) {
|
switch (instr & 0x7F) {
|
||||||
@ -345,6 +350,7 @@ void janet_bytecode_movopt(JanetFuncDef *def) {
|
|||||||
case JOP_MAKE_BRACKET_TUPLE: {
|
case JOP_MAKE_BRACKET_TUPLE: {
|
||||||
if (!janetc_regalloc_check(&ra, DD)) {
|
if (!janetc_regalloc_check(&ra, DD)) {
|
||||||
def->bytecode[i] = JOP_NOOP;
|
def->bytecode[i] = JOP_NOOP;
|
||||||
|
recur = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -352,6 +358,7 @@ void janet_bytecode_movopt(JanetFuncDef *def) {
|
|||||||
case JOP_MOVE_FAR: {
|
case JOP_MOVE_FAR: {
|
||||||
if (!janetc_regalloc_check(&ra, EE)) {
|
if (!janetc_regalloc_check(&ra, EE)) {
|
||||||
def->bytecode[i] = JOP_NOOP;
|
def->bytecode[i] = JOP_NOOP;
|
||||||
|
recur = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -366,6 +373,7 @@ void janet_bytecode_movopt(JanetFuncDef *def) {
|
|||||||
case JOP_CLOSURE: {
|
case JOP_CLOSURE: {
|
||||||
if (!janetc_regalloc_check(&ra, AA)) {
|
if (!janetc_regalloc_check(&ra, AA)) {
|
||||||
def->bytecode[i] = JOP_NOOP;
|
def->bytecode[i] = JOP_NOOP;
|
||||||
|
recur = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -378,6 +386,7 @@ void janet_bytecode_movopt(JanetFuncDef *def) {
|
|||||||
#undef CC
|
#undef CC
|
||||||
#undef DD
|
#undef DD
|
||||||
#undef EE
|
#undef EE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify some bytecode */
|
/* Verify some bytecode */
|
||||||
|
Loading…
Reference in New Issue
Block a user