GDC optimizations bug ?
Maor via D.gnu
d.gnu at puremagic.com
Sun Nov 9 00:37:08 PST 2014
Hi,
I'm trying to compile a program using inline asm with
optimizations and I got my inline asm functions thrown out by the
optimizer although I declared them as having side effects (by
stating a memory clobber).
I wrote the following toy program to demonstrate the problem:
----------------------------------------------
import std.stdio;
import gcc.attribute;
@attribute("forceinline") ulong exchangeAndAdd(shared ulong
*counter, ulong addition) {
ulong retVal = void; // we don't want it initialized when
dmd is used
asm {
"
mov %2, %0 ;
lock ;
xadd %0, (%1) ;
":
"=&r"(retVal) :
"r"(counter), "r"(addition) :
"memory";
}
return retVal;
}
ulong func1() {
shared ulong a = 9;
exchangeAndAdd(&a, 3);
return a;
}
void main()
{
ulong b;
b = func1();
writeln(b);
}
----------------------------------------------
Compiling it with and without optimizations gives a different
output:
> /opt/gdc/bin/gdc ./test.d -o/tmp/a.out
> /tmp/a.out
12
> /opt/gdc/bin/gdc -O3 -g ./test.d -o/tmp/a.out
> /tmp/a.out
9
using gdb we can see that the call to exchangeAndAdd() is being
thrown out in the optimized version:
(gdb) disas _D4test5func1FZm
Dump of assembler code for function _D4test5func1FZm:
0x0000000000406460 <+0>: movq $0x9,-0x8(%rsp)
0x0000000000406469 <+9>: mov -0x8(%rsp),%rax
0x000000000040646e <+14>: retq
End of assembler dump.
Is this a compiler bug or am I doing something wrong ?
btw, I'm using gdc 4.9.0.
thanks in advance,
Maor
More information about the D.gnu
mailing list