X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_common_transform.c;h=9e9ae9b0357cbf75604f91f532619f2a747e50d6;hb=10e58f9669ea6c77e82bd3bc12c4ac5bbaa6bb15;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..9e9ae9b03 100644 --- a/ir/be/ia32/ia32_common_transform.c +++ b/ir/be/ia32/ia32_common_transform.c @@ -446,20 +446,12 @@ ir_node *ia32_gen_ASM(ir_node *node) const ir_asm_constraint *in_constraints; const ir_asm_constraint *out_constraints; ident **clobbers; - int clobbers_flags = 0; unsigned clobber_bits[N_IA32_CLASSES]; int out_size; backend_info_t *info; memset(&clobber_bits, 0, sizeof(clobber_bits)); - /* workaround for lots of buggy code out there as most people think volatile - * asm is enough for everything and forget the flags (linux kernel, etc.) - */ - if (get_irn_pinned(node) == op_pin_state_pinned) { - clobbers_flags = 1; - } - arity = get_irn_arity(node); in = ALLOCANZ(ir_node*, arity); @@ -472,7 +464,6 @@ ir_node *ia32_gen_ASM(ir_node *node) if (strcmp(c, "memory") == 0) continue; if (strcmp(c, "cc") == 0) { - clobbers_flags = 1; continue; } @@ -511,7 +502,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 +511,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;