-O2/-O3 Optimization bug?

Mike none at none.com
Tue Jan 21 16:28:32 PST 2014


Hello again,

I'm continuing my work on an ARM Cortex-M port of the D Runtime.  
I now have a repository 
(https://github.com/JinShil/D_Runtime_ARM_Cortex-M_study) and a 
wiki 
(https://github.com/JinShil/D_Runtime_ARM_Cortex-M_study/wiki/1.0-Introduction) 
for anyone interested.  I'm doing my best to document the entire 
process.

I tried playing with GDC/GCC optimizations recently, and noticed 
that it breaks the following simple code from my "Hello World" 
experiment 
(http://wiki.dlang.org/Extremely_minimal_semihosted_%22Hello_World%22)

void OnReset()
{
   while(true)
   {
     // Create semihosting message
     uint[3] message =
       [
	2, 			      //stderr
	cast(uint)"hello\r\n".ptr,    //ptr to string
	7                             //size of string
       ];

     //Send semihosting command
     SendCommand(0x05, &message);
   }
}

Compiling with...
   arm-none-eabi-gdc -O1 start.d -o start.o
... works fine, but compiling with...
   arm-none-eabi-gdc -O2 start.d -o start.o
... or ...
   arm-none-eabi-gdc -O3 start.d -o start.o
... does not.

I traced this down to the -finline-small-functions and 
-fipa-cp-clone options, so if I compile with...
   arm-none-eabi-gdc -O2 -fno-inline-small-functions start.d -o 
start.o
... or ...
   arm-none-eabi-gdc -O3 -fno-inline-small-functions 
-fno-ipa-cp-clone start.d -o start.o
... it works fine.

Comparing the assembly generated with...
   arm-none-eabi-gdc -O1 start.d -o start.o
... and ...
   arm-none-eabi-gdc -O2 start.d -o start.o
... I can see that the "hello\r\n" string constant vanishes from 
the assembly file with the -O2 option.

"So what's the question, Mike?" I hear you say:
1.  Is this just one of the consequences of using -O2/-O3, and I 
should just suck it up and deal with it?
2.  Is this potentially a bug in the GCC backend?
3.  Is this potentially a bug in GDC or the DMD frontend?

Thanks for the help,
Mike


More information about the D.gnu mailing list