On Thu, Jul 26, 2018 at 12:29 PM Alexander Monakov <amona...@ispras.ru> wrote: > > Hi, > > when using explicit register variables ('register int foo asm("%ebp");'), > using const/volatile type qualifiers on the declaration does not result in > the logically expected effect. > > The main issue is that gcc-8 got "better" at propagating initializers of > 'register const' variables to their uses in asm operands, losing the > association with the register and thus causing the operand to > unexpectedly appear in some other register. This caused build issues for > the Linux kernel and was reported a couple of times in the GCC Bugzilla. > > This patch adds a few lines to the documentation to say that qualifiers > won't work as expected. OK for trunk?
Looks ok to me. Maybe we should change FEs to ignore those qualifiers on explicit register variables and emit a warning like warning: const/volatile qualifier ignored on X ? > Thanks. > Alexander > > PR target/86673 > doc/extend.texi (Global Register Variables): Discourage use of type > qualifiers. > (Local Register Variables): Likewise. > > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index 7b471ec40f7..9a41f2753e9 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -9591,6 +9591,11 @@ a global variable the declaration appears outside a > function. The > @code{static}. The register name must be a valid register name for the > target platform. > > +Do not use type qualifiers such as @code{const} and @code{volatile}, as > +the result may be contrary to your expectations. In particular, using > +the @code{volatile} qualifier does not fully prevent the compiler from > +optimizing accesses to the register. > + > Registers are a scarce resource on most systems and allowing the > compiler to manage their usage usually results in the best code. However, > under special circumstances it can make sense to reserve some globally. > @@ -9698,6 +9703,12 @@ but for a local variable the declaration appears > within a function. The > @code{static}. The register name must be a valid register name for the > target platform. > > +Do not use type qualifiers such as @code{const} and @code{volatile}, as > +the result may be contrary to your expectations. In particular, when > +the @code{const} qualifier is used, the compiler may substitute the > +variable with its initializer in @code{asm} statements, which may cause > +the corresponding operand to appear in a different register. > + > As with global register variables, it is recommended that you choose > a register that is normally saved and restored by function calls on your > machine, so that calls to library routines will not clobber it.