This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: gcc optimises out test of value in register-only loop
- From: Andrew Haley <aph at redhat dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Thu, 13 Oct 2011 12:38:00 +0100
- Subject: Re: gcc optimises out test of value in register-only loop
- References: <loom.20111013T124012-691@post.gmane.org>
On 10/13/2011 12:23 PM, MikeW wrote:
> sh4-linux-gcc (GCC) 4.2.4 [unfortunately the version is tied to the
> kernel build. ]
>
> In some kernel code where RAM is unavailable due to manipulation of the MMU,
> I wanted to place some 'got here' stops in the code so I could ^C break in gdb,
> reset a register value and allow execution to continue.
>
> Accordingly I tried:
> volatile register int stop_loop __asm("r5")__;
> ...
> stop_loop = 0x1234;
> (disable MMU)
> while (stop_loop != 0);
> ...
>
> which seemed to generate code that checks the value of r5 only once:
>
> xxxx08: mov r5,r1
> xxxx0a: tst r1,r1
> xxxx0c: bf xxxx0c ;r5 never tested again!!
> xxxx0e: (unrelated code)
>
> I also tried
> while ((volatile)stop_loop != 0);
> and
> while ((volatile)(stop_loop != 0));
>
> which both gave the original asm code as above.
>
> So, in short, is there any way to persuade gcc to reload r5 - which could
> in other non-debug situations be a global register variable updated
> in an ISR, for example.
I don't think so. If every there was a case for "use asm", it's surely
this.
Andrew.