[Issue 10509] Closure is allocated even if it may be not needed

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Sep 19 23:28:29 PDT 2013


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


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|wrong-code                  |performance
           Severity|critical                    |enhancement


--- Comment #1 from Don <clugdbug at yahoo.com.au> 2013-09-19 23:28:25 PDT ---
This is a very difficult optimization.
Consider:

void f(int i)
{
    if (i)
        del = () => i;  // (1)
    ++i;                // (2)
}

If you put i on the heap only at (1), then the compiler has trouble generating
code at (2) -- is i on the heap, or on the stack?

Another example:

    if (cond1()) 
        del = () => i;
    if (cond2()) 
        del = () => i*2;
The compiler would then have to generate code to move i onto the heap in two
places, and in the second case, it might already be on the heap.

> This hits with pain as one do not expect such behaviour

I think that is inevitable. In some simple cases, the compiler might be able to
avoid creating a closure, but it will always be rather conservative.
This isn't wrong code, it's a missed optimization opportunity.

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


More information about the Digitalmars-d-bugs mailing list