Re: Inlining with gcc 4.x.x (Linux) ?
"John L. Ries" <[email protected]> Tue, 10 Jan 2017 10:11:02 -0800 (PST)
| Newsgroups | gmane.comp.compilers.gpc |
|---|---|
| Message-ID | <alpine.DEB.2.11.1701101007570.26299@apolloIII> |
So somebody has compiled GPC based on GCC 4.3? This is good (latest I
had previously seen was 4.1). Are patches available for any later
versions of GCC?
--------------------------|
John L. Ries |
Salford Systems |
Phone: (619)543-8880 x107 |
or (435)867-8885 |
--------------------------|
On Tue, 10 Jan 2017, Peter wrote:
> I've built GPC 3.4.6 and 4.3.6 on Debian Stretch (64bit)
> Running benchmarks on a Perlin Noise routine I get
>
> 3.4.6 5.6 secs
> 4.3.6 11.0 secs !!
>
> The difference seems to be mainly down to a failure of 4.3.6 to inline.
> Call functions themselves may not take much time but I believe the real
> problem is that without the subroutines inlined, the main Noise function
> is no longer a leaf function, and therefore under register pressure.
>
> ….....
>
> a := Lerp (sx, u10, v10);
> b := Lerp (sx, u11, v11);
> d := Lerp (sy, a, b);
>
> Noise3 := Lerp(sz, c, d);
> End;
>
>
> This code produces with 3.4.6
>
> { Hard to know where it starts without line numbers ! }
> addsd %xmm9, %xmm7
> addsd %xmm3, %xmm2
> subsd %xmm0, %xmm1
> subsd %xmm7, %xmm2
> mulsd %xmm14, %xmm1
> mulsd %xmm14, %xmm2
> addsd %xmm0, %xmm1
> addsd %xmm7, %xmm2
> subsd %xmm1, %xmm2
> mulsd %xmm2, %xmm12
> movsd %xmm12, %xmm0
> addsd %xmm1, %xmm0
> ret
>
> which is pretty lean & mean.
>
>
> However, with 4.3.6 I get
>
> movsd 112(%rsp), %xmm2
> movsd 104(%rsp), %xmm1
> movsd 48(%rsp), %xmm0
> call _p__M0_S5_Lerp
> movsd 128(%rsp), %xmm2
> movsd %xmm0, 152(%rsp)
> movsd 120(%rsp), %xmm1
> movsd 48(%rsp), %xmm0
> call _p__M0_S5_Lerp
> movsd 152(%rsp), %xmm1
> movapd %xmm0, %xmm2
> movsd 56(%rsp), %xmm0
> call _p__M0_S5_Lerp
> movsd 40(%rsp), %xmm1
> movapd %xmm0, %xmm2
> movsd 64(%rsp), %xmm0
> call _p__M0_S5_Lerp
> addq $240, %rsp
> popq %rbx
> popq %rbp
> popq %r12
> popq %r13
> popq %r14
> popq %r15
> ret
>
>
> ( Stack spills tend to be expensive on [my] AMD processor as the level
> 0/1 cache isn't that fast.
>
>
> Maybe I have broken my build of 4.3.6 Can anyone else conform the
> status of inlining on linux x86 with 4.x.x compilers? The simple
> example from the info file
>
> program InlineDemo;
>
> function Max (x, y: Integer): Integer; attribute (inline);
> begin
> if x > y then
> Max := x
> else
> Max := y
> end;
>
> begin
> WriteLn (Max (42, 17), ' ', Max (-4, -2))
> end.
>
>
> Also does not work for me with 4.3.6. It still produces a call instruction.
> call _p__M0_S0_Max
>
>
> I recall also that inlining did not work with the official 4.1 Debian
> package. I was thinking of reporting this as a (Debian) bug a while
> back, but GPC was then removed from the archive, which made that moot.
>
>
> Going forward, I'm wondering which gcc version to base my builds on.
> 4.3.6 supports potentially a few more architectures,
> ARMel
> PowerPC
> SH4
>
> and supports the -m32 switch, but a 100% slowdown on the CPU intensive
> stuff I use the compiler for is too much a penalty for me.
>
> From further tinkering around, I notice that 3.4.6 often inlines even
> when not asked to do so, whereas 4.3.6 very rarely if ever inlines.
> Neither compiler seems to obey the inline attribute!
>
> Anyone any thoughts on this?
> Hoping of course that its an easy to fix typo type bug...
>
>
> Regards,
> Peter B
>
>
>
>
>
> _______________________________________________
> Gpc mailing list
> [email protected]
> https://www.g-n-u.de/mailman/listinfo/gpc
_______________________________________________
Gpc mailing list
[email protected]
https://www.g-n-u.de/mailman/listinfo/gpc