From 2643eb1eddc584baf4f4f9967556c61fbdc59241 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Sat, 26 Jul 2025 12:30:03 +0800 Subject: [PATCH] =?UTF-8?q?[midend-mem2reg]=E4=BF=AE=E6=94=B9=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=8F=82=E6=95=B0=E5=AE=9A=E4=B9=89=E5=BC=95=E5=85=A5?= =?UTF-8?q?argument=E7=B1=BB=EF=BC=8C=E6=98=BE=E7=A4=BA=E4=B8=BA=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=88=9B=E5=BB=BAalloca=E5=92=8Cstore=E6=8C=87?= =?UTF-8?q?=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/IR.cpp | 10 ++++++-- src/SysYIRCFGOpt.cpp | 8 +----- src/SysYIRGenerator.cpp | 32 ++++++++++++++++------- src/SysYIRPrinter.cpp | 2 +- src/include/IR.h | 57 +++++++++++++++++++++++++++++------------ 5 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/IR.cpp b/src/IR.cpp index faa9aed..02ecfdd 100644 --- a/src/IR.cpp +++ b/src/IR.cpp @@ -530,8 +530,14 @@ Function * Function::clone(const std::string &suffix) const { } } - for (const auto ¶m : blocks.front()->getArguments()) { - newFunction->getEntryBlock()->insertArgument(dynamic_cast(oldNewValueMap.at(param))); + // for (const auto ¶m : blocks.front()->getArguments()) { + // newFunction->getEntryBlock()->insertArgument(dynamic_cast(oldNewValueMap.at(param))); + // } + for (const auto &arg : arguments) { + auto newArg = dynamic_cast(oldNewValueMap.at(arg)); + if (newArg != nullptr) { + newFunction->insertArgument(newArg); + } } return newFunction; diff --git a/src/SysYIRCFGOpt.cpp b/src/SysYIRCFGOpt.cpp index 1a6c3a1..94381f4 100644 --- a/src/SysYIRCFGOpt.cpp +++ b/src/SysYIRCFGOpt.cpp @@ -85,7 +85,7 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) { // std::cout << "merge block: " << blockiter->get()->getName() << std::endl; BasicBlock* block = blockiter->get(); BasicBlock* nextBlock = blockiter->get()->getSuccessors()[0]; - auto nextarguments = nextBlock->getArguments(); + // auto nextarguments = nextBlock->getArguments(); // 删除br指令 if (block->getNumInstructions() != 0) { auto thelastinstinst = block->end(); @@ -108,12 +108,6 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) { block->getInstructions().emplace_back(institer->release()); institer = nextBlock->getInstructions().erase(institer); } - // 合并参数 - // TODO:是否需要去重? - for (auto &argm : nextarguments) { - argm->setParent(block); - block->insertArgument(argm); - } // 更新前驱后继关系,类似树节点操作 block->removeSuccessor(nextBlock); nextBlock->removePredecessor(block); diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index 08332ec..0f3871c 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -335,7 +335,6 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){ module->enterNewScope(); auto name = ctx->Ident()->getText(); - std::vector paramTypes; std::vector paramActualTypes; std::vector paramNames; std::vector> paramDims; @@ -400,12 +399,25 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){ BasicBlock* entry = function->getEntryBlock(); builder.setPosition(entry, entry->end()); + for(int i = 0; i < paramActualTypes.size(); ++i) { + Argument* arg = new Argument(paramActualTypes[i], function, i, paramNames[i]); + function->insertArgument(arg); + + } + + auto funcArgs = function->getArguments(); + std::vector allocas; for (int i = 0; i < paramActualTypes.size(); ++i) { - AllocaInst* alloca = builder.createAllocaInst(Type::getPointerType(paramActualTypes[i]), {},paramNames[i]); - entry->insertArgument(alloca); + AllocaInst *alloca = builder.createAllocaInst(paramActualTypes[i], {}, paramNames[i]); + allocas.push_back(alloca); module->addVariable(paramNames[i], alloca); } + for(int i = 0; i < paramActualTypes.size(); ++i) { + Value *argValue = funcArgs[i]; + builder.createStoreInst(argValue, allocas[i]); + } + // 在处理函数体之前,创建一个新的基本块作为函数体的实际入口 // 这样 entryBB 就可以在完成初始化后跳转到这里 BasicBlock* funcBodyEntry = function->addBasicBlock("funcBodyEntry_" + name); @@ -902,18 +914,18 @@ std::any SysYIRGenerator::visitCall(SysYParser::CallContext *ctx) { // 获取形参列表。`getArguments()` 返回的是 `Argument*` 的集合, // 每个 `Argument` 代表一个函数形参,其 `getType()` 就是指向形参的类型的指针类型。 - auto formalParamsAlloca = function->getEntryBlock()->getArguments(); + auto formalParams = function->getArguments(); // 检查实参和形参数量是否匹配。 - if (args.size() != formalParamsAlloca.size()) { + if (args.size() != formalParams.size()) { std::cerr << "Error: Function call argument count mismatch for function '" << funcName << "'." << std::endl; assert(false && "Function call argument count mismatch!"); } for (int i = 0; i < args.size(); i++) { // 形参的类型 (e.g., i32, float, i32*, [10 x i32]*) - Type* formalParamExpectedValueType = formalParamsAlloca[i]->getType()->as()->getBaseType(); - // 实参的实际类型 (e.g., i32, float, i32*, [67 x i32]*) + Type* formalParamExpectedValueType = formalParams[i]->getType(); + // 实参的实际类型 (e.g., i32, float, i32*, [67 x i32]*) Type* actualArgType = args[i]->getType(); // 如果实参类型与形参类型不匹配,则尝试进行类型转换 if (formalParamExpectedValueType != actualArgType) { @@ -1422,10 +1434,12 @@ void Utils::createExternalFunction( pBuilder->setPosition(entry, entry->end()); for (int i = 0; i < paramTypes.size(); ++i) { + auto arg = new Argument(paramTypes[i], function, i, paramNames[i]); auto alloca = pBuilder->createAllocaInst( Type::getPointerType(paramTypes[i]), {}, paramNames[i]); - entry->insertArgument(alloca); - // pModule->addVariable(paramNames[i], alloca); + function->insertArgument(arg); + auto store = pBuilder->createStoreInst(arg, alloca); + pModule->addVariable(paramNames[i], alloca); } } diff --git a/src/SysYIRPrinter.cpp b/src/SysYIRPrinter.cpp index 689fd50..668ed84 100644 --- a/src/SysYIRPrinter.cpp +++ b/src/SysYIRPrinter.cpp @@ -134,7 +134,7 @@ void SysYPrinter::printFunction(Function *function) { auto entryBlock = function->getEntryBlock(); const auto &args_types = function->getParamTypes(); - auto &args = entryBlock->getArguments(); + auto &args = function->getArguments(); int i = 0; for (const auto &args_type : args_types) { diff --git a/src/include/IR.h b/src/include/IR.h index 8f0103d..0fb26e9 100644 --- a/src/include/IR.h +++ b/src/include/IR.h @@ -468,7 +468,6 @@ public: // --- End of refactored ConstantValue and related classes --- - class Instruction; class Function; class BasicBlock; @@ -487,7 +486,6 @@ public: using inst_list = std::list>; using iterator = inst_list::iterator; - using arg_list = std::vector; using block_list = std::vector; using block_set = std::unordered_set; @@ -495,7 +493,6 @@ protected: Function *parent; ///< 从属的函数 inst_list instructions; ///< 拥有的指令序列 - arg_list arguments; ///< 分配空间后的形式参数列表 block_list successors; ///< 前驱列表 block_list predecessors; ///< 后继列表 bool reachable = false; @@ -515,14 +512,12 @@ public: public: unsigned getNumInstructions() const { return instructions.size(); } - unsigned getNumArguments() const { return arguments.size(); } unsigned getNumPredecessors() const { return predecessors.size(); } unsigned getNumSuccessors() const { return successors.size(); } Function* getParent() const { return parent; } void setParent(Function *func) { parent = func; } inst_list& getInstructions() { return instructions; } auto getInstructions_Range() const { return make_range(instructions); } - arg_list& getArguments() { return arguments; } block_list& getPredecessors() { return predecessors; } void clearPredecessors() { predecessors.clear(); } block_list& getSuccessors() { return successors; } @@ -530,7 +525,6 @@ public: iterator begin() { return instructions.begin(); } iterator end() { return instructions.end(); } iterator terminator() { return std::prev(end()); } - void insertArgument(AllocaInst *inst) { arguments.push_back(inst); } bool hasSuccessor(BasicBlock *block) const { return std::find(successors.begin(), successors.end(), block) != successors.end(); } ///< 判断是否有后继块 @@ -1065,6 +1059,8 @@ public: }; // class UncondBrInst //! Conditional branch +// 这里的args是指向条件分支的两个分支的参数列表但是现在弃用了 +// 通过mem2reg优化后,数据流分析将不会由arguments来传递 class CondBrInst : public Instruction { friend class IRBuilder; friend class Function; @@ -1090,17 +1086,17 @@ public: BasicBlock* getElseBlock() const { return dynamic_cast(getOperand(2)); } - auto getThenArguments() const { - auto begin = std::next(operand_begin(), 3); - auto end = std::next(begin, getThenBlock()->getNumArguments()); - return make_range(begin, end); - } - auto getElseArguments() const { - auto begin = - std::next(operand_begin(), 3 + getThenBlock()->getNumArguments()); - auto end = operand_end(); - return make_range(begin, end); - } + // auto getThenArguments() const { + // auto begin = std::next(operand_begin(), 3); + // // auto end = std::next(begin, getThenBlock()->getNumArguments()); + // return make_range(begin, end); + // } + // auto getElseArguments() const { + // auto begin = + // std::next(operand_begin(), 3 + getThenBlock()->getNumArguments()); + // auto end = operand_end(); + // return make_range(begin, end); + // } }; // class CondBrInst @@ -1243,6 +1239,21 @@ public: class GlobalValue; +class Argument : public Value { +protected: + Function *func; + int index; + +public: + Argument(Type *type, Function *func, int index, const std::string &name = "") + : Value(type, name), func(func), index(index) {} + +public: + Function* getParent() const { return func; } + int getIndex() const { return index; } +}; + + class Module; //! Function definitionclass class Function : public Value { @@ -1254,6 +1265,7 @@ protected: public: using block_list = std::list>; + using arg_list = std::vector; enum FunctionAttribute : uint64_t { PlaceHolder = 0x0UL, Pure = 0x1UL << 0, @@ -1265,6 +1277,7 @@ public: protected: Module *parent; ///< 函数的父模块 block_list blocks; ///< 函数包含的基本块列表 + arg_list arguments; ///< 函数参数列表 FunctionAttribute attribute = PlaceHolder; ///< 函数属性 std::set callees; ///< 函数调用的函数集合 public: @@ -1289,6 +1302,16 @@ protected: auto getBasicBlocks() { return make_range(blocks); } block_list& getBasicBlocks_NoRange() { return blocks; } BasicBlock* getEntryBlock() { return blocks.front().get(); } + void insertArgument(Argument *arg) { arguments.push_back(arg); } + arg_list& getArguments() { return arguments; } + unsigned getNumArguments() const { return arguments.size(); } + Argument* getArgument(unsigned index) const { + assert(index < arguments.size() && "Argument index out of bounds"); + return arguments[index]; + } ///< 获取位置为index的参数 + auto getArgumentsRange() const { + return make_range(arguments.begin(), arguments.end()); + } ///< 获取参数列表的范围 void removeBasicBlock(BasicBlock *blockToRemove) { auto is_same_ptr = [blockToRemove](const std::unique_ptr &ptr) { return ptr.get() == blockToRemove; }; blocks.remove_if(is_same_ptr);