www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 1150] New: Compiler creates wrong code

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=1150

           Summary: Compiler creates wrong code
           Product: D
           Version: 1.012
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Keywords: wrong-code
          Severity: critical
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: niqbmozgvx mailinator.com


The compiler creates wrong assembly code for the following class if _not_
compiled with optimize argument "-O" (example "dmd bug.d -g").

--------- bug.d -------------
class RangeCoder {
        uint[258] cumCount; // 256 + end + total
        uint lower;
        uint upper;
        ulong range;

        this() {
                for (int i=0; i<cumCount.length; i++)
                        cumCount[i] = i;
                lower = 0;
                upper = 0xffffffff;
                range = 0x100000000;
        }

        void encode(uint symbol) {
                uint total = cumCount[length - 1];              
                // "Error: Access Violation" in following line
                upper = lower + cast(uint)((cumCount[symbol+1] * range) /
total) - 1;
                lower = lower + cast(uint)((cumCount[symbol]   * range) /
total);
        }

}

int main(char[][] args) {
        RangeCoder rc = new RangeCoder();
        rc.encode(77);
        return 0;
}
------- bug.d -------

Assembler code created by the compiler:

------- asm ---------
image00400000!D3bug10RangeCoder6encodeMFkZv:
00402084 c8280000        enter   28h,0
        [...]
004020e8 8b4de0          mov     ecx,dword ptr [ebp-20h]
004020eb 8b34b1          mov     esi,dword ptr [ecx+esi*4] 
004020ee 89f0            mov     eax,esi        // eax = cumCount[symbol+1]
004020f0 8b55f4          mov     edx,dword ptr [ebp-0Ch]
004020f3 8db218040000    lea     esi,[edx+418h]         // esi -> range
004020f9 f76604          mul     eax,dword ptr [esi+4]  // edx:eax = eax *
Hi(range)
004020fc 8975e8          mov     dword ptr [ebp-18h],esi
004020ff 96              xchg    eax,esi        // <-- esi is wrong here!
00402100 f726            mul     eax,dword ptr [esi]  ds:0023:0000004e=????????
// should be: edx:eax = eax * Lo(range)
00402102 03d6            add     edx,esi        // add carry from 1. mul
------- asm --------

The consequence is a Access Violation  402100.

LLAP,
Sascha


-- 
Apr 15 2007
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=1150


bugzilla digitalmars.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED





Fixed DMD 1.013


-- 
Apr 20 2007
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=1150


thomas-dloop kuehne.cn changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         OS/Version|Windows                     |All





Added to DStress as
http://dstress.kuehne.cn/run/o/odd_bug_15_A.d


-- 
Apr 23 2007