System programming in D (Was: The God Language)
Artur Skawina
art.08.09 at gmail.com
Thu Jan 5 03:40:09 PST 2012
On 01/05/12 02:34, Iain Buclaw wrote:
> Regardless, there is little reason to want to use a forced inline with
> gdc. Just like in c++ when you define all methods in the class
> definition, gdc considers all methods as candidates for inlining.
> Similarly, when -inline is passed, the same is also done for normal
> functions that are considered inlinable by the frontend. These
> functions marked as inline are treated in the same way as a function
> declared 'inline' in C or C++, and will be treated as such by the
> backend.
This reminded me:
------------------------------------
bool empty1(T)(T[] a) { return 1; }
bool empty2(T)(in T[] a) { return 1; }
int main(string[] argv) {
auto r1 = empty1(argv[0]);
auto r2 = empty2(argv[0]);
return r1&&r2;
}
------------------------------------
results in:
------------------------------------
# gdc -O3 -finline -frelease -fno-bounds-check notinlined.d -o notinlined
08049ac0 <bool notinlined.empty1!(immutable(char)).empty1(immutable(char)[])>:
8049ac0: 55 push %ebp
8049ac1: b8 01 00 00 00 mov $0x1,%eax
8049ac6: 89 e5 mov %esp,%ebp
8049ac8: 5d pop %ebp
8049ac9: c3 ret
08049ad0 <bool notinlined.empty2!(immutable(char)).empty2(const(immutable(char)[]))>:
8049ad0: 55 push %ebp
8049ad1: b8 01 00 00 00 mov $0x1,%eax
8049ad6: 89 e5 mov %esp,%ebp
8049ad8: 5d pop %ebp
8049ad9: c3 ret
08049ae0 <_Dmain>:
8049ae0: 55 push %ebp
8049ae1: 89 e5 mov %esp,%ebp
8049ae3: 83 ec 18 sub $0x18,%esp
8049ae6: 8b 45 0c mov 0xc(%ebp),%eax
8049ae9: 8b 50 04 mov 0x4(%eax),%edx
8049aec: 8b 00 mov (%eax),%eax
8049aee: 89 54 24 04 mov %edx,0x4(%esp)
8049af2: 89 04 24 mov %eax,(%esp)
8049af5: e8 d6 ff ff ff call 8049ad0 <bool notinlined.empty2!(immutable(char)).empty2(const(immutable(char)[]))>
8049afa: c9 leave
8049afb: 0f b6 c0 movzbl %al,%eax
8049afe: c3 ret
------------------------------------
IOW gdc completely gives up on inlining the function/method because of the "in".
Actually, "bool empty2(T)(const T[] a)" is enough to trigger the call.
This means that eg array.empty never gets inlined.
"pragma(attribute, always_inline)" does not help in this case.
artur
More information about the D.gnu
mailing list