http://d.puremagic.com/issues/show_bug.cgi?id=1140


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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch


--- Comment #5 from Don <clugd...@yahoo.com.au> 2009-10-07 23:58:13 PDT ---
This seems to be a superficial ICE. It only happens in this wierd situation, 
when a parameter, which was passed in a register, needs to be stored into a 
double-register (EDX:EAX).
In this case, the existing register can't be re-used, even though it satisfies 
all the conditions in cod1 line 3433.
We simply need to add an extra condition to prevent the register being 
re-used.After this simple change, correct code is generated instead of the ICE. 
I think this case never occurs in the calling conventions used in DMC.

 Of course, taking the address of an parameter, then casting it to the wrong 
size is a highly dubious thing
 to be doing, since it's getting whatever happens to be on the stack. Unsafe 
mode only!

 PATCH (against DMD2.033) cod1.c, line 3434:

    // See if we can use register that parameter was passed in
    if (regcon.params && e->EV.sp.Vsym->Sclass == SCfastpar &&
-    regcon.params & mask[e->EV.sp.Vsym->Spreg])
+    regcon.params & mask[e->EV.sp.Vsym->Spreg] && sz!=REGSIZE*2)
    {    assert(sz <= REGSIZE);
    reg = e->EV.sp.Vsym->Spreg;
    forregs = mask[reg];
    mfuncreg &= ~forregs;
    regcon.used |= forregs;
    return fixresult(e,forregs,pretregs);
    }

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to