This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/17336] AVRGCC ignores "volatile" keyword for "register" variables
- From: "m_klokov at mail dot ru" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 7 Sep 2004 08:54:12 -0000
- Subject: [Bug c/17336] AVRGCC ignores "volatile" keyword for "register" variables
- References: <20040906135657.17336.m_klokov@mail.ru>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Additional Comments From m_klokov at mail dot ru 2004-09-07 08:53 -------
> You didn't say what was wrong with the code.
Yes. It's my mistake.
The compiler moves the access to volatile variable from the loop
(i.e. optimizes it).
in fact the compiler optimizes the code:
while(1) { if(flag) do_something(); }
to code:
register char temp=flag;
while(1) { if(temp) do_something(); }
where flag global declared as:
volatile register char flag;
(By the way such "optimization" is neither shorter nor faster for AVR MCU)
> Maybe you were expecting all references to the volatile register
> to be atomic? They aren't. That isn't what volatile means.
I didn't expect it should be uninterrupted (if you mean this...)
I just expected that compiler will know that this variables may be changed
by external process (hardware, interrupt handler, another thread).
So if I write to check this variable 1000 times in loop,
compiler should not always use the result from first check outside the loop.
It should produce REAL checking every time as the value can be altered.
> There is also a more general problem here in that gcc knows what a
> volatile memory location is, but does not know what a volatile register
> is. As a result, volatile register variables won't work the way you expect.
> By the way, current gcc sources emit a warning for this testcase:
> tmp.c:1: warning: volatile register variables don't work as you might wish
Do you mean that volatile keyword can not be used (will not work)
with register variables? So I cannot use the register variables that
can be changed from outside the code?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17336