www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Does the compiler inline the predicate functions to

reply tipdbmp <email example.com> writes:
I can't read assembly but it seems to me that it doesn't: 
https://godbolt.org/g/PCsnPT
I think C++'s sort can take a "function object" that can get 
inlined.
Mar 18 2018
next sibling parent Radu <rad.racariu gmail.com> writes:
On Sunday, 18 March 2018 at 12:59:06 UTC, tipdbmp wrote:
 I can't read assembly but it seems to me that it doesn't: 
 https://godbolt.org/g/PCsnPT
 I think C++'s sort can take a "function object" that can get 
 inlined.
add "-O3" also to the compiler switches.
Mar 18 2018
prev sibling parent reply Stefan Koch <uplink.coder googlemail.com> writes:
On Sunday, 18 March 2018 at 12:59:06 UTC, tipdbmp wrote:
 I can't read assembly but it seems to me that it doesn't: 
 https://godbolt.org/g/PCsnPT
 I think C++'s sort can take a "function object" that can get 
 inlined.
Correct it does not get in-lined. Even with -O3 it does not. The reason is that the code the sort instantiation produces is too big for the inliner cost function. If you have a look at the the cg file produced when you specify -vcg-ast you can see that it's a massive amount of code.
Mar 18 2018
parent reply David Nadlinger <code klickverbot.at> writes:
On Sunday, 18 March 2018 at 14:15:37 UTC, Stefan Koch wrote:
 On Sunday, 18 March 2018 at 12:59:06 UTC, tipdbmp wrote:
 I can't read assembly but it seems to me that it doesn't: 
 https://godbolt.org/g/PCsnPT
 I think C++'s sort can take a "function object" that can get 
 inlined.
Correct it does not get in-lined. Even with -O3 it does not. The reason is that the code the sort instantiation produces is too big for the inliner cost function. If you have a look at the the cg file produced when you specify -vcg-ast you can see that it's a massive amount of code.
I believe the original poster was asking about the *predicate* to sort, which is indeed inlined with optimizations on. ( tipdbmp: The string gets turned into the function _D3std10functional__T9binaryFunVAyaa5_61203c2062VQra1_61VQza1_62Z__TQBvTiTi QCdFNaNbNiNfKiKiZb. No references to it remain with -O3; the LLVM IR obtained with -output-ll might be easier to read than assembly.) — David
Mar 18 2018
parent reply tipdbmp <email example.com> writes:
( tipdbmp: The string gets turned into the function 
_D3std10functional__T9binaryFunVAyaa5_61203c2062VQra1_61VQza1_62Z__TQBvTiTi
QCdFNaNbNiNfKiKiZb. No references to it remain with -O3; the LLVM IR obtained
with -output-ll might be easier to read than assembly.)
I see. It seems that ldc 1.8.0 with "-release -O2|3" inlines it, but dmd 2.079.0 with "-release" (no -O option?) does not.
the LLVM IR obtained with -output-ll might be easier to read 
than assembly.)
I only seem to get assembly on d.godbolt.org, even with the -output-ll option.
Mar 19 2018
next sibling parent Seb <seb wilzba.ch> writes:
On Monday, 19 March 2018 at 12:45:58 UTC, tipdbmp wrote:
( tipdbmp: The string gets turned into the function 
_D3std10functional__T9binaryFunVAyaa5_61203c2062VQra1_61VQza1_62Z__TQBvTiTi
QCdFNaNbNiNfKiKiZb. No references to it remain with -O3; the LLVM IR obtained
with -output-ll might be easier to read than assembly.)
I see. It seems that ldc 1.8.0 with "-release -O2|3" inlines it, but dmd 2.079.0 with "-release" (no -O option?) does not.
DMD has a -inline flag to enable inlining - though LDC is a lot better in optimization than DMD and thus typically used for anything performance related.
the LLVM IR obtained with -output-ll might be easier to read 
than assembly.)
I only seem to get assembly on d.godbolt.org, even with the -output-ll option.
You can get IR on run.dlang.io by simply selecting LDC and hitting the IR button.
Mar 19 2018
prev sibling parent Johan Engelen <j j.nl> writes:
On Monday, 19 March 2018 at 12:45:58 UTC, tipdbmp wrote:
the LLVM IR obtained with -output-ll might be easier to read 
than assembly.)
I only seem to get assembly on d.godbolt.org, even with the -output-ll option.
On d.godbolt.org, you can get LLVM IR with a trick: use `-output-s=false -output-ll`. -Johan
Mar 19 2018