inlining...
Chris Williams
yoreanon-chrisw at yahoo.co.jp
Fri Mar 14 15:22:33 PDT 2014
On Friday, 14 March 2014 at 22:12:38 UTC, Nick Sabalausky wrote:
> On 3/14/2014 8:37 AM, Manu wrote:
>> On 14 March 2014 22:02, John Colvin
>> <john.loughran.colvin at gmail.com> wrote:
>>>
>>> I don't know how good compilers are at taking this sort of
>>> thing into
>>> account already.
>>>
>>
>> I don't know if they try or not, but I can say from experience
>> that results
>> are generally unreliable.
>> I would never depend on the inliner to get this right.
>>
>
> I don't know how this compares to other inliners, but FWIW,
> DMD's inliner is pretty simple (By coincidence, I was just
> digging into it the other day):
>
> Every expression node (ie non-statement, non-declaration) in
> the function's AST adds 1 to the cost of inlining (so ex: 1+2*3
> would have a cost of 2 - one mult, plus one addition). If the
> total cost is under 250, the function is inlined.
>
> Also, any type of AST node that isn't explicitly handled in
> inline.c will prevent a function from ever being inlined (since
> the ijnliner doesn't know how to inline it). I assume this is
> probably after lowerings are done, though, so more advanced
> constructs probably don't need to be explicitly handled.
>
> There is one other minor difficulty worth noting: When DMD
> wants to inline a function call, and the function's return
> value is actually used (ex: "auto x = foo();" or "1 + foo()"),
> the function must get inlined as an expression. Unfortunately,
> AIUI, a lot of D's statements can't be implemented inside an
> expression ATM (such as loops), so these would currently
> prevent such a function call from being inlined.
>
> I don't know how easy or difficult that would be to fix.
> Conceptually it should be simple: Create an Expression type
> StatementExp to wrap a Statement as an expression. But other
> parts of the backend would probably need to know about it, and
> I'm unfamiliar with the rest of the backend, so have no idea
> what that would/wouldn't entail.
>
> Not that it can't be done (AFAIK), but since the subject came
> up I thought I'd give a brief overview of the current DMD
> inliner, just FWIW.
Probably one easy adjustment that would result in a lot of gain
in optimization would be to bump the lower bound of 250 if the
function is an operator overload.
More information about the Digitalmars-d
mailing list