[Issue 3521] Optimized code access popped register

2014-04-18 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=3521

Walter Bright bugzi...@digitalmars.com changed:

   What|Removed |Added

Version|1.051   |D1

--


[Issue 3521] Optimized code access popped register

2009-12-06 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3521


Walter Bright bugzi...@digitalmars.com changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution||FIXED


--- Comment #5 from Walter Bright bugzi...@digitalmars.com 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

2009-11-30 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3521


Walter Bright bugzi...@digitalmars.com changed:

   What|Removed |Added

 CC||bugzi...@digitalmars.com


--- Comment #3 from Walter Bright bugzi...@digitalmars.com 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

2009-11-27 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3521



--- Comment #2 from Don clugd...@yahoo.com.au 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

2009-11-23 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3521


Don clugd...@yahoo.com.au changed:

   What|Removed |Added

 CC||clugd...@yahoo.com.au


--- Comment #1 from Don clugd...@yahoo.com.au 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: ---