From 5fb2bd79df4c43ce601b5fdfa3e8f38c121d912a Mon Sep 17 00:00:00 2001 From: Egor Mayorov Date: Tue, 13 May 2025 00:46:32 +0300 Subject: [PATCH] Some actions simplify analyzing IR --- src/Sapfor.cpp | 2 +- src/SwapOperators/swapOperators.cpp | 96 +++++++++++++++++++++++++++-- src/SwapOperators/swapOperators.h | 2 +- 3 files changed, 94 insertions(+), 6 deletions(-) diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index c24eee3..6731c47 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -942,7 +942,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne } else if (curr_regime == SWAP_OPERATORS) { - runSwapOperators(loopGraph, fullIR, countOfTransform); + runSwapOperators(file, loopGraph, fullIR, countOfTransform); } else if (curr_regime == PRIVATE_REMOVING_ANALYSIS) { diff --git a/src/SwapOperators/swapOperators.cpp b/src/SwapOperators/swapOperators.cpp index 54cc60b..e0f68a2 100644 --- a/src/SwapOperators/swapOperators.cpp +++ b/src/SwapOperators/swapOperators.cpp @@ -4,12 +4,100 @@ #include #include +#include "../Utils/errors.h" +#include "../Utils/SgUtils.h" +#include "../GraphCall/graph_calls.h" +#include "../GraphCall/graph_calls_func.h" +#include "../CFGraph/CFGraph.h" +#include "../CFGraph/IR.h" +#include "../GraphLoop/graph_loops.h" #include "swapOperators.h" +using namespace std; -void runSwapOperators(std::map>& loopGraph, std::map>& FullIR, int& countOfTransform) + +unordered_set loop_tags = {FOR_NODE/*, FORALL_NODE, WHILE_NODE, DO_WHILE_NODE*/}; + + +vector findInstructionsFromOperator(SgStatement* st, vector Blocks) { - std::cout << "SWAP_OPERATORS Pass" << std::endl; - countOfTransform += 1; + vector result; + string filename = st -> fileName(); + for (auto& block: Blocks) + { + vector instructionsInBlock = block -> getInstructions(); + for (auto& instruction: instructionsInBlock) + { + SgStatement* curOperator = instruction -> getInstruction() -> getOperator(); + if (curOperator -> lineNumber() == st -> lineNumber()) + result.push_back(instruction); + } + } + return result; +} + +vector findFuncBlocksByFuncStatement(SgStatement *st, std::map>& FullIR) +{ + vector result; + Statement* forSt = (Statement*)st; + for (auto& func : FullIR) + { + if (func.first -> funcPointer -> getCurrProcessFile() == forSt -> getCurrProcessFile() + && func.first -> funcPointer -> lineNumber() == forSt -> lineNumber()) + result = func.second; + } + return result; +} + +map> findAndAnalyzeLoops(SgStatement *st, vector blocks) +{ + map> result; + SgStatement *lastNode = st->lastNodeOfStmt(); + while (st && st != lastNode) + { + if (loop_tags.find(st -> variant()) != loop_tags.end()) + { + // part with find statements of loop + SgForStmt *forSt = (SgForStmt*)st; + SgStatement *loopBody = forSt -> body(); + SgStatement *lastLoopNode = st->lastNodeOfStmt(); + // part with find blocks and instructions of loops + 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 + loopBody = loopBody -> lexNext(); + } + } + st = st -> lexNext(); + } + return result; +} + +vector> AnalyzeLoop(SgForStmt* forStatement, vector loopBlocks) +{ + vector> result; + // Analyze loop and create rules for moving operators in loops + // Return vector with moving rules (from line to line for operators) + return result; +} + +void runSwapOperators(SgFile *file, std::map>& loopGraph, std::map>& FullIR, int& countOfTransform) +{ + std::cout << "SWAP_OPERATORS Pass" << std::endl; // to remove + countOfTransform += 1; // to remove + + const int funcNum = file->numberOfFunctions(); + for (int i = 0; i < funcNum; ++i) + { + SgStatement *st = file->functions(i); + vector blocks = findFuncBlocksByFuncStatement(st, FullIR); + map> loopsMapping = findAndAnalyzeLoops(st, blocks); + for (pair> loopForAnalyze: loopsMapping) + { + vector> moveRules = AnalyzeLoop(loopForAnalyze.first, loopForAnalyze.second); + } + } + return; -}; \ No newline at end of file +}; diff --git a/src/SwapOperators/swapOperators.h b/src/SwapOperators/swapOperators.h index b159c44..b66152f 100644 --- a/src/SwapOperators/swapOperators.h +++ b/src/SwapOperators/swapOperators.h @@ -3,4 +3,4 @@ #include "../GraphLoop/graph_loops.h" #include "../CFGraph/CFGraph.h" -void runSwapOperators(std::map>& loopGraph, std::map>& FullIR, int& countOfTransform); +void runSwapOperators(SgFile *file, std::map>& loopGraph, std::map>& FullIR, int& countOfTransform);