Fix stupid issue where hop output registers were being overwritten, leading to

invalid SSA form.
This commit is contained in:
David Given 2016-10-14 23:12:29 +02:00
parent 98fe70a7de
commit bb53a7fb51

View file

@ -181,25 +181,25 @@ static struct insn* walk_instructions(struct burm_node* node, int goal)
if (!insn->insndata->is_fragment) if (!insn->insndata->is_fragment)
{ {
struct vreg* vreg = NULL; insn->hop = current_hop = new_hop(current_bb, insn->ir);
emit(insn);
if (!current_hop->output)
{
switch (node->label) switch (node->label)
{ {
case ir_to_esn(IR_REG, 1): case ir_to_esn(IR_REG, 1):
case ir_to_esn(IR_REG, 2): case ir_to_esn(IR_REG, 2):
case ir_to_esn(IR_REG, 4): case ir_to_esn(IR_REG, 4):
case ir_to_esn(IR_REG, 8): case ir_to_esn(IR_REG, 8):
vreg = node->ir->result; current_hop->output = node->ir->result;
break; break;
case ir_to_esn(IR_NOP, 0): case ir_to_esn(IR_NOP, 0):
vreg = node->left->ir->result; current_hop->output = node->left->ir->result;
break; break;
} }
}
insn->hop = current_hop = new_hop(current_bb, insn->ir);
current_hop->output = vreg;
emit(insn);
hop_print('I', current_hop); hop_print('I', current_hop);
array_append(&current_bb->hops, current_hop); array_append(&current_bb->hops, current_hop);