private_removing: bug fixes #14
@@ -885,18 +885,21 @@ static void checkImplicitDirectUsage(Context* ctx, SgExpression* exp, int stmtLi
|
|||||||
{
|
{
|
||||||
SgFunctionCallExp* funcCallExp = (SgFunctionCallExp*)exp;
|
SgFunctionCallExp* funcCallExp = (SgFunctionCallExp*)exp;
|
||||||
string funcName = funcCallExp->funName()->identifier();
|
string funcName = funcCallExp->funName()->identifier();
|
||||||
auto funcInfo = findFunc(ctx->loopStmt->fileName(), funcName, ctx->allFuncInfo);
|
FuncInfo* funcInfo = findFunc(ctx->loopStmt->fileName(), funcName, ctx->allFuncInfo);
|
||||||
for (int i = 0; i < funcCallExp->numberOfArgs(); ++i)
|
if (funcInfo != nullptr)
|
||||||
{
|
{
|
||||||
SgExpression* funcArg = funcCallExp->arg(i);
|
for (int i = 0; i < funcCallExp->numberOfArgs(); ++i)
|
||||||
if (funcInfo->funcParams.isArgOut(i)
|
|
||||||
&& funcArg->symbol() != nullptr
|
|
||||||
&& isEqSymbols(funcArg->symbol(), ctx->arraySymbol))
|
|
||||||
{
|
{
|
||||||
auto fixedVec = getFixedSubscriptsVector((SgArrayRefExp*)funcArg, ctx->dimensionsNum);
|
SgExpression* funcArg = funcCallExp->arg(i);
|
||||||
fixedSubscripts.push_back(fixedVec);
|
if (funcInfo->funcParams.isArgOut(i)
|
||||||
addMessageUsageInFunctionCall(ctx->messages, getDimensionVarName(ctx->arraySymbol, fixedVec),
|
&& funcArg->symbol() != nullptr
|
||||||
funcName, ctx->loop->lineNum, stmtLineNum);
|
&& isEqSymbols(funcArg->symbol(), ctx->arraySymbol))
|
||||||
|
{
|
||||||
|
auto fixedVec = getFixedSubscriptsVector((SgArrayRefExp*)funcArg, ctx->dimensionsNum);
|
||||||
|
fixedSubscripts.push_back(fixedVec);
|
||||||
|
addMessageUsageInFunctionCall(ctx->messages, getDimensionVarName(ctx->arraySymbol, fixedVec),
|
||||||
|
funcName, ctx->loop->lineNum, stmtLineNum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1231,32 +1234,40 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
|||||||
{
|
{
|
||||||
vector<DefUseStmtsPair> defUsePairs;
|
vector<DefUseStmtsPair> defUsePairs;
|
||||||
|
|
||||||
for (const InsertedStatement& stmt : insertedStmts)
|
for (const InsertedStatement& useInsertedStmt : insertedStmts)
|
||||||
{
|
{
|
||||||
if (stmt.type != TypeOfInsertedStmt::USE)
|
if (useInsertedStmt.type != TypeOfInsertedStmt::USE) // analysis for USE stmt
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int relLineNum = stmt.relatedToStmt->lineNumber();
|
int useLineNum = useInsertedStmt.relatedToStmt->lineNumber();
|
||||||
|
|
||||||
// looking for reaching definitions for the current block:
|
// looking for reaching definitions for the current block:
|
||||||
auto useInsAndBlock = getInstructionAndBlockByStatement(CFGraph, stmt.insertedStmt);
|
auto useInsAndBlock = getInstructionAndBlockByStatement(CFGraph, useInsertedStmt.insertedStmt);
|
||||||
auto useArg = useInsAndBlock.first->getArg1();
|
auto useArg = useInsAndBlock.first->getArg1();
|
||||||
const auto& RD_In = useInsAndBlock.second->getRD_In();
|
const auto& RD_In = useInsAndBlock.second->getRD_In();
|
||||||
|
|
||||||
const auto& RD_forUseArg = RD_In.find(useArg);
|
const auto& RD_forUseArg = RD_In.find(useArg);
|
||||||
if (RD_forUseArg == RD_In.end()) // cannot find reaching definitions for argument
|
if (RD_forUseArg == RD_In.end()) // cannot find reaching definitions for argument
|
||||||
{
|
{
|
||||||
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), relLineNum);
|
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), useLineNum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
set<int> RD_defArgs = RD_forUseArg->second; // make copy
|
set<int> RD_defArgs = RD_forUseArg->second; // make copy
|
||||||
|
|
||||||
|
// delete recursive definition from RD def args:
|
||||||
for (int defArgNum : RD_defArgs)
|
for (int defArgNum : RD_defArgs)
|
||||||
{
|
{
|
||||||
|
if (defArgNum == SAPFOR::CFG_VAL::UNINIT)
|
||||||
|
continue;
|
||||||
|
|
||||||
auto defInsAndBlock = getInstructionAndBlockByNumber(CFGraph, defArgNum);
|
auto defInsAndBlock = getInstructionAndBlockByNumber(CFGraph, defArgNum);
|
||||||
|
if (defInsAndBlock.first == nullptr)
|
||||||
|
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||||
|
|
||||||
SgStatement* defStmt = defInsAndBlock.first->getOperator();
|
SgStatement* defStmt = defInsAndBlock.first->getOperator();
|
||||||
auto defInsertedStmt = findInsertedStmt(insertedStmts, defStmt);
|
auto defInsertedStmt = findInsertedStmt(insertedStmts, defStmt);
|
||||||
if (stmt.relatedToStmt == defInsertedStmt->relatedToStmt) // recursive definition
|
if (useInsertedStmt.relatedToStmt == defInsertedStmt->relatedToStmt)
|
||||||
{
|
{
|
||||||
RD_defArgs.erase(defArgNum);
|
RD_defArgs.erase(defArgNum);
|
||||||
break;
|
break;
|
||||||
@@ -1265,13 +1276,40 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
|||||||
|
|
||||||
if (RD_defArgs.size() == 0) // argument is not initialized
|
if (RD_defArgs.size() == 0) // argument is not initialized
|
||||||
{
|
{
|
||||||
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), relLineNum);
|
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), useLineNum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (RD_defArgs.find(SAPFOR::CFG_VAL::UNINIT) != RD_defArgs.end()) // argument is not initialized
|
||||||
|
{
|
||||||
|
bool uninitArgIsOk = false;
|
||||||
|
if (RD_defArgs.size() == 2)
|
||||||
|
{
|
||||||
|
RD_defArgs.erase(SAPFOR::CFG_VAL::UNINIT);
|
||||||
|
int defArgNum = *RD_defArgs.begin();
|
||||||
|
|
||||||
|
auto defInsAndBlock = getInstructionAndBlockByNumber(CFGraph, defArgNum);
|
||||||
|
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())
|
||||||
|
{
|
||||||
|
uninitArgIsOk = true; // argument isn't really uninitialized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!uninitArgIsOk)
|
||||||
|
{
|
||||||
|
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), useLineNum);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (RD_defArgs.size() > 1) // more than one reaching definition
|
if (RD_defArgs.size() > 1) // more than one reaching definition
|
||||||
{
|
{
|
||||||
addMessageMoreThanOneRD(ctx->messages, ctx->arraySymbol->identifier(), relLineNum);
|
addMessageMoreThanOneRD(ctx->messages, ctx->arraySymbol->identifier(), useLineNum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1282,19 +1320,19 @@ static vector<DefUseStmtsPair> buildDefUsePairs(Context* ctx, const CFG_Type& CF
|
|||||||
auto defInsertedStmt = findInsertedStmt(insertedStmts, defStmt);
|
auto defInsertedStmt = findInsertedStmt(insertedStmts, defStmt);
|
||||||
if (defInsertedStmt == insertedStmts.end())
|
if (defInsertedStmt == insertedStmts.end())
|
||||||
{
|
{
|
||||||
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), relLineNum);
|
addMessageCannotFindRD(ctx->messages, ctx->arraySymbol->identifier(), useLineNum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//don't substitute def stmt into use, if def is recursive
|
//don't substitute def stmt into use, if def is recursive
|
||||||
if (defInsertedStmt->isRecursive)
|
if (defInsertedStmt->isRecursive)
|
||||||
{
|
{
|
||||||
addMessageRecursiveDependency(ctx->messages, ctx->arraySymbol->identifier(), relLineNum);
|
addMessageRecursiveDependency(ctx->messages, ctx->arraySymbol->identifier(), useLineNum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SgAssignStmt* def = (SgAssignStmt*)defInsertedStmt->relatedToStmt;
|
SgAssignStmt* def = (SgAssignStmt*)defInsertedStmt->relatedToStmt;
|
||||||
SgAssignStmt* use = (SgAssignStmt*)stmt.relatedToStmt;
|
SgAssignStmt* use = (SgAssignStmt*)useInsertedStmt.relatedToStmt;
|
||||||
defUsePairs.push_back(make_pair(def, use));
|
defUsePairs.push_back(make_pair(def, use));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user