]> de.git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ir.c
Actually allocate a nil-vector for nil
[xonotic/gmqcc.git] / ir.c
diff --git a/ir.c b/ir.c
index 4482d1d40b7e3371c994dc9c424755437d280980..9f76892f67af0cd3be1c0015c3e4957127a1dd86 100644 (file)
--- a/ir.c
+++ b/ir.c
@@ -772,8 +772,10 @@ bool ir_function_finalize(ir_function *self)
         }
     }
 
-    if (!ir_function_naive_phi(self))
+    if (!ir_function_naive_phi(self)) {
+        irerror(self->context, "internal error: ir_function_naive_phi failed");
         return false;
+    }
 
     for (i = 0; i < vec_size(self->locals); ++i) {
         ir_value *v = self->locals[i];
@@ -2930,6 +2932,8 @@ tailcall:
 
                 if (param->vtype == TYPE_FIELD)
                     stmt.opcode = field_store_instr[param->fieldtype];
+                else if (param->vtype == TYPE_NIL)
+                    stmt.opcode = INSTR_STORE_V;
                 else
                     stmt.opcode = type_store_instr[param->vtype];
                 stmt.o1.u1 = ir_value_code_addr(param);
@@ -2957,6 +2961,8 @@ tailcall:
 
                 if (param->vtype == TYPE_FIELD)
                     stmt.opcode = field_store_instr[param->fieldtype];
+                else if (param->vtype == TYPE_NIL)
+                    stmt.opcode = INSTR_STORE_V;
                 else
                     stmt.opcode = type_store_instr[param->vtype];
                 stmt.o1.u1 = ir_value_code_addr(param);
@@ -3637,6 +3643,12 @@ bool ir_builder_generate(ir_builder *self, const char *filename)
         }
     }
 
+    /* generate nil */
+    ir_value_code_setaddr(self->nil, vec_size(code_globals));
+    vec_push(code_globals, 0);
+    vec_push(code_globals, 0);
+    vec_push(code_globals, 0);
+
     /* generate global temps */
     self->first_common_globaltemp = vec_size(code_globals);
     for (i = 0; i < self->max_globaltemps; ++i) {