77 Commits

Author SHA1 Message Date
37ebeee97a Remove unused code and comments 2025-07-01 00:58:42 +03:00
2d47b8533b Merge branch 'master' into analyze_loops_with_IR 2025-06-29 22:10:03 +03:00
2fd08e79f1 Merge branch 'master' into analyze_loops_with_IR 2025-06-22 20:09:16 +03:00
2af6d9c140 WIP change logic of inductive variables 2025-06-19 23:01:10 +03:00
375070f959 Merge branch 'master' into analyze_loops_with_IR 2025-06-18 23:22:33 +03:00
31715a46d0 WIP: merge with master 2025-06-18 23:21:55 +03:00
ALEXks
ef6d7fb70f fixed code style 2025-05-30 18:11:18 +03:00
ALEXks
c7c46cd159 fixed code style 2025-05-30 18:09:14 +03:00
ALEXks
c842630ec2 fixed code style 2025-05-30 18:03:01 +03:00
ALEXks
2969f92013 moved code, fixed style 2025-05-30 17:33:57 +03:00
ALEXks
b13b0a0f57 Merge branch 'analyze_loops_with_IR' of http://192.168.0.176:30008/Alexander_KS/SAPFOR into analyze_loops_with_IR 2025-05-30 17:06:26 +03:00
ALEXks
06dd8848be improved CFG functions style 2025-05-30 17:06:21 +03:00
bed098b345 fixed cmake style 2025-05-30 13:02:27 +03:00
f322306344 Merge branch 'master' into analyze_loops_with_IR 2025-05-30 13:01:26 +03:00
f7c66f537d merged master 2025-05-30 12:54:18 +03:00
267f85ae27 Merge branch 'master' into analyze_loops_with_IR 2025-05-28 16:23:11 +03:00
b137ea5ef3 WIP: testing on big data 2025-05-27 23:34:45 +03:00
6a84171382 finish inductive variables 2025-04-22 16:14:29 +03:00
cd209a587a WIP: merge master 2025-03-25 21:53:01 +03:00
ALEXks
0b0d7d373b fixed removeDvmSpfDirectives 2025-03-25 21:09:34 +03:00
ALEXks
781a892497 fixed removeDvmSpfDirectives 2025-03-25 21:09:34 +03:00
ALEXks
a55440c071 fixed module analysis 2025-03-25 21:09:34 +03:00
ALEXks
996f7ead1b fixed 2025-03-25 21:09:34 +03:00
ALEXks
5231eeacd8 fixed module symbols analysis 2025-03-25 21:09:34 +03:00
ALEXks
7460cf6e59 added REMOVE_SPF pass 2025-03-25 21:09:34 +03:00
ALEXks
5596b57021 version updated 2025-03-25 21:09:34 +03:00
3ad972c188 Обновить README.md 2025-03-25 21:09:34 +03:00
dde0bcdee5 Обновить README.md 2025-03-25 21:09:34 +03:00
65cdbef201 added forgotten files 2025-03-25 21:09:34 +03:00
2ad239d1e3 moved dvm to submodule 2025-03-25 21:09:34 +03:00
12f311077b added dvm as submodule 2025-03-25 21:09:34 +03:00
ALEXks
a2e0a99891 added Server project 2025-03-25 21:09:34 +03:00
27a350dac0 fixed cmakes 2025-03-25 21:09:33 +03:00
3c1032bfd0 moved to dvm_svn 2025-03-25 21:09:33 +03:00
189374274e finalyze moving 2025-03-25 21:09:12 +03:00
de4690513b fixed paths 2025-03-25 20:43:08 +03:00
86ab34e7f3 fixed paths 2025-03-25 20:43:01 +03:00
06cfe83666 removed unnecessary 2025-03-25 20:39:36 +03:00
a3c1e1e5d1 fixed paths 2025-03-25 20:39:36 +03:00
75e89ab868 fixed paths 2025-03-25 20:39:35 +03:00
d4fb323f86 moved 2025-03-25 20:39:29 +03:00
ALEXks
0c9f0664fd added module symbols initiazliation 2025-03-25 20:35:21 +03:00
ALEXks
90a608230c version updated 2025-03-25 20:35:21 +03:00
ALEXks
d6df2f6b5f fdvm updated 2025-03-25 20:35:21 +03:00
ALEXks
90894a4723 fixed module analysis 2025-03-25 20:35:21 +03:00
ALEXks
26fe1d3f61 first step of shadow fixing 2025-03-25 20:35:21 +03:00
ALEXks
68d2f3253c improved module analysis 2025-03-25 20:35:21 +03:00
ALEXks
09401376c7 improved module analysis 2025-03-25 20:35:21 +03:00
ALEXks
a0c8f78868 fixed implicit 2025-03-25 20:35:21 +03:00
ALEXks
2aa9e569f4 refactoring module analysis 2025-03-25 20:35:20 +03:00
ALEXks
9e5ee78b80 fixed module symbol analysis 2025-03-25 20:35:20 +03:00
ALEXks
d5d5514e17 fixed function analysis 2025-03-25 20:35:20 +03:00
ALEXks
68c779790d fixed dead flag for functions 2025-03-25 20:35:20 +03:00
ALEXks
c6b09ad285 fixed distribution, fixed routine, fixed null program unparsing 2025-03-25 20:35:20 +03:00
ALEXks
fd402b6ab0 added optimized version of CG on GPU 2025-03-25 20:35:20 +03:00
ALEXks
b76753c285 removed logging from SAPFOR and SERVER, updated NPB and fdvm 2025-03-25 20:35:20 +03:00
ALEXks
44600a50c1 updated dvm 2025-03-25 20:35:20 +03:00
ALEXks
d2f5e5fcc1 fixed DECLARE 2025-03-25 20:35:20 +03:00
ALEXks
18ac0ae47c fixed DECLARE 2025-03-25 20:35:20 +03:00
ALEXks
00b6026761 fixed 2025-03-25 20:35:20 +03:00
ALEXks
2036fab86f added dvm declare 2025-03-25 20:35:20 +03:00
ALEXks
da4e992926 fixed routine convertation 2025-03-25 20:35:20 +03:00
ALEXks
8e4a4c78ad improved ROUTINE insertion 2025-03-25 20:35:20 +03:00
b4038b532f WIP try to fix renaming 2025-03-25 20:35:20 +03:00
dec1a853db Merge branch 'master' into analyze_loops_with_IR 2024-12-31 16:41:12 +03:00
7df02737c7 WIP: finishing SSA renaming 2024-12-26 01:58:15 +03:00
d267dc047a WIP: add fi functions and rename vars 2024-12-19 15:37:34 +03:00
12a810ad35 WIP fix russian coments 2024-11-22 00:28:12 +03:00
1522dc7f27 Merge branch 'master' into analyze_loops_with_IR 2024-11-21 21:27:58 +03:00
bd52d5c6ec Remove debug files 2024-11-17 22:34:53 +03:00
4ba2bb4c94 Merge branch 'master' into analyze_loops_with_IR 2024-11-17 22:27:14 +03:00
60544ea4d6 WIP: add dominators logic 2024-11-14 15:28:51 +03:00
ALEXks
b40e969d02 Merge branch 'analyze_loops_with_IR' of http://alex-freenas.ddns.net:3000/Alexander_KS/SAPFOR into analyze_loops_with_IR 2024-05-26 20:49:46 +03:00
d062e52dd6 WIP add afterLoopLine 2024-05-26 20:49:14 +03:00
392ad97738 WIP add analizing IR loop 2024-05-26 20:49:14 +03:00
c2c111586c WIP add afterLoopLine 2024-05-26 13:53:47 +03:00
172eedfef1 WIP add analizing IR loop 2024-05-26 12:32:53 +03:00
27 changed files with 1042 additions and 570 deletions

View File

