<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 9 November 2013 18:17, Johannes Pfau <span dir="ltr"><<a href="mailto:nospam@example.com" target="_blank">nospam@example.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Am Fri, 08 Nov 2013 21:00:18 +0100<br>
schrieb "Timo Sintonen" <<a href="mailto:t.sintonen@luukku.com">t.sintonen@luukku.com</a>>:<br>
<div><div class="h5"><br>
> Now returning to my original problem.<br>
><br>
> I tested various loops and it seems that write to a variable is<br>
> not volatile even if the variable is marked shared. If I write to<br>
> a variable several times in a loop, all but the last write are<br>
> optimized out. The only write is put after the loop.<br>
> Read works fine now with shared.<br>
><br>
> How can I do volatile writes?<br>
<br>
</div></div>AFAICS this is a GDC bug, Iain can you have a look at this?<br>
<br>
Here's a simple test case:<br>
---------------------------------------------<br>
struct Register<br>
{<br>
    shared size_t a;<br>
}<br>
<br>
Register* reg = cast(Register*)0xFFDDCCAA;<br>
<br>
void main()<br>
{<br>
     for(size_t i = 0; i < 10; i++)<br>
         reg.a = i;<br>
}<br>
---------------------------------------------<br>
<br>
<br>
Same thing in C (working):<br>
---------------------------------------------<br>
#include <stdlib.h><br>
<br>
struct Register<br>
{<br>
    volatile size_t a;<br>
};<br>
typedef struct Register reg_t;<br>
<br>
reg_t* reg = (reg_t*)0xFFDDCCAA;<br>
<br>
void main()<br>
{<br>
     size_t i;<br>
     for(i = 0; i < 10; i++)<br>
         reg->a = i;<br>
}<br>
<br>
---------------------------------------------<br>
<br>
Compile with<br>
gdc -O3 test.d -S -fdump-tree-original-raw<br>
gcc -O3 test.c -S -fdump-tree-original-raw<br>
<br>
Of course the code won't run but the wrong optimization is obvious in<br>
the generated ASM. I had a quick look at the fdump-tree-original-raw<br>
output but I didn't see a obvious difference between the C/D output.<br>
</blockquote></div><br><br></div><div class="gmail_extra">Please raise a bug.<br></div><div class="gmail_extra"><br clear="all"><br>-- <br>Iain Buclaw<br><br>*(p < e ? p++ : p) = (c & 0x0f) + '0';
</div></div>