[Bug rtl-optimization/85745] variable with asm register assignment allocated in wrong reg
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri May 11 15:58:00 GMT 2018
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.
More information about the Gcc-bugs
mailing list