https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91102
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Segher Boessenkool from comment #2) > 91102.c: In function 'foo': > 91102.c:7:1: warning: control reaches end of non-void function > [-Wreturn-type] > 7 | } > | ^ > > so ice-on-invalid-code? Well, invalid at runtime, so valid if not called. > Although, hrm, inserting "return 3;" there still ICEs. The testcase has been creduced and hand cleaned up, forgot about the return value. Let's talk about int foo (long d, long l) { register long e asm ("x1") = d; register long f asm("x2") = l; asm ("" : : "r" (e), "r" (f)); return 3; } struct T { int i; int j; }; union S { long h; struct T t; }; void bar (union S b) { while (1) { union S c = b; c.t.j++; b.h = foo (b.h, c.h); } } then. The change is done in decrease_live_ranges_number: 2128 if (sregno < FIRST_PSEUDO_REGISTER 2129 && reg_mentioned_p (dest, PATTERN (q))) 2130 failed = 1; 2131 2132 /* Attempt to replace all uses. */ 2133 else if (!validate_replace_rtx (src, dest, q)) 2134 failed = 1; So, shouldn't we have some code for dregno < FIRST_PSEUDO_REGISTER that checks for cases like this (dunno what exactly, just insns where already at least one of the operands from extract_operands is a hard register, or more specifically don't propagate into an operand that has number in a constraint and corresponding argument is already (a different) hard register, something else?