修复了引入的部分bug
This commit is contained in:
@@ -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,25 +151,11 @@ int main(int argc, char **argv) {
|
|||||||
SysYPrinter(moduleIR).printIR();
|
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
|
// 根据优化级别,执行额外的优化 pass
|
||||||
if (optLevel >= 1) {
|
if (optLevel >= 1) {
|
||||||
@@ -184,6 +174,26 @@ int main(int argc, char **argv) {
|
|||||||
// MyCustomOpt2 opt2_pass(moduleIR, builder, &cfa); // 假设需要CFA
|
// MyCustomOpt2 opt2_pass(moduleIR, builder, &cfa); // 假设需要CFA
|
||||||
// opt2_pass.run();
|
// opt2_pass.run();
|
||||||
// ... 更多 -O1 特有的优化
|
// ... 更多 -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 {
|
} 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 阶段,则继续生成汇编 (后端)
|
||||||
|
// 设置 DEBUG 模式(如果指定了 'asmd')
|
||||||
|
if (argStopAfter == "asmd") {
|
||||||
|
DEBUG = 1;
|
||||||
|
DEEPDEBUG = 1;
|
||||||
|
}
|
||||||
sysy::RISCv64CodeGen codegen(moduleIR); // 传入优化后的 moduleIR
|
sysy::RISCv64CodeGen codegen(moduleIR); // 传入优化后的 moduleIR
|
||||||
string asmCode = codegen.code_gen();
|
string asmCode = codegen.code_gen();
|
||||||
|
|
||||||
// 如果指定停止在 ASM 阶段,则打印/保存汇编并退出
|
// 如果指定停止在 ASM 阶段,则打印/保存汇编并退出
|
||||||
if (argStopAfter == "asm" || argStopAfter == "asmd") {
|
if (argStopAfter == "asm" || argStopAfter == "asmd") {
|
||||||
// 设置 DEBUG 模式(如果指定了 'asmd')
|
|
||||||
if (argStopAfter == "asmd") {
|
|
||||||
DEBUG = 1;
|
|
||||||
DEEPDEBUG = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!argOutputFilename.empty()) {
|
if (!argOutputFilename.empty()) {
|
||||||
ofstream fout(argOutputFilename);
|
ofstream fout(argOutputFilename);
|
||||||
if (not fout.is_open()) {
|
if (not fout.is_open()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user