Skip to content

Commit df65c33

Browse files
committed
Remove unnecessary blocks
1 parent a95f395 commit df65c33

3 files changed

Lines changed: 25 additions & 8 deletions

File tree

sources/compiler.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -803,24 +803,28 @@ static block_ids emit_statement(opcodes *code, block *parent, statement *stateme
803803
statement->block.vars.v[i].variable_id = var.index;
804804
}
805805

806+
bool loop_block;
806807
uint64_t start_block_id;
807808
if (block_start_id != 0) {
808809
start_block_id = block_start_id;
810+
loop_block = true;
809811
}
810812
else {
811813
start_block_id = next_variable_id;
812814
++next_variable_id;
815+
loop_block = false;
813816
}
814817

815818
uint64_t end_block_id = next_variable_id;
816819
++next_variable_id;
817820

818821
{
819822
opcode o;
820-
o.type = OPCODE_BLOCK_START;
821-
o.op_block.start_id = start_block_id;
822-
o.op_block.end_id = end_block_id;
823-
o.size = OP_SIZE(o, op_block);
823+
o.type = OPCODE_BLOCK_START;
824+
o.op_block.start_id = start_block_id;
825+
o.op_block.end_id = end_block_id;
826+
o.op_block.loop_block = loop_block;
827+
o.size = OP_SIZE(o, op_block);
824828
emit_op(code, &o);
825829
}
826830

@@ -830,10 +834,11 @@ static block_ids emit_statement(opcodes *code, block *parent, statement *stateme
830834

831835
{
832836
opcode o;
833-
o.type = OPCODE_BLOCK_END;
834-
o.op_block.start_id = start_block_id;
835-
o.op_block.end_id = end_block_id;
836-
o.size = OP_SIZE(o, op_block);
837+
o.type = OPCODE_BLOCK_END;
838+
o.op_block.start_id = start_block_id;
839+
o.op_block.end_id = end_block_id;
840+
o.op_block.loop_block = loop_block;
841+
o.size = OP_SIZE(o, op_block);
837842
emit_op(code, &o);
838843
}
839844

sources/compiler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ typedef struct opcode {
170170
struct {
171171
uint64_t start_id;
172172
uint64_t end_id;
173+
bool loop_block;
173174
} op_block;
174175
struct {
175176
uint8_t nothing;

sources/transformer.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ void transform(uint32_t flags) {
3737
opcode *o = (opcode *)&data[index];
3838

3939
switch (o->type) {
40+
case OPCODE_BLOCK_START:
41+
case OPCODE_BLOCK_END:
42+
if ((flags & TRANSFORM_FLAG_REDUCE_BLOCKS) != 0) {
43+
if (o->op_block.loop_block) {
44+
copy_opcode(o);
45+
}
46+
}
47+
else {
48+
copy_opcode(o);
49+
}
50+
break;
4051
case OPCODE_STORE_ACCESS_LIST: {
4152
kong_access a = o->op_store_access_list.access_list[o->op_store_access_list.access_list_size - 1];
4253

0 commit comments

Comments
 (0)