From adbd9c64e8c2d26c689e2e8e80ad6e6022982475 Mon Sep 17 00:00:00 2001 From: Egor Mayorov Date: Thu, 22 May 2025 22:41:09 +0300 Subject: [PATCH] some loop analysis done --- src/SwapOperators/swapOperators.cpp | 71 ++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/src/SwapOperators/swapOperators.cpp b/src/SwapOperators/swapOperators.cpp index e0f68a2..cb76dcb 100644 --- a/src/SwapOperators/swapOperators.cpp +++ b/src/SwapOperators/swapOperators.cpp @@ -62,26 +62,80 @@ map> findAndAnalyzeLoops(SgStatement *st SgStatement *loopBody = forSt -> body(); SgStatement *lastLoopNode = st->lastNodeOfStmt(); // part with find blocks and instructions of loops + unordered_set blocks_nums; while (loopBody && loopBody != lastLoopNode) { SAPFOR::IR_Block* IR = findInstructionsFromOperator(loopBody, blocks).front(); - result[forSt].push_back(IR -> getBasicBlock()); // change this part for taking only unique blocks to vector + if (blocks_nums.find(IR -> getBasicBlock() -> getNumber()) == blocks_nums.end()) + { + result[forSt].push_back(IR -> getBasicBlock()); + blocks_nums.insert(IR -> getBasicBlock() -> getNumber()); + } loopBody = loopBody -> lexNext(); } + std::sort(result[forSt].begin(), result[forSt].end()); } st = st -> lexNext(); } return result; } -vector> AnalyzeLoop(SgForStmt* forStatement, vector loopBlocks) +map> AnalyzeLoopAndFindDeps(SgForStmt* forStatement, vector loopBlocks, map>& FullIR) { - vector> result; - // Analyze loop and create rules for moving operators in loops - // Return vector with moving rules (from line to line for operators) + map> result; + for (SAPFOR::BasicBlock* bb: loopBlocks) { + std::map> blockReachingDefinitions = bb -> getRD_In(); + vector instructions = bb -> getInstructions(); + for (SAPFOR::IR_Block* irBlock: instructions) { + SAPFOR::Instruction* instr = irBlock -> getInstruction(); + // take Argument 1 and it's RD and push operators to final set + if (instr -> getArg1() != NULL) { + SAPFOR::Argument* arg = instr -> getArg1(); + set prevInstructionsNumbers = blockReachingDefinitions[arg]; + for (int i: prevInstructionsNumbers) { + SAPFOR::Instruction* foundInstruction = getInstructionAndBlockByNumber(FullIR, i).first; + if (foundInstruction != NULL) { + SgStatement* prevOp = foundInstruction -> getOperator(); + if (prevOp != forStatement && instr -> getOperator() != forStatement && instr -> getOperator() -> lineNumber() > prevOp -> lineNumber()) + result[instr -> getOperator()].insert(prevOp); + } + } + } + // take Argument 2 (if exists) and it's RD and push operators to final set + if (instr -> getArg2() != NULL) { + SAPFOR::Argument* arg = instr -> getArg2(); + set prevInstructionsNumbers = blockReachingDefinitions[arg]; + for (int i: prevInstructionsNumbers) { + SAPFOR::Instruction* foundInstruction = getInstructionAndBlockByNumber(FullIR, i).first; + if (foundInstruction != NULL) { + SgStatement* prevOp = foundInstruction -> getOperator(); + if (prevOp != forStatement && instr -> getOperator() != forStatement && instr -> getOperator() -> lineNumber() > prevOp -> lineNumber()) + result[instr -> getOperator()].insert(prevOp); + } + } + } + // update RD + if (instr -> getResult() != NULL) + blockReachingDefinitions[instr -> getResult()] = {instr -> getNumber()}; + } + } return result; } +int RebuildLoop(int firstLine, int lastLine, map> moveRules) { + // only cout done yet (( + cout << "LOOP ANALYZE FROM " << firstLine << " TO " << lastLine << " RES\n" << endl; + for (auto r: moveRules) { + cout << "OPERATOR: " << endl; + cout << r.first -> lineNumber() << r.first -> sunparse(); + cout << "DEPENDS FROM NEXT: " << endl; + for (SgStatement* st: r.second) + cout << st -> lineNumber() << endl; + } + cout << "\n\n\n"; + return 0; +} + void runSwapOperators(SgFile *file, std::map>& loopGraph, std::map>& FullIR, int& countOfTransform) { std::cout << "SWAP_OPERATORS Pass" << std::endl; // to remove @@ -95,7 +149,12 @@ void runSwapOperators(SgFile *file, std::map> loopsMapping = findAndAnalyzeLoops(st, blocks); for (pair> loopForAnalyze: loopsMapping) { - vector> moveRules = AnalyzeLoop(loopForAnalyze.first, loopForAnalyze.second); + map> moveRules = AnalyzeLoopAndFindDeps(loopForAnalyze.first, loopForAnalyze.second, FullIR); + if (moveRules.size() != 0) { + int firstLine = loopForAnalyze.first -> lineNumber(); + int lastLine = loopForAnalyze.first -> lastNodeOfStmt() -> lineNumber(); + countOfTransform += RebuildLoop(firstLine, lastLine, moveRules); + } } }