From 03088e3522fcc70e14212da698946a716578f27b Mon Sep 17 00:00:00 2001 From: AntonMilienkov Date: Mon, 18 Dec 2023 16:45:52 +0300 Subject: [PATCH] Bags fix: all params and Intent(in) --- .../_src/Transformations/checkpoints.cpp | 82 ++++++++++++++++++- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp index 468d224..6878ed6 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/checkpoints.cpp @@ -37,6 +37,41 @@ static SgType* createArrayCharType(int len, int dim) } } +static void findDeclsNoIntentIn(SgExpression* ex, std::vector& local, const std::map& localParams, + std::set& added, std::set& IntentInadded) +{ + if (ex) + { + if (ex->variant() == VAR_REF) + { + if (ex->symbol()->variant() == VARIABLE_NAME && + localParams.find(ex->symbol()->identifier()) == localParams.end()) + { + if (added.find(ex->symbol()->identifier()) == added.end() && + IntentInadded.find(ex->symbol()->identifier()) == IntentInadded.end()) + { + added.insert(ex->symbol()->identifier()); + local.push_back(ex); + } + } + } + + if (ex->variant() == ARRAY_REF) + { + if (ex->symbol()->variant() == VARIABLE_NAME && + added.find(ex->symbol()->identifier()) == added.end() && + IntentInadded.find(ex->symbol()->identifier()) == IntentInadded.end()) + { + added.insert(ex->symbol()->identifier()); + local.push_back(new SgArrayRefExp(*ex->symbol())); + } + } + + findDeclsNoIntentIn(ex->lhs(), local, localParams, added, IntentInadded); + findDeclsNoIntentIn(ex->rhs(), local, localParams, added, IntentInadded); + } +} + static void findDecls(SgExpression* ex, vector& local, const map& localParams, set& added) { @@ -70,6 +105,45 @@ static void findDecls(SgExpression* ex, vector& local, const map< } } +static void findLocalDataNoIntentIn(SgStatement* start, SgStatement* end, std::vector& local, + std::map& localParams, std::set& added) +{ + for (SgStatement* st = start; st != end; st = st->lexNext()) + { + if (st->variant() == PARAM_DECL) + { + auto decl = (SgParameterStmt*)st; + for (int z = 0; z < decl->numberOfConstants(); ++z) + localParams[decl->constant(z)->identifier()] = st; + } + + if (st->variant() == EXTERN_STAT) + for (SgExpression* ex = st->expr(0); ex; ex = ex->rhs()) + added.insert(ex->lhs()->symbol()->identifier()); + } + + std::set IntentInadded; + + for (SgStatement* st = start; st != end; st = st->lexNext()) + if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90) + if (st->expr(2) && st->expr(2)->lhs()->variant() == 468) { + SgExpression* ex = st->expr(0); + while (ex) + { + if (ex->lhs()) + if (ex->lhs()->variant() == VAR_REF) + IntentInadded.insert(ex->lhs()->symbol()->identifier()); + ex = ex->rhs(); + } + } + + for (SgStatement* st = start; st != end; st = st->lexNext()) + { + if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90) + findDeclsNoIntentIn(st->expr(0), local, localParams, added, IntentInadded); + } +} + static void findLocalData(SgStatement* start, SgStatement* end, vector& local, map& localParams, set& added) { @@ -569,8 +643,8 @@ void createCheckpoints(SgFile *file, const map& commonBloc vector local; map localParams; set addedToList; - findLocalData(func->lexNext(), lastDecl, local, localParams, addedToList); - const vector useOfMods = findUseOfModules(func->lexNext(), lastDecl); + findLocalDataNoIntentIn(func->lexNext(), firstExec, local, localParams, addedToList); + const vector useOfMods = findUseOfModules(func->lexNext(), firstExec); SgStatement* loadBlock = new SgStatement(IF_NODE); SgStatement* storeBlock = new SgStatement(IF_NODE); @@ -938,7 +1012,7 @@ void createCheckpoints(SgFile *file, const map& commonBloc vector local; map localParams; set addedToList; - findLocalData(hedrFrom->lexNext(), lastDecl, local, localParams, addedToList); + findLocalDataNoIntentIn(hedrFrom->lexNext(), firstExec, local, localParams, addedToList); if (!processedFrom.count(j->second)) { SgSymbol* modS = moduleF->symbol(); @@ -1000,13 +1074,13 @@ void createCheckpoints(SgFile *file, const map& commonBloc ifLoadOk->insertStmtAfter(*insertToifLoadOk[z], *ifLoadOk); processedFrom[j->second] = ifLoadOk1->lexNext(); - processedFrom[j->second]->unparsestdout(); } else { SgStatement * read = new SgInputOutputStmt(READ_STAT, *makeExprList({ &frmt, &unit }, false), *new SgVarRefExp(loadS[3])); gotoBlock->insertStmtAfter(*read, *gotoBlock); processedFrom[j->second] = gotoBlock->lexNext(); + firstExec->insertStmtBefore(*gotoBlock, *hedrFrom); } }