diff --git a/src/AddressCalculationExpansion.cpp b/src/AddressCalculationExpansion.cpp index f4e9a14..d157528 100644 --- a/src/AddressCalculationExpansion.cpp +++ b/src/AddressCalculationExpansion.cpp @@ -47,7 +47,7 @@ bool AddressCalculationExpansion::run() { for (const auto& use_ptr : allocaInst->getDims()) { Value* dimValue = use_ptr->getValue(); if (ConstantValue* constVal = dynamic_cast(dimValue)) { - dims.push_back(constVal->getValue()); + dims.push_back(constVal->getInt()); } else { std::cerr << "Warning: AllocaInst dimension is not a constant integer. Skipping GEP expansion for: "; SysYPrinter::printValue(allocaInst); @@ -101,13 +101,13 @@ bool AddressCalculationExpansion::run() { } } - Value* totalOffset = ConstantValue::get(0); + Value* totalOffset = ConstantInteger::get(0); pBuilder->setPosition(bb, it); for (size_t i = 0; i < indexOperands.size(); ++i) { Value* index = indexOperands[i]; int stride = calculateStride(dims, i); - Value* strideConst = ConstantValue::get(stride); + Value* strideConst = ConstantInteger::get(stride); Type* intType = Type::getIntType(); BinaryInst* currentDimOffsetInst = pBuilder->createBinaryInst(Instruction::kMul, intType, index, strideConst); BinaryInst* newTotalOffsetInst = pBuilder->createBinaryInst(Instruction::kAdd, intType, totalOffset, currentDimOffsetInst); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 050b63c..c67a64e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,10 +23,10 @@ add_executable(sysyc SysYIRPrinter.cpp SysYIROptPre.cpp SysYIRAnalyser.cpp - DeadCodeElimination.cpp + # DeadCodeElimination.cpp AddressCalculationExpansion.cpp - Mem2Reg.cpp - Reg2Mem.cpp + # Mem2Reg.cpp + # Reg2Mem.cpp RISCv64Backend.cpp ) diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index 7520891..40b5f59 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -10,10 +10,9 @@ #include #include #include -using namespace std; #include "SysYIRGenerator.h" - +using namespace std; namespace sysy { /* @@ -130,30 +129,111 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) { delete root; if (dims.empty()) { builder.createStoreInst(values.getValue(0), alloca); - } else { - // 对于多维数组,使用memset初始化 - // 计算每个维度的大小 - // 这里的values.getNumbers()返回的是每个维度的大小 - // 这里的values.getValues()返回的是每个维度对应的值 - // 例如:对于一个二维数组,values.getNumbers()可能是[3, 4],表示3行4列 - // values.getValues()可能是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] - // 对于每个维度,使用memset将对应的值填充到数组中 - // 这里的alloca是一个指向数组的指针 - const std::vector & counterNumbers = values.getNumbers(); - const std::vector & counterValues = values.getValues(); - unsigned begin = 0; - for (size_t i = 0; i < counterNumbers.size(); i++) { - + } else{ + // **数组变量初始化** + const std::vector &counterValues = values.getValues(); + + // 计算数组的**总元素数量**和**总字节大小** + int numElements = 1; + // 存储每个维度的实际整数大小,用于索引计算 + std::vector dimSizes; + for (Value *dimVal : dims) { + if (ConstantInteger *constInt = dynamic_cast(dimVal)) { + int dimSize = constInt->getInt(); + numElements *= dimSize; + dimSizes.push_back(dimSize); + } + // TODO else 错误处理:数组维度必须是常量(对于静态分配) + } + unsigned int elementSizeInBytes = type->getSize(); // 获取单个元素的大小(字节) + unsigned int totalSizeInBytes = numElements * elementSizeInBytes; + + // **判断是否可以进行全零初始化优化** + bool allValuesAreZero = false; + if (counterValues.empty()) { // 例如 int arr[3] = {}; 或 int arr[3][4] = {}; + allValuesAreZero = true; + } + else { + allValuesAreZero = true; + for (Value *val : counterValues){ + if (ConstantInteger *constInt = dynamic_cast(val)){ + if (constInt->getInt() != 0){ + allValuesAreZero = false; + break; + } + } + else{ + // 如果值不是常量,我们通常不能确定它是否为零,所以不进行 memset 优化 + allValuesAreZero = false; + break; + } + } + } + + if (allValuesAreZero) { + // 如果所有初始化值都是零(或没有明确初始化但语法允许),使用 memset 优化 builder.createMemsetInst( - alloca, ConstantValue::get(static_cast(begin)), - ConstantValue::get(static_cast(counterNumbers[i])), - counterValues[i]); - begin += counterNumbers[i]; + alloca, // 目标数组的起始地址 + ConstantInteger::get(0), // 偏移量(通常为0),后续删除 + ConstantInteger::get(totalSizeInBytes), + ConstantInteger::get(0)); // 填充的总字节数 + } + else { + // **逐元素存储:遍历所有初始值,并为每个值生成一个 store 指令** + for (size_t k = 0; k < counterValues.size(); ++k) { + // 用于存储当前元素的索引列表 + std::vector currentIndices; + int tempLinearIndex = k; // 临时线性索引,用于计算多维索引 + + // **将线性索引转换为多维索引** + // 这个循环从最内层维度开始倒推,计算每个维度的索引 + // 假设是行主序(row-major order),这是 C/C++ 数组的标准存储方式 + for (int dimIdx = dimSizes.size() - 1; dimIdx >= 0; --dimIdx) + { + // 计算当前维度的索引,并插入到列表的最前面 + currentIndices.insert(currentIndices.begin(), + ConstantInteger::get(static_cast(tempLinearIndex % dimSizes[dimIdx]))); + // 更新线性索引,用于计算下一个更高维度的索引 + tempLinearIndex /= dimSizes[dimIdx]; + } + + // **生成 store 指令,传入值、基指针和计算出的索引列表** + // 你的 builder.createStoreInst 签名需要能够接受这些参数 + // 假设你的 builder.createStoreInst(Value *val, Value *ptr, const std::vector &indices, ...) + builder.createStoreInst(counterValues[k], alloca, currentIndices); + } } } } + else + { // **如果没有显式初始化值,默认对数组进行零初始化** + if (!dims.empty()) + { // 只有数组才需要默认的零初始化 + int numElements = 1; + for (Value *dimVal : dims) + { + if (ConstantInteger *constInt = dynamic_cast(dimVal)) + { + numElements *= constInt->getInt(); + } + } + unsigned int elementSizeInBytes = type->getSize(); + unsigned int totalSizeInBytes = numElements * elementSizeInBytes; + + // 使用 memset 将整个数组清零 + builder.createMemsetInst( + alloca, + ConstantInteger::get(0), + ConstantInteger::get(totalSizeInBytes), + ConstantInteger::get(0) + ); // 填充的总字节数 + } + // 标量变量如果没有初始化值,通常不生成额外的初始化指令,因为其内存已分配但未赋值。 + } + module->addVariable(name, alloca); } + return std::any(); } @@ -218,7 +298,7 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){ paramNames.push_back(param->Ident()->getText()); std::vector dims = {}; if (!param->LBRACK().empty()) { - dims.push_back(ConstantValue::get(-1)); // 第一个维度不确定 + dims.push_back(ConstantInteger::get(-1)); // 第一个维度不确定 for (const auto &exp : param->exp()) { dims.push_back(std::any_cast(visitExp(exp))); } @@ -247,9 +327,9 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){ if(HasReturnInst == false) { // 如果没有return语句,则默认返回0 if (returnType != Type::getVoidType()) { - Value* returnValue = ConstantValue::get(0); + Value* returnValue = ConstantInteger::get(0); if (returnType == Type::getFloatType()) { - returnValue = ConstantValue::get(0.0f); + returnValue = ConstantFloating::get(0.0f); } builder.createReturnInst(returnValue); } else { @@ -286,9 +366,9 @@ std::any SysYIRGenerator::visitAssignStmt(SysYParser::AssignStmtContext *ctx) { ConstantValue * constValue = dynamic_cast(value); if (constValue != nullptr) { if (variableType == Type::getFloatType()) { - value = ConstantValue::get(static_cast(constValue->getInt())); + value = ConstantInteger::get(static_cast(constValue->getInt())); } else { - value = ConstantValue::get(static_cast(constValue->getFloat())); + value = ConstantFloating::get(static_cast(constValue->getFloat())); } } else { if (variableType == Type::getFloatType()) { @@ -478,9 +558,9 @@ std::any SysYIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext *ctx) { ConstantValue * constValue = dynamic_cast(returnValue); if (constValue != nullptr) { if (funcType == Type::getFloatType()) { - returnValue = ConstantValue::get(static_cast(constValue->getInt())); + returnValue = ConstantInteger::get(static_cast(constValue->getInt())); } else { - returnValue = ConstantValue::get(static_cast(constValue->getFloat())); + returnValue = ConstantFloating::get(static_cast(constValue->getFloat())); } } else { if (funcType == Type::getFloatType()) { @@ -560,10 +640,10 @@ std::any SysYIRGenerator::visitPrimaryExp(SysYParser::PrimaryExpContext *ctx) { std::any SysYIRGenerator::visitNumber(SysYParser::NumberContext *ctx) { if (ctx->ILITERAL() != nullptr) { int value = std::stol(ctx->ILITERAL()->getText(), nullptr, 0); - return static_cast(ConstantValue::get(value)); + return static_cast(ConstantInteger::get(value)); } else if (ctx->FLITERAL() != nullptr) { float value = std::stof(ctx->FLITERAL()->getText()); - return static_cast(ConstantValue::get(value)); + return static_cast(ConstantFloating::get(value)); } throw std::runtime_error("Unknown number type."); return std::any(); // 不会到达这里 @@ -599,9 +679,9 @@ std::any SysYIRGenerator::visitCall(SysYParser::CallContext *ctx) { ConstantValue * constValue = dynamic_cast(args[i]); if (constValue != nullptr) { if (params[i]->getType() == Type::getPointerType(Type::getFloatType())) { - args[i] = ConstantValue::get(static_cast(constValue->getInt())); + args[i] = ConstantInteger::get(static_cast(constValue->getInt())); } else { - args[i] = ConstantValue::get(static_cast(constValue->getFloat())); + args[i] = ConstantFloating::get(static_cast(constValue->getFloat())); } } else { if (params[i]->getType() == Type::getPointerType(Type::getFloatType())) { @@ -629,9 +709,9 @@ std::any SysYIRGenerator::visitUnaryExp(SysYParser::UnaryExpContext *ctx) { ConstantValue * constValue = dynamic_cast(value); if (constValue != nullptr) { if (constValue->isFloat()) { - result = ConstantValue::get(-constValue->getFloat()); + result = ConstantFloating::get(-constValue->getFloat()); } else { - result = ConstantValue::get(-constValue->getInt()); + result = ConstantInteger::get(-constValue->getInt()); } } else if (value != nullptr) { if (value->getType() == Type::getIntType()) { @@ -648,9 +728,9 @@ std::any SysYIRGenerator::visitUnaryExp(SysYParser::UnaryExpContext *ctx) { if (constValue != nullptr) { if (constValue->isFloat()) { result = - ConstantValue::get(1 - (constValue->getFloat() != 0.0F ? 1 : 0)); + ConstantFloating::get(1 - (constValue->getFloat() != 0.0F ? 1 : 0)); } else { - result = ConstantValue::get(1 - (constValue->getInt() != 0 ? 1 : 0)); + result = ConstantInteger::get(1 - (constValue->getInt() != 0 ? 1 : 0)); } } else if (value != nullptr) { if (value->getType() == Type::getIntType()) { @@ -692,13 +772,13 @@ std::any SysYIRGenerator::visitMulExp(SysYParser::MulExpContext *ctx) { if (operandType != floatType) { ConstantValue * constValue = dynamic_cast(operand); if (constValue != nullptr) - operand = ConstantValue::get(static_cast(constValue->getInt())); + operand = ConstantFloating::get(static_cast(constValue->getInt())); else operand = builder.createIToFInst(operand); } else if (resultType != floatType) { ConstantValue* constResult = dynamic_cast(result); if (constResult != nullptr) - result = ConstantValue::get(static_cast(constResult->getInt())); + result = ConstantFloating::get(static_cast(constResult->getInt())); else result = builder.createIToFInst(result); } @@ -707,14 +787,14 @@ std::any SysYIRGenerator::visitMulExp(SysYParser::MulExpContext *ctx) { ConstantValue* constOperand = dynamic_cast(operand); if (opType == SysYParser::MUL) { if ((constOperand != nullptr) && (constResult != nullptr)) { - result = ConstantValue::get(constResult->getFloat() * + result = ConstantFloating::get(constResult->getFloat() * constOperand->getFloat()); } else { result = builder.createFMulInst(result, operand); } } else if (opType == SysYParser::DIV) { if ((constOperand != nullptr) && (constResult != nullptr)) { - result = ConstantValue::get(constResult->getFloat() / + result = ConstantFloating::get(constResult->getFloat() / constOperand->getFloat()); } else { result = builder.createFDivInst(result, operand); @@ -729,17 +809,17 @@ std::any SysYIRGenerator::visitMulExp(SysYParser::MulExpContext *ctx) { ConstantValue * constOperand = dynamic_cast(operand); if (opType == SysYParser::MUL) { if ((constOperand != nullptr) && (constResult != nullptr)) - result = ConstantValue::get(constResult->getInt() * constOperand->getInt()); + result = ConstantInteger::get(constResult->getInt() * constOperand->getInt()); else result = builder.createMulInst(result, operand); } else if (opType == SysYParser::DIV) { if ((constOperand != nullptr) && (constResult != nullptr)) - result = ConstantValue::get(constResult->getInt() / constOperand->getInt()); + result = ConstantInteger::get(constResult->getInt() / constOperand->getInt()); else result = builder.createDivInst(result, operand); } else { if ((constOperand != nullptr) && (constResult != nullptr)) - result = ConstantValue::get(constResult->getInt() % constOperand->getInt()); + result = ConstantInteger::get(constResult->getInt() % constOperand->getInt()); else result = builder.createRemInst(result, operand); } @@ -767,13 +847,13 @@ std::any SysYIRGenerator::visitAddExp(SysYParser::AddExpContext *ctx) { if (operandType != floatType) { ConstantValue * constOperand = dynamic_cast(operand); if (constOperand != nullptr) - operand = ConstantValue::get(static_cast(constOperand->getInt())); + operand = ConstantFloating::get(static_cast(constOperand->getInt())); else operand = builder.createIToFInst(operand); } else if (resultType != floatType) { ConstantValue * constResult = dynamic_cast(result); if (constResult != nullptr) - result = ConstantValue::get(static_cast(constResult->getInt())); + result = ConstantFloating::get(static_cast(constResult->getInt())); else result = builder.createIToFInst(result); } @@ -782,12 +862,12 @@ std::any SysYIRGenerator::visitAddExp(SysYParser::AddExpContext *ctx) { ConstantValue * constOperand = dynamic_cast(operand); if (opType == SysYParser::ADD) { if ((constResult != nullptr) && (constOperand != nullptr)) - result = ConstantValue::get(constResult->getFloat() + constOperand->getFloat()); + result = ConstantFloating::get(constResult->getFloat() + constOperand->getFloat()); else result = builder.createFAddInst(result, operand); } else { if ((constResult != nullptr) && (constOperand != nullptr)) - result = ConstantValue::get(constResult->getFloat() - constOperand->getFloat()); + result = ConstantFloating::get(constResult->getFloat() - constOperand->getFloat()); else result = builder.createFSubInst(result, operand); } @@ -796,12 +876,12 @@ std::any SysYIRGenerator::visitAddExp(SysYParser::AddExpContext *ctx) { ConstantValue * constOperand = dynamic_cast(operand); if (opType == SysYParser::ADD) { if ((constResult != nullptr) && (constOperand != nullptr)) - result = ConstantValue::get(constResult->getInt() + constOperand->getInt()); + result = ConstantInteger::get(constResult->getInt() + constOperand->getInt()); else result = builder.createAddInst(result, operand); } else { if ((constResult != nullptr) && (constOperand != nullptr)) - result = ConstantValue::get(constResult->getInt() - constOperand->getInt()); + result = ConstantInteger::get(constResult->getInt() - constOperand->getInt()); else result = builder.createSubInst(result, operand); } @@ -833,10 +913,10 @@ std::any SysYIRGenerator::visitRelExp(SysYParser::RelExpContext *ctx) { auto operand2 = constOperand->isFloat() ? constOperand->getFloat() : constOperand->getInt(); - if (opType == SysYParser::LT) result = ConstantValue::get(operand1 < operand2 ? 1 : 0); - else if (opType == SysYParser::GT) result = ConstantValue::get(operand1 > operand2 ? 1 : 0); - else if (opType == SysYParser::LE) result = ConstantValue::get(operand1 <= operand2 ? 1 : 0); - else if (opType == SysYParser::GE) result = ConstantValue::get(operand1 >= operand2 ? 1 : 0); + if (opType == SysYParser::LT) result = ConstantInteger::get(operand1 < operand2 ? 1 : 0); + else if (opType == SysYParser::GT) result = ConstantInteger::get(operand1 > operand2 ? 1 : 0); + else if (opType == SysYParser::LE) result = ConstantInteger::get(operand1 <= operand2 ? 1 : 0); + else if (opType == SysYParser::GE) result = ConstantInteger::get(operand1 >= operand2 ? 1 : 0); else assert(false); } else { @@ -848,14 +928,14 @@ std::any SysYIRGenerator::visitRelExp(SysYParser::RelExpContext *ctx) { if (resultType == floatType || operandType == floatType) { if (resultType != floatType) { if (constResult != nullptr) - result = ConstantValue::get(static_cast(constResult->getInt())); + result = ConstantFloating::get(static_cast(constResult->getInt())); else result = builder.createIToFInst(result); } if (operandType != floatType) { if (constOperand != nullptr) - operand = ConstantValue::get(static_cast(constOperand->getInt())); + operand = ConstantFloating::get(static_cast(constOperand->getInt())); else operand = builder.createIToFInst(operand); @@ -901,8 +981,8 @@ std::any SysYIRGenerator::visitEqExp(SysYParser::EqExpContext *ctx) { auto operand2 = constOperand->isFloat() ? constOperand->getFloat() : constOperand->getInt(); - if (opType == SysYParser::EQ) result = ConstantValue::get(operand1 == operand2 ? 1 : 0); - else if (opType == SysYParser::NE) result = ConstantValue::get(operand1 != operand2 ? 1 : 0); + if (opType == SysYParser::EQ) result = ConstantInteger::get(operand1 == operand2 ? 1 : 0); + else if (opType == SysYParser::NE) result = ConstantInteger::get(operand1 != operand2 ? 1 : 0); else assert(false); } else { @@ -913,13 +993,13 @@ std::any SysYIRGenerator::visitEqExp(SysYParser::EqExpContext *ctx) { if (resultType == floatType || operandType == floatType) { if (resultType != floatType) { if (constResult != nullptr) - result = ConstantValue::get(static_cast(constResult->getInt())); + result = ConstantFloating::get(static_cast(constResult->getInt())); else result = builder.createIToFInst(result); } if (operandType != floatType) { if (constOperand != nullptr) - operand = ConstantValue::get(static_cast(constOperand->getInt())); + operand = ConstantFloating::get(static_cast(constOperand->getInt())); else operand = builder.createIToFInst(operand); } @@ -943,9 +1023,9 @@ std::any SysYIRGenerator::visitEqExp(SysYParser::EqExpContext *ctx) { // 如果只有一个关系表达式,则将结果转换为0或1 if (constResult != nullptr) { if (constResult->isFloat()) - result = ConstantValue::get(constResult->getFloat() != 0.0F ? 1 : 0); + result = ConstantInteger::get(constResult->getFloat() != 0.0F ? 1 : 0); else - result = ConstantValue::get(constResult->getInt() != 0 ? 1 : 0); + result = ConstantInteger::get(constResult->getInt() != 0 ? 1 : 0); } } @@ -1013,6 +1093,7 @@ void Utils::tree2Array(Type *type, ArrayValueTree *root, ValueCounter &result, IRBuilder *builder) { Value* value = root->getValue(); auto &children = root->getChildren(); + // 类型转换 if (value != nullptr) { if (type == value->getType()) { result.push_back(value); @@ -1020,14 +1101,14 @@ void Utils::tree2Array(Type *type, ArrayValueTree *root, if (type == Type::getFloatType()) { ConstantValue* constValue = dynamic_cast(value); if (constValue != nullptr) - result.push_back(ConstantValue::get(static_cast(constValue->getInt()))); + result.push_back(ConstantFloating::get(static_cast(constValue->getInt()))); else result.push_back(builder->createIToFInst(value)); } else { ConstantValue* constValue = dynamic_cast(value); if (constValue != nullptr) - result.push_back(ConstantValue::get(static_cast(constValue->getFloat()))); + result.push_back(ConstantInteger::get(static_cast(constValue->getFloat()))); else result.push_back(builder->createFtoIInst(value)); @@ -1061,9 +1142,9 @@ void Utils::tree2Array(Type *type, ArrayValueTree *root, int num = blockSize - afterSize + beforeSize; if (num > 0) { if (type == Type::getFloatType()) - result.push_back(ConstantValue::get(0.0F), num); + result.push_back(ConstantFloating::get(0.0F), num); else - result.push_back(ConstantValue::get(0), num); + result.push_back(ConstantInteger::get(0), num); } } @@ -1101,7 +1182,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) { funcName, pModule, pBuilder); paramTypes.push_back(Type::getIntType()); paramNames.emplace_back("x"); - paramDims.push_back(std::vector{ConstantValue::get(-1)}); + paramDims.push_back(std::vector{ConstantInteger::get(-1)}); funcName = "getarray"; Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType, funcName, pModule, pBuilder); @@ -1117,7 +1198,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) { returnType = Type::getIntType(); paramTypes.push_back(Type::getFloatType()); paramNames.emplace_back("x"); - paramDims.push_back(std::vector{ConstantValue::get(-1)}); + paramDims.push_back(std::vector{ConstantInteger::get(-1)}); funcName = "getfarray"; Utils::createExternalFunction(paramTypes, paramNames, paramDims, returnType, funcName, pModule, pBuilder); @@ -1141,7 +1222,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) { paramTypes.push_back(Type::getIntType()); paramDims.clear(); paramDims.emplace_back(); - paramDims.push_back(std::vector{ConstantValue::get(-1)}); + paramDims.push_back(std::vector{ConstantInteger::get(-1)}); paramNames.clear(); paramNames.emplace_back("n"); paramNames.emplace_back("a"); @@ -1164,7 +1245,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) { paramTypes.push_back(Type::getFloatType()); paramDims.clear(); paramDims.emplace_back(); - paramDims.push_back(std::vector{ConstantValue::get(-1)}); + paramDims.push_back(std::vector{ConstantInteger::get(-1)}); paramNames.clear(); paramNames.emplace_back("n"); paramNames.emplace_back("a"); diff --git a/src/SysYIROptPre.cpp b/src/SysYIROptPre.cpp index fb05cb7..771c474 100644 --- a/src/SysYIROptPre.cpp +++ b/src/SysYIROptPre.cpp @@ -469,9 +469,9 @@ void SysYOptPre::SysYAddReturn() { pBuilder->setPosition(block.get(), block->end()); // TODO: 如果int float函数缺少返回值是否需要报错 if (func->getReturnType()->isInt()) { - pBuilder->createReturnInst(ConstantValue::get(0)); + pBuilder->createReturnInst(ConstantInteger::get(0)); } else if (func->getReturnType()->isFloat()) { - pBuilder->createReturnInst(ConstantValue::get(0.0F)); + pBuilder->createReturnInst(ConstantFloating::get(0.0F)); } else { pBuilder->createReturnInst(); } diff --git a/src/sysyc.cpp b/src/sysyc.cpp index bcde78f..eb774f6 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -16,14 +16,14 @@ using namespace antlr4; #include "SysYIROptPre.h" #include "RISCv64Backend.h" #include "SysYIRAnalyser.h" -#include "DeadCodeElimination.h" +// #include "DeadCodeElimination.h" #include "AddressCalculationExpansion.h" -#include "Mem2Reg.h" -#include "Reg2Mem.h" +// #include "Mem2Reg.h" +// #include "Reg2Mem.h" using namespace sysy; -int DEBUG = 0; +int DEBUG = 1; int DEEPDEBUG = 0; static string argStopAfter; @@ -174,32 +174,32 @@ int main(int argc, char **argv) { // MyCustomOpt2 opt2_pass(moduleIR, builder, &cfa); // 假设需要CFA // opt2_pass.run(); // ... 更多 -O1 特有的优化 - DeadCodeElimination dce(moduleIR, &cfa, &ava); - dce.runDCEPipeline(); - if (DEBUG) { - cout << "=== After 1st DCE (Default) ===\n"; - SysYPrinter(moduleIR).printIR(); - } + // DeadCodeElimination dce(moduleIR, &cfa, &ava); + // dce.runDCEPipeline(); + // if (DEBUG) { + // cout << "=== After 1st DCE (Default) ===\n"; + // SysYPrinter(moduleIR).printIR(); + // } - Mem2Reg mem2reg(moduleIR, builder, &cfa, &ava); - mem2reg.mem2regPipeline(); - if (DEBUG) { - cout << "=== After Mem2Reg (Default) ===\n"; - 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(); - } + // 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(); - } + // dce.runDCEPipeline(); // 第二次 DCE (默认) + // if (DEBUG) { + // cout << "=== After 2nd DCE (Default) ===\n"; + // SysYPrinter(moduleIR).printIR(); + // } } else { if (DEBUG) cout << "No additional middle-end optimizations applied for -O" << optLevel << ".\n"; }