From 5cf411680ef35c51ba966fb3079a8082e032f812 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Wed, 20 Aug 2025 01:31:51 +0800 Subject: [PATCH] =?UTF-8?q?[backend-optpatch]=E5=AF=B9RISCv64ISel.cpp?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=A4=E6=96=AD=E6=8F=90=E4=BE=9B=E8=A1=A5?= =?UTF-8?q?=E4=B8=81=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/RISCv64/RISCv64ISel.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/backend/RISCv64/RISCv64ISel.cpp b/src/backend/RISCv64/RISCv64ISel.cpp index 9fccba6..6af4311 100644 --- a/src/backend/RISCv64/RISCv64ISel.cpp +++ b/src/backend/RISCv64/RISCv64ISel.cpp @@ -103,7 +103,29 @@ void RISCv64ISel::select() { } } - if (optLevel > 0) { + // 仅当函数满足特定条件时,才需要保存参数寄存器,应用更精细的过滤规则 + // 1. 函数包含call指令 (非叶子函数): 参数寄存器(a0-a7)是调用者保存的, + // call指令可能会覆盖这些寄存器,因此必须保存。 + // 2. 函数包含alloca指令 (需要栈分配)。 + // 3. 函数的指令数量超过一个阈值(如20),意味着它是一个复杂的叶子函数, + // 为安全起见,保存其参数。 + // 简单的叶子函数 (如min) 则可以跳过这个步骤进行优化。 + auto shouldSaveArgs = [](Function* func) { + if (!func) return false; + int instruction_count = 0; + for (const auto& bb : func->getBasicBlocks()) { + for (const auto& inst : bb->getInstructions()) { + if (dynamic_cast(inst.get()) || dynamic_cast(inst.get())) { + return true; // 发现call或alloca,立即返回true + } + instruction_count++; + } + } + // 如果没有call或alloca,则检查指令数量 + return instruction_count > 45; + }; + + if (optLevel > 0 && shouldSaveArgs(F)) { if (F && !F->getBasicBlocks().empty()) { // 定位到第一个MachineBasicBlock,也就是函数入口 BasicBlock* first_ir_block = F->getBasicBlocks_NoRange().front().get();