added small optimizations to OVM codegen
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 5 Jan 2023 02:24:39 +0000 (20:24 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 5 Jan 2023 02:24:39 +0000 (20:24 -0600)
core/container/iter.onyx
interpreter/src/vm/code_builder.c
shared/lib/linux_x86_64/lib/libovmwasm.so

index 869c4de5e931ea8b76af1e367058b9dd91150c47..fba14a0af2aeec9336f3cf9be55b33a7f8db1b0c 100644 (file)
@@ -557,10 +557,10 @@ from_array :: #match #local {}
 from_array :: (arr: [] $T/type_is_struct) => generator(
     ^.{ data = arr.data, count = arr.count, current = 0 },
 
-    (use ctx: ^$T) -> (typeof ctx.data, bool) {
-        if current < count {
-            defer current += 1;
-            return ^data[current], true;
+    ctx => {
+        if ctx.current < ctx.count {
+            defer ctx.current += 1;
+            return ^ctx.data[ctx.current], true;
         }
 
         return null, false;
@@ -571,10 +571,10 @@ from_array :: (arr: [] $T/type_is_struct) => generator(
 from_array :: (arr: [] $T) => generator(
     ^.{ data = arr.data, count = arr.count, current = 0 },
 
-    (use ctx: ^$T) -> (typeof *ctx.data, bool) {
-        if current < count {
-            defer current += 1;
-            return data[current], true;
+    ctx => {
+        if ctx.current < ctx.count {
+            defer ctx.current += 1;
+            return ctx.data[ctx.current], true;
         }
 
         return .{}, false;
index a00e416d40fb0ed7b559fb7d8ac62b47471a6b27..59da1e86fd6fbf962a13291c1fdd45894805346c 100644 (file)
@@ -410,8 +410,15 @@ void ovm_code_builder_add_local_set(ovm_code_builder_t *builder, i32 local_idx)
     {
         ovm_instr_t *last_instr = &bh_arr_last(builder->program->code);
         if (OVM_INSTR_INSTR(*last_instr) == OVMI_IMM) {
-            if (IS_TEMPORARY_VALUE(builder, last_instr->r)
-                && last_instr->r == LAST_VALUE(builder)) {
+            if (IS_TEMPORARY_VALUE(builder, last_instr->r) && last_instr->r == LAST_VALUE(builder)) {
+                last_instr->r = local_idx;
+                POP_VALUE(builder);
+                return;
+            }
+        }
+
+        if (OVM_INSTR_INSTR(*last_instr) == OVMI_REG_GET) {
+            if (IS_TEMPORARY_VALUE(builder, last_instr->r) && last_instr->r == LAST_VALUE(builder)) {
                 last_instr->r = local_idx;
                 POP_VALUE(builder);
                 return;
@@ -461,6 +468,21 @@ void ovm_code_builder_add_register_get(ovm_code_builder_t *builder, i32 reg_idx)
 }
 
 void ovm_code_builder_add_register_set(ovm_code_builder_t *builder, i32 reg_idx) {
+    // :PrimitiveOptimization
+    {
+        ovm_instr_t *last_instr = &bh_arr_last(builder->program->code);
+        if (OVM_INSTR_INSTR(*last_instr) == OVMI_MOV) {
+            if (IS_TEMPORARY_VALUE(builder, last_instr->r) && last_instr->r == LAST_VALUE(builder)) {
+                
+                last_instr->full_instr = OVM_TYPED_INSTR(OVMI_REG_SET, OVM_TYPE_NONE);
+                last_instr->r = reg_idx;
+
+                POP_VALUE(builder);
+                return;
+            }
+        }
+    }
+
     ovm_instr_t instr = {0};
     instr.full_instr = OVM_TYPED_INSTR(OVMI_REG_SET, OVM_TYPE_NONE);
     instr.r = reg_idx;
index 6e2ffbb9e34ffa5f8a5198e6820ebf9adfd9a2d9..9368eae74de37c5ae3881b88ef51afc83c84d371 100755 (executable)
Binary files a/shared/lib/linux_x86_64/lib/libovmwasm.so and b/shared/lib/linux_x86_64/lib/libovmwasm.so differ