修复了引入的部分bug

This commit is contained in:
Lixuanwang
2025-07-16 17:40:07 +08:00
parent f4d599a567
commit 20acdc910d

View File

@@ -126,6 +126,10 @@ int main(int argc, char **argv) {
// optLevel >= 1 时,执行默认优化 + 额外的 -O1 优化。 // optLevel >= 1 时,执行默认优化 + 额外的 -O1 优化。
cout << "Applying middle-end optimizations (level -O" << optLevel << ")...\n"; cout << "Applying middle-end optimizations (level -O" << optLevel << ")...\n";
// 设置 DEBUG 模式(如果指定了 'ird'
if (argStopAfter == "ird") {
DEBUG = 1; // 这里可能需要更精细地控制 DEBUG 的开启时机和范围
}
// 默认优化 pass (在所有优化级别都会执行) // 默认优化 pass (在所有优化级别都会执行)
SysYOptPre optPre(moduleIR, builder); SysYOptPre optPre(moduleIR, builder);
optPre.SysYOptimizateAfterIR(); optPre.SysYOptimizateAfterIR();
@@ -147,6 +151,30 @@ int main(int argc, char **argv) {
SysYPrinter(moduleIR).printIR(); SysYPrinter(moduleIR).printIR();
} }
// 根据优化级别,执行额外的优化 pass
if (optLevel >= 1) {
cout << "Applying additional -O" << optLevel << " optimizations...\n";
// 放置 -O1 及其以上级别要启用的额外优化 pass
// 例如:
// MyNewOptimizationPass newOpt(moduleIR, builder);
// newOpt.run();
// 占位符注释,替换为你的具体优化 pass
// cout << "--- Additional Pass: MyCustomOpt1 ---" << endl;
// MyCustomOpt1 opt1_pass(moduleIR, builder);
// opt1_pass.run();
// cout << "--- Additional Pass: MyCustomOpt2 ---" << endl;
// MyCustomOpt2 opt2_pass(moduleIR, builder, &cfa); // 假设需要CFA
// opt2_pass.run();
// ... 更多 -O1 特有的优化
Mem2Reg mem2reg(moduleIR, builder, &cfa, &ava); Mem2Reg mem2reg(moduleIR, builder, &cfa, &ava);
mem2reg.mem2regPipeline(); mem2reg.mem2regPipeline();
if (DEBUG) { if (DEBUG) {
@@ -166,24 +194,6 @@ int main(int argc, char **argv) {
cout << "=== After 2nd DCE (Default) ===\n"; cout << "=== After 2nd DCE (Default) ===\n";
SysYPrinter(moduleIR).printIR(); SysYPrinter(moduleIR).printIR();
} }
// 根据优化级别,执行额外的优化 pass
if (optLevel >= 1) {
cout << "Applying additional -O" << optLevel << " optimizations...\n";
// 放置 -O1 及其以上级别要启用的额外优化 pass
// 例如:
// MyNewOptimizationPass newOpt(moduleIR, builder);
// newOpt.run();
// 占位符注释,替换为你的具体优化 pass
// cout << "--- Additional Pass: MyCustomOpt1 ---" << endl;
// MyCustomOpt1 opt1_pass(moduleIR, builder);
// opt1_pass.run();
// cout << "--- Additional Pass: MyCustomOpt2 ---" << endl;
// MyCustomOpt2 opt2_pass(moduleIR, builder, &cfa); // 假设需要CFA
// opt2_pass.run();
// ... 更多 -O1 特有的优化
} else { } else {
cout << "No additional middle-end optimizations applied for -O" << optLevel << ".\n"; cout << "No additional middle-end optimizations applied for -O" << optLevel << ".\n";
} }
@@ -191,10 +201,6 @@ int main(int argc, char **argv) {
// 5. 根据 argStopAfter 决定后续操作 // 5. 根据 argStopAfter 决定后续操作
// a) 如果指定停止在 IR 阶段,则打印最终 IR 并退出 // a) 如果指定停止在 IR 阶段,则打印最终 IR 并退出
if (argStopAfter == "ir" || argStopAfter == "ird") { if (argStopAfter == "ir" || argStopAfter == "ird") {
// 设置 DEBUG 模式(如果指定了 'ird'
if (argStopAfter == "ird") {
DEBUG = 1; // 这里可能需要更精细地控制 DEBUG 的开启时机和范围
}
// 打印最终 IR // 打印最终 IR
cout << "=== Final IR ===\n"; cout << "=== Final IR ===\n";
SysYPrinter printer(moduleIR); // 在这里创建打印器,因为可能之前调试时用过临时打印器 SysYPrinter printer(moduleIR); // 在这里创建打印器,因为可能之前调试时用过临时打印器
@@ -203,17 +209,16 @@ int main(int argc, char **argv) {
} }
// b) 如果未停止在 IR 阶段,则继续生成汇编 (后端) // b) 如果未停止在 IR 阶段,则继续生成汇编 (后端)
sysy::RISCv64CodeGen codegen(moduleIR); // 传入优化后的 moduleIR
string asmCode = codegen.code_gen();
// 如果指定停止在 ASM 阶段,则打印/保存汇编并退出
if (argStopAfter == "asm" || argStopAfter == "asmd") {
// 设置 DEBUG 模式(如果指定了 'asmd' // 设置 DEBUG 模式(如果指定了 'asmd'
if (argStopAfter == "asmd") { if (argStopAfter == "asmd") {
DEBUG = 1; DEBUG = 1;
DEEPDEBUG = 1; DEEPDEBUG = 1;
} }
sysy::RISCv64CodeGen codegen(moduleIR); // 传入优化后的 moduleIR
string asmCode = codegen.code_gen();
// 如果指定停止在 ASM 阶段,则打印/保存汇编并退出
if (argStopAfter == "asm" || argStopAfter == "asmd") {
if (!argOutputFilename.empty()) { if (!argOutputFilename.empty()) {
ofstream fout(argOutputFilename); ofstream fout(argOutputFilename);
if (not fout.is_open()) { if (not fout.is_open()) {