[Issue 4440] inlined delegates produces different asm than straight lined code

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Jul 11 10:13:18 PDT 2010


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


Brad Roberts <braddr at puremagic.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
         AssignedTo|nobody at puremagic.com        |braddr at puremagic.com


--- Comment #2 from Brad Roberts <braddr at puremagic.com> 2010-07-11 10:13:14 PDT ---
Reducing the test case further:
extern(C) int printf(const char*, ...);

bool if_delegate(int i, bool delegate(ref int) predicate)
{
    return predicate(i);
}

bool if_nodelegate(int i)
{
    return i == 99;
}

void main()
{
    foreach(i; 1 .. 100)
        if (if_delegate(i, (ref int j) { return j == 99; }))
            printf("i = %d\n", i);

    foreach(i; 1 .. 100)
        if (if_nodelegate(i))
            printf("i = %d\n", i);
}

In the previous version of the code, the use of the for loops makes the cost of
the functions too high for the inliner to bother inlining find_if into main. 
Also,in the non-inlined version of the function, there's no way for it to
inline the delegate since it's a variable, not a constant thing.

This changed version reduces the problem to: will it inline the delegate?  The
answer is still no, but allows that specific problem to be explored.

Leandro, does this stray too far away from the underlying code that led you to
file this bug?

-- 
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