@@ -12,7 +12,6 @@ add_definitions("-D SYS5")
add_definitions("-D YYDEBUG")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 17)
set(fdvm_include projects/dvm/fdvmh/include/fdvmh/)
set(fdvm_sources projects/dvm/fdvmh/tools/fdvmh/)
@@ -34,7 +33,6 @@ include_directories(src/Distribution)
include_directories(src/GraphCall)
include_directories(src/GraphLoop)
include_directories(src/Transformations/ExpressionSubstitution)
include_directories(src/Transformations)
#Sage lib includes
include_directories(${fdvm_include})
@@ -240,14 +238,14 @@ set(CFG src/CFGraph/IR.cpp
src/CFGraph/live_variable_analysis.h
src/CFGraph/private_variables_analysis.cpp
src/CFGraph/private_variables_analysis.h
)
src/CFGraph/IR_SSAForm.cpp
src/CFGraph/IR_SSAForm.h)
set(DATA_FLOW
src/CFGraph/DataFlow/data_flow.h
src/CFGraph/DataFlow/data_flow_impl.h
src/CFGraph/DataFlow/backward_data_flow.h
src/CFGraph/DataFlow/backward_data_flow_impl.h
)
src/CFGraph/DataFlow/backward_data_flow_impl.h)
set(CREATE_INTER_T src/CreateInterTree/CreateInterTree.cpp
src/CreateInterTree/CreateInterTree.h)
@@ -323,7 +321,9 @@ set(GR_LOOP src/GraphLoop/graph_loops_base.cpp
set(LOOP_ANALYZER src/LoopAnalyzer/allocations_prepoc.cpp
src/LoopAnalyzer/dep_analyzer.cpp
src/LoopAnalyzer/loop_analyzer.cpp
src/LoopAnalyzer/loop_analyzer.h)
src/LoopAnalyzer/loop_analyzer.h
src/LoopAnalyzer/implicit_loops_analyzer.cpp
src/LoopAnalyzer/implicit_loops_analyzer.h)
set(MAIN src/Sapfor.cpp
src/Sapfor.h

View File

@@ -50,12 +50,30 @@ BBlock::BasicBlock(const BBlock& copyFrom)
prev = copyFrom.prev;
}
void BBlock::addInstruction(IR_Block* item)
void BBlock::addInstruction(IR_Block* item, bool pushFront)
{
if (pushFront)
instructions.insert(instructions.begin(), item);
else
instructions.push_back(item);
item->setBasicBlock(this);
}
void BBlock::addInstructionBefore(IR_Block* item, Instruction* before)
{
checkNull(before, convertFileName(__FILE__).c_str(), __LINE__);
checkNull(item, convertFileName(__FILE__).c_str(), __LINE__);
for (auto it = instructions.begin(); it != instructions.end(); ++it) {
if ((*it)->getInstruction() == before) {
instructions.insert(it, item);
item->setBasicBlock(this);
return;
}
}
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
}
int BBlock::removePrev(BBlock* removed)
{
auto it = std::remove(prev.begin(), prev.end(), removed);
@@ -512,7 +530,7 @@ static int buildReachingDefs(const vector<BBlock*>& CFG, const FuncInfo* currF,
return iter;
}
//Kosaraju<EFBFBD>Sharir algorithm
//Kosaraju-Sharir algorithm
static vector<int> getStronglyConnectedComps(vector<vector<int>>& g) {
// 1. For each vertex u of the graph, mark u as unvisited. Let l be empty.
auto size = g.size();

View File

@@ -6,6 +6,10 @@
#include <vector>
#include "IR.h"
#include "../Utils/errors.h"
#include "../Utils/utils.h"
#include "../Utils/CommonBlock.h"
#include "../GraphCall/graph_calls.h"
#include "IR_domTree.h"
namespace SAPFOR
@@ -41,7 +45,8 @@ namespace SAPFOR
BasicBlock(IR_Block* item);
BasicBlock(const BasicBlock& copyFrom);
void addInstruction(IR_Block* item);
void addInstructionBefore(IR_Block* item, Instruction* istruction);
void addInstruction(IR_Block* item, bool pushFront = false);
void addPrev(BasicBlock* prev_) { prev.push_back(prev_); }
void addNext(BasicBlock* next_) { next.push_back(next_); }
void setDom(BasicBlock* dom) { directDominator = dom; }

View File

@@ -42,6 +42,7 @@ namespace SAPFOR
Argument() : number(lastNumArg++), type(CFG_ARG_TYPE::NONE), value(""), mType(CFG_MEM_TYPE::NONE_) { }
Argument(CFG_ARG_TYPE type, CFG_MEM_TYPE mType) : number(lastNumArg++), type(type), mType(mType), value("") { }
Argument(CFG_ARG_TYPE type, CFG_MEM_TYPE mType, const std::string& value) : number(lastNumArg++), type(type), mType(mType), value(value) { }
Argument(CFG_ARG_TYPE type, CFG_MEM_TYPE mType, const std::string& value, int num) : number(num), type(type), mType(mType), value(value) { }
Argument(CFG_ARG_TYPE type, const std::string& value) : number(lastNumArg++), type(type), mType(CFG_MEM_TYPE::NONE_), value(value)
{
if (type != CFG_ARG_TYPE::INSTR && type == CFG_ARG_TYPE::LAB &&
@@ -50,6 +51,9 @@ namespace SAPFOR
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
}
}
Argument(const Argument& other)
: number(other.number), type(other.type), mType(other.mType), value(other.value)
{ }
void setType(CFG_ARG_TYPE newType) { type = newType; }
CFG_ARG_TYPE getType() const { return type; }

386
src/CFGraph/IR_SSAForm.cpp Normal file
View File

@@ -0,0 +1,386 @@
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <set>
#include "../Utils/SgUtils.h"
#include "../Utils/CommonBlock.h"
#include "../GraphCall/graph_calls.h"
#include "dvm.h"
#include "IR.h"
#include "CFGraph.h"
using namespace std;
using namespace SAPFOR;
static const SAPFOR::Argument CONST_UNDEFINED_ARG(CFG_ARG_TYPE::CONST, CFG_MEM_TYPE::COMMON_, "-1");
template <typename T> static bool compareVectors(const vector<T>* vec1, const vector<T>* vec2)
{
if (vec1 == vec2)
return true;
if (!vec1 || !vec2)
return false;
vector<T> sortedVec1 = *vec1;
vector<T> sortedVec2 = *vec2;
sort(sortedVec1.begin(), sortedVec1.end());
sort(sortedVec2.begin(), sortedVec2.end());
return sortedVec1 == sortedVec2;
}
template <typename T> static vector<T>* getCommonElements(const vector<vector<T>>* vectors)
{
if (!vectors || vectors->empty())
return new vector<T>();
vector<T>* commonElements = new vector<T>((*vectors)[0]);
for (size_t i = 1; i < vectors->size(); ++i)
{
vector<T> tempCommon;
vector<T> sortedVec = (*vectors)[i];
sort(commonElements->begin(), commonElements->end());
sort(sortedVec.begin(), sortedVec.end());
set_intersection(
commonElements->begin(), commonElements->end(),
sortedVec.begin(), sortedVec.end(),
back_inserter(tempCommon)
);
*commonElements = tempCommon;
if (commonElements->empty())
break;
}
return commonElements;
}
static map<SAPFOR::BasicBlock*, vector<SAPFOR::BasicBlock*>> findDominators(const vector<SAPFOR::BasicBlock*>& blocks)
{
map<SAPFOR::BasicBlock*, vector<SAPFOR::BasicBlock*>> result;
bool changed = true;
while (changed)
{
changed = false;
for (auto& currentBlock : blocks)
{
auto pred = currentBlock->getPrev();
auto prevDominators = new vector<vector<SAPFOR::BasicBlock*>>();
for (auto predBlock : pred)
prevDominators->push_back(result.find(predBlock) != result.end() ? result[predBlock] : blocks);
auto currentBlockResult = getCommonElements(prevDominators);
currentBlockResult->push_back(currentBlock);
if (result.find(currentBlock) == result.end() || !compareVectors(currentBlockResult, &result[currentBlock]))
{
result[currentBlock] = *currentBlockResult;
changed = true;
}
}
}
return result;
}
static map<SAPFOR::BasicBlock*, vector<SAPFOR::BasicBlock*>> findDominatorBorders(const vector<SAPFOR::BasicBlock*>& blocks)
{
map<SAPFOR::BasicBlock*, vector<SAPFOR::BasicBlock*>> result;
for (auto& block : blocks)
result[block] = *(new vector<SAPFOR::BasicBlock*>());
for (auto& block : blocks)
{
if (block->getPrev().size() > 1)
{
for (auto prev : block->getPrev())
{
auto tmpBlock = prev;
while (tmpBlock != block->getDom())
{
result[tmpBlock].push_back(block);
tmpBlock = tmpBlock->getDom();
}
}
}
}
return result;
}
static pair<set<SAPFOR::Argument*>, map<SAPFOR::Argument*, set<SAPFOR::BasicBlock*>>> getGlobalsAndVarBlocks(const vector<SAPFOR::BasicBlock*>& blocks)
{
set<SAPFOR::Argument*> globals;
map<SAPFOR::Argument*, set<SAPFOR::BasicBlock*>> varBlocks;
for (auto& block : blocks)
{
set<SAPFOR::Argument*> def;
const auto& instructions = block->getInstructions();
for (const auto& irBlock : instructions)
{
if (irBlock)
{
Instruction* instr = irBlock->getInstruction();
if (instr)
{
auto arg1 = instr->getArg1();
auto arg2 = instr->getArg2();
auto res = instr->getResult();
if (arg1 && arg1->getType() == CFG_ARG_TYPE::VAR && find(def.begin(), def.end(), arg1) == def.end())
globals.insert(arg1);
if (arg2 && arg2->getType() == CFG_ARG_TYPE::VAR && find(def.begin(), def.end(), arg2) == def.end())
globals.insert(arg2);
if (res && res->getType() == CFG_ARG_TYPE::VAR)
{
def.insert(res);
varBlocks[res].insert(block);
}
}
}
}
}
return make_pair(globals, varBlocks);
}
static void getBlocksWithFiFunctions(const vector<SAPFOR::BasicBlock*> blocks, set<SAPFOR::Argument*>& globals,
map<SAPFOR::Argument*, set<SAPFOR::BasicBlock*>>& varBlocks,
map<SAPFOR::BasicBlock*, vector<SAPFOR::BasicBlock*>>& dominatorBorders)
{
vector<SAPFOR::BasicBlock*> blocksWithFiFunctions;
auto fiFunc = new SAPFOR::Argument(CFG_ARG_TYPE::FUNC, CFG_MEM_TYPE::NONE_, "FI_FUNCTION");
auto paramCount = new SAPFOR::Argument(CFG_ARG_TYPE::CONST, CFG_MEM_TYPE::LOCAL_, "0");
for (auto& var : globals)
{
auto worklist = varBlocks[var];
set<SAPFOR::BasicBlock*> hasFiFunction;
while (!worklist.empty())
{
auto block = *worklist.begin();
worklist.erase(block);
for (auto& dfBlock : dominatorBorders[block])
{
if (hasFiFunction.find(dfBlock) == hasFiFunction.end())
{
hasFiFunction.insert(dfBlock);
Instruction* phiInstruction = new Instruction(CFG_OP::F_CALL, new SAPFOR::Argument(*fiFunc), new SAPFOR::Argument(*paramCount), var, dfBlock->getInstructions()[0]->getInstruction()->getOperator());
IR_Block* phiBlock = new IR_Block(phiInstruction);
dfBlock->addInstruction(phiBlock, true);
}
}
}
}
}
static void restoreConnections(const vector<SAPFOR::BasicBlock*>& originalBlocks, vector<SAPFOR::BasicBlock*>& copiedBlocks)
{
map<SAPFOR::BasicBlock*, SAPFOR::BasicBlock*> blockMapping;
for (size_t i = 0; i < originalBlocks.size(); ++i)
blockMapping[originalBlocks[i]] = copiedBlocks[i];
for (size_t i = 0; i < originalBlocks.size(); ++i)
{
SAPFOR::BasicBlock* originalBlock = originalBlocks[i];
SAPFOR::BasicBlock* copiedBlock = copiedBlocks[i];
auto prevCopy = copiedBlock->getPrev();
for (auto j : prevCopy)
copiedBlock->removePrev(j);
auto nextCopy = copiedBlock->getNext();
for (auto j : nextCopy)
copiedBlock->removeNext(j);
for (auto* succ : originalBlock->getNext())
copiedBlock->addNext(blockMapping[succ]);
for (auto* prev : originalBlock->getPrev())
copiedBlock->addPrev(blockMapping[prev]);
}
}
static SAPFOR::Argument* newName(SAPFOR::Argument* var, map<string, int>& counter, map<string, stack<SAPFOR::Argument*>>& stack, int number) {
counter[var->getValue()]++;
SAPFOR::Argument* newName = new SAPFOR::Argument(var->getType(), var->getMemType(), var->getValue(), number);
stack[var->getValue()].push(newName);
return newName;
}
static void renameFiFunctionResultVar(SAPFOR::BasicBlock* block, map<string, int>& counter, map<string, stack<SAPFOR::Argument*>>& stack) {
for (auto& irBlock : block->getInstructions())
{
auto instruction = irBlock->getInstruction();
if (instruction->getOperation() == CFG_OP::F_CALL && instruction->getArg1() != NULL &&
instruction->getArg1()->getValue() == "FI_FUNCTION" && instruction->getResult() != NULL)
{
instruction->setResult(newName(instruction->getResult(), counter, stack, instruction->getNumber()));
}
}
}
static void renameInstructionVars(SAPFOR::BasicBlock* block, map<string, int>& counter, map<string, stack<SAPFOR::Argument*>>& stack)
{
for (auto& irBlock : block->getInstructions())
{
auto instruction = irBlock->getInstruction();
if (instruction->getArg1() != NULL && instruction->getArg1()->getType() == CFG_ARG_TYPE::VAR)
instruction->setArg1(stack[instruction->getArg1()->getValue()].top());
if (instruction->getArg2() != NULL && instruction->getArg2()->getType() == CFG_ARG_TYPE::VAR)
instruction->setArg2(stack[instruction->getArg2()->getValue()].top());
if (instruction->getResult() != NULL && instruction->getResult()->getType() == CFG_ARG_TYPE::VAR)
instruction->setResult(newName(instruction->getResult(), counter, stack, instruction->getNumber()));
}
}
static void renameFiFunctionArgsVar(SAPFOR::BasicBlock* block, map<string, stack<SAPFOR::Argument*>>& stack)
{
auto size = block->getInstructions().size();
auto& instructions = block->getInstructions();
for (size_t i = 0; i < size; ++i)
{
auto irBlock = instructions[i];
auto instruction = irBlock->getInstruction();
if (instruction->getOperation() == CFG_OP::F_CALL && instruction->getArg1() != NULL &&
instruction->getArg1()->getValue() == "FI_FUNCTION" && instruction->getResult() != NULL &&
instruction->getArg2() != NULL)
{
Instruction* paramInstruction;
if (stack[instruction->getResult()->getValue()].size() > 0)
{
SAPFOR::Argument* tmp = new SAPFOR::Argument(CFG_ARG_TYPE::CONST, CFG_MEM_TYPE::COMMON_, to_string(stack[instruction->getResult()->getValue()].top()->getNumber()));
paramInstruction = new Instruction(CFG_OP::PARAM, tmp);
}
else
{
SAPFOR::Argument* tmp = new SAPFOR::Argument(CFG_ARG_TYPE::CONST, CFG_MEM_TYPE::COMMON_, "-1");
paramInstruction = new Instruction(CFG_OP::PARAM, tmp);
}
paramInstruction->setOperator(block->getInstructions()[0]->getInstruction()->getOperator());
block->addInstructionBefore(new IR_Block(paramInstruction), instruction);
instruction->getArg2()->setValue(to_string(stoi(instruction->getArg2()->getValue()) + 1));
i++;
}
}
}
static vector<SAPFOR::BasicBlock*> findBlocksWithValue(vector<SAPFOR::BasicBlock*>& blocks, SAPFOR::BasicBlock* x)
{
vector<SAPFOR::BasicBlock*> result;
for (auto& block : blocks)
if (block->getDom() == x)
result.push_back(block);
return result;
}
static void renameIR(SAPFOR::BasicBlock* block, vector<SAPFOR::BasicBlock*>& blocks, map<string, int>& counter, map<string, stack<SAPFOR::Argument*>>& stack)
{
renameFiFunctionResultVar(block, counter, stack);
renameInstructionVars(block, counter, stack);
for (auto& successor : block->getNext())
renameFiFunctionArgsVar(successor, stack);
for (auto& child : findBlocksWithValue(blocks, block))
renameIR(child, blocks, counter, stack);
for (auto& irBlock : block->getInstructions())
{
auto instruction = irBlock->getInstruction();
if (instruction->getResult() != NULL && instruction->getResult()->getType() == CFG_ARG_TYPE::VAR)
{
string varName = instruction->getResult()->getValue();
stack[varName].pop();
}
}
for (auto& irBlock : block->getInstructions())
{
auto instruction = irBlock->getInstruction();
if (instruction->getOperation() == CFG_OP::F_CALL && instruction->getArg1() != NULL &&
instruction->getArg1()->getValue() == "FI_FUNCTION" && instruction->getResult() != NULL)
{
string varName = instruction->getResult()->getValue();
stack[varName].pop();
}
}
}
void buildFuncIRSSAForm(FuncInfo* funcInfo, const std::vector<SAPFOR::BasicBlock*>& funcIRConst, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& result)
{
vector<SAPFOR::BasicBlock*> funcIR;
for (auto& i : funcIRConst)
funcIR.push_back(new SAPFOR::BasicBlock(*i));
restoreConnections(funcIRConst, funcIR);
SAPFOR::buildDominatorTree(funcIR);
auto dominatorBorders = findDominatorBorders(funcIR);
auto globalsAndVarBlocks = getGlobalsAndVarBlocks(funcIR);
auto globals = globalsAndVarBlocks.first;
auto varBlocks = globalsAndVarBlocks.second;
getBlocksWithFiFunctions(funcIR, globals, varBlocks, dominatorBorders);
map<string, int> count;
map<string, stack<SAPFOR::Argument*>> varStack;
for (auto& var : globals)
{
count[var->getValue()] = 0;
stack<SAPFOR::Argument*> tmp;
tmp.push(new SAPFOR::Argument(CONST_UNDEFINED_ARG));
varStack[var->getValue()] = tmp;
}
renameIR(funcIR[0], funcIR, count, varStack);
result[funcInfo] = funcIR;
}
FuncInfo* getIRByFilename(const std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& fullIR, const char* filename)
{
for (auto ir : fullIR)
if (ir.first->fileName == filename)
return ir.first;
return nullptr;
}

8
src/CFGraph/IR_SSAForm.h Normal file
View File

@@ -0,0 +1,8 @@
#pragma once
#include "CFGraph.h"
#include "IR.h"
void buildFuncIRSSAForm(FuncInfo* funcInfo, const std::vector<SAPFOR::BasicBlock*>& fullIR, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& result);
FuncInfo* getIRByFilename(const std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& fullIR, const char* filename);

View File

@@ -7,7 +7,7 @@
#include "CFGraph.h"
// Lengauer, Thomas. A fast algorithm for finding dominators in a flowgraph / Thomas Lengauer, Robert Endre Tarjan
// ACM Transactions on Programming Languages and Systems (TOPLAS). <20> 1979. <20> Vol. 1, no. 1. <20> Pp. 121<32>141.
// ACM Transactions on Programming Languages and Systems (TOPLAS). <20> 1979. <20> Vol. 1, no. 1. <20> Pp. 121<32>141.
namespace SAPFOR {

View File

@@ -22,7 +22,7 @@
#include "SgUtils.h"
#include "../Sapfor.h"
#include "graph_loops_func.h"
#include "LoopNesting/loop_transform.h"
#include "../Transformations/LoopNesting/loop_transform.h"
#include "expr_transform.h"
#include "graph_calls_func.h"

View File

@@ -10,7 +10,7 @@
#include "../ParallelizationRegions/ParRegions.h"
#include "../Distribution/Arrays.h"
#include "LoopNesting/loop_transform.h"
#include "../Transformations/LoopNesting/loop_transform.h"
#include "errors.h"
#include "directive_parser.h"

View File

@@ -11,9 +11,9 @@
#include "DvmhRegionInserter.h"
#include "DvmhRegions/RegionsMerger.h"
#include "../VerificationCode/verifications.h"
#include "../Transformations/FunctionPurifying/function_purifying.h"
#include "../LoopAnalyzer/loop_analyzer.h"
#include "../DirectiveProcessing/directive_parser.h"
#include "FunctionPurifying/function_purifying.h"
using namespace std;
@@ -794,6 +794,154 @@ ArraySet DvmhRegionInserter::get_used_arrs_for_block(SgStatement* st, int usage_
return usages;
}
static bool filterFromList(SgStatement* st, const set<string>& idents, bool exclude = false)
{
bool empty = false;
SgExpression* list = st->expr(0);
vector<SgExpression*> newList;
int total = 0;
while (list)
{
if (exclude)
{
if (idents.find(list->lhs()->symbol()->identifier()) == idents.end())
newList.push_back(list->lhs());
}
else
{
if (idents.find(list->lhs()->symbol()->identifier()) != idents.end())
newList.push_back(list->lhs());
}
total++;
list = list->rhs();
}
if (newList.size() == 0)
empty = true;
else if (total != newList.size())
st->setExpression(0, makeExprList(newList));
return empty;
}
static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
{
string oldFile = current_file->filename();
if (!func->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto copy = duplicateProcedure(func, NULL, false, false, false, true);
const set<string> idents(pars.identificators.begin(), pars.identificators.end());
bool need = (func->symbol()->identifier() == string("bl182"));
//remove all exec
SgStatement* st = copy->lexNext();
SgStatement* last = copy->lastNodeOfStmt();
vector<SgStatement*> toExtract;
while (st != last)
{
if (isDVM_stat(st) || isSPF_stat(st))
{
if (st->variant() != ACC_ROUTINE_DIR)
{
toExtract.push_back(st);
st = st->lexNext();
}
else
st = st->lexNext();
}
else if (isSgExecutableStatement(st))
{
SgStatement* next = st->lastNodeOfStmt();
if (next != last)
next = next->lexNext();
toExtract.push_back(st);
st = next;
}
else
st = st->lexNext();
}
//remove unused declarations
st = copy->lexNext();
while (st != last)
{
const int var = st->variant();
if (var == VAR_DECL
|| var == VAR_DECL_90
|| var == DIM_STAT
|| var == INTENT_STMT
|| var == EXTERN_STAT)
{
bool empty = filterFromList(st, idents);
if (empty)
{
toExtract.push_back(st);
st = st->lexNext();
continue;
}
}
else if (!isDVM_stat(st) && !isSPF_stat(st))
toExtract.push_back(st);
if (st->variant() == CONTAINS_STMT)
break;
st = st->lexNext();
}
for (auto& elem : toExtract)
elem->extractStmt();
string retVal = copy->unparse();
if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return retVal;
}
static void insertInterface(SgStatement* func, const string& iface, const string& fName)
{
string oldFile = current_file->filename();
if (!func->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
SgStatement* st = func->lexNext();
SgStatement* last = func->lastNodeOfStmt();
while (st != last)
{
if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90)
{
bool empty = filterFromList(st, { fName }, true);
if (empty)
{
SgStatement* next = st->lexNext();
st->extractStmt();
st = next;
continue;
}
}
if (isSgExecutableStatement(st))
break;
st = st->lexNext();
}
SgStatement* ifaceBlock = new SgStatement(INTERFACE_STMT);
addControlEndToStmt(ifaceBlock->thebif);
ifaceBlock->setlineNumber(getNextNegativeLineNumber()); // st->lineNumber()
ifaceBlock->setFileName(st->fileName());
st->insertStmtBefore(*ifaceBlock, *st->controlParent());
ifaceBlock->lastNodeOfStmt()->addComment(iface.c_str());
if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
}
static LoopGraph* getParallelLoop(LoopGraph* loop)
{
auto prev_st = loop->loop->lexPrev();
@@ -1024,7 +1172,7 @@ static bool isPure(SgStatement* func)
void DvmhRegionInserter::createInterfaceBlockForOutCall(FuncInfo* func, FuncInfo* callFrom)
{
insertInterface(func->funcPointer, callFrom);
insertInterface(func->funcPointer, getInterfaceBlock(callFrom->funcPointer->GetOriginal(), callFrom->funcParams), callFrom->funcName);
}
void DvmhRegionInserter::createInterfaceBlockForParallelFunctions(bool onlyRoutine)
@@ -1298,9 +1446,6 @@ static set<DIST::Array*>
declStat = SgStatement::getStatementByFileAndLine(decl.first, decl.second);
if (declStat == NULL) // check in inlcudes
{
if (!main->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
for (auto st = main; st != main->lastNodeOfStmt() && !declStat; st = st->lexNext())
{
if (st->fileName() == decl.first && st->lineNumber() == decl.second)
@@ -1312,7 +1457,7 @@ static set<DIST::Array*>
}
else
{
declStat = getFuncStat(declStat, { BLOCK_DATA });
declStat = getFuncStat(declStat);
if (declStat != main)
{
declStat = NULL;

View File

@@ -779,20 +779,6 @@ static void checkSpecList(SgExpression *spec, FuncInfo* currF, const map<string,
}
}
static void checkInTypeDescription(SgExpression *ex, FuncInfo* currF, const map<string, int>& parNames)
{
if (ex)
{
if (ex->variant() == ARRAY_REF)
fillIn(currF, ex->lhs(), parNames, false);
else
{
checkInTypeDescription(ex->lhs(), currF, parNames);
checkInTypeDescription(ex->rhs(), currF, parNames);
}
}
}
static void fillInOut(FuncInfo *currF, SgStatement *start, SgStatement *last, const set<SgStatement*>& activeOps)
{
if (currF->funcParams.countOfPars == 0)
@@ -813,12 +799,7 @@ static void fillInOut(FuncInfo *currF, SgStatement *start, SgStatement *last, co
if (st->variant() == ENTRY_STAT)
continue;
if (isSgExecutableStatement(st) == NULL) {
checkInTypeDescription(st->expr(0), currF, parNames);
continue;
}
if (st->lineNumber() <= 0)
if (isSgExecutableStatement(st) == NULL || st->lineNumber() <= 0)
continue;
if (activeOps.size() && activeOps.find(st) == activeOps.end())

View File

@@ -31,7 +31,7 @@
#include "../DirectiveProcessing/directive_parser.h"
#include "../DynamicAnalysis/gCov_parser_func.h"
#include "VectorAssignToLoop/array_assign_to_loop.h"
#include "../Transformations/VectorAssignToLoop/array_assign_to_loop.h"
using std::vector;
using std::map;

View File

@@ -0,0 +1,281 @@
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iostream>
#include <stack>
#include "../CFGraph/IR.h"
#include "GraphCall/graph_calls.h"
#include "implicit_loops_analyzer.h"
using namespace std;
using namespace SAPFOR;
using std::map;
using std::set;
using std::vector;
using std::pair;
using std::string;
using std::cout;
using std::endl;
using std::make_pair;
using std::to_string;
enum VisitState { UNVISITED = 0, VISITING = 1, VISITED = 2 };
void dfs(SAPFOR::BasicBlock* block,
std::map<int, int>& visit,
std::vector<std::pair<SAPFOR::BasicBlock*, SAPFOR::BasicBlock*>>& startAndEnd,
SAPFOR::BasicBlock* prev)
{
if (!block)
return;
int id = block->getNumber();
if (visit[id] == VISITING) {
startAndEnd.emplace_back(prev, block);
return;
}
if (visit[id] == VISITED)
return;
visit[id] = VISITING;
for (auto next : block->getNext())
dfs(next, visit, startAndEnd, block);
visit[id] = VISITED;
}
void getLoopBody(SAPFOR::BasicBlock* loopHeader, const std::set<SAPFOR::BasicBlock*>& loopExits, std::vector<SAPFOR::BasicBlock*>& loopBody)
{
std::set<SAPFOR::BasicBlock*> visited;
std::stack<SAPFOR::BasicBlock*> stack;
stack.push(loopHeader);
while (!stack.empty())
{
auto block = stack.top();
stack.pop();
if (visited.count(block))
continue;
visited.insert(block);
for (auto succ : block->getNext())
{
if (loopExits.count(succ))
continue;
if (!visited.count(succ))
stack.push(succ);
}
}
std::set<SAPFOR::BasicBlock*> backReachable;
std::stack<SAPFOR::BasicBlock*> reverseStack;
reverseStack.push(loopHeader);
while (!reverseStack.empty())
{
auto block = reverseStack.top();
reverseStack.pop();
if (backReachable.count(block))
continue;
backReachable.insert(block);
for (auto pred : block->getPrev())
if (visited.count(pred) && !backReachable.count(pred))
reverseStack.push(pred);
}
for (auto block : visited)
if (backReachable.count(block))
loopBody.push_back(block);
}
SAPFOR::Instruction* findDef(const SAPFOR::Argument* arg,
const std::vector<SAPFOR::BasicBlock*>& blocks)
{
if (!arg)
return nullptr;
std::string argName = arg->getValue();
for (auto block : blocks) {
for (auto instrWrapper : block->getInstructions()) {
auto instr = instrWrapper->getInstruction();
if (!instr)
continue;
auto res = instr->getResult();
if (!res)
continue;
if (res->getValue() == argName)
return instr;
}
}
return nullptr;
}
const SAPFOR::Argument* getBaseSource(const SAPFOR::Argument* arg, const std::vector<SAPFOR::BasicBlock*>& blocks)
{
while (arg && arg->getType() == CFG_ARG_TYPE::REG)
{
auto defInstr = findDef(arg, blocks);
if (!defInstr)
break;
auto defOp = defInstr->getOperation();
if (defOp == CFG_OP::ASSIGN)
arg = defInstr->getArg1();
else
break;
}
return arg;
}
void findInductiveVars(const std::vector<SAPFOR::BasicBlock*>& Loopblocks, const std::vector<SAPFOR::BasicBlock*>& blocks)
{
std::set<std::string> inductiveVars;
for (auto block : Loopblocks)
{
for (auto instrWrapper : block->getInstructions())
{
auto instr = instrWrapper->getInstruction();
if (!instr)
continue;
auto res = instr->getResult();
if (!res || res->getType() != SAPFOR::CFG_ARG_TYPE::VAR)
continue;
while (instr && instr->getOperation() == CFG_OP::ASSIGN)
instr = findDef(instr->getArg1(), blocks);
if (!instr || instr->getOperation() != CFG_OP::ADD && instr->getOperation() != CFG_OP::SUBT)
continue;
auto arg1 = getBaseSource(instr->getArg1(), blocks);
auto arg2 = getBaseSource(instr->getArg2(), blocks);
bool ok = false;
if (res->getValue() == arg1->getValue() && arg2->getType() == CFG_ARG_TYPE::CONST)
ok = true;
else if (res->getValue() == arg2->getValue() && arg1->getType() == CFG_ARG_TYPE::CONST)
ok = true;
if (ok)
inductiveVars.insert(res->getValue());
}
}
if (inductiveVars.empty())
std::cout << "No inductive variables found." << std::endl;
else
for (const auto& var : inductiveVars)
std::cout << "Inductive variable: " << var << std::endl;
}
Instruction* findInstructionAfterLoop(const std::vector<SAPFOR::BasicBlock*>& loopBody)
{
std::set<SAPFOR::BasicBlock*> loopSet(loopBody.begin(), loopBody.end());
for (auto block : loopBody)
{
for (auto succ : block->getNext())
{
if (!loopSet.count(succ))
{
auto instructions = succ->getInstructions();
if (instructions.empty())
std::cout << "Exit block has no instructions." << std::endl;
for (auto wrapper : instructions)
if (auto instr = wrapper->getInstruction())
return instr;
}
}
}
return nullptr;
}
void findImplicitLoops(const std::vector<SAPFOR::BasicBlock*>& irSSA, const std::vector<LoopGraph*> loopGraph)
{
map<int, int> visited;
for (auto i : irSSA)
visited[i->getNumber()] = UNVISITED;
vector<pair<SAPFOR::BasicBlock*, SAPFOR::BasicBlock*>> startAndEnd;
dfs(irSSA[0], visited, startAndEnd, NULL);
vector<LoopGraph*> loops;
for (auto& [tail, header] : startAndEnd)
{
set<SAPFOR::BasicBlock*> loopExits;
for (auto succ : tail->getNext())
if (succ != header)
loopExits.insert(succ);
vector<SAPFOR::BasicBlock*> loopBody;
getLoopBody(header, loopExits, loopBody);
findInductiveVars(loopBody, irSSA);
Instruction* instructionAfterLoop = findInstructionAfterLoop(loopBody);
if (instructionAfterLoop == NULL)
{
cout << "Warning: instruction after loop not found!" << endl;
continue;
}
auto firstInstruction = header->getInstructions()[0]->getInstruction();
auto lastInstruction = tail->getInstructions().back()->getInstruction();
auto tmpLoop = new LoopGraph();
tmpLoop->lineNum = firstInstruction->getOperator()->lineNumber();
tmpLoop->lineNumAfterLoop = instructionAfterLoop->getOperator()->lineNumber();
if (firstInstruction->getOperator()->variant() == FOR_NODE)
{
SgForStmt* stmt = isSgForStmt(firstInstruction->getOperator());
cout << "for loop" << endl;
}
else if (firstInstruction->getOperator()->variant() == WHILE_NODE)
{
SgWhileStmt* stmt = isSgWhileStmt(firstInstruction->getOperator());
cout << (stmt->conditional() == NULL ? "infinit" : "") << "while loop" << endl;
}
else if (firstInstruction->getOperator()->variant() == DO_WHILE_NODE)
{
SgWhileStmt* stmt = isSgDoWhileStmt(firstInstruction->getOperator());
cout << "do while loop" << endl;
}
else if (firstInstruction->getOperator()->variant() == LOOP_NODE)
{
cout << "not known loop" << endl;
}
else
{
cout << "goto loop" << endl;
}
cout << "loop start line " << tmpLoop->lineNum << endl;
cout << "after loop line " << tmpLoop->lineNumAfterLoop << endl << endl;
loops.push_back(tmpLoop);
}
}

View File

@@ -0,0 +1,7 @@
#pragma once
#include <map>
#include "../CFGraph/CFGraph.h"
#include "../GraphCall/graph_calls.h"
void findImplicitLoops(const std::vector<SAPFOR::BasicBlock*>& fullIR_SSA, const std::vector<LoopGraph*> loopGraph);

View File

@@ -48,7 +48,7 @@ extern int passDone;
#include "../VisualizerCalls/get_information.h"
#include "../VisualizerCalls/SendMessage.h"
#include "LoopEndDoConverter/enddo_loop_converter.h"
#include "../Transformations/LoopEndDoConverter/enddo_loop_converter.h"
#include "../DirectiveProcessing/remote_access.h"
#include "../DirectiveProcessing/directive_omp_parser.h"

View File

@@ -18,7 +18,7 @@
#include "../DirectiveProcessing/insert_directive.h"
#include "SgUtils.h"
#include "expr_transform.h"
#include "FunctionPurifying/function_purifying.h"
#include "../Transformations/FunctionPurifying/function_purifying.h"
using std::map;
using std::pair;

View File

@@ -121,7 +121,7 @@ static void SolveDataFlow(Region* DFG)
Collapse(DFG);
}
map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR)
map<LoopGraph*, ArrayAccessingIndexes> findPrivateArrays(map<string, vector<LoopGraph*>> &loopGraph, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR)
{
map<LoopGraph*, ArrayAccessingIndexes> result;
for (const auto& [loopName, loops] : loopGraph)

View File

@@ -10,5 +10,5 @@
#include "../CFGraph/CFGraph.h"
void Collapse(Region* region);
std::map<LoopGraph*, ArrayAccessingIndexes> FindPrivateArrays(std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR);
std::map<LoopGraph*, ArrayAccessingIndexes> findPrivateArrays(std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR);
std::pair<SAPFOR::BasicBlock*, std::unordered_set<SAPFOR::BasicBlock*>> GetBasicBlocksForLoop(const LoopGraph* loop, const std::vector<SAPFOR::BasicBlock*> blocks);

View File

@@ -40,6 +40,7 @@
#include "ProjectManipulation/ConvertFiles.h"
#include "LoopAnalyzer/loop_analyzer.h"
#include "LoopAnalyzer/implicit_loops_analyzer.h"
#include "GraphCall/graph_calls_func.h"
#include "GraphLoop/graph_loops_func.h"
@@ -95,6 +96,7 @@
#include "CFGraph/IR.h"
#include "CFGraph/RD_subst.h"
#include "CFGraph/CFGraph.h"
#include "CFGraph/IR_SSAForm.h"
#include "CFGraph/live_variable_analysis.h"
#include "CFGraph/private_variables_analysis.h"
@@ -1019,8 +1021,19 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
if(func->funcPointer->variant() != ENTRY_STAT)
countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks);
}
else if (curr_regime == BUILD_IR_SSA_FORM)
{
auto irFound = getIRByFilename(fullIR, file_name);
buildFuncIRSSAForm(irFound, fullIR[irFound], fullIR_SSA);
}
else if (curr_regime == FIND_IMPLICIT_LOOPS)
{
auto itFound = loopGraph.find(file_name);
auto irFound = getIRByFilename(fullIR_SSA, file_name);
findImplicitLoops(fullIR_SSA[irFound], itFound->second);
}
else if (curr_regime == FIND_PRIVATE_ARRAYS)
FindPrivateArrays(loopGraph, fullIR);
findPrivateArrays(loopGraph, fullIR);
else if (curr_regime == TEST_PASS)
{
//test pass
@@ -1281,6 +1294,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
detectCopies(allFuncInfo);
fillInterfaceBlock(allFuncInfo);
intentInsertToInterfaces(allFuncInfo);
createInterfacesForAssumedSize(allFuncInfo);
//this call is only for testing
//setPureStatus(allFuncInfo);
@@ -1914,8 +1928,6 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
calculateStatsForPredictor(allFuncInfo, gCovInfo);
parseDvmDirForPredictor(declaredArrays, commonBlocks, allFuncInfo, gCovInfo);
}
else if (curr_regime == TRANSFORM_ASSUMED_SIZE_PARAMETERS)
transformAssumedSizeParameters(allFuncInfo);
const float elapsed = duration_cast<milliseconds>(high_resolution_clock::now() - timeForPass).count() / 1000.;
const float elapsedGlobal = duration_cast<milliseconds>(high_resolution_clock::now() - globalTime).count() / 1000.;
@@ -2151,8 +2163,6 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam
runAnalysis(*project, REMOVE_COPIES, false);
runAnalysis(*project, SWAP_LOOPS, false);
runPass(TRANSFORM_ASSUMED_SIZE_PARAMETERS, proj_name, folderName);
if (folderName || consoleMode)
runAnalysis(*project, UNPARSE_FILE, true, additionalName.c_str(), folderName);
}
@@ -2635,10 +2645,7 @@ int main(int argc, char **argv)
}
if (curr_regime == INSERT_PARALLEL_DIRS_NODIST)
{
ignoreArrayDistributeState = true;
sharedMemoryParallelization = 1;
}
if (runAsClient)
{

View File

@@ -182,11 +182,11 @@ enum passes {
SET_IMPLICIT_NONE,
RENAME_INLCUDES,
FIND_IMPLICIT_LOOPS,
BUILD_IR_SSA_FORM,
FIND_PRIVATE_ARRAYS,
TRANSFORM_ASSUMED_SIZE_PARAMETERS,
TEST_PASS,
EMPTY_PASS
};
@@ -371,10 +371,10 @@ static void setPassValues()
passNames[SET_IMPLICIT_NONE] = "SET_IMPLICIT_NONE";
passNames[RENAME_INLCUDES] = "RENAME_INLCUDES";
passNames[INSERT_NO_DISTR_FLAGS_FROM_GUI] = "INSERT_NO_DISTR_FLAGS_FROM_GUI";
passNames[FIND_IMPLICIT_LOOPS] = "FIND_IMPLICIT_LOOPS";
passNames[BUILD_IR_SSA_FORM] = "BUILD_IR_SSA_FORM";
passNames[FIND_PRIVATE_ARRAYS] = "FIND_PRIVATE_ARRAYS";
passNames[TRANSFORM_ASSUMED_SIZE_PARAMETERS] = "TRANSFORM_ASSUMED_SIZE_PARAMETERS";
passNames[TEST_PASS] = "TEST_PASS";
}

View File

@@ -181,3 +181,7 @@ bool passNamesWasInit = false;
std::map<PTR_BFND, std::pair<std::string, int>> sgStats;
std::map<PTR_LLND, std::pair<std::string, int>> sgExprs;
//for FIND_IMPLICIT_LOOPS and BUILD_IR_SSA_FORM
map<FuncInfo*, vector<SAPFOR::BasicBlock*>> fullIR_SSA;
//

View File

@@ -136,41 +136,33 @@ void createInterfacesForOutCalls(FuncInfo* func)
}
}
static bool changeIfHasStarRange(SgExpression* arrayDecl, SgStatement* scope, vector<SgSymbol*>& parNames)
static bool changeIfHasStarRange(SgExpression* arrayDecl, bool doReplace = false)
{
SgExpression* list = arrayDecl->lhs();
string varN = arrayDecl->symbol()->identifier() + string("_sz");
bool has = false;
bool has = doReplace;
SgExpression* allDimsBefore = NULL;
while (list)
{
const int var = list->lhs()->variant();
if (var == STAR_RANGE)
{
has = true;
parNames.push_back(new SgSymbol(VARIABLE_NAME, varN.c_str(), SgTypeInt(), scope));
SgExpression* par = allDimsBefore ? &(*new SgVarRefExp(parNames.back()) / *allDimsBefore) : (new SgVarRefExp(parNames.back()));
list->setLhs(par);
break;
}
else
{
if (allDimsBefore == NULL)
allDimsBefore = list->lhs();
else
allDimsBefore = &(*allDimsBefore * *list->lhs()->copyPtr());
}
list = list->rhs();
}
if (has)
{
list = arrayDecl->lhs();
while (list)
{
list->setLhs(new SgExpression(DDOT));
list = list->rhs();
}
}
return has;
}
/*static void removeExternalStat(SgStatement* func, const set<string>& addedInterfaceFor)
static void removeExternalStat(SgStatement* func, const set<string>& addedInterfaceFor)
{
vector<SgStatement*> toRem;
for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext())
@@ -205,7 +197,7 @@ static bool changeIfHasStarRange(SgExpression* arrayDecl, SgStatement* scope, ve
for (auto& rem : toRem)
rem->deleteStmt();
}*/
}
template<typename T>
static vector<FuncInfo*> sortByName(const T &funcs)
@@ -218,25 +210,9 @@ static vector<FuncInfo*> sortByName(const T &funcs)
return funcList;
}
static bool hasDvmParallel(SgStatement *func)
void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFuncInfo)
{
for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext())
{
const int var = st->variant();
if (var == DVM_PARALLEL_ON_DIR || var == ACC_REGION_DIR ||
var == ACC_ACTUAL_DIR || var == ACC_GET_ACTUAL_DIR)
return true;
if (st->variant() == CONTAINS_STMT)
break;
}
return false;
}
void transformAssumedSizeParameters(const map<string, vector<FuncInfo*>>& allFuncInfo)
{
map<string, vector<int>> assumedSizeArraysByFunc;
set<FuncInfo*> hasAssumedSizeArrays;
for (auto& funcByFile : allFuncInfo)
{
@@ -249,12 +225,6 @@ void transformAssumedSizeParameters(const map<string, vector<FuncInfo*>>& allFun
if (prog == NULL)
continue;
if (!hasDvmParallel(prog))
continue;
vector<SgSymbol*> parNames;
SgStatement* scope = prog->getScopeForDeclare();
vector<SgExpression*> arrayRefs;
bool hasRefs = false;
for (int z = 0; z < func->funcParams.countOfPars; ++z)
@@ -274,8 +244,13 @@ void transformAssumedSizeParameters(const map<string, vector<FuncInfo*>>& allFun
{
if (list->lhs() && list->lhs()->symbol()->identifier() == name)
{
if (changeIfHasStarRange(list->lhs(), scope, parNames))
assumedSizeArraysByFunc[func->funcName].push_back(z);
if (changeIfHasStarRange(list->lhs()))
{
hasRefs = true;
hasAssumedSizeArrays.insert(func);
}
else
arrayRefs.push_back(list->lhs());
break;
}
list = list->rhs();
@@ -284,20 +259,13 @@ void transformAssumedSizeParameters(const map<string, vector<FuncInfo*>>& allFun
}
}
if (parNames.size())
{
SgProcHedrStmt* proc = isSgProcHedrStmt(func->funcPointer->GetOriginal());
checkNull(proc, convertFileName(__FILE__).c_str(), __LINE__);
//makeDeclaration(parNames, scope);
for (auto& newPar : parNames)
proc->AddArg(*new SgVarRefExp(newPar));
}
if (hasRefs)
for (auto& ref : arrayRefs)
changeIfHasStarRange(ref, true);
}
}
if (assumedSizeArraysByFunc.size() == 0)
if (hasAssumedSizeArrays.size() == 0)
return;
for (auto& funcByFile : allFuncInfo)
@@ -305,60 +273,26 @@ void transformAssumedSizeParameters(const map<string, vector<FuncInfo*>>& allFun
if (SgFile::switchToFile(funcByFile.first) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
SgSymbol* funcSize = new SgSymbol(FUNCTION_NAME, "size");
for (auto& func : sortByName(funcByFile.second))
{
SgProgHedrStmt* prog = isSgProgHedrStmt(func->funcPointer->GetOriginal());
if (prog == NULL)
continue;
for (auto& detailedCall : func->callsFromDetailed)
set<string> addedInterfaceFor;
for (auto& elem : sortByName(func->callsFromV))
{
auto it = assumedSizeArraysByFunc.find(detailedCall.detailCallsFrom.first);
if (it != assumedSizeArraysByFunc.end())
auto it = hasAssumedSizeArrays.find(elem);
if (it != hasAssumedSizeArrays.end())
{
auto pointer = detailedCall.pointerDetailCallsFrom;
SgExpression* list = NULL;
if (pointer.second == FUNC_CALL)
{
SgExpression* p = (SgExpression*)pointer.first;
list = p->lhs();
}
else
{
SgStatement* p = (SgStatement*)pointer.first;
list = p->expr(0);
}
SgExpression* last = list;
vector<SgExpression*> pars;
while (list)
{
last = list;
pars.push_back(list->lhs());
list = list->rhs();
}
for (int z = 0; z < it->second.size(); ++z)
{
int parNum = it->second[z];
if (parNum >= pars.size())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
//TODO: need to do it better
SgExpression* parArray = pars[parNum]->copyPtr();
parArray->setLhs(NULL);
parArray->setRhs(NULL);
SgFunctionCallExp* call = new SgFunctionCallExp(*funcSize, *parArray);
last->setRhs(new SgExpression(EXPR_LIST, call));
last = last->rhs();
}
auto callFrom = *it;
DvmhRegionInserter::createInterfaceBlockForOutCall(func, callFrom);
addedInterfaceFor.insert(callFrom->funcName);
}
}
if (addedInterfaceFor.size())
removeExternalStat(prog, addedInterfaceFor);
}
}
}
@@ -1454,37 +1388,6 @@ static string makeName(SgSymbol* var, map<SgSymbol*, set< SgSymbol*>>& modVarsTo
return name;
}
static bool filterFromList(SgStatement* st, const set<string>& idents, bool exclude = false)
{
bool empty = false;
SgExpression* list = st->expr(0);
vector<SgExpression*> newList;
int total = 0;
while (list)
{
if (exclude)
{
if (idents.find(list->lhs()->symbol()->identifier()) == idents.end())
newList.push_back(list->lhs());
}
else
{
if (idents.find(list->lhs()->symbol()->identifier()) != idents.end())
newList.push_back(list->lhs());
}
total++;
list = list->rhs();
}
if (newList.size() == 0)
empty = true;
else if (total != newList.size())
st->setExpression(0, makeExprList(newList));
return empty;
}
static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
{
string oldFile = current_file->filename();
@@ -1492,21 +1395,22 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto copy = duplicateProcedure(func, NULL, false, false, false, true);
const set<string> idents(pars.identificators.begin(), pars.identificators.end());
const set<string> ident(pars.identificators.begin(), pars.identificators.end());
//remove all exec
SgStatement* st = copy->lexNext();
SgStatement* last = copy->lastNodeOfStmt();
vector<SgStatement*> toExtract;
while (st != last)
{
if (isDVM_stat(st) || isSPF_stat(st))
{
if (st->variant() != ACC_ROUTINE_DIR)
{
toExtract.push_back(st);
st = st->lexNext();
SgStatement* next = st->lexNext();
st->extractStmt();
st = next;
}
else
st = st->lexNext();
@@ -1527,20 +1431,31 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
st = copy->lexNext();
while (st != last)
{
const int var = st->variant();
if (st->variant() == VAR_DECL
|| st->variant() == VAR_DECL_90
|| st->variant() == DIM_STAT
|| st->variant() == INTENT_STMT)
{
SgExpression* list = st->expr(0);
vector<SgExpression*> newList;
while (list)
{
if (ident.find(list->lhs()->symbol()->identifier()) != ident.end())
newList.push_back(list->lhs());
list = list->rhs();
}
if (var == VAR_DECL || var == VAR_DECL_90 || var == DIM_STAT ||
var == INTENT_STMT || var == EXTERN_STAT)
{
bool empty = filterFromList(st, idents);
if (empty)
if (newList.size() == 0)
{
SgStatement* next = st->lexNext();
toExtract.push_back(st);
st = st->lexNext();
st = next;
continue;
}
else
st->setExpression(0, makeExprList(newList));
}
else if (!isDVM_stat(st) && !isSPF_stat(st))
else
toExtract.push_back(st);
if (st->variant() == CONTAINS_STMT)
@@ -1551,56 +1466,16 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
for (auto& elem : toExtract)
elem->extractStmt();
string codeString = copy->unparse();
string retVal = copy->unparse();
if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
//insert tabs
const string tab = " ";
const int countEnds = std::count(codeString.begin(), codeString.end(), '\n');
string retVal = " ";
retVal.reserve(retVal.size() + codeString.size() + countEnds * tab.size());
for (int z = 0, ends = 0; z < codeString.size(); ++z)
{
retVal += codeString[z];
if (codeString[z] == '\n')
{
ends++;
if (ends == countEnds)
continue;
int p = z + 1;
while (codeString[p] == ' ' && p < codeString.size())
++p;
auto start = p;
auto end = string::npos;
auto sub = codeString.find("subroutine", p);
auto func = codeString.find("function", p);
auto end_sub = codeString.find("end subroutine", p);
auto end_func = codeString.find("end function", p);
if (sub != end && sub == start || end_sub != end && end_sub == start ||
func != end && func == start || end_func != end && end_func == start)
{
retVal += " ";
}
else
retVal += tab;
}
}
return retVal;
}
void insertInterface(SgStatement* func, const FuncInfo *callFrom)
static void insertInterface(SgStatement* func, const string& iface)
{
const string& iface = getInterfaceBlock(callFrom->funcPointer->GetOriginal(), callFrom->funcParams);
const string& fName = callFrom->funcName;
string oldFile = current_file->filename();
if (!func->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
@@ -1609,18 +1484,6 @@ void insertInterface(SgStatement* func, const FuncInfo *callFrom)
SgStatement* last = func->lastNodeOfStmt();
while (st != last)
{
if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90)
{
bool empty = filterFromList(st, { fName }, true);
if (empty)
{
SgStatement* next = st->lexNext();
st->extractStmt();
st = next;
continue;
}
}
if (isSgExecutableStatement(st))
break;
st = st->lexNext();
@@ -1628,7 +1491,7 @@ void insertInterface(SgStatement* func, const FuncInfo *callFrom)
SgStatement* ifaceBlock = new SgStatement(INTERFACE_STMT);
addControlEndToStmt(ifaceBlock->thebif);
ifaceBlock->setlineNumber(getNextNegativeLineNumber());
ifaceBlock->setlineNumber(st->lineNumber());
ifaceBlock->setFileName(st->fileName());
st->insertStmtBefore(*ifaceBlock, *st->controlParent());
ifaceBlock->lastNodeOfStmt()->addComment(iface.c_str());
@@ -1644,7 +1507,7 @@ static void createInterfaceBlockForToCalls(FuncInfo* func)
if (callTo->interfaceBlocks.find(func->funcName) == callTo->interfaceBlocks.end())
{
callTo->interfaceBlocks[func->funcName] = func;
insertInterface(callTo->funcPointer, func);
insertInterface(callTo->funcPointer, getInterfaceBlock(func->funcPointer->GetOriginal(), func->funcParams));
}
}
}

View File

@@ -6,6 +6,7 @@ bool checkOutCalls(const std::set<std::string>& outCalls);
std::map<SgStatement*, std::set<std::string>> fillFromIntent(SgStatement* header);
void intentInsert(const std::vector<FuncInfo*>& allFuncInfo);
void intentInsertToInterfaces(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
void createInterfacesForAssumedSize(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
void createInterfacesForOutCalls(FuncInfo* func);
void setPureStatus(const std::set<FuncInfo*>& funcInfo);
void setPureStatus(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
@@ -13,7 +14,3 @@ void setPureStatus(const std::map<std::string, std::vector<FuncInfo*>>& allFuncI
void commonTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, CommonBlock*>& commonBlocks);
void saveTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
void moduleTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
void insertInterface(SgStatement* func, const FuncInfo* callFrom);
void transformAssumedSizeParameters(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);

View File

@@ -17,83 +17,6 @@ using std::pair;
#define DEBUG_TRACE 0
static bool findAlloatableKeyword(SgExpression* exp)
{
if (exp)
{
if (exp->variant() == ALLOCATABLE_OP)
return true;
return findAlloatableKeyword(exp->lhs()) || findAlloatableKeyword(exp->rhs());
}
return false;
}
static bool checkDynamicArray(DIST::Array *array)
{
for (const auto &bounds : array->GetSizes())
if (bounds.first == -1 || bounds.second == -1)
return true;
return false;
}
static SgExpression* findExprWithVariant(SgExpression* exp, int variant)
{
if (exp)
{
if (exp->variant() == variant)
return exp;
auto *l = findExprWithVariant(exp->lhs(), variant);
if (l)
return l;
auto *r = findExprWithVariant(exp->rhs(), variant);
if (r)
return r;
}
return NULL;
}
static bool checkAssumedSize(SgStatement *st, const string &arrayName, const string &currentFile)
{
bool found = false;
DIST::Array* array_p = getArrayFromDeclarated(st, arrayName);
auto place = *array_p->GetDeclInfo().begin();
auto decl_file_name = place.first;
SgFile::switchToFile(decl_file_name);
SgExpression* list = st->expr(0);
while (list)
{
if (list->lhs() && list->lhs()->symbol()->identifier() == arrayName)
{
if(findExprWithVariant(list->lhs(), STAR_RANGE))
found = true;
break;
}
}
if (!found)
{
auto *dim_expr = findExprWithVariant(st->expr(2), DIMENSION_OP);
if (dim_expr && findExprWithVariant(dim_expr, STAR_RANGE))
found = true;
}
SgFile::switchToFile(currentFile);
return found;
}
static void findArrays(SgExpression* exp, set<SgSymbol*>& arrays)
{
if (exp)
@@ -106,7 +29,7 @@ static void findArrays(SgExpression* exp, set<SgSymbol*>& arrays)
}
}
static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& arrays, SgStatement* stat, const string& current_file)
static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& arrays, SgStatement* stat)
{
auto var = stat->variant();
@@ -151,7 +74,10 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
{
SgExpression* fmt = stat->expr(1);
if (!fmt || fmt->variant() != SPEC_PAIR || fmt->lhs()->variant() != KEYWORD_VAL)
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
if (fmt->rhs()->variant() != KEYWORD_VAL || fmt->rhs()->sunparse() != "*")
need_replace = true;
@@ -178,7 +104,10 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
{
auto *kv = spec->lhs();
if (!kv || kv->variant() != SPEC_PAIR || !kv->rhs())
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
if (kv->rhs()->variant() != KEYWORD_VAL || kv->rhs()->sunparse() != "*")
{
@@ -207,15 +136,9 @@ static void populateDistributedIoArrays(map<SgSymbol*, set<SgStatement*>>& array
{
string array_name = string(by_symb->identifier());
DIST::Array* array_p = getArrayFromDeclarated(declaratedInStmt(by_symb), array_name);
if (array_p &&
array_p->GetDistributeFlagVal() == Distribution::distFlag::IO_PRIV &&
!checkAssumedSize(declaratedInStmt(by_symb), array_name, current_file) &&
arrays[by_symb].insert(stat).second
)
{
if (array_p && array_p->GetDistributeFlagVal() == Distribution::distFlag::IO_PRIV && arrays[by_symb].insert(stat).second)
__spf_print(DEBUG_TRACE, "[%d]: add array %s\n", stat->lineNumber(), array_p->GetName().c_str());
}
}
__spf_print(DEBUG_TRACE, "[replace]\n");
}
@@ -287,12 +210,7 @@ static void replaceArrayRec(SgSymbol* arr, SgSymbol* replace_by, SgStatement* st
}
}
static void copyArrayBetweenStatements(SgSymbol* replace_symb,
SgSymbol* replace_by,
SgStatement* start,
SgStatement* last,
bool start_is_scope,
FuncInfo *func_info)
static void copyArrayBetweenStatements(SgSymbol* replace_symb, SgSymbol* replace_by, SgStatement* start, SgStatement* last, bool start_is_scope)
{
while (start->lexNext() && !isSgExecutableStatement(start->lexNext()))
start = start->lexNext();
@@ -315,18 +233,6 @@ static void copyArrayBetweenStatements(SgSymbol* replace_symb,
start->insertStmtAfter(*assign, *parent);
}
if (has_write)
{
for (int i = 0; i < func_info->funcParams.identificators.size(); i++)
{
if (func_info->funcParams.identificators[i] == replace_symb->identifier())
{
has_write &= func_info->funcParams.isArgOut(i);
break;
}
}
}
if (has_write)
{
// A = A_reg
@@ -337,15 +243,9 @@ static void copyArrayBetweenStatements(SgSymbol* replace_symb,
}
}
static void replaceArrayInFragment(SgSymbol* replace_symb,
const set<SgStatement*> usages,
SgSymbol* replace_by,
SgStatement* start,
SgStatement* last,
FuncInfo *func_info,
const string& filename)
static void replaceArrayInFragment(SgSymbol* replace_symb, const set<SgStatement*> usages, SgSymbol* replace_by, SgStatement* start, SgStatement* last, const string& filename)
{
while (start->lexNext() && (!isSgExecutableStatement(start->lexNext()) || start->lexNext()->variant() == ALLOCATE_STMT))
while (start->lexNext() && !isSgExecutableStatement(start->lexNext()))
start = start->lexNext();
set<SgStatement*> not_opened, not_closed, copied;
@@ -412,7 +312,7 @@ static void replaceArrayInFragment(SgSymbol* replace_symb,
}
__spf_print(DEBUG_TRACE, "[copy %s] [%d, %d]\n", replace_symb->identifier(), scope_start->lineNumber(), scope_end->lineNumber());
copyArrayBetweenStatements(replace_symb, replace_by, scope_start, scope_end, copy_scope == scope_start, func_info);
copyArrayBetweenStatements(replace_symb, replace_by, scope_start, scope_end, copy_scope == scope_start);
copied.insert(copy_scope);
}
}
@@ -468,19 +368,12 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
{
const auto& filename = linesByFile.first;
if (SgFile::switchToFile(filename) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto func_info_it = allFuncInfo.find(filename);
if (func_info_it == allFuncInfo.end())
if (SgFile::switchToFile(filename) < 0)
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
auto *lbound_symb = new SgSymbol(PROCEDURE_NAME, "lbound");
auto *ubound_symb = new SgSymbol(PROCEDURE_NAME, "ubound");
for (auto& lines : linesByFile.second)
{
__spf_print(DEBUG_TRACE, "[fragment] %s: %d:%d %d\n", filename.c_str(), lines.lines.first,
@@ -490,6 +383,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
if (lines.isImplicit())
{
curr_stmt = current_file->SgStatementAtLine(lines.lines.first);
end = current_file->SgStatementAtLine(lines.lines.second);
@@ -505,7 +399,6 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
map<SgSymbol*, set<SgStatement*>> need_replace;
SgStatement* last_io_bound = NULL;
FuncInfo *current_func_info = NULL;
while (curr_stmt != end)
{
@@ -514,24 +407,9 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
auto var = curr_stmt->variant();
if (var == PROC_HEDR || var == PROG_HEDR || var == FUNC_HEDR)
{
current_func_info = NULL;
for (auto *func_info : func_info_it->second)
{
if (func_info->funcName == curr_stmt->symbol()->identifier())
{
current_func_info = func_info;
break;
}
}
if (!current_func_info)
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
curr_stmt = curr_stmt->lexNext();
while (curr_stmt && !isSgExecutableStatement(curr_stmt))
{
@@ -559,7 +437,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
const string locationName = array_p->GetLocation().second;
auto place = *array_p->GetDeclInfo().begin();
auto decl_file_name = place.first;
string fileName = place.first;
string suffix = "_io_l";
if (fromModule)
@@ -568,7 +446,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
pair<SgSymbol*, SgSymbol*> copied;
copied.first = array_to_copy;
if (SgFile::switchToFile(decl_file_name) == -1)
if (SgFile::switchToFile(fileName) == -1)
{
auto* func_stmt = curr_stmt->getScopeForDeclare();
@@ -604,7 +482,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
}
else
{
copied = copyArray(place, array_p, linesByFile.second, suffix + to_string(region->GetId()), decl_file_name, newDeclsToInclude, copied_syms);
copied = copyArray(place, array_p, linesByFile.second, suffix + to_string(region->GetId()), fileName, newDeclsToInclude, copied_syms);
}
SgStatement* decl = SgStatement::getStatementByFileAndLine(place.first, place.second);
@@ -625,124 +503,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
dir_str += "!$SPF ANALYSIS(PROCESS_PRIVATE(" + string(copied.second->identifier()) + "))\n";
decl->addComment(dir_str.c_str());
}
created_copies.insert({ array_to_copy, copied.second });
// make array-copy allocatable in case of main array shape not constant
if(checkDynamicArray(array_p))
{
// insert allocatable keyword in declaration
auto *kword_list = decl->expr(2);
if (!findAlloatableKeyword(kword_list))
{
if (!kword_list)
{
kword_list = new SgExprListExp();
decl->setExpression(2, *kword_list);
}
while (kword_list->rhs())
kword_list = kword_list->rhs();
if (kword_list->lhs())
{
kword_list->setRhs(new SgExprListExp());
kword_list = kword_list->rhs();
}
kword_list->setLhs(new SgExpression(ALLOCATABLE_OP));
}
// insert allocate(a_l(lbound(a, 1):ubound(a,1),...)) statement
SgFile::switchToFile(filename);
SgStatement* insertPlace = NULL;
auto* func_stmt = curr_stmt->getScopeForDeclare();
for (auto iterator = func_stmt->lexNext();
!isSgExecutableStatement(iterator) || isSPF_stat(iterator) &&
!(iterator->variant() == SPF_PARALLEL_REG_DIR || iterator->variant() == SPF_END_PARALLEL_REG_DIR);
iterator = iterator->lexNext())
{
insertPlace = iterator;
}
//NULL - no decl stats in function!
if (!insertPlace)
insertPlace = func_stmt;
auto st = insertPlace->controlParent();
if (st->variant() == GLOBAL)
st = insertPlace;
auto *stat = new SgStatement(ALLOCATE_STMT);
auto *created_array_ref = new SgArrayRefExp(*copied.second);
auto* dim_list = new SgExprListExp();
created_array_ref->setLhs(dim_list);
int dim_len = array_p->GetSizes().size();
for (int i = 1; i <= dim_len; i++)
{
auto *lcall = new SgFunctionCallExp(*lbound_symb);
auto *rcall = new SgFunctionCallExp(*ubound_symb);
for (auto *call : {lcall, rcall})
{
call->setLhs(new SgExprListExp());
call->lhs()->setLhs(new SgArrayRefExp(*array_to_copy));
call->lhs()->setRhs(new SgValueExp(i));
}
auto *dot_expr = new SgExpression(DDOT);
dot_expr->setLhs(lcall);
dot_expr->setRhs(rcall);
dim_list->setLhs(dot_expr);
if (i < dim_len)
{
auto *next = new SgExprListExp();
dim_list->setRhs(next);
dim_list = next;
}
}
stat->setExpression(0, created_array_ref);
insertPlace->insertStmtAfter(*stat, *st);
// insert deallocate statemens before all returns
auto *find_return_stmt = func_stmt;
while (find_return_stmt != func_stmt->lastNodeOfStmt())
{
auto *next = find_return_stmt->lexNext();
if (next && (isSgReturnStmt(next) || next == func_stmt->lastNodeOfStmt()))
{
if (next->hasLabel())
{
moveLabelBefore(next);
find_return_stmt = next->lexPrev();
}
auto *dealloc_stmt = new SgStatement(DEALLOCATE_STMT);
dealloc_stmt->setExpression(0, new SgExprListExp());
dealloc_stmt->expr(0)->setLhs(new SgArrayRefExp(*copied.second));
find_return_stmt->insertStmtAfter(*dealloc_stmt, *next->controlParent());
if (next == curr_stmt)
curr_stmt = dealloc_stmt;
}
find_return_stmt = next;
}
}
SgFile::switchToFile(filename);
}
}
@@ -754,9 +515,12 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
{
auto it = created_copies.find(p.first);
if (it != created_copies.end())
replaceArrayInFragment(p.first, p.second, it->second, last_io_bound, curr_stmt, current_func_info, filename);
replaceArrayInFragment(p.first, p.second, it->second, last_io_bound, curr_stmt, filename);
else
{
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return;
}
}
}
@@ -774,7 +538,7 @@ void replaceDistributedArraysInIO(vector<ParallelRegion*>& regions,
}
}
populateDistributedIoArrays(need_replace, curr_stmt, filename);
populateDistributedIoArrays(need_replace, curr_stmt);
curr_stmt = curr_stmt->lexNext();
}
}

View File

@@ -316,7 +316,9 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
list({ VERIFY_INCLUDES, CORRECT_VAR_DECL }) <= Pass(SET_IMPLICIT_NONE);
list({ CALL_GRAPH2, CALL_GRAPH, BUILD_IR, LOOP_GRAPH, LOOP_ANALYZER_DATA_DIST_S2 }) <= Pass(FIND_PRIVATE_ARRAYS);
list({ CALL_GRAPH, LOOP_GRAPH, CALL_GRAPH2, BUILD_IR }) <= Pass(BUILD_IR_SSA_FORM) <= Pass(FIND_IMPLICIT_LOOPS);
list({ CALL_GRAPH, LOOP_GRAPH, CALL_GRAPH2, BUILD_IR, LOOP_ANALYZER_DATA_DIST_S2 }) <= Pass(FIND_PRIVATE_ARRAYS);
passesIgnoreStateDone.insert({ CREATE_PARALLEL_DIRS, INSERT_PARALLEL_DIRS, INSERT_SHADOW_DIRS, EXTRACT_PARALLEL_DIRS,
EXTRACT_SHADOW_DIRS, CREATE_REMOTES, UNPARSE_FILE, REMOVE_AND_CALC_SHADOW,

View File

@@ -1,3 +1,3 @@
#pragma once
#define VERSION_SPF "2440"
#define VERSION_SPF "2432"