[Issue 13190] New: Optimizer breaks comparison with zero
    via Digitalmars-d-bugs 
    digitalmars-d-bugs at puremagic.com
       
    Tue Jul 22 10:53:01 PDT 2014
    
    
  
https://issues.dlang.org/show_bug.cgi?id=13190
          Issue ID: 13190
           Summary: Optimizer breaks comparison with zero
           Product: D
           Version: D1 & D2
          Hardware: x86
                OS: All
            Status: NEW
          Keywords: wrong-code
          Severity: critical
          Priority: P1
         Component: DMD
          Assignee: nobody at puremagic.com
          Reporter: yebblies at gmail.com
This code, compiled with -release -O, breaks on win32 and linux32 (and
presumably other32).
The for loop comparison (table[i].a != 0) gets implemented as a load+or+bne,
but the increment for the loop index gets inserted between the or and the loop,
which trashes the flags register.  This results in an infinite loop and
eventually a segfault.
extern(C) int printf(const(char)*,...);
struct Struct
{
    ulong a;
    uint b;
};
__gshared Struct[] table = 
[
    Struct(1, 1),
    Struct(0, 2)
];
void main()
{
    for (int i = 0; table[i].a; i++)
    {
        ulong tbl = table[i].a;
        printf("i:%d stc:%lld\n", i, tbl);
        if (1 + tbl)
        {
            if (tbl == 0x80000)
                return;
        }
    }
}
condition asm: _003 == array base, ebx = current offset, esi = loop index
?_016:  add     ebx, 16                                 ; 005E _ 83. C3, 10
        mov     ecx, dword ptr [?_003]                  ; 0061 _ 8B. 0D,
00000034(segrel)
        mov     edx, dword ptr [ebx+ecx+4H]             ; 0067 _ 8B. 54 0B, 04
        or      edx, dword ptr [ebx+ecx]                ; 006B _ 0B. 14 0B
        inc     esi                                     ; 006E _ 46
        jnz     ?_014                                   ; 006F _ 75, A4
--
    
    
More information about the Digitalmars-d-bugs
mailing list