mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
[qfcc] Ensure all operands are cleared before flow
I had missed the flowvar clearing for auxiliary use/def/kill operands. It's possible it wasn't necessary at the time since the operands were added just for dealloc checking, but there's every reason it could become necessary.
This commit is contained in:
parent
b5a57cd15c
commit
208359edc6
1 changed files with 21 additions and 4 deletions
|
@ -550,6 +550,23 @@ static int flow_def_clear_flowvars (def_t *def, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
clear_operand (operand_t *op)
|
||||
{
|
||||
if (op && op->op_type == op_def) {
|
||||
def_visit_all (op->def, 0, flow_def_clear_flowvars, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clear_operand_chain (operand_t *op)
|
||||
{
|
||||
while (op) {
|
||||
clear_operand (op);
|
||||
op = op->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
add_var_addrs (set_t *set, flowvar_t *var)
|
||||
{
|
||||
|
@ -622,11 +639,11 @@ flow_build_vars (function_t *func)
|
|||
s = func->statements[i];
|
||||
flow_analyze_statement (s, 0, 0, 0, operands);
|
||||
for (j = 0; j < FLOW_OPERANDS; j++) {
|
||||
if (operands[j] && operands[j]->op_type == op_def) {
|
||||
def_visit_all (operands[j]->def, 0,
|
||||
flow_def_clear_flowvars, 0);
|
||||
}
|
||||
clear_operand (operands[j]);
|
||||
}
|
||||
clear_operand_chain (s->use);
|
||||
clear_operand_chain (s->def);
|
||||
clear_operand_chain (s->kill);
|
||||
}
|
||||
// count .return and .param_[0-7] as they are always needed
|
||||
for (i = 0; i < num_flow_params; i++) {
|
||||
|
|
Loading…
Reference in a new issue