News for hackers. Stuff that matters.
Re:Frame pointers vs. DWARF – my verdict by sylware on Wednesday February 15, 2023 @08:00AM (#34803227)
dwarf = brain convolution

frame pointer = 1 less register on an already set of registers under heavy strain (x86_64). I do envy risc-v with all their registers: even the load-store model of risc-v won't use enough more registers to end up with the same amount of strain as on x86_64.

If I ever have the usage of dwarf, I would build the tables manually only for what I wish to debug?... if it is possible (without the use of specialized assembler directives, because it increase significantly the technical cost of the assembler). That said, does a real, accurate and complete specification of dward exists? Because when I look at the sysv ABI or ELF, what a mess.

Re:Frame pointers vs. DWARF – my verdict by masklinn on Wednesday February 15, 2023 @08:24AM (#34803463)
> frame pointer = 1 less register on an already set of registers under heavy strain (x86_64).

X86-64 is not under heavy register pressure strain. That idea is a legacy from x86 (plain, 32b).

x86-64 has the same register count as ARMv7 and few bothered disabling the frame pointer there, even though it’s a load-store architecture.

Re:Frame pointers vs. DWARF – my verdict by tialaramex on Wednesday February 15, 2023 @09:22AM (#34804127)
Right, x86-64 offers eight extra register names† (r8 through r15). If you choose to go from x86-without-frame-pointer to x86-64-with-frame-pointer you gained 7 register names which is huge.

This makes the case where that one extra register name makes all the difference much rarer, arguably turning it from "I demand a compiler flag" to "Let's just hand-write the machine code for this one very special routine if our performance data suggests it's worth it".

† Internally a modern CPU has far more actual register, to enable a feature called "register renaming". But we can only talk about them using their canonical names, and x86-64 adds eight more of those.

Re:Frame pointers vs. DWARF – my verdict by the_mitsuhiko on Wednesday February 15, 2023 @09:29AM (#34804233)
I think generally the talk about "there are not enough registers" ignore pipelining and register renaming way too much. The loss of performance of the frame pointer register even on x86 is not that problematic, and on x86_64 it's completely negligible unless you're in a tight switch heavy interpreter loop.
Re:Frame pointers vs. DWARF – my verdict by zznzz on Wednesday February 15, 2023 @10:15AM (#34804890)
Register renaming doesn’t significantly address the impact of reducing the number of architectural registers available to the compiler. With fewer register names available, the compiler will spill locals to stack more often, and register renaming doesn’t help - memory renaming is needed to really mitigate this.

But i agree the impact of preserving frame pointers is generally quite small and doesn’t often actually need mitigation - on amd64 there’s not much impact from losing 1 more of 16 arch registers.

Re:Frame pointers vs. DWARF – my verdict by irogers on Wednesday February 15, 2023 @11:46AM (#34806549)
Agner speaks about memory renaming back on Zen 2:

https://www.agner.org/forum/viewtopic.php?t=41

Intel Alderlake has performance events for tracking it:

https://github.com/intel/perfmon/blob/974c69919b2a9dfd8278cf...

But even before this you had store to load forwarding on x86. I'm not saying you have, but before inventing a performance problem it is worth spending time trying to diagnose it with thorough profiling (e.g. [1]). The Fedora frame pointer patch did a thorough performance analysis and performance will be revisited again. Unfortunately there are a lot of arm chair performance experts who haven't spent time looking into the details.

[1] https://perf.wiki.kernel.org/index.php/Top-Down_Analysis

Re:Frame pointers vs. DWARF – my verdict by masklinn on Wednesday February 15, 2023 @10:36AM (#34805172)
And that’s before accounting for SP which the compiler will usually avoid touching. So for an x86 target, omitting the frame pointer means going from 6 to 7 usable registers, on x86-64 it’s 14 to 15, a lot less necessary outside of very specific work loads.