X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_common_transform.c;h=2b7d49eae3db287195e720e99aa81a8dca920c03;hb=438580abed840c55e82a03b47daeacfe2da8040f;hp=2bfbefcd1c742954ae05f10feb28e9bb684a5b10;hpb=a9950b7e54fec21e54067548ba9748a298d20e55;p=libfirm diff --git a/ir/be/ia32/ia32_common_transform.c b/ir/be/ia32/ia32_common_transform.c index 2bfbefcd1..2b7d49eae 100644 --- a/ir/be/ia32/ia32_common_transform.c +++ b/ir/be/ia32/ia32_common_transform.c @@ -511,7 +511,7 @@ ir_node *ia32_gen_ASM(ir_node *node) for (out_idx = 0; out_idx < n_out_constraints; ++out_idx) { const ir_asm_constraint *constraint = &out_constraints[out_idx]; const char *c = get_id_str(constraint->constraint); - unsigned pos = constraint->pos; + unsigned pos = constraint->pos; constraint_t parsed_constraint; const arch_register_req_t *req; @@ -520,6 +520,12 @@ ir_node *ia32_gen_ASM(ir_node *node) out_reg_reqs, out_idx); out_reg_reqs[out_idx] = req; + /* multiple constraints for same pos. This can happen for example when + * a =A constraint gets lowered to two constraints: =a and =d for the + * same pos */ + if (register_map[pos].valid) + continue; + register_map[pos].use_input = 0; register_map[pos].valid = 1; register_map[pos].memory = 0;