[llvm] [ARM][Thumb1] Improve EstimateFunctionSizeInBytes accuracy (PR #203318)
Peter Smith via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 08:39:40 PDT 2026
================
@@ -2346,16 +2346,146 @@ bool ARMFrameLowering::restoreCalleeSavedRegisters(
// FIXME: Make generic?
static unsigned EstimateFunctionSizeInBytes(const MachineFunction &MF,
- const ARMBaseInstrInfo &TII) {
+ const ARMBaseInstrInfo &TII,
+ const ARMSubtarget &STI,
+ bool BigFrameOffsets) {
unsigned FnSize = 0;
+
+ if (MF.shouldSplitStack()) {
+ // Split stack prologue saves r4,r5; makes a copy of sp and loads
+ // a literal; compares the two, and if sp < literal, pushes
+ // further registers and calls __morestack.
+ FnSize += 0x24;
+ }
+
+ // Size of a particularly large Thumb1 stack setup prologue:
+ // update sp for variadic functions (2 bytes)
+ // + push registers (maybe high ones by copying them down, up to 14 bytes)
+ // + frame pointer (might use r11, requiring pushing it first, 6 bytes)
+ // + stack update (up to 6 bytes)
+ // + stack realignment (8)
+ // + make base pointer (2).
+ FnSize += 0x38;
+
+ // Size of a large epilogue:
+ // restore sp from frame pointer (6 bytes if it's in r11)
+ // + pop registers (up to 14 bytes, as above)
+ // + pop r11 if it was saved to make frame pointer (4 bytes)
+ // + pop return address into a low reg (2 bytes)
+ // + update sp to undo variadic function setup (2 bytes)
+ // + BX to where you popped the return address (2 bytes)
+ FnSize += 0x1e;
+
for (auto &MBB : MF) {
- for (auto &MI : MBB)
- FnSize += TII.getInstSizeInBytes(MI);
+ bool seenBranch = false, seenConstantLoad = false;
+ for (auto &MI : MBB) {
+ unsigned InstSize;
+ switch (MI.getOpcode()) {
+ case ARM::tADDframe:
+ if (BigFrameOffsets) {
----------------
smithp35 wrote:
Coding style nit. I think the LLVM coding standard prefers not to have braces around single statements.
I don't personally have a strong opinion on this, but could be worth a check.
https://github.com/llvm/llvm-project/pull/203318
More information about the llvm-commits
mailing list