http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55934
--- Comment #6 from Steven Bosscher <steven at gcc dot gnu.org> 2013-01-16
20:59:17 UTC ---
I had expected the following patch to fix the issue:
* lra-assigns.c (assign_by_spills): Throw away the pattern of asms
that have operands with impossible constraints.
* lra-constraints.c (process_alt_operands): Verify that a class
selected from constraints on asms is valid for the operand mode.
Index: lra-assigns.c
===================================================================
--- lra-assigns.c (revision 195104)
+++ lra-assigns.c (working copy)
@@ -1240,6 +1240,9 @@ assign_by_spills (void)
asm_p = true;
error_for_asm (insn,
"%<asm%> operand has impossible constraints");
+ /* Avoid further trouble with this insn. */
+ PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
+ lra_set_insn_deleted (insn);
}
}
lra_assert (asm_p);
Index: lra-constraints.c
===================================================================
--- lra-constraints.c (revision 195104)
+++ lra-constraints.c (working copy)
@@ -1809,6 +1809,20 @@ process_alt_operands (int only_alternati
}
while ((p += len), c);
+ /* For asms, verify that the class for this alternative is possible
+ for the mode that is specified. */
+ if (INSN_CODE (curr_insn) < 0)
+ {
+ int i;
+ gcc_assert (n_alternatives == 1);
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (HARD_REGNO_MODE_OK (i, mode)
+ && in_hard_reg_set_p (reg_class_contents[this_alternative],
mode, i))
+ break;
+ if (i == FIRST_PSEUDO_REGISTER)
+ return false;
+ }
+
/* Record which operands fit this alternative. */
if (win)
{
But this results in a different error message than before:
$ ./cc1 -quiet -O2 t.c
t.c: In function 'foo':
t.c:5:3: error: inconsistent operand constraints in an 'asm'
__asm ("" : "=x" (x)); /* { dg-error "impossible register constraint" } */
^
Personally I don't care one way or the other: impossible or inconsistent,
bottom line it's a bad constraint. What do others think about this?