From 20acdc910defc987f1cccff6cdd0b4dee0fc8ec6 Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Wed, 16 Jul 2025 17:40:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=BC=95=E5=85=A5?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E5=88=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sysyc.cpp | 59 ++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/sysyc.cpp b/src/sysyc.cpp index edd9318..674a510 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -126,6 +126,10 @@ int main(int argc, char **argv) { // optLevel >= 1 时,执行默认优化 + 额外的 -O1 优化。 cout << "Applying middle-end optimizations (level -O" << optLevel << ")...\n"; + // 设置 DEBUG 模式(如果指定了 'ird') + if (argStopAfter == "ird") { + DEBUG = 1; // 这里可能需要更精细地控制 DEBUG 的开启时机和范围 + } // 默认优化 pass (在所有优化级别都会执行) SysYOptPre optPre(moduleIR, builder); optPre.SysYOptimizateAfterIR(); @@ -147,25 +151,11 @@ int main(int argc, char **argv) { SysYPrinter(moduleIR).printIR(); } - Mem2Reg mem2reg(moduleIR, builder, &cfa, &ava); - mem2reg.mem2regPipeline(); - if (DEBUG) { - cout << "=== After Mem2Reg (Default) ===\n"; - SysYPrinter(moduleIR).printIR(); - } - Reg2Mem reg2mem(moduleIR, builder); - reg2mem.DeletePhiInst(); - if (DEBUG) { - cout << "=== After Reg2Mem (Default) ===\n"; - SysYPrinter(moduleIR).printIR(); - } - dce.runDCEPipeline(); // 第二次 DCE (默认) - if (DEBUG) { - cout << "=== After 2nd DCE (Default) ===\n"; - SysYPrinter(moduleIR).printIR(); - } + + + // 根据优化级别,执行额外的优化 pass if (optLevel >= 1) { @@ -184,6 +174,26 @@ int main(int argc, char **argv) { // MyCustomOpt2 opt2_pass(moduleIR, builder, &cfa); // 假设需要CFA // opt2_pass.run(); // ... 更多 -O1 特有的优化 + + Mem2Reg mem2reg(moduleIR, builder, &cfa, &ava); + mem2reg.mem2regPipeline(); + if (DEBUG) { + cout << "=== After Mem2Reg (Default) ===\n"; + SysYPrinter(moduleIR).printIR(); + } + + Reg2Mem reg2mem(moduleIR, builder); + reg2mem.DeletePhiInst(); + if (DEBUG) { + cout << "=== After Reg2Mem (Default) ===\n"; + SysYPrinter(moduleIR).printIR(); + } + + dce.runDCEPipeline(); // 第二次 DCE (默认) + if (DEBUG) { + cout << "=== After 2nd DCE (Default) ===\n"; + SysYPrinter(moduleIR).printIR(); + } } else { cout << "No additional middle-end optimizations applied for -O" << optLevel << ".\n"; } @@ -191,10 +201,6 @@ int main(int argc, char **argv) { // 5. 根据 argStopAfter 决定后续操作 // a) 如果指定停止在 IR 阶段,则打印最终 IR 并退出 if (argStopAfter == "ir" || argStopAfter == "ird") { - // 设置 DEBUG 模式(如果指定了 'ird') - if (argStopAfter == "ird") { - DEBUG = 1; // 这里可能需要更精细地控制 DEBUG 的开启时机和范围 - } // 打印最终 IR cout << "=== Final IR ===\n"; SysYPrinter printer(moduleIR); // 在这里创建打印器,因为可能之前调试时用过临时打印器 @@ -203,17 +209,16 @@ int main(int argc, char **argv) { } // b) 如果未停止在 IR 阶段,则继续生成汇编 (后端) + // 设置 DEBUG 模式(如果指定了 'asmd') + if (argStopAfter == "asmd") { + DEBUG = 1; + DEEPDEBUG = 1; + } sysy::RISCv64CodeGen codegen(moduleIR); // 传入优化后的 moduleIR string asmCode = codegen.code_gen(); // 如果指定停止在 ASM 阶段,则打印/保存汇编并退出 if (argStopAfter == "asm" || argStopAfter == "asmd") { - // 设置 DEBUG 模式(如果指定了 'asmd') - if (argStopAfter == "asmd") { - DEBUG = 1; - DEEPDEBUG = 1; - } - if (!argOutputFilename.empty()) { ofstream fout(argOutputFilename); if (not fout.is_open()) {