[Issue 3521] Optimized code access popped register
https://issues.dlang.org/show_bug.cgi?id=3521 Walter Bright changed: What|Removed |Added Version|1.051 |D1 --
[Issue 3521] Optimized code access popped register
http://d.puremagic.com/issues/show_bug.cgi?id=3521 Walter Bright changed: What|Removed |Added Status|NEW |RESOLVED Resolution||FIXED --- Comment #5 from Walter Bright 2009-12-06 00:48:12 PST --- Fixed dmd 1.053 and 2.037 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 3521] Optimized code access popped register
http://d.puremagic.com/issues/show_bug.cgi?id=3521 --- Comment #4 from Walter Bright 2009-11-30 17:39:56 PST --- Fixed changeset 272. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 3521] Optimized code access popped register
http://d.puremagic.com/issues/show_bug.cgi?id=3521 Walter Bright changed: What|Removed |Added CC||bugzi...@digitalmars.com --- Comment #3 from Walter Bright 2009-11-30 14:16:29 PST --- I've found the cause of the problem; it's when a registered variable is on both sides of an operator and the right side tries to modify the variable. The fix isn't easy, I'll work on it. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 3521] Optimized code access popped register
http://d.puremagic.com/issues/show_bug.cgi?id=3521 --- Comment #2 from Don 2009-11-27 00:15:10 PST --- I investigated this a bit, so far without success. I'm writing notes here for when I come back to it. It's something to do with the register allocation. The compiler is somehow forgetting that it already assigned a register for c when doing the assignment. I removed the assert to make disassembly even easier: this hits a breakpoint only when compiled with -O. It only happens if c is zero. You can change the != into any kind of comparison, and the c=200 into c+=200, without affecting the bug. However, changing it into ((c = 200)!=*a) avoids the bug. void crash(int x) { if (x==200) return; asm { int 3; } } void bug3521(int *a){ int c = 0; *a = 0; if ( *a || (*a != (c = 200)) ) crash(c); } void main (){ int x; bug3521(&x); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 3521] Optimized code access popped register
http://d.puremagic.com/issues/show_bug.cgi?id=3521 Don changed: What|Removed |Added CC||clugd...@yahoo.com.au --- Comment #1 from Don 2009-11-23 01:57:30 PST --- Reduced test case shows that this is very low level. It's very specific, changing the expression order slightly will make the problem go away. The assignment to c gets optimised away, so that it remains as 0. - void bug3521(int *a) { int c = 0; *a = 0; if (*a == 0 && (*a + (c = 2)) == 2) assert(c == 2); } void main () { int x; bug3521(&x); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---