This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gcc optimises out test of value in register-only loop


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]