#include "irgen/IRGen.h" #include #include "SysYParser.h" #include "ir/IR.h" #include "ir/passes/ConstFold.h" #include "ir/passes/ConstProp.h" #include "ir/passes/DCE.h" #include "ir/passes/Mem2Reg.h" #include "ir/passes/PassManager.h" #include "utils/Log.h" // 修改 GenerateIR 函数 std::unique_ptr GenerateIR(SysYParser::CompUnitContext& tree, const SemaResult& sema_result) { auto module = std::make_unique(); IRGenImpl gen(*module, sema_result.context, sema_result.symbol_table); tree.accept(&gen); ir::PassManager pass_manager; pass_manager.AddPass(std::make_unique()); pass_manager.AddPass(std::make_unique()); pass_manager.AddPass(std::make_unique()); pass_manager.AddPass(std::make_unique()); pass_manager.AddPass(std::make_unique()); DebugStream() << "[DEBUG] IRGenDriver: before mem2reg" << std::endl; pass_manager.Run(*module); DebugStream() << "[DEBUG] IRGenDriver: after scalar opts" << std::endl; return module; }