https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85745
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The reason this happens is that the register variable is marked const. Don't do that. If it is const, the compiler optimizes it more aggressively - it will happily fold uses of the variable to the constant ininitializer, so the inline asm becomes "r" (110) instead of "r" (__r2) and thus it can use any register. This is how C++ behaved for years and how C in GCC behaves since the folding improvements. --- gcc/c/c-fold.c 2018-05-10 19:39:13.750529734 +0200 +++ gcc/c/c-fold.c 2018-05-11 17:57:12.941957170 +0200 @@ -165,7 +165,10 @@ c_fully_fold_internal (tree expr, bool i if (!IS_EXPR_CODE_CLASS (kind) || kind == tcc_statement) { /* Except for variables which we can optimize to its initializer. */ - if (VAR_P (expr) && !lval && (optimize || in_init)) + if (VAR_P (expr) + && !lval + && (optimize || in_init) + && !DECL_HARD_REGISTER (expr)) { if (in_init) ret = decl_constant_value_1 (expr, true); would be a workaround for this, but not really sure if we want to use it.