On Wednesday, 22 January 2014 at 15:03:49 UTC, Johannes Pfau
wrote:
Am Wed, 22 Jan 2014 00:28:32 +0000
schrieb "Mike" <[email protected]>:
"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.