X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ir.c;h=0c0517a54d791cfdd248efcd98d8b4433fa8e9f4;hb=a4617d0e610380f9048499114b3fc086876bb7eb;hp=077ac555c9f42ac20de0b2bcdcfcb2e65f621c9f;hpb=fe8457f9bac503fc085e63bf3d37cdb4578eef5e;p=xonotic%2Fgmqcc.git diff --git a/ir.c b/ir.c index 077ac55..0c0517a 100644 --- a/ir.c +++ b/ir.c @@ -311,14 +311,21 @@ ir_value* ir_function_get_local(ir_function *self, const char *name) return NULL; } -ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype) +ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype, bool param) { ir_value *ve = ir_function_get_local(self, name); if (ve) { return NULL; } - ve = ir_value_var(name, store_local, vtype); + if (param && + self->locals_count && + self->locals[self->locals_count-1]->store != store_param) { + printf("cannot add parameters after adding locals\n"); + return NULL; + } + + ve = ir_value_var(name, (param ? store_param : store_local), vtype); if (!ir_function_locals_add(self, ve)) { ir_value_delete(ve); return NULL; @@ -1457,7 +1464,7 @@ static bool ir_block_naive_phi(ir_block *self) if (v->writes[w]->_ops[0] == v) v->writes[w]->_ops[0] = instr->_ops[0]; - if (old->store != store_value && old->store != store_local) + if (old->store != store_value && old->store != store_local && old->store != store_param) { /* If it originally wrote to a global we need to store the value * there as welli @@ -1837,8 +1844,11 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change value = instr->_ops[o]; /* We only care about locals */ + /* we also calculate parameter liferanges so that locals + * can take up parameter slots */ if (value->store != store_value && - value->store != store_local) + value->store != store_local && + value->store != store_param) continue; /* read operands */