From: Wolfgang (Blub) Bumiller Date: Fri, 4 May 2012 08:20:04 +0000 (+0200) Subject: Changing life-range calculation to include the last read because then it doesn't... X-Git-Tag: 0.1-rc1~489^2~5 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e0331ef15f0f8351fb3781f9cf5e74f4efd37b32;p=xonotic%2Fgmqcc.git Changing life-range calculation to include the last read because then it doesn't need another vector to keep elements in. In order for this to make sense, the life-range overlap test now returns false if the end of one range _equals_ the beginning of the other, since that's not truly overlapping anymore --- diff --git a/ir.c b/ir.c index 2a33065..8e8ffb7 100644 --- a/ir.c +++ b/ir.c @@ -582,8 +582,13 @@ bool ir_values_overlap(ir_value *a, ir_value *b) /* check if the entries overlap, for that, * both must start before the other one ends. */ +#if defined(LIFE_RANGE_WITHOUT_LAST_READ) if (la->start <= lb->end && lb->start <= la->end) +#else + if (la->start < lb->end && + lb->start < la->end) +#endif { return true; } @@ -1473,14 +1478,19 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change ir_instr *instr; ir_value *value; bool tempbool; - size_t i, o, p, rd; + size_t i, o, p; /* bitmasks which operands are read from or written to */ size_t read, write; +#if defined(LIFE_RANGE_WITHOUT_LAST_READ) + size_t rd; new_reads_t new_reads; +#endif char dbg_ind[16] = { '#', '0' }; (void)dbg_ind; +#if defined(LIFE_RANGE_WITHOUT_LAST_READ) MEM_VECTOR_INIT(&new_reads, v); +#endif if (prev) { @@ -1497,16 +1507,19 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change for (p = 0; p < instr->phi_count; ++p) { value = instr->phi[p].value; - /* used this before new_reads - puts the last read into the life range as well - if (!ir_block_living_find(self, value, NULL)) - ir_block_living_add(self, value); - */ - /* fprintf(stderr, "read: %s\n", value->_name); */ +#if ! defined(LIFE_RANGE_WITHOUT_LAST_READ) + if (!ir_block_living_find(self, value, NULL) && + !ir_block_living_add(self, value)) + { + goto on_error; + } +#else if (!new_reads_t_v_find(&new_reads, value, NULL)) { if (!new_reads_t_v_add(&new_reads, value)) goto on_error; } +#endif } /* See which operands are read and write operands */ @@ -1528,16 +1541,20 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change /* read operands */ if (read & (1<_name); */ if (!new_reads_t_v_find(&new_reads, value, NULL)) { if (!new_reads_t_v_add(&new_reads, value)) goto on_error; } +#endif } /* write operands */ @@ -1547,10 +1564,15 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change */ if (write & (1<run_id == self->owner->run_id) @@ -1622,7 +1649,9 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change return true; on_error: +#if defined(LIFE_RANGE_WITHOUT_LAST_READ) MEM_VECTOR_CLEAR(&new_reads, v); +#endif return false; }