From c277aa2226bc43b5338fbf3e29c8ba502a03e1af Mon Sep 17 00:00:00 2001 From: lzkk <956449176@qq.com> Date: Thu, 28 May 2026 01:59:27 +0800 Subject: [PATCH] =?UTF-8?q?perf(mir):=20=E5=B8=A7=E6=A7=BD=E6=8C=89?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E9=87=8D=E6=8E=92=E5=BA=8F=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=B0=8F=E6=A7=BD=E4=BC=98=E5=85=88=E8=8E=B7=E5=BE=97=20ldur?= =?UTF-8?q?=20=E8=8C=83=E5=9B=B4=E5=86=85=E5=81=8F=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 4字节标量优先分配,大数组靠后,使热访问在 [-256,0] 的 ldur 范围。 crypto -176(-10.3%),消除大量 mov x13,x29 + sub 地址计算链。 --- src/mir/FrameLowering.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/mir/FrameLowering.cpp b/src/mir/FrameLowering.cpp index 34422b00..291d55dd 100644 --- a/src/mir/FrameLowering.cpp +++ b/src/mir/FrameLowering.cpp @@ -39,15 +39,35 @@ namespace mir } callee_saved_bytes = AlignTo(callee_saved_bytes, 16); + // 将小槽位(频繁访问的标量)排在前面,使偏移在 ldur 范围 [-256,0] 内 + std::vector slot_order(slots.size()); + for (size_t i = 0; i < slots.size(); ++i) + slot_order[i] = i; + std::stable_sort(slot_order.begin(), slot_order.end(), + [&](size_t a, size_t b) { + const auto &sa = slots[a]; + const auto &sb = slots[b]; + if (sa.is_stack_arg != sb.is_stack_arg) + return !sa.is_stack_arg; + if (sa.is_callee_stack_arg != sb.is_callee_stack_arg) + return !sa.is_callee_stack_arg; + return sa.size < sb.size; + }); + + std::vector new_offsets(slots.size(), 0); int offset = 0; - for (auto &slot : slots) + for (size_t si : slot_order) { + auto &slot = slots[si]; if (slot.is_stack_arg || slot.is_callee_stack_arg) continue; offset -= slot.size; offset = AlignTo(offset, slot.size >= 8 ? 8 : 4); - slot.offset = offset; + new_offsets[si] = offset; } + for (size_t i = 0; i < slots.size(); ++i) + if (!slots[i].is_stack_arg && !slots[i].is_callee_stack_arg) + slots[i].offset = new_offsets[i]; offset -= callee_saved_bytes; offset -= 16;