-O2/-O3 Optimization bug?

Mike none at none.com
Wed Jan 22 13:31:55 PST 2014


On Wednesday, 22 January 2014 at 15:03:49 UTC, Johannes Pfau 
wrote:
> Am Wed, 22 Jan 2014 00:28:32 +0000
> schrieb "Mike" <none at none.com>:
>
>> 
>> "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
>
> I can only guess, but this looks like another 'volatile' 
> problem. You'd
> have to post the ASM of the optimized version somewhere, and 
> probably
> the output of -fdump-tree-optimized for the optimized version.
>
> But anyway, I guess it inlines 'SendCommand' and then thinks 
> you're not
> using the message and probably completely optimizes the call 
> away. Then
> it sees you're never using message and removes the rest of your 
> code.
> If SendCommand was written in D you'd have to mark the target 
> of the
> copy volatile (or shared).
>
> But I'm not sure how this applies to the inline asm though. In 
> C you
> have asm volatile, but I never used that. This answer seems to 
> state
> that you have to use asm volatile:
> http://stackoverflow.com/a/5057270/471401
>
>
>
> So the questions for Iain:
>  * should we mark all inline ASM blocks as volatile?
>  * shared can't replace volatile in this case as `shared 
> asm{...}`
>    isn't valid
>  * Should we add some GDC specific way to mark extended ASM 
> blocks as
>    volatile? As DMD doesn't optimize ASM blocks at all there's 
> probably
>    no need for a standard solution?

Thanks for the response, Johannes.  Defining message as "shared 
uint[3] message" and defining SendMessage as "void 
SendCommand(int command, shared void* message)" did the trick.


More information about the D.gnu mailing list