Use simple assignment instead of memcpy() when possible.
[libfirm] / ir / be / ia32 / ia32_common_transform.c
index 2bfbefc..2b7d49e 100644 (file)
@@ -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;