From f65fe9fc20d145d90d947bbc32431ce8a8e99792 Mon Sep 17 00:00:00 2001 From: lzkk <956449176@qq.com> Date: Thu, 28 May 2026 01:57:16 +0800 Subject: [PATCH] =?UTF-8?q?perf(mir):=20=E6=89=A9=E5=B1=95=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E5=AF=BB=E5=9D=80=E5=88=B0=20EmitStatement=20Load=20?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=EF=BC=88ptr/float/int=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit h-8 -58(-14.6%), sort -66(-10.7%), h-5 -35(-10.9%), crypto -43, shuffle -37 24 基线更新,此轮优化累计巨大收益。 --- src/mir/Lowering.cpp | 83 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/src/mir/Lowering.cpp b/src/mir/Lowering.cpp index e6251e20..80dcf320 100644 --- a/src/mir/Lowering.cpp +++ b/src/mir/Lowering.cpp @@ -1390,28 +1390,73 @@ namespace mir } } - int addr = EmitPtrValue(load.GetPtr(), function, value_vregs, - scalar_slots, array_slots, block); - if (is_ptr) - { - int vreg = function.CreateVReg(VRegClass::Ptr); - block.Append(Opcode::LoadMem, - {Operand::VReg(vreg, VRegClass::Ptr), Operand::VReg(addr, VRegClass::Ptr)}); - value_vregs[&load] = vreg; - } - else if (is_float) + // 缩放寻址:GEP + Load → ldr [base, idx, uxtw #2] + bool scaled_load = false; + if (auto *gep = dynamic_cast(load.GetPtr())) { - int vreg = function.CreateVReg(VRegClass::Float); - block.Append(Opcode::LoadMem, - {Operand::VReg(vreg, VRegClass::Float), Operand::VReg(addr, VRegClass::Ptr)}); - value_vregs[&load] = vreg; + int idx_imm = 0; + if (!TryGetConstantInt(gep->GetIndex(), idx_imm)) + { + scaled_load = true; + int base_addr = EmitPtrValue(gep->GetBasePtr(), function, value_vregs, + scalar_slots, array_slots, block); + int idx_vreg = EmitIntValue(gep->GetIndex(), function, value_vregs, + scalar_slots, array_slots, block); + if (is_ptr) + { + int vreg = function.CreateVReg(VRegClass::Ptr); + block.Append(Opcode::LoadMem, + {Operand::VReg(vreg, VRegClass::Ptr), + Operand::VReg(base_addr, VRegClass::Ptr), + Operand::VReg(idx_vreg, VRegClass::Int)}); + value_vregs[&load] = vreg; + } + else if (is_float) + { + int vreg = function.CreateVReg(VRegClass::Float); + block.Append(Opcode::LoadMem, + {Operand::VReg(vreg, VRegClass::Float), + Operand::VReg(base_addr, VRegClass::Ptr), + Operand::VReg(idx_vreg, VRegClass::Int)}); + value_vregs[&load] = vreg; + } + else + { + int vreg = function.CreateVReg(VRegClass::Int); + block.Append(Opcode::LoadMem, + {Operand::VReg(vreg, VRegClass::Int), + Operand::VReg(base_addr, VRegClass::Ptr), + Operand::VReg(idx_vreg, VRegClass::Int)}); + value_vregs[&load] = vreg; + } + } } - else + + if (!scaled_load) { - int vreg = function.CreateVReg(VRegClass::Int); - block.Append(Opcode::LoadMem, - {Operand::VReg(vreg, VRegClass::Int), Operand::VReg(addr, VRegClass::Ptr)}); - value_vregs[&load] = vreg; + int addr = EmitPtrValue(load.GetPtr(), function, value_vregs, + scalar_slots, array_slots, block); + if (is_ptr) + { + int vreg = function.CreateVReg(VRegClass::Ptr); + block.Append(Opcode::LoadMem, + {Operand::VReg(vreg, VRegClass::Ptr), Operand::VReg(addr, VRegClass::Ptr)}); + value_vregs[&load] = vreg; + } + else if (is_float) + { + int vreg = function.CreateVReg(VRegClass::Float); + block.Append(Opcode::LoadMem, + {Operand::VReg(vreg, VRegClass::Float), Operand::VReg(addr, VRegClass::Ptr)}); + value_vregs[&load] = vreg; + } + else + { + int vreg = function.CreateVReg(VRegClass::Int); + block.Append(Opcode::LoadMem, + {Operand::VReg(vreg, VRegClass::Int), Operand::VReg(addr, VRegClass::Ptr)}); + value_vregs[&load] = vreg; + } } return; }