Index: lra-assigns.c =================================================================== --- lra-assigns.c (revision 193871) +++ lra-assigns.c (working copy) @@ -1220,8 +1220,17 @@ assign_by_spills (void) bitmap_initialize (&failed_reload_insns, ®_obstack); for (i = 0; i < nfails; i++) - bitmap_ior_into (&failed_reload_insns, - &lra_reg_info[sorted_pseudos[i]].insn_bitmap); + { + regno = sorted_pseudos[i]; + bitmap_ior_into (&failed_reload_insns, + &lra_reg_info[regno].insn_bitmap); + /* Assign an arbitrary hard register of regno class to + avoid further trouble with the asm insns. */ + bitmap_clear_bit (&all_spilled_pseudos, regno); + assign_hard_regno + (ira_class_hard_regs[regno_allocno_class_array[regno]][0], + regno); + } EXECUTE_IF_SET_IN_BITMAP (&failed_reload_insns, 0, u, bi) { insn = lra_insn_recog_data[u]->insn; @@ -1230,9 +1239,6 @@ assign_by_spills (void) asm_p = true; error_for_asm (insn, "% operand has impossible constraints"); - /* Avoid further trouble with this insn. */ - PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx); - lra_invalidate_insn_data (insn); } } lra_assert (asm_p); Index: lra-constraints.c =================================================================== --- lra-constraints.c (revision 193870) +++ lra-constraints.c (working copy) @@ -3184,7 +3184,7 @@ loc_equivalence_change_p (rtx *loc) /* Maximum allowed number of constraint pass iterations after the last spill pass. It is for preventing LRA cycling in a bug case. */ -#define MAX_CONSTRAINT_ITERATION_NUMBER 15 +#define MAX_CONSTRAINT_ITERATION_NUMBER 30 /* Maximum number of generated reload insns per an insn. It is for preventing this pass cycling in a bug case. */ Index: testsuite/gcc.target/i386/pr55512-1.c =================================================================== --- testsuite/gcc.target/i386/pr55512-1.c (revision 0) +++ testsuite/gcc.target/i386/pr55512-1.c (working copy) @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int +foo (int x) +{ + asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */ + "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7), + "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11), + "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15) : : lab); + __builtin_unreachable (); + lab: + return 0; +} Index: testsuite/gcc.target/i386/pr55512-2.c =================================================================== --- testsuite/gcc.target/i386/pr55512-2.c (revision 0) +++ testsuite/gcc.target/i386/pr55512-2.c (working copy) @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +#define __builtin_unreachable() do { } while (0) + +int +foo (int x) +{ + asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */ + "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7), + "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11), + "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15) : : lab); + __builtin_unreachable (); + lab: + return 0; +} Index: testsuite/gcc.target/i386/pr55512-3.c =================================================================== --- testsuite/gcc.target/i386/pr55512-3.c (revision 0) +++ testsuite/gcc.target/i386/pr55512-3.c (working copy) @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int +bar (int x) +{ + asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */ + "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7), + "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11), + "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15), + "r" (x + 16) : : lab); + __builtin_unreachable (); + lab: + return 0; +} Index: testsuite/gcc.target/i386/pr55512-4.c =================================================================== --- testsuite/gcc.target/i386/pr55512-4.c (revision 0) +++ testsuite/gcc.target/i386/pr55512-4.c (working copy) @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +#define __builtin_unreachable() do { } while (0) + +int +bar (int x) +{ + asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */ + "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7), + "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11), + "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15), + "r" (x + 16) : : lab); + __builtin_unreachable (); + lab: + return 0; +}