From e8660120cc731814e4cabf353596536868064901 Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Fri, 18 Jul 2025 20:48:59 +0800 Subject: [PATCH] =?UTF-8?q?[backend]=E5=88=A0=E9=99=A4=E4=BA=86=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=AF=B9=E6=95=B0=E7=BB=84=E8=AE=BF=E5=AD=98=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=B1=95=E5=BC=80=EF=BC=8C=E5=9B=A0=E4=B8=BA?= =?UTF-8?q?=E5=B7=B2=E7=BB=8F=E5=9C=A8IR=E4=B8=AD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/RISCv64Backend.cpp | 100 ++--------------------------------------- 1 file changed, 4 insertions(+), 96 deletions(-) diff --git a/src/RISCv64Backend.cpp b/src/RISCv64Backend.cpp index cdfa30d..bc9cfc5 100644 --- a/src/RISCv64Backend.cpp +++ b/src/RISCv64Backend.cpp @@ -399,108 +399,16 @@ std::vector> RISCv64CodeGen::build_dag( DAGNode* ptr_node = get_operand_node(ptr_ir, value_to_node, nodes_storage); store_node->operands.push_back(val_node); - - // === 修改开始:处理带索引的 StoreInst === - if (store->getNumIndices() > 0) { - if (DEBUG) std::cerr << "处理带索引的 StoreInst: " << store->getNumIndices() << " 个索引\n"; - - // 假设只有一个索引 - Value* index_ir = store->getIndex(0); // 获取索引 IR Value* - DAGNode* index_node = get_operand_node(index_ir, value_to_node, nodes_storage); // 索引 DAG 节点 - - // 1. 获取元素大小的 ConstantValue * (例如 4 字节) - // ConstantValue::get 返回裸指针,其生命周期由 IR 框架自身管理(假定是单例或池化)。 - Value* const_4_value_ir = ConstantValue::get(4); - // 为这个常量创建一个 DAGNode - DAGNode* size_node = create_node(DAGNode::CONSTANT, const_4_value_ir, value_to_node, nodes_storage); - - - // 2. 创建一个 BINARY (MUL) 节点来计算字节偏移量 (index * element_size) - // BinaryInst 构造函数是 protected 的,需要通过静态工厂方法创建 - Instruction* dummy_mul_inst_raw_ptr = BinaryInst::create(BinaryInst::kMul, Type::getIntType(), index_ir, const_4_value_ir, bb); - // 将所有权转移到成员变量 temp_instructions_storage - temp_instructions_storage.push_back(std::unique_ptr(dummy_mul_inst_raw_ptr)); // 存储临时的 Instruction - - // 为这个新的 BinaryInst 创建一个 DAGNode,它的类型是 DAGNode::BINARY - DAGNode* byte_offset_node = create_node(DAGNode::BINARY, dummy_mul_inst_raw_ptr, value_to_node, nodes_storage); - - byte_offset_node->operands.push_back(index_node); - byte_offset_node->operands.push_back(size_node); - index_node->users.push_back(byte_offset_node); - size_node->users.push_back(byte_offset_node); - - - // 3. 创建一个 BINARY (ADD) 节点来计算最终地址 (base_address + byte_offset) - // 创建另一个临时的 BinaryInst。 - Instruction* dummy_add_inst_raw_ptr = BinaryInst::create(BinaryInst::kAdd, Type::getIntType(), ptr_ir, dummy_mul_inst_raw_ptr, bb); - temp_instructions_storage.push_back(std::unique_ptr(dummy_add_inst_raw_ptr)); // 存储临时的 Instruction - - // 为这个新的 BinaryInst 创建一个 DAGNode - DAGNode* final_addr_node = create_node(DAGNode::BINARY, dummy_add_inst_raw_ptr, value_to_node, nodes_storage); - - final_addr_node->operands.push_back(ptr_node); - final_addr_node->operands.push_back(byte_offset_node); - ptr_node->users.push_back(final_addr_node); - byte_offset_node->users.push_back(final_addr_node); - - // 现在,STORE 节点的操作数是要存储的值和最终地址 - store_node->operands.push_back(final_addr_node); - final_addr_node->users.push_back(store_node); - - } else { // 原始的非索引 StoreInst 处理 - store_node->operands.push_back(ptr_node); - ptr_node->users.push_back(store_node); - } - // === 修改结束 === - + store_node->operands.push_back(ptr_node); + ptr_node->users.push_back(store_node); } else if (auto load = dynamic_cast(inst)) { auto load_node = create_node(DAGNode::LOAD, load, value_to_node, nodes_storage); // 获取内存位置的指针 (基地址) Value* ptr_ir = load->getPointer(); DAGNode* ptr_node = get_operand_node(ptr_ir, value_to_node, nodes_storage); - - // === 修改开始:处理带索引的 LoadInst === - if (load->getNumIndices() > 0) { - // 假设只有一个索引 - Value* index_ir = load->getIndex(0); - DAGNode* index_node = get_operand_node(index_ir, value_to_node, nodes_storage); - - // 1. 获取元素大小的 ConstantValue * (例如 4 字节) - Value* const_4_value_ir = ConstantValue::get(4); - DAGNode* size_node = create_node(DAGNode::CONSTANT, const_4_value_ir, value_to_node, nodes_storage); - - // 2. 创建一个 BINARY (MUL) 节点来计算字节偏移量 (index * element_size) - Instruction* dummy_mul_inst_raw_ptr = BinaryInst::create(BinaryInst::kMul, Type::getIntType(), index_ir, const_4_value_ir, bb); - temp_instructions_storage.push_back(std::unique_ptr(dummy_mul_inst_raw_ptr)); // 存储临时的 Instruction - - DAGNode* byte_offset_node = create_node(DAGNode::BINARY, dummy_mul_inst_raw_ptr, value_to_node, nodes_storage); - - byte_offset_node->operands.push_back(index_node); - byte_offset_node->operands.push_back(size_node); - index_node->users.push_back(byte_offset_node); - size_node->users.push_back(byte_offset_node); - - // 3. 创建一个 BINARY (ADD) 节点来计算最终地址 (base_address + byte_offset) - Instruction* dummy_add_inst_raw_ptr = BinaryInst::create(BinaryInst::kAdd, Type::getIntType(), ptr_ir, dummy_mul_inst_raw_ptr, bb); - temp_instructions_storage.push_back(std::unique_ptr(dummy_add_inst_raw_ptr)); // 存储临时的 Instruction - - DAGNode* final_addr_node = create_node(DAGNode::BINARY, dummy_add_inst_raw_ptr, value_to_node, nodes_storage); - - final_addr_node->operands.push_back(ptr_node); - final_addr_node->operands.push_back(byte_offset_node); - ptr_node->users.push_back(final_addr_node); - byte_offset_node->users.push_back(final_addr_node); - - // 现在,LOAD 节点的操作数是最终地址 - load_node->operands.push_back(final_addr_node); - final_addr_node->users.push_back(load_node); - - } else { // 原始的非索引 LoadInst 处理 - load_node->operands.push_back(ptr_node); - ptr_node->users.push_back(load_node); - } - // === 修改结束 === + load_node->operands.push_back(ptr_node); + ptr_node->users.push_back(load_node); } else if (auto bin = dynamic_cast(inst)) { if (value_to_node.count(bin)) continue; // CSE