private_removing #47
@@ -20,11 +20,12 @@ using UsersDirectives = map<pair<string, int>, set<SgStatement*>>;
|
||||
// RegularExpr represents expressions like ( coefA * I + coefB ),
|
||||
// where I is a variable and coefA or coefB can be equal to zero
|
||||
struct RegularExpr {
|
||||
int coefA = 0;
|
||||
int coefA;
|
||||
int coefB;
|
||||
string var;
|
||||
SgSymbol* varSymbol;
|
||||
|
||||
RegularExpr(): coefA(0), coefB(0), var("") {}
|
||||
RegularExpr(): coefA(0), coefB(0), var(""), varSymbol(nullptr) {}
|
||||
|
||||
string toString() const
|
||||
{
|
||||
@@ -218,7 +219,10 @@ static bool checkAndFillRegularExpr(SgExpression* expr, RegularExpr& regularExpr
|
||||
regularExpr.coefA = retCoefs.first;
|
||||
regularExpr.coefB = retCoefs.second;
|
||||
if (!deleteTmpVar)
|
||||
{
|
||||
regularExpr.var = iterationVar->identifier();
|
||||
regularExpr.varSymbol = iterationVar;
|
||||
}
|
||||
|
||||
if (deleteTmpVar)
|
||||
delete iterationVar;
|
||||
@@ -236,7 +240,7 @@ static bool checkAndFillRegularExpr(SgExpression* expr, RegularExpr& regularExpr
|
||||
// getShortFixedSubscriptsVector returns vector of fixed INT_VAL subscripts of arrayRef
|
||||
static vector<int> getShortFixedSubscriptsVector(SgArrayRefExp* arrayRef,
|
||||
const vector<bool>& fixedDimensionsMask,
|
||||
Regime regime, vector<SgSymbol*> iterationVars)
|
||||
Regime regime)
|
||||
{
|
||||
if (regime == Regime::DEFLT)
|
||||
{
|
||||
@@ -251,14 +255,12 @@ static vector<int> getShortFixedSubscriptsVector(SgArrayRefExp* arrayRef,
|
||||
{
|
||||
vector<int> subscriptsVector;
|
||||
SgExprListExp* indexExprList = (SgExprListExp*)arrayRef->lhs();
|
||||
if (iterationVars.size() < indexExprList->length())
|
||||
return vector<int>{};
|
||||
|
||||
for (int i = 0; i < indexExprList->length(); ++i)
|
||||
{
|
||||
SgExpression* indexExpr = indexExprList->elem(i);
|
||||
RegularExpr regularExpr;
|
||||
if (!checkAndFillRegularExpr(indexExpr, regularExpr, iterationVars[i]))
|
||||
if (!checkAndFillRegularExpr(indexExpr, regularExpr, nullptr))
|
||||
return vector<int>{};
|
||||
|
||||
subscriptsVector.push_back(regularExpr.coefA);
|
||||
@@ -271,38 +273,15 @@ static vector<int> getShortFixedSubscriptsVector(SgArrayRefExp* arrayRef,
|
||||
return vector<int>{};
|
||||
}
|
||||
|
||||
static vector<int> getShortFixedSubscriptsVector(SgArrayRefExp* arrayRef, const PrivateToRemove& varToRemove)
|
||||
{
|
||||
vector<SgSymbol*> iterationVars;
|
||||
if (varToRemove.regime == Regime::REGULAR_INDEXES)
|
||||
{
|
||||
auto vars = varToRemove.arrayRefToIterationVarsMap.find(arrayRef);
|
||||
if (vars != varToRemove.arrayRefToIterationVarsMap.end())
|
||||
iterationVars = vars->second;
|
||||
}
|
||||
|
||||
return getShortFixedSubscriptsVector(arrayRef, varToRemove.fixedDimensions,
|
||||
varToRemove.regime, iterationVars);
|
||||
}
|
||||
|
||||
// removeDuplicateArrayRefs returns unique array refereces in fixed dimensions
|
||||
static vector<SgArrayRefExp*> removeDuplicateArrayRefs(const vector<SgArrayRefExp*>& arrayRefs,
|
||||
const vector<bool>& fixedDimensionsMask,
|
||||
Regime regime,
|
||||
const map<SgArrayRefExp*, vector<SgSymbol*>>& arrayRefToIterVarsMap)
|
||||
Regime regime)
|
||||
{
|
||||
map<vector<int>, SgArrayRefExp*> uniqueRefs;
|
||||
for (SgArrayRefExp* arrayRef : arrayRefs)
|
||||
{
|
||||
vector<SgSymbol*> iterationVars;
|
||||
if (regime == Regime::REGULAR_INDEXES)
|
||||
{
|
||||
auto vars = arrayRefToIterVarsMap.find(arrayRef);
|
||||
if (vars != arrayRefToIterVarsMap.end())
|
||||
iterationVars = vars->second;
|
||||
}
|
||||
|
||||
vector<int> subscripts = getShortFixedSubscriptsVector(arrayRef, fixedDimensionsMask, regime, iterationVars);
|
||||
vector<int> subscripts = getShortFixedSubscriptsVector(arrayRef, fixedDimensionsMask, regime);
|
||||
if (uniqueRefs.find(subscripts) == uniqueRefs.end())
|
||||
uniqueRefs.insert(make_pair(subscripts, arrayRef));
|
||||
}
|
||||
@@ -330,6 +309,7 @@ static bool isSymbolInExpression(SgSymbol* symbol, SgExpression* exp)
|
||||
isSymbolInExpression(symbol, exp->rhs());
|
||||
}
|
||||
|
||||
// findFuncByName searches function by its name among all functions (and subroutines) in program
|
||||
static FuncInfo* findFuncByName(string funcName, const map<string, vector<FuncInfo*>>& allFuncInfo)
|
||||
{
|
||||
for (const auto& fileFuncs : allFuncInfo)
|
||||
@@ -340,6 +320,7 @@ static FuncInfo* findFuncByName(string funcName, const map<string, vector<FuncIn
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// getCurrentFunc return FuncInfo about current function for stmt
|
||||
static FuncInfo* getCurrentFunc(SgStatement* stmt, const map<string, vector<FuncInfo*>>& allFuncInfo)
|
||||
{
|
||||
auto fileInfo = allFuncInfo.find(stmt->fileName());
|
||||
@@ -659,6 +640,11 @@ static bool isVarChangedBetween(string var, SgStatement* first, SgStatement* sec
|
||||
return false;
|
||||
}
|
||||
|
||||
static vector<int> getShortFixedSubscriptsVector(SgArrayRefExp* arrayRef, const PrivateToRemove& varToRemove)
|
||||
{
|
||||
return getShortFixedSubscriptsVector(arrayRef, varToRemove.fixedDimensions, varToRemove.regime);
|
||||
}
|
||||
|
||||
// fillReadShortFixedSumscripts fills all short fixed subscripts vectors of array var,
|
||||
// which are used for reading from array var in exp
|
||||
static void fillReadShortFixedSubscripts(SgExpression* exp, const PrivateToRemove& var,
|
||||
@@ -765,12 +751,27 @@ static void removeVarFromPrivateAttributes(SgSymbol* var, LoopGraph* loop)
|
||||
|
||||
// getVarToExpMap returns map SgSymbol* from defRef -> SgExpression* from useRef
|
||||
static map<SgSymbol*, SgExpression*> getVarToExpMap(SgArrayRefExp* defRef, SgArrayRefExp* useRef,
|
||||
const vector<bool>& fixedDimensions)
|
||||
const vector<bool>& fixedDimensions, Regime regime)
|
||||
{
|
||||
map<SgSymbol*, SgExpression*> varToExpMap;
|
||||
for (int i = 0; i < fixedDimensions.size(); ++i)
|
||||
if (!fixedDimensions[i])
|
||||
{
|
||||
if (fixedDimensions[i])
|
||||
continue;
|
||||
|
||||
// check not fixed dimension:
|
||||
if (regime == Regime::REGULAR_INDEXES)
|
||||
{
|
||||
RegularExpr useExpr;
|
||||
checkAndFillRegularExpr(useRef->subscript(i), useExpr, nullptr);
|
||||
RegularExpr defExpr;
|
||||
checkAndFillRegularExpr(defRef->subscript(i), defExpr, nullptr);
|
||||
varToExpMap.insert(make_pair(defExpr.varSymbol, new SgVarRefExp(useExpr.varSymbol)));
|
||||
|
||||
}
|
||||
else
|
||||
varToExpMap.insert(make_pair(defRef->subscript(i)->symbol(), useRef->subscript(i)));
|
||||
}
|
||||
|
||||
return varToExpMap;
|
||||
}
|
||||
@@ -781,19 +782,6 @@ static set<vector<int>> removeArray(string filename, PrivateToRemove& arrayToRem
|
||||
{
|
||||
set<vector<int>> removedFixedSubscripts;
|
||||
|
||||
// again fill itaration vars:
|
||||
arrayToRemove.arrayRefToIterationVarsMap.clear();
|
||||
SgStatement* loopStmt = arrayToRemove.loop->loop->GetOriginal();
|
||||
for (SgStatement* st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt(); st = st->lexNext())
|
||||
{
|
||||
vector<SgSymbol*> iterationVars;
|
||||
fillIterationVars(st, loopStmt, iterationVars);
|
||||
|
||||
vector<SgArrayRefExp*> arrayRefs = getDirectArrayRefsFromSingleStmt(st, arrayToRemove.varSymbol);
|
||||
for (SgArrayRefExp* arrayRef : arrayRefs)
|
||||
arrayToRemove.arrayRefToIterationVarsMap.insert(make_pair(arrayRef, iterationVars));
|
||||
}
|
||||
|
||||
auto& fixedDimensions = arrayToRemove.fixedDimensions;
|
||||
for (auto& defUsePair : arrayToRemove.defUseStmtsPairs)
|
||||
{
|
||||
@@ -824,7 +812,7 @@ static set<vector<int>> removeArray(string filename, PrivateToRemove& arrayToRem
|
||||
|
||||
removedFixedSubscripts.insert(useFixedSubscripts);
|
||||
|
||||
auto varToExpMap = getVarToExpMap(defRef, useRef, fixedDimensions);
|
||||
auto varToExpMap = getVarToExpMap(defRef, useRef, fixedDimensions, arrayToRemove.regime);
|
||||
|
||||
SgExpression* expToSubst = defStmt->rhs()->copyPtr();
|
||||
expToSubst = replaceVarsWithExps(expToSubst, varToExpMap);
|
||||
@@ -868,8 +856,7 @@ void removePrivates(string filename, vector<Messages>& messages,
|
||||
}
|
||||
else
|
||||
{
|
||||
varRefs = removeDuplicateArrayRefs(varRefs, fixedDimensions, varToRemove.regime,
|
||||
varToRemove.arrayRefToIterationVarsMap);
|
||||
varRefs = removeDuplicateArrayRefs(varRefs, fixedDimensions, varToRemove.regime);
|
||||
for (auto& varRef : varRefs)
|
||||
{
|
||||
vector<int> subscripts = getShortFixedSubscriptsVector(varRef, varToRemove);
|
||||
@@ -892,6 +879,7 @@ void removePrivates(string filename, vector<Messages>& messages,
|
||||
}
|
||||
}
|
||||
|
||||
// remove dead code from loop:
|
||||
for (auto& dcLoopRem : removeDC)
|
||||
{
|
||||
auto loopStmt = dcLoopRem->loop->GetOriginal();
|
||||
@@ -928,7 +916,6 @@ struct Context {
|
||||
int dimensionsNum;
|
||||
vector<SgArrayRefExp*> explicitArrayRefs;
|
||||
vector<bool> fixedDimensionsMask;
|
||||
map<SgArrayRefExp*, vector<SgSymbol*>> arrayRefToIterationVarsMap;
|
||||
};
|
||||
|
||||
// ReducedArrayVars represents mapping of array reference to reduced scalar var:
|
||||
@@ -995,15 +982,7 @@ static vector<InsertedStatement>::const_iterator findInsertedStmt(const vector<I
|
||||
|
||||
static vector<int> getShortFixedSubscriptsVector(Context* ctx, SgArrayRefExp* arrayRef)
|
||||
{
|
||||
vector<SgSymbol*> iterationVars;
|
||||
if (ctx->regime == Regime::REGULAR_INDEXES)
|
||||
{
|
||||
auto vars = ctx->arrayRefToIterationVarsMap.find(arrayRef);
|
||||
if (vars != ctx->arrayRefToIterationVarsMap.end())
|
||||
iterationVars = vars->second;
|
||||
}
|
||||
|
||||
return getShortFixedSubscriptsVector(arrayRef, ctx->fixedDimensionsMask, ctx->regime, iterationVars);
|
||||
return getShortFixedSubscriptsVector(arrayRef, ctx->fixedDimensionsMask, ctx->regime);
|
||||
}
|
||||
|
||||
// getLoopsInfo return vector of pair (string, int) - doName and level for each loop
|
||||
@@ -1225,26 +1204,34 @@ static bool checkRegularIndexRefs(Context* ctx)
|
||||
if (!isArrayRefInVector(arrayRef, ctx->explicitArrayRefs))
|
||||
continue;
|
||||
|
||||
// check if unfixed dimension index contains iteration var:
|
||||
SgExprListExp* indexExprList = (SgExprListExp*)arrayRef->lhs();
|
||||
if (iterationVars.size() < indexExprList->length())
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < indexExprList->length(); ++i)
|
||||
{
|
||||
if (ctx->fixedDimensionsMask[i])
|
||||
continue;
|
||||
|
||||
SgExpression* indexExpr = indexExprList->elem(i);
|
||||
RegularExpr regularExpr;
|
||||
if (!checkAndFillRegularExpr(indexExpr, regularExpr, iterationVars[i]))
|
||||
if (!checkAndFillRegularExpr(indexExpr, regularExpr, nullptr))
|
||||
return false;
|
||||
|
||||
if (regularExpr.coefA == 0)
|
||||
return false;
|
||||
|
||||
bool isIterationVar = false;
|
||||
for (SgSymbol* iterationVar : iterationVars)
|
||||
{
|
||||
if (iterationVar->identifier() == regularExpr.var)
|
||||
{
|
||||
isIterationVar = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: possibly can be removed:
|
||||
if (st->variant() == ASSIGN_STAT && isEqSymbols(st->expr(0)->symbol(), ctx->arraySymbol))
|
||||
for (auto iterationVar : iterationVars)
|
||||
if (isSymbolInExpression(iterationVar, st->expr(1)))
|
||||
if (!isIterationVar)
|
||||
return false;
|
||||
|
||||
iterationVars.resize(indexExprList->length());
|
||||
ctx->arrayRefToIterationVarsMap.insert(make_pair(arrayRef, iterationVars));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1522,7 +1509,8 @@ static vector<vector<ArraySubscript>> checkIndirectUsage(Context* ctx)
|
||||
if (currentFunc == nullptr)
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
vector<Variable*> commonBlockGroupedVar = getCommonBlockGroupedVar(currentFunc, ctx->arraySymbol, ctx->commonBlocks);
|
||||
const auto& blocks = ctx->commonBlocks;
|
||||
vector<Variable*> commonBlockGroupedVar = getCommonBlockGroupedVar(currentFunc, ctx->arraySymbol, blocks);
|
||||
if (commonBlockGroupedVar.empty())
|
||||
return indirectUsageMasks;
|
||||
|
||||
@@ -1623,9 +1611,11 @@ static ReducedArrayVarsMap getReducedArrayVars(Context* ctx)
|
||||
{
|
||||
string name = getReducedArrayVarName(arrayRef->symbol(), subscripts);
|
||||
|
||||
if (checkSymbNameAndCorrect(name, "_") != name)
|
||||
{
|
||||
int nameNumber = checkSymbNameAndCorrect(name + "__", 0);
|
||||
if (nameNumber != 0)
|
||||
name = name + "__" + std::to_string(nameNumber);
|
||||
}
|
||||
|
||||
SgSymbol* newSymbol = new SgSymbol(VARIABLE_NAME, name.c_str(), type, scope);
|
||||
reducedArrayVars.insert(subscripts, newSymbol);
|
||||
@@ -1700,8 +1690,7 @@ static vector<InsertedStatement> insertReducedArrayVarStmts(Context* ctx,
|
||||
{
|
||||
vector<SgArrayRefExp*> arrayRefs;
|
||||
fillDirectArrayRefs(st->expr(i), ctx->arraySymbol, arrayRefs);
|
||||
arrayRefs = removeDuplicateArrayRefs(arrayRefs, ctx->fixedDimensionsMask, ctx->regime,
|
||||
ctx->arrayRefToIterationVarsMap);
|
||||
arrayRefs = removeDuplicateArrayRefs(arrayRefs, ctx->fixedDimensionsMask, ctx->regime);
|
||||
if (!arrayRefs.empty())
|
||||
isUseStmt = true;
|
||||
|
||||
@@ -1774,7 +1763,7 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
||||
|
||||
set<int> RD_defArgs = RD_forUseArg->second; // make copy
|
||||
|
||||
// delete recursive and uninit definition from RD def args:
|
||||
// delete recursive, uninit and definitions that cannot reach use stmt from RD def args:
|
||||
set<int> tmpRD_defArgs;
|
||||
for (int defArgNum : RD_defArgs)
|
||||
{
|
||||
@@ -1787,46 +1776,19 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
||||
|
||||
SgStatement* defStmt = defInsAndBlock.first->getOperator();
|
||||
auto defInsertedStmt = findInsertedStmt(insertedStmts, defStmt);
|
||||
if (useInsertedStmt.relatedToStmt == defInsertedStmt->relatedToStmt)
|
||||
if (useLineNum <= defInsertedStmt->relatedToStmt->lineNumber())
|
||||
continue;
|
||||
|
||||
tmpRD_defArgs.insert(defArgNum);
|
||||
}
|
||||
RD_defArgs.swap(tmpRD_defArgs);
|
||||
|
||||
if (RD_defArgs.size() == 0) // argument is not initialized
|
||||
{
|
||||
addMessageCannotFindRD(ctx->messages, arrayName, useLineNum);
|
||||
continue;
|
||||
}
|
||||
|
||||
SgStatement* defStmt = nullptr;
|
||||
|
||||
if (RD_defArgs.size() > 1)
|
||||
if (RD_defArgs.size() != 1)
|
||||
{
|
||||
bool defIsFound = false;
|
||||
for (int defArg : RD_defArgs) // try to find the real definition from RD_defArgs
|
||||
{
|
||||
if (defArg == SAPFOR::CFG_VAL::UNINIT)
|
||||
continue;
|
||||
|
||||
auto defInsAndBlock = getInstructionAndBlockByNumber(CFGraph, defArg);
|
||||
if (defInsAndBlock.first == nullptr)
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
|
||||
auto defInsertedStmt = findInsertedStmt(insertedStmts, defInsAndBlock.first->getOperator());
|
||||
if (defInsertedStmt->relatedToStmt->lineNumber() < useLineNum &&
|
||||
useInsAndBlock.second->getNumber() == defInsAndBlock.second->getNumber())
|
||||
{
|
||||
defIsFound = true;
|
||||
auto defInsAndBlock = getInstructionAndBlockByNumber(CFGraph, defArg);
|
||||
defStmt = defInsAndBlock.first->getOperator();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!defIsFound)
|
||||
{
|
||||
// try to find definition not from RD_defArgs, by search in the block instructions:
|
||||
string defVarName = useInsertedStmt.insertedStmt->expr(1)->symbol()->identifier();
|
||||
const auto& blockInstructionsVector = useInsAndBlock.second->getInstructions();
|
||||
@@ -1845,7 +1807,6 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!defIsFound)
|
||||
{
|
||||
@@ -1884,15 +1845,6 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
||||
return defUsePairs;
|
||||
}
|
||||
|
||||
//// getScopeLoopStmt returns least outer scope loop statement
|
||||
//static SgForStmt* getScopeLoopStmt(SgStatement* stmt)
|
||||
//{
|
||||
// while (stmt != nullptr && stmt->variant() != FOR_NODE)
|
||||
// stmt = stmt->controlParent();
|
||||
//
|
||||
// return (SgForStmt*)stmt;
|
||||
//}
|
||||
|
||||
// findChildLoop returns LoopGraph for provided loop statement
|
||||
static LoopGraph* findLoop(LoopGraph* outerLoop, SgForStmt* loopStmt)
|
||||
{
|
||||
@@ -2063,7 +2015,8 @@ static bool areDifferentRefs(Context* ctx, SgExpression* exp, const pair<string,
|
||||
return false;
|
||||
}
|
||||
|
||||
static pair<SAPFOR::Argument*, set<int>> findVarInRDSet(const map<SAPFOR::Argument*, set<int>>& RD_In, const string& var)
|
||||
static pair<SAPFOR::Argument*, set<int>> findVarInRDSet(const map<SAPFOR::Argument*, set<int>>& RD_In,
|
||||
const string& var)
|
||||
{
|
||||
for (auto& RD_InElem : RD_In)
|
||||
{
|
||||
@@ -2093,7 +2046,9 @@ static bool checkDefUsePair(Context* ctx, const DefUseStmtsPair& defUse, const C
|
||||
vector<SgArrayRefExp*> arrayUseRefs = getDirectArrayRefsFromSingleStmt(defUse.second, ctx->arraySymbol);
|
||||
for (auto useRef : arrayUseRefs)
|
||||
{
|
||||
map<SgSymbol*, SgExpression*> varToExpMap = getVarToExpMap(defRef, useRef, ctx->fixedDimensionsMask);
|
||||
map<SgSymbol*, SgExpression*> varToExpMap;
|
||||
varToExpMap = getVarToExpMap(defRef, useRef, ctx->fixedDimensionsMask, ctx->regime);
|
||||
|
||||
SgExpression* expToSubst = defUse.first->rhs()->copyPtr();
|
||||
expToSubst = replaceVarsWithExps(expToSubst, varToExpMap);
|
||||
|
||||
@@ -2282,7 +2237,6 @@ void removePrivateAnalyze(Context *ctx)
|
||||
newPrivateToRemove.regime = ctx->regime;
|
||||
newPrivateToRemove.defUseStmtsPairs.swap(resultDefUsePairs);
|
||||
newPrivateToRemove.fixedDimensions.swap(ctx->fixedDimensionsMask);
|
||||
newPrivateToRemove.arrayRefToIterationVarsMap = ctx->arrayRefToIterationVarsMap;
|
||||
|
||||
privatesToRemoveGlobal.push_back(newPrivateToRemove);
|
||||
}
|
||||
@@ -2349,6 +2303,8 @@ void removePrivatesAnalysis(string filename,
|
||||
context.dimensionsNum = ((SgArrayType*)arrayToRemove->type())->dimension();
|
||||
context.arraySymbol = arrayToRemove;
|
||||
|
||||
string arrayName = arrayToRemove->identifier();
|
||||
|
||||
auto filterMasks = checkImplicitAndIndirectUsage(&context);
|
||||
filterArrayRefs(&context, arrayRefs, filterMasks);
|
||||
|
||||
@@ -2358,8 +2314,7 @@ void removePrivatesAnalysis(string filename,
|
||||
|
||||
if (!checkLoopAlignmentMatching(&context))
|
||||
{
|
||||
addMessageVarNotAlignedWithLoop(messages, context.arraySymbol->identifier(),
|
||||
context.loop->lineNum);
|
||||
addMessageVarNotAlignedWithLoop(messages, arrayName, context.loop->lineNum);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2374,14 +2329,10 @@ void removePrivatesAnalysis(string filename,
|
||||
else if (checkRegularIndexRefs(&context))
|
||||
{
|
||||
context.regime = Regime::REGULAR_INDEXES;
|
||||
context.fixedDimensionsMask = vector<bool>{};
|
||||
removePrivateAnalyze(&context);
|
||||
}
|
||||
else
|
||||
{
|
||||
addMessageDoesNotMatchMask(messages, context.arraySymbol->identifier(),
|
||||
context.loop->lineNum);
|
||||
}
|
||||
addMessageDoesNotMatchMask(messages, arrayName, context.loop->lineNum);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ struct PrivateToRemove {
|
||||
Regime regime;
|
||||
std::vector<std::pair<SgAssignStmt*, SgStatement*>> defUseStmtsPairs;
|
||||
std::vector<bool> fixedDimensions;
|
||||
std::map<SgArrayRefExp*, std::vector<SgSymbol*>> arrayRefToIterationVarsMap;
|
||||
};
|
||||
|
||||
// removePrivates removes all privates from vector privatesToRemoveGloval
|
||||
|
||||
Reference in New Issue
Block a user