From a882be75e952669a42bef23f582f2cfab2d91c90 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Mon, 11 Dec 2023 21:41:31 +0300 Subject: [PATCH 01/68] WIP : Add new pass - set-implisit-none --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 7 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 4 + sapfor/experts/Sapfor_2017/_src/Sapfor.h | 3 + .../Transformations/set_implicit_none.cpp | 187 ++++++++++++++++++ .../_src/Transformations/set_implicit_none.h | 7 + .../Sapfor_2017/_src/Utils/PassManager.h | 2 + 6 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp create mode 100644 sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index d6c259b..5010d0c 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -187,6 +187,9 @@ set(TR_FUNC_PURE _src/Transformations/function_purifying.cpp _src/Transformations/function_purifying.h) set(TR_GV _src/Transformations/fix_common_blocks.cpp _src/Transformations/fix_common_blocks.h) +set(TR_IMPLICIT_NONE _src/Transformations/set_implicit_none.cpp + _src/Transformations/set_implicit_none.h) + set(TRANSFORMS ${TR_CP} ${TR_VECTOR} @@ -200,7 +203,8 @@ set(TRANSFORMS ${TR_FUNC_PURE} ${TR_LOOP_UNROLL} ${TR_GV} - ${TR_PRIV_DEL}) + ${TR_PRIV_DEL} + ${TR_IMPLICIT_NONE}) set(CFG _src/CFGraph/IR.cpp _src/CFGraph/IR.h @@ -419,6 +423,7 @@ source_group (Transformations\\PrivateArrayRemoving FILES ${TR_PRIV_DEL}) source_group (Transformations\\VectorAssignToLoop FILES ${TR_VECTOR}) source_group (Transformations\\RenameSymbols FILES ${RENAME_SYMBOLS}) source_group (Transformations\\GlobalVariables FILES ${TR_GV}) +source_group (Transformations\\SetImplicitNone FILES ${TR_IMPLICIT_NONE}) source_group (CreateIntervals FILES ${CREATE_INTER_T}) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 9dda347..46f802b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -78,6 +78,7 @@ #include "Transformations/function_purifying.h" #include "Transformations/private_removing.h" #include "Transformations/fix_common_blocks.h" +#include "Transformations/set_implicit_none.h" #include "RenameSymbols/rename_symbols.h" #include "ProjectParameters/projectParameters.h" @@ -2175,6 +2176,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne runPrivateVariableAnalysis(loopGraph, fullIR, commonBlocks, SPF_messages); else if (curr_regime == FIX_COMMON_BLOCKS) fixCommonBlocks(allFuncInfo, commonBlocks, &project); + else if (curr_regime == SET_IMPLICIT_NONE) + ImplicitCheck(&project); else if (curr_regime == SELECT_ARRAY_DIM_CONF) { map> localMessages; @@ -2608,6 +2611,7 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam case LOOPS_SPLITTER: case LOOPS_COMBINER: case FIX_COMMON_BLOCKS: + case SET_IMPLICIT_NONE: case TEST_PASS: runAnalysis(*project, curr_regime, false); case SUBST_EXPR_RD_AND_UNPARSE: diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.h b/sapfor/experts/Sapfor_2017/_src/Sapfor.h index 957a1f8..62ad7ef 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.h +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.h @@ -168,6 +168,8 @@ enum passes { FIX_COMMON_BLOCKS, + SET_IMPLICIT_NONE, + TEST_PASS, EMPTY_PASS }; @@ -339,6 +341,7 @@ static void setPassValues() passNames[PRIVATE_ANALYSIS_IR] = "PRIVATE_ANALYSIS_IR"; passNames[FIX_COMMON_BLOCKS] = "FIX_COMMON_BLOCKS"; + passNames[SET_IMPLICIT_NONE] = "SET_IMPLICIT_NONE"; passNames[TEST_PASS] = "TEST_PASS"; } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp new file mode 100644 index 0000000..6c4de80 --- /dev/null +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -0,0 +1,187 @@ +#include +#include +#include +#include + +#include "Utils/SgUtils.h" +#include "set_implicit_none.h" + +using std::vector; +using std::map; +using std::multimap; +using std::set; +using std::make_pair; +using std::string; +using std::to_string; + +map implicit; +set vars; +vector toDecl; + +static void InsertToMap(SgType* type, SgExpression* letters) { + + while (letters != NULL && letters->lhs() != NULL) { + + string letter; + + switch (letters->lhs()->sunparse().size()) { + + case 3: + letter = letters->lhs()->sunparse(); + implicit[letter[1]] = type; + + break; + case 7: + letter = letters->lhs()->sunparse(); + + for (char i = letter[1]; i <= letter[5]; i++) { + implicit[i] = type; + } + break; + default : + //printf("IMPLICIT bad format (can bew only {letter : letter} or {letter})"); + throw; + } + + letters = letters->rhs(); + } + +} + +static void InsertDefaultToMap() { + SgType* intType = new SgType(T_INT); + + SgType* realType = new SgType(T_FLOAT); + + for (char i = 'a'; i <= 'z'; i++) { + implicit[i] = realType; + } + + for (char i = 'i'; i <= 'n'; i++) { + implicit[i] = intType; + } +} + +static void CheckVariables(SgStatement* function) { + + for (int k = 0; k < function->numberOfChildrenList1(); k++) { + SgStatement* state = function->childList1(k); + + + if (state->expr(0) && (state->expr(0)->variant() == VAR_REF || state->expr(0)->variant() == ARRAY_REF)) { + SgSymbol* symbol = state->expr(0)->symbol(); + auto x = declaratedInStmt(symbol, NULL, false); + + if (vars.find(symbol) == vars.end() && x == NULL) { + vars.insert(symbol); + + char firstLetter = *symbol->identifier(); + + if (implicit.find(firstLetter) != implicit.end()) { + if (implicit[firstLetter]->variant() != symbol->type()->variant()) { + symbol->setType(implicit[firstLetter]); + + if (symbol->declaredInStmt() == NULL) { + toDecl.push_back(symbol); + } + } + else { + toDecl.push_back(symbol); + } + } + else { + //printf("Variable - "); + //printf(symbol->identifier()); + //printf(" - not found in IMPLICIT\n"); + throw; + } + } + } + } + + makeDeclaration(toDecl, function, NULL); +} + + +void ImplicitCheck(SgProject* project) { + + /* + printf("IMPLICIT\n"); + */ + + for (int i = 0; i < project->numberOfFiles(); i++) { + SgFile file = project->file(i); + int coutOfFunctions; + for (int j = 0; j < file.numberOfFunctions(); j++) { + SgStatement* function = file.functions(j); + + implicit.clear(); + vars.clear(); + toDecl.clear(); + + //fill implicit + + for (int k = 0; k < function->numberOfChildrenList1(); k++) { + SgStatement* state = function->childList1(k); + + + + if (state->variant() == IMPL_DECL) { + + if (state->expr(0) == NULL) { + + } + else { + SgExpression* expression = state->expr(0); + int n = 0; + SgExpression* one = expression; + + while (one != NULL && one->lhs() != NULL) { + + string what_type = one->lhs()->sunparse(); + + if (what_type.find("kind=") != std::string::npos) { + + SgType* baseType = new SgType(one->lhs()->type()->variant()); + + SgType* type = new SgType(T_ARRAY, NULL, baseType); + + SgExpression* letters = one->lhs()->operand(1); + + InsertToMap(type, letters); + } + else { + + SgType* type = new SgType(one->lhs()->type()->variant()); + + SgExpression* letters = one->lhs()->operand(1); + + InsertToMap(type, letters); + } + + one = one->rhs(); + } + + } + + break; + } + + if (state->variant() == CONTROL_END) { + + SgStatement* state = new SgStatement(IMPL_DECL); + auto cp = function->childList1(0)->controlParent(); + function->childList1(0)->insertStmtBefore(*state, *cp); + + + InsertDefaultToMap(); + + break; + } + } + + CheckVariables(function); + + } + } +} diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h new file mode 100644 index 0000000..985c6d5 --- /dev/null +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h @@ -0,0 +1,7 @@ +#pragma once +#include "Utils/SgUtils.h" + +#include "string" +#include "map" + +void ImplicitCheck(SgProject* project); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index 7b584e5..ac40cc4 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -302,6 +302,8 @@ void InitPassesDependencies(map> &passDepsIn, set Pass(CALL_GRAPH2) <= Pass(FIX_COMMON_BLOCKS); + Pass(CALL_GRAPH2) <= Pass(SET_IMPLICIT_NONE); + 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, REVERSE_CREATED_NESTED_LOOPS, PREDICT_SCHEME, CALCULATE_STATS_SCHEME, REVERT_SPF_DIRS, CLEAR_SPF_DIRS, TRANSFORM_SHADOW_IF_FULL, From 3456226e66afe2a96e407b4c3a50c3ebc4a6df56 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Mon, 11 Dec 2023 21:48:11 +0300 Subject: [PATCH 02/68] Forgot static( --- .../Sapfor_2017/_src/Transformations/set_implicit_none.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 6c4de80..432c74c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -14,9 +14,9 @@ using std::make_pair; using std::string; using std::to_string; -map implicit; -set vars; -vector toDecl; +static map implicit; +static set vars; +static vector toDecl; static void InsertToMap(SgType* type, SgExpression* letters) { From a5c31c60a7a88405cf1e947827a041c5ad95afdd Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Tue, 12 Mar 2024 10:42:22 +0300 Subject: [PATCH 03/68] WIP : check all implicit stmts --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 4 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 9 +- .../Transformations/set_implicit_none.cpp | 267 ++++++++++++------ .../_src/Transformations/set_implicit_none.h | 6 +- .../Sapfor_2017/_src/Utils/PassManager.h | 2 - 5 files changed, 194 insertions(+), 94 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index de349ae..49d8dea 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -194,7 +194,7 @@ set(TR_IMPLICIT_NONE _src/Transformations/set_implicit_none.cpp _src/Transformations/set_implicit_none.h) set(TRANSFORMS - ${TR_CP} + ${TR_CP} ${TR_VECTOR} ${TR_ENDDO_LOOP} ${TR_LOOP_NEST} @@ -207,7 +207,7 @@ set(TRANSFORMS ${TR_LOOP_UNROLL} ${TR_GV} ${TR_PRIV_DEL} - ${TR_CONV}) + ${TR_CONV} ${TR_PRIV_DEL} ${TR_IMPLICIT_NONE}) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index e50cd3f..1a407e6 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1162,6 +1162,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne getMaxMinBlockDistribution(file, min_max_block); else if (curr_regime == CONVERT_TO_C) covertToC(file); + else if (curr_regime == SET_IMPLICIT_NONE) + ImplicitCheck(file); else if (curr_regime == TEST_PASS) { //test pass @@ -2057,8 +2059,6 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne runPrivateVariableAnalysis(loopGraph, fullIR, commonBlocks, SPF_messages); else if (curr_regime == FIX_COMMON_BLOCKS) fixCommonBlocks(allFuncInfo, commonBlocks, &project); - else if (curr_regime == SET_IMPLICIT_NONE) - ImplicitCheck(&project); else if (curr_regime == SELECT_ARRAY_DIM_CONF) { SelectArrayConfForParallelization(&project, allFuncInfo, loopGraph, createdDirectives, SPF_messages, arrayLinksByFuncCalls, parallelRegions); removeRegionsWithoutDirs(createdDirectives, parallelRegions, allFuncInfo, SPF_messages); @@ -2522,7 +2522,7 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam case LOOPS_SPLITTER: case LOOPS_COMBINER: case FIX_COMMON_BLOCKS: - case SET_IMPLICIT_NONE: + //case SET_IMPLICIT_NONE: case TEST_PASS: runAnalysis(*project, curr_regime, false); case SUBST_EXPR_RD_AND_UNPARSE: @@ -2624,7 +2624,10 @@ int main(int argc, char **argv) else if (string(curr_arg) == "-passN") { i++; + // test + curr_regime = getPassCode(argv[i]); + curr_regime = 130; printf("code for pass %s is %d\n", argv[i], curr_regime); } else if (string(curr_arg) == "-passInfo") diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 432c74c..bb7928d 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -5,6 +5,7 @@ #include "Utils/SgUtils.h" #include "set_implicit_none.h" +#include using std::vector; using std::map; @@ -14,106 +15,120 @@ using std::make_pair; using std::string; using std::to_string; -static map implicit; -static set vars; -static vector toDecl; +map types; +vector varsWithoutDecl; +const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; -static void InsertToMap(SgType* type, SgExpression* letters) { - - while (letters != NULL && letters->lhs() != NULL) { - - string letter; - - switch (letters->lhs()->sunparse().size()) { - - case 3: - letter = letters->lhs()->sunparse(); - implicit[letter[1]] = type; - - break; - case 7: - letter = letters->lhs()->sunparse(); - - for (char i = letter[1]; i <= letter[5]; i++) { - implicit[i] = type; - } - break; - default : - //printf("IMPLICIT bad format (can bew only {letter : letter} or {letter})"); - throw; - } - - letters = letters->rhs(); - } +void InitTypes(); +void FillCommonTypes(); +void GetImplicitTypes(SgExpression* expr); +static inline string getContains(SgStatement* funcSt) +{ + string containsName; + SgStatement* st_cp = funcSt->controlParent(); + if (st_cp->variant() == PROC_HEDR || st_cp->variant() == PROG_HEDR || st_cp->variant() == FUNC_HEDR) + containsName = st_cp->symbol()->identifier() + std::string("."); + return containsName; } -static void InsertDefaultToMap() { - SgType* intType = new SgType(T_INT); +void ImplicitCheck(SgFile* file) { - SgType* realType = new SgType(T_FLOAT); + auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); + auto hasImplicitNone = false; - for (char i = 'a'; i <= 'z'; i++) { - implicit[i] = realType; - } + for (SgStatement* i = file->firstStatement(); i = i->lexNext(); i != NULL) { - for (char i = 'i'; i <= 'n'; i++) { - implicit[i] = intType; - } -} + if (i->variant() == IMPL_DECL) { + SgImplicitStmt* implicitSt = isSgImplicitStmt(i); + if (implicitSt) { + int numberOfTypes = implicitSt->numberOfImplicitTypes(); -static void CheckVariables(SgStatement* function) { + if (numberOfTypes > 0) { + for (int j = 0; j < numberOfTypes; j++) { + SgType* type = implicitSt->implicitType(j); + SgExpression* letters = implicitSt->implicitRangeList(j); - for (int k = 0; k < function->numberOfChildrenList1(); k++) { - SgStatement* state = function->childList1(k); - - - if (state->expr(0) && (state->expr(0)->variant() == VAR_REF || state->expr(0)->variant() == ARRAY_REF)) { - SgSymbol* symbol = state->expr(0)->symbol(); - auto x = declaratedInStmt(symbol, NULL, false); - - if (vars.find(symbol) == vars.end() && x == NULL) { - vars.insert(symbol); - - char firstLetter = *symbol->identifier(); - - if (implicit.find(firstLetter) != implicit.end()) { - if (implicit[firstLetter]->variant() != symbol->type()->variant()) { - symbol->setType(implicit[firstLetter]); - - if (symbol->declaredInStmt() == NULL) { - toDecl.push_back(symbol); - } - } - else { - toDecl.push_back(symbol); + types['a'] = type; + printf("%s\n", letters->unparse()); } } else { - //printf("Variable - "); - //printf(symbol->identifier()); - //printf(" - not found in IMPLICIT\n"); - throw; + hasImplicitNone = true; } } } + else { + printf("%s\nvariant - %d\n\n", i->unparse(), i->variant()); + } } - makeDeclaration(toDecl, function, NULL); + + if (!hasImplicitNone) { + auto firstRealStatementOfFile = file->firstStatement()->lexNext()->lexNext(); + firstRealStatementOfFile->insertStmtBefore(*implicitNoneDeclaration, *(firstRealStatementOfFile->controlParent())); + } + + printf("%s", file->firstStatement()->lexNext()->unparse()); + + return; +} + +void InitTypes() { + for (char i = 'a'; i <= 'z'; i++) { + types[i] = NULL; + } +} + +void FillCommonTypes() { + for (char i: commonIntLetters) { + if (types[i] == NULL) { + types[i] = new SgType(T_INT); + } + } + + for (auto i : types) { + if (i.second == NULL) { + types[i.first] = new SgType(T_FLOAT); + } + } +} + +void GetImplicitTypes(SgExpression* expr) { + if (expr == NULL) { + return; + } + + if (expr->variant() == IMPL_TYPE) { + auto letters = expr->operand(1); + auto type = expr->type(); + + printf("letters - %s\n", letters->unparse()); + } + + if (expr->lhs() != NULL) { + GetImplicitTypes(expr->lhs()); + } + if (expr->rhs() != NULL) { + GetImplicitTypes(expr->rhs()); + } } -void ImplicitCheck(SgProject* project) { - - /* - printf("IMPLICIT\n"); - */ - - for (int i = 0; i < project->numberOfFiles(); i++) { - SgFile file = project->file(i); - int coutOfFunctions; - for (int j = 0; j < file.numberOfFunctions(); j++) { - SgStatement* function = file.functions(j); +/* +* +* +auto x = implicitSt->numberOfImplicitTypes(); + printf("IMPLICIT\n%s", implicitSt->unparse()); + printf("number - %d\n", x); + for (int j = 0; j < x; j++) { + printf("%d - %s\n", j, implicitSt->implicitRangeList(j)->unparse()); + } + printf("\n"); +* +int coutOfFunctions; + for (int j = 0; j < file->numberOfFunctions(); j++) { + SgStatement* function = file->functions(j); implicit.clear(); vars.clear(); @@ -124,7 +139,7 @@ void ImplicitCheck(SgProject* project) { for (int k = 0; k < function->numberOfChildrenList1(); k++) { SgStatement* state = function->childList1(k); - + if (state->variant() == IMPL_DECL) { @@ -162,11 +177,11 @@ void ImplicitCheck(SgProject* project) { one = one->rhs(); } - } - + } + break; } - + if (state->variant() == CONTROL_END) { SgStatement* state = new SgStatement(IMPL_DECL); @@ -183,5 +198,89 @@ void ImplicitCheck(SgProject* project) { CheckVariables(function); } + + +static void InsertToMap(SgType* type, SgExpression* letters) { + + while (letters != NULL && letters->lhs() != NULL) { + + string letter; + + switch (letters->lhs()->sunparse().size()) { + + case 3: + letter = letters->lhs()->sunparse(); + implicit[letter[1]] = type; + + break; + case 7: + letter = letters->lhs()->sunparse(); + + for (char i = letter[1]; i <= letter[5]; i++) { + implicit[i] = type; + } + break; + default: + //printf("IMPLICIT bad format (can bew only {letter : letter} or {letter})"); + throw; + } + + letters = letters->rhs(); + } + +} + +static void InsertDefaultToMap() { + SgType* intType = new SgType(T_INT); + + SgType* realType = new SgType(T_FLOAT); + + for (char i = 'a'; i <= 'z'; i++) { + implicit[i] = realType; + } + + for (char i = 'i'; i <= 'n'; i++) { + implicit[i] = intType; } } + +static void CheckVariables(SgStatement* function) { + + for (int k = 0; k < function->numberOfChildrenList1(); k++) { + SgStatement* state = function->childList1(k); + + + if (state->expr(0) && (state->expr(0)->variant() == VAR_REF || state->expr(0)->variant() == ARRAY_REF)) { + SgSymbol* symbol = state->expr(0)->symbol(); + auto x = declaratedInStmt(symbol, NULL, false); + + if (vars.find(symbol) == vars.end() && x == NULL) { + vars.insert(symbol); + + char firstLetter = *symbol->identifier(); + + if (implicit.find(firstLetter) != implicit.end()) { + if (implicit[firstLetter]->variant() != symbol->type()->variant()) { + symbol->setType(implicit[firstLetter]); + + if (symbol->declaredInStmt() == NULL) { + toDecl.push_back(symbol); + } + } + else { + toDecl.push_back(symbol); + } + } + else { + //printf("Variable - "); + //printf(symbol->identifier()); + //printf(" - not found in IMPLICIT\n"); + throw; + } + } + } + } + + makeDeclaration(toDecl, function, NULL); +} +*/ diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h index 985c6d5..5d2fb25 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h @@ -1,7 +1,7 @@ #pragma once #include "Utils/SgUtils.h" -#include "string" -#include "map" +#include +#include -void ImplicitCheck(SgProject* project); \ No newline at end of file +void ImplicitCheck(SgFile* file); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index fd507f9..1085084 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -306,8 +306,6 @@ void InitPassesDependencies(map> &passDepsIn, set Pass(REMOVE_OMP_DIRS) <= Pass(REMOVE_OMP_DIRS_TRANSFORM); - Pass(CALL_GRAPH2) <= Pass(SET_IMPLICIT_NONE); - 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, REVERSE_CREATED_NESTED_LOOPS, PREDICT_SCHEME, CALCULATE_STATS_SCHEME, REVERT_SPF_DIRS, CLEAR_SPF_DIRS, TRANSFORM_SHADOW_IF_FULL, From cf2bed5c9cb8fcd1eff33e6f370765b5801d2f78 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Tue, 12 Mar 2024 11:24:52 +0300 Subject: [PATCH 04/68] Add comments --- .../Transformations/set_implicit_none.cpp | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index bb7928d..eb01b85 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -16,6 +16,7 @@ using std::string; using std::to_string; map types; +vector allVars; vector varsWithoutDecl; const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; @@ -23,15 +24,6 @@ void InitTypes(); void FillCommonTypes(); void GetImplicitTypes(SgExpression* expr); -static inline string getContains(SgStatement* funcSt) -{ - string containsName; - SgStatement* st_cp = funcSt->controlParent(); - if (st_cp->variant() == PROC_HEDR || st_cp->variant() == PROG_HEDR || st_cp->variant() == FUNC_HEDR) - containsName = st_cp->symbol()->identifier() + std::string("."); - return containsName; -} - void ImplicitCheck(SgFile* file) { auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); @@ -49,6 +41,7 @@ void ImplicitCheck(SgFile* file) { SgType* type = implicitSt->implicitType(j); SgExpression* letters = implicitSt->implicitRangeList(j); + // get real letters types['a'] = type; printf("%s\n", letters->unparse()); } @@ -63,6 +56,18 @@ void ImplicitCheck(SgFile* file) { } } + // get all vars + + for each (auto var in allVars) + { + SgStatement* declaredIn = declaratedInStmt(var); + if (declaredIn == NULL) { + varsWithoutDecl.push_back(var); + } + } + + // create decl + // delete implicit if (!hasImplicitNone) { auto firstRealStatementOfFile = file->firstStatement()->lexNext()->lexNext(); From 24f8ead2b0fe4f93707b766032fe2f0647d1b10c Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Tue, 12 Mar 2024 17:43:53 +0300 Subject: [PATCH 05/68] fix merge errors --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 1 + sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 9 - sapfor/experts/Sapfor_2017/_src/Sapfor.h | 3 - .../Transformations/set_implicit_none.cpp | 209 ++---------------- 4 files changed, 14 insertions(+), 208 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 46a19b1..02f7fb9 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -197,6 +197,7 @@ set(TR_IMPLICIT_NONE _src/Transformations/set_implicit_none.cpp set(TRANSFORMS ${TR_DEAD_CODE} + ${TR_CP} ${TR_VECTOR} ${TR_ENDDO_LOOP} ${TR_LOOP_NEST} diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 2d42e11..3d283a4 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -83,11 +83,8 @@ #include "Transformations/private_removing.h" #include "Transformations/fix_common_blocks.h" #include "Transformations/convert_to_c.h" -<<<<<<< HEAD #include "Transformations/set_implicit_none.h" -======= #include "Transformations/dead_code.h" ->>>>>>> master #include "RenameSymbols/rename_symbols.h" #include "ProjectParameters/projectParameters.h" @@ -1175,10 +1172,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne getMaxMinBlockDistribution(file, min_max_block); else if (curr_regime == CONVERT_TO_C) covertToC(file); -<<<<<<< HEAD else if (curr_regime == SET_IMPLICIT_NONE) ImplicitCheck(file); -======= else if (curr_regime == INSERT_NO_DISTR_FLAGS_FROM_GUI) addPrivatesToArraysFromGUI(file, declaredArrays, distrStateFromGUI); else if (curr_regime == REMOVE_DEAD_CODE) @@ -1187,7 +1182,6 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne for (auto& func : funcsForFile) removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); } ->>>>>>> master else if (curr_regime == TEST_PASS) { //test pass @@ -2645,10 +2639,7 @@ int main(int argc, char **argv) else if (string(curr_arg) == "-passN") { i++; - // test - curr_regime = getPassCode(argv[i]); - curr_regime = 130; printf("code for pass %s is %d\n", argv[i], curr_regime); } else if (string(curr_arg) == "-passInfo") diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.h b/sapfor/experts/Sapfor_2017/_src/Sapfor.h index d3ceb53..4a08593 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.h +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.h @@ -356,11 +356,8 @@ static void setPassValues() passNames[REMOVE_COMMENTS] = "REMOVE_COMMENTS"; passNames[GET_MIN_MAX_BLOCK_DIST] = "GET_MIN_MAX_BLOCK_DIST"; passNames[CONVERT_TO_C] = "CONVERT_TO_C"; -<<<<<<< HEAD passNames[SET_IMPLICIT_NONE] = "SET_IMPLICIT_NONE"; -======= passNames[INSERT_NO_DISTR_FLAGS_FROM_GUI] = "INSERT_NO_DISTR_FLAGS_FROM_GUI"; ->>>>>>> master passNames[TEST_PASS] = "TEST_PASS"; } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index eb01b85..85f2389 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -22,13 +22,15 @@ const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; void InitTypes(); void FillCommonTypes(); -void GetImplicitTypes(SgExpression* expr); void ImplicitCheck(SgFile* file) { auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; + InitTypes(); + FillCommonTypes(); + for (SgStatement* i = file->firstStatement(); i = i->lexNext(); i != NULL) { if (i->variant() == IMPL_DECL) { @@ -51,14 +53,11 @@ void ImplicitCheck(SgFile* file) { } } } - else { - printf("%s\nvariant - %d\n\n", i->unparse(), i->variant()); - } } // get all vars - for each (auto var in allVars) + for (auto var : allVars) { SgStatement* declaredIn = declaratedInStmt(var); if (declaredIn == NULL) { @@ -69,7 +68,16 @@ void ImplicitCheck(SgFile* file) { // create decl // delete implicit + if (!hasImplicitNone) { + for (SgStatement* i = file->firstStatement(); ; i != NULL) { + if (i->variant() == IMPL_DECL) { + auto tmp = i; + i = i->lexNext(); + tmp->deleteStmt(); + } + } + auto firstRealStatementOfFile = file->firstStatement()->lexNext()->lexNext(); firstRealStatementOfFile->insertStmtBefore(*implicitNoneDeclaration, *(firstRealStatementOfFile->controlParent())); } @@ -98,194 +106,3 @@ void FillCommonTypes() { } } } - -void GetImplicitTypes(SgExpression* expr) { - if (expr == NULL) { - return; - } - - if (expr->variant() == IMPL_TYPE) { - auto letters = expr->operand(1); - auto type = expr->type(); - - printf("letters - %s\n", letters->unparse()); - } - - if (expr->lhs() != NULL) { - GetImplicitTypes(expr->lhs()); - } - if (expr->rhs() != NULL) { - GetImplicitTypes(expr->rhs()); - } -} - - -/* -* -* -auto x = implicitSt->numberOfImplicitTypes(); - printf("IMPLICIT\n%s", implicitSt->unparse()); - printf("number - %d\n", x); - for (int j = 0; j < x; j++) { - printf("%d - %s\n", j, implicitSt->implicitRangeList(j)->unparse()); - } - printf("\n"); -* -int coutOfFunctions; - for (int j = 0; j < file->numberOfFunctions(); j++) { - SgStatement* function = file->functions(j); - - implicit.clear(); - vars.clear(); - toDecl.clear(); - - //fill implicit - - for (int k = 0; k < function->numberOfChildrenList1(); k++) { - SgStatement* state = function->childList1(k); - - - - if (state->variant() == IMPL_DECL) { - - if (state->expr(0) == NULL) { - - } - else { - SgExpression* expression = state->expr(0); - int n = 0; - SgExpression* one = expression; - - while (one != NULL && one->lhs() != NULL) { - - string what_type = one->lhs()->sunparse(); - - if (what_type.find("kind=") != std::string::npos) { - - SgType* baseType = new SgType(one->lhs()->type()->variant()); - - SgType* type = new SgType(T_ARRAY, NULL, baseType); - - SgExpression* letters = one->lhs()->operand(1); - - InsertToMap(type, letters); - } - else { - - SgType* type = new SgType(one->lhs()->type()->variant()); - - SgExpression* letters = one->lhs()->operand(1); - - InsertToMap(type, letters); - } - - one = one->rhs(); - } - - } - - break; - } - - if (state->variant() == CONTROL_END) { - - SgStatement* state = new SgStatement(IMPL_DECL); - auto cp = function->childList1(0)->controlParent(); - function->childList1(0)->insertStmtBefore(*state, *cp); - - - InsertDefaultToMap(); - - break; - } - } - - CheckVariables(function); - - } - - -static void InsertToMap(SgType* type, SgExpression* letters) { - - while (letters != NULL && letters->lhs() != NULL) { - - string letter; - - switch (letters->lhs()->sunparse().size()) { - - case 3: - letter = letters->lhs()->sunparse(); - implicit[letter[1]] = type; - - break; - case 7: - letter = letters->lhs()->sunparse(); - - for (char i = letter[1]; i <= letter[5]; i++) { - implicit[i] = type; - } - break; - default: - //printf("IMPLICIT bad format (can bew only {letter : letter} or {letter})"); - throw; - } - - letters = letters->rhs(); - } - -} - -static void InsertDefaultToMap() { - SgType* intType = new SgType(T_INT); - - SgType* realType = new SgType(T_FLOAT); - - for (char i = 'a'; i <= 'z'; i++) { - implicit[i] = realType; - } - - for (char i = 'i'; i <= 'n'; i++) { - implicit[i] = intType; - } -} - -static void CheckVariables(SgStatement* function) { - - for (int k = 0; k < function->numberOfChildrenList1(); k++) { - SgStatement* state = function->childList1(k); - - - if (state->expr(0) && (state->expr(0)->variant() == VAR_REF || state->expr(0)->variant() == ARRAY_REF)) { - SgSymbol* symbol = state->expr(0)->symbol(); - auto x = declaratedInStmt(symbol, NULL, false); - - if (vars.find(symbol) == vars.end() && x == NULL) { - vars.insert(symbol); - - char firstLetter = *symbol->identifier(); - - if (implicit.find(firstLetter) != implicit.end()) { - if (implicit[firstLetter]->variant() != symbol->type()->variant()) { - symbol->setType(implicit[firstLetter]); - - if (symbol->declaredInStmt() == NULL) { - toDecl.push_back(symbol); - } - } - else { - toDecl.push_back(symbol); - } - } - else { - //printf("Variable - "); - //printf(symbol->identifier()); - //printf(" - not found in IMPLICIT\n"); - throw; - } - } - } - } - - makeDeclaration(toDecl, function, NULL); -} -*/ From 76d173d5541c171d55db257f8ec9b9335219d8f9 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Wed, 13 Mar 2024 23:38:42 +0300 Subject: [PATCH 06/68] WIP: add deleting implicit stmts aninserting decls --- .../Transformations/set_implicit_none.cpp | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 85f2389..1cb3ce4 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -22,16 +22,26 @@ const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; void InitTypes(); void FillCommonTypes(); +void FunctionImplicitCheck(SgStatement* function); void ImplicitCheck(SgFile* file) { + for (int funcNum = 0; funcNum < file->numberOfFunctions(); funcNum++) { + SgStatement* function = file->functions(funcNum); + FunctionImplicitCheck(function); + } + + return; +} + +void FunctionImplicitCheck(SgStatement* function) { auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; InitTypes(); FillCommonTypes(); - for (SgStatement* i = file->firstStatement(); i = i->lexNext(); i != NULL) { + for (SgStatement* i = function->lexNext(); i = i->lexNext(); i != NULL) { if (i->variant() == IMPL_DECL) { SgImplicitStmt* implicitSt = isSgImplicitStmt(i); @@ -44,8 +54,7 @@ void ImplicitCheck(SgFile* file) { SgExpression* letters = implicitSt->implicitRangeList(j); // get real letters - types['a'] = type; - printf("%s\n", letters->unparse()); + types['o'] = type; } } else { @@ -55,34 +64,49 @@ void ImplicitCheck(SgFile* file) { } } - // get all vars + for (SgSymbol* symbol = function->symbol(); symbol != NULL; symbol = symbol->next()) { + if (symbol != NULL && symbol->declaredInStmt() != NULL) { + allVars.push_back(symbol); + } + } for (auto var : allVars) { - SgStatement* declaredIn = declaratedInStmt(var); + vector _; + SgStatement* declaredIn = declaratedInStmt(var, &_, false); if (declaredIn == NULL) { varsWithoutDecl.push_back(var); } } - // create decl - // delete implicit + for (auto var : varsWithoutDecl) { + vector test = { var }; + char c = var->identifier()[0]; + if (types.find(c) != types.end()) { + test[0]->setType(types[c]); + } + + makeDeclaration(function, test); + } if (!hasImplicitNone) { - for (SgStatement* i = file->firstStatement(); ; i != NULL) { + for (SgStatement* i = function->lexNext(); i != NULL;) { if (i->variant() == IMPL_DECL) { auto tmp = i; i = i->lexNext(); tmp->deleteStmt(); } + else { + i = i->lexNext(); + } } - auto firstRealStatementOfFile = file->firstStatement()->lexNext()->lexNext(); + auto firstRealStatementOfFile = function->lexNext(); firstRealStatementOfFile->insertStmtBefore(*implicitNoneDeclaration, *(firstRealStatementOfFile->controlParent())); } - printf("%s", file->firstStatement()->lexNext()->unparse()); + printf("%s", function->unparse()); return; } From f145afceef27923b96fb0f89604587467f21d117 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Thu, 14 Mar 2024 15:45:03 +0300 Subject: [PATCH 07/68] Fix warnings --- .../Transformations/set_implicit_none.cpp | 108 ++++++++++-------- 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 1cb3ce4..cb719e4 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -1,19 +1,8 @@ -#include -#include -#include -#include - #include "Utils/SgUtils.h" #include "set_implicit_none.h" -#include using std::vector; using std::map; -using std::multimap; -using std::set; -using std::make_pair; -using std::string; -using std::to_string; map types; vector allVars; @@ -24,9 +13,11 @@ void InitTypes(); void FillCommonTypes(); void FunctionImplicitCheck(SgStatement* function); -void ImplicitCheck(SgFile* file) { +void ImplicitCheck(SgFile* file) +{ - for (int funcNum = 0; funcNum < file->numberOfFunctions(); funcNum++) { + for (int funcNum = 0; funcNum < file->numberOfFunctions(); funcNum++) + { SgStatement* function = file->functions(funcNum); FunctionImplicitCheck(function); } @@ -34,22 +25,27 @@ void ImplicitCheck(SgFile* file) { return; } -void FunctionImplicitCheck(SgStatement* function) { +void FunctionImplicitCheck(SgStatement* function) +{ auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; InitTypes(); FillCommonTypes(); - for (SgStatement* i = function->lexNext(); i = i->lexNext(); i != NULL) { - - if (i->variant() == IMPL_DECL) { - SgImplicitStmt* implicitSt = isSgImplicitStmt(i); - if (implicitSt) { + for (SgStatement* statement = function->lexNext(); statement = statement->lexNext(); statement != NULL) + { + if (statement->variant() == IMPL_DECL) + { + SgImplicitStmt* implicitSt = isSgImplicitStmt(statement); + if (implicitSt) + { int numberOfTypes = implicitSt->numberOfImplicitTypes(); - if (numberOfTypes > 0) { - for (int j = 0; j < numberOfTypes; j++) { + if (numberOfTypes > 0) + { + for (int j = 0; j < numberOfTypes; j++) + { SgType* type = implicitSt->implicitType(j); SgExpression* letters = implicitSt->implicitRangeList(j); @@ -57,15 +53,22 @@ void FunctionImplicitCheck(SgStatement* function) { types['o'] = type; } } - else { + else + { hasImplicitNone = true; } } } + else if (statement->variant() == CONTAINS_STMT || isSgExecutableStatement(statement) != NULL) + { + break; + } } - for (SgSymbol* symbol = function->symbol(); symbol != NULL; symbol = symbol->next()) { - if (symbol != NULL && symbol->declaredInStmt() != NULL) { + for (SgSymbol* symbol = function->symbol(); symbol != NULL; symbol = symbol->next()) + { + if (symbol != NULL && symbol->declaredInStmt() != NULL) + { allVars.push_back(symbol); } } @@ -74,36 +77,38 @@ void FunctionImplicitCheck(SgStatement* function) { { vector _; SgStatement* declaredIn = declaratedInStmt(var, &_, false); - if (declaredIn == NULL) { + if (declaredIn == NULL) + { + char c = var->identifier()[0]; + + if (types.find(c) != types.end()) + { + var->setType(types[c]); + } + varsWithoutDecl.push_back(var); } } - for (auto var : varsWithoutDecl) { - vector test = { var }; - char c = var->identifier()[0]; + makeDeclaration(varsWithoutDecl, function, NULL); - if (types.find(c) != types.end()) { - test[0]->setType(types[c]); - } - - makeDeclaration(function, test); - } - - if (!hasImplicitNone) { - for (SgStatement* i = function->lexNext(); i != NULL;) { - if (i->variant() == IMPL_DECL) { + if (!hasImplicitNone) + { + for (SgStatement* i = function->lexNext(); i != NULL;) + { + if (i->variant() == IMPL_DECL) + { auto tmp = i; i = i->lexNext(); tmp->deleteStmt(); } - else { + else + { i = i->lexNext(); } } - auto firstRealStatementOfFile = function->lexNext(); - firstRealStatementOfFile->insertStmtBefore(*implicitNoneDeclaration, *(firstRealStatementOfFile->controlParent())); + function->insertStmtBefore(*implicitNoneDeclaration, *function); } printf("%s", function->unparse()); @@ -111,21 +116,28 @@ void FunctionImplicitCheck(SgStatement* function) { return; } -void InitTypes() { - for (char i = 'a'; i <= 'z'; i++) { +void InitTypes() +{ + for (char i = 'a'; i <= 'z'; i++) + { types[i] = NULL; } } -void FillCommonTypes() { - for (char i: commonIntLetters) { - if (types[i] == NULL) { +void FillCommonTypes() +{ + for (char i: commonIntLetters) + { + if (types[i] == NULL) + { types[i] = new SgType(T_INT); } } - for (auto i : types) { - if (i.second == NULL) { + for (auto i : types) + { + if (i.second == NULL) + { types[i.first] = new SgType(T_FLOAT); } } From c00f8d69777ca3e454265ba1726f30345d7c7507 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Sat, 16 Mar 2024 15:31:06 +0300 Subject: [PATCH 08/68] Fix searching letters and vars --- .../Transformations/set_implicit_none.cpp | 136 +++++++++++++----- 1 file changed, 101 insertions(+), 35 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index cb719e4..dfefa2e 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -3,23 +3,32 @@ using std::vector; using std::map; +using std::set; map types; -vector allVars; +set allVars; vector varsWithoutDecl; const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; void InitTypes(); void FillCommonTypes(); +void CleanTypes(); void FunctionImplicitCheck(SgStatement* function); +void FindAllVars(SgExpression* expr); +char AddLettersToMap(SgExpression* params, SgType* type); void ImplicitCheck(SgFile* file) { - for (int funcNum = 0; funcNum < file->numberOfFunctions(); funcNum++) + for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++) { - SgStatement* function = file->functions(funcNum); + InitTypes(); + FillCommonTypes(); + + SgStatement* function = file->functions(functionNumber); FunctionImplicitCheck(function); + + CleanTypes(); } return; @@ -30,27 +39,23 @@ void FunctionImplicitCheck(SgStatement* function) auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; - InitTypes(); - FillCommonTypes(); - - for (SgStatement* statement = function->lexNext(); statement = statement->lexNext(); statement != NULL) + for (SgStatement* statement = function; statement = statement->lexNext(); statement != NULL) { if (statement->variant() == IMPL_DECL) { - SgImplicitStmt* implicitSt = isSgImplicitStmt(statement); - if (implicitSt) + SgImplicitStmt* implicitStatement = isSgImplicitStmt(statement); + if (implicitStatement != NULL) { - int numberOfTypes = implicitSt->numberOfImplicitTypes(); + int numberOfTypes = implicitStatement->numberOfImplicitTypes(); if (numberOfTypes > 0) { for (int j = 0; j < numberOfTypes; j++) { - SgType* type = implicitSt->implicitType(j); - SgExpression* letters = implicitSt->implicitRangeList(j); + SgType* type = implicitStatement->implicitType(j); + SgExpression* lettersExpression = implicitStatement->implicitRangeList(j); - // get real letters - types['o'] = type; + AddLettersToMap(lettersExpression, type); } } else @@ -65,19 +70,19 @@ void FunctionImplicitCheck(SgStatement* function) } } - for (SgSymbol* symbol = function->symbol(); symbol != NULL; symbol = symbol->next()) + for (SgStatement* statement = function; statement != function->lastExecutable(); statement = statement->lexNext()) { - if (symbol != NULL && symbol->declaredInStmt() != NULL) + for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++) { - allVars.push_back(symbol); + FindAllVars(statement->expr(expressionNumber)); } } for (auto var : allVars) { vector _; - SgStatement* declaredIn = declaratedInStmt(var, &_, false); - if (declaredIn == NULL) + SgStatement* declaredInStatement = declaratedInStmt(var, &_, false); + if (declaredInStatement == NULL) { char c = var->identifier()[0]; @@ -94,51 +99,112 @@ void FunctionImplicitCheck(SgStatement* function) if (!hasImplicitNone) { - for (SgStatement* i = function->lexNext(); i != NULL;) + for (SgStatement* statement = function->lexNext(); statement != NULL;) { - if (i->variant() == IMPL_DECL) + if (statement->variant() == IMPL_DECL) { - auto tmp = i; - i = i->lexNext(); - tmp->deleteStmt(); + auto tmpStatement = statement; + statement = statement->lexNext(); + tmpStatement->deleteStmt(); } else { - i = i->lexNext(); + statement = statement->lexNext(); } } function->insertStmtBefore(*implicitNoneDeclaration, *function); } - printf("%s", function->unparse()); - return; } void InitTypes() { - for (char i = 'a'; i <= 'z'; i++) + for (char letter = 'a'; letter <= 'z'; letter++) { - types[i] = NULL; + types[letter] = NULL; } } void FillCommonTypes() { - for (char i: commonIntLetters) + for (char letter : commonIntLetters) { - if (types[i] == NULL) + if (types[letter] == NULL) { - types[i] = new SgType(T_INT); + types[letter] = new SgType(T_INT); } } - for (auto i : types) + for (auto letter : types) { - if (i.second == NULL) + if (letter.second == NULL) { - types[i.first] = new SgType(T_FLOAT); + types[letter.first] = new SgType(T_FLOAT); } } } + +void CleanTypes() +{ + types.clear(); + allVars.clear(); + varsWithoutDecl.clear(); +} + +void FindAllVars(SgExpression* expr) +{ + if (expr == NULL) + { + return; + } + + if (expr->symbol() != NULL) + { + allVars.insert(expr->symbol()); + } + + FindAllVars(expr->lhs()); + FindAllVars(expr->rhs()); +} + +char AddLettersToMap(SgExpression* expr, SgType* type) +{ + if (expr == NULL) + { + return NULL; + } + + if (expr->variant() == CHAR_VAL) + { + SgValueExp* val = isSgValueExp(expr); + return val->charValue(); + } + + char leftVal = AddLettersToMap(expr->lhs(), type); + char rightVal = AddLettersToMap(expr->rhs(), type); + + if (expr->variant() == DDOT) + { + if (leftVal != NULL && rightVal != NULL) + { + for (char letter = leftVal; letter <= rightVal; letter++) + { + types[letter] = type; + } + } + } + + if (expr->variant() == EXPR_LIST) + { + if (leftVal != NULL) { + types[leftVal] = type; + } + if (rightVal != NULL) { + types[rightVal] = type; + } + } + + return NULL; +} \ No newline at end of file From 34bc8b0219899637742825b1b993eba3596428f8 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Sat, 16 Mar 2024 19:40:29 +0300 Subject: [PATCH 09/68] Fix problems --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 1 - .../Transformations/set_implicit_none.cpp | 65 ++++--------------- 2 files changed, 13 insertions(+), 53 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 3d283a4..375238c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -2541,7 +2541,6 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam case LOOPS_SPLITTER: case LOOPS_COMBINER: case FIX_COMMON_BLOCKS: - //case SET_IMPLICIT_NONE: case TEST_PASS: runAnalysis(*project, curr_regime, false); case SUBST_EXPR_RD_AND_UNPARSE: diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index dfefa2e..4efb058 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -19,7 +19,6 @@ char AddLettersToMap(SgExpression* params, SgType* type); void ImplicitCheck(SgFile* file) { - for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++) { InitTypes(); @@ -30,16 +29,14 @@ void ImplicitCheck(SgFile* file) CleanTypes(); } - - return; } -void FunctionImplicitCheck(SgStatement* function) +static void FunctionImplicitCheck(SgStatement* function) { auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; - for (SgStatement* statement = function; statement = statement->lexNext(); statement != NULL) + for (SgStatement* statement = function; statement != NULL; statement = statement->lexNext()) { if (statement->variant() == IMPL_DECL) { @@ -59,24 +56,16 @@ void FunctionImplicitCheck(SgStatement* function) } } else - { hasImplicitNone = true; - } } } else if (statement->variant() == CONTAINS_STMT || isSgExecutableStatement(statement) != NULL) - { break; - } } for (SgStatement* statement = function; statement != function->lastExecutable(); statement = statement->lexNext()) - { for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++) - { FindAllVars(statement->expr(expressionNumber)); - } - } for (auto var : allVars) { @@ -87,9 +76,7 @@ void FunctionImplicitCheck(SgStatement* function) char c = var->identifier()[0]; if (types.find(c) != types.end()) - { var->setType(types[c]); - } varsWithoutDecl.push_back(var); } @@ -108,73 +95,55 @@ void FunctionImplicitCheck(SgStatement* function) tmpStatement->deleteStmt(); } else - { statement = statement->lexNext(); - } } - function->insertStmtBefore(*implicitNoneDeclaration, *function); + function->insertStmtAfter(*implicitNoneDeclaration, *function); } - return; + printf("%s", function->unparse()); } -void InitTypes() +static void InitTypes() { for (char letter = 'a'; letter <= 'z'; letter++) - { types[letter] = NULL; - } } -void FillCommonTypes() +static void FillCommonTypes() { for (char letter : commonIntLetters) - { if (types[letter] == NULL) - { types[letter] = new SgType(T_INT); - } - } for (auto letter : types) - { if (letter.second == NULL) - { types[letter.first] = new SgType(T_FLOAT); - } - } } -void CleanTypes() +static void CleanTypes() { types.clear(); allVars.clear(); varsWithoutDecl.clear(); } -void FindAllVars(SgExpression* expr) +static void FindAllVars(SgExpression* expr) { if (expr == NULL) - { return; - } - if (expr->symbol() != NULL) - { + if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF) allVars.insert(expr->symbol()); - } FindAllVars(expr->lhs()); FindAllVars(expr->rhs()); } -char AddLettersToMap(SgExpression* expr, SgType* type) +static char AddLettersToMap(SgExpression* expr, SgType* type) { if (expr == NULL) - { return NULL; - } if (expr->variant() == CHAR_VAL) { @@ -186,24 +155,16 @@ char AddLettersToMap(SgExpression* expr, SgType* type) char rightVal = AddLettersToMap(expr->rhs(), type); if (expr->variant() == DDOT) - { if (leftVal != NULL && rightVal != NULL) - { for (char letter = leftVal; letter <= rightVal; letter++) - { types[letter] = type; - } - } - } if (expr->variant() == EXPR_LIST) - { - if (leftVal != NULL) { + { + if (leftVal != NULL) types[leftVal] = type; - } - if (rightVal != NULL) { + if (rightVal != NULL) types[rightVal] = type; - } } return NULL; From fbcddeea8ff7db1125fd7a2ec801a57c27e47dce Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Sun, 17 Mar 2024 18:46:49 +0300 Subject: [PATCH 10/68] Remove printf --- .../Sapfor_2017/_src/Transformations/set_implicit_none.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 4efb058..f891380 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -100,8 +100,6 @@ static void FunctionImplicitCheck(SgStatement* function) function->insertStmtAfter(*implicitNoneDeclaration, *function); } - - printf("%s", function->unparse()); } static void InitTypes() From b80c941fec8ec92f0be743ef442c345efa95929c Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Thu, 21 Mar 2024 21:05:14 +0300 Subject: [PATCH 11/68] Fix internal program error --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 7 +- .../Transformations/set_implicit_none.cpp | 176 +++++++++--------- 2 files changed, 96 insertions(+), 87 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 02f7fb9..7d0c5d2 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -178,9 +178,9 @@ set(TR_LOOP_SPLIT _src/Transformations/loops_splitter.cpp set(TR_LOOP_UNROLL _src/Transformations/loops_unrolling.cpp _src/Transformations/loops_unrolling.h) set(TR_PRIV_BR _src/Transformations/private_arrays_resizing.cpp - _src/Transformations/private_arrays_resizing.h) + _src/Transformations/private_arrays_resizing.h) set(TR_PRIV_DEL _src/Transformations/private_removing.cpp - _src/Transformations/private_removing.h) + _src/Transformations/private_removing.h) set(TR_SWAP_ARR_DIMS _src/Transformations/swap_array_dims.cpp _src/Transformations/swap_array_dims.h) set(TR_FUNC_DUP _src/Transformations/uniq_call_chain_dup.cpp @@ -190,8 +190,7 @@ set(TR_FUNC_PURE _src/Transformations/function_purifying.cpp set(TR_GV _src/Transformations/fix_common_blocks.cpp _src/Transformations/fix_common_blocks.h) set(TR_CONV _src/Transformations/convert_to_c.cpp - _src/Transformations/convert_to_c.h) - + _src/Transformations/convert_to_c.h) set(TR_IMPLICIT_NONE _src/Transformations/set_implicit_none.cpp _src/Transformations/set_implicit_none.h) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index f891380..c7c6eb9 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -5,39 +5,86 @@ using std::vector; using std::map; using std::set; -map types; -set allVars; -vector varsWithoutDecl; -const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; +static const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; -void InitTypes(); -void FillCommonTypes(); -void CleanTypes(); -void FunctionImplicitCheck(SgStatement* function); -void FindAllVars(SgExpression* expr); -char AddLettersToMap(SgExpression* params, SgType* type); - -void ImplicitCheck(SgFile* file) +static void InitTypes(map types) { - for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++) - { - InitTypes(); - FillCommonTypes(); - - SgStatement* function = file->functions(functionNumber); - FunctionImplicitCheck(function); - - CleanTypes(); - } + for (char letter = 'a'; letter <= 'z'; letter++) + types[letter] = NULL; } -static void FunctionImplicitCheck(SgStatement* function) +static void FillCommonTypes(map types) { + for (char letter : commonIntLetters) + if (types[letter] == NULL) + types[letter] = new SgType(T_INT); + + for (auto letter : types) + if (letter.second == NULL) + types[letter.first] = new SgType(T_FLOAT); +} + +static void FindAllVars(SgExpression* expr, set* allVars) +{ + if (expr == NULL) + return; + + if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF) + allVars->insert(expr->symbol()); + + FindAllVars(expr->lhs(), allVars); + FindAllVars(expr->rhs(), allVars); +} + +static char AddLettersToMap(SgExpression* expr, SgType* type, map& types) +{ + if (expr == NULL) + return NULL; + + if (expr->variant() == CHAR_VAL) + { + SgValueExp* val = isSgValueExp(expr); + return val->charValue(); + } + + char leftVal = AddLettersToMap(expr->lhs(), type, types); + char rightVal = AddLettersToMap(expr->rhs(), type, types); + + if (expr->variant() == DDOT) + if (leftVal != NULL && rightVal != NULL) + for (char letter = leftVal; letter <= rightVal; letter++) + types[letter] = type; + + if (expr->variant() == EXPR_LIST) + { + if (leftVal != NULL) + types[leftVal] = type; + if (rightVal != NULL) + types[rightVal] = type; + } + + return NULL; +} + +static map FunctionImplicitCheck(SgStatement* function, map>& typesByFunctions) +{ + set allVars; + map types; + vector varsWithoutDecl; + + InitTypes(types); + FillCommonTypes(types); + + if (typesByFunctions.find(function->controlParent()) != typesByFunctions.end()) + for (auto parentType : typesByFunctions[function->controlParent()]) + types[parentType.first] = parentType.second; + auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; for (SgStatement* statement = function; statement != NULL; statement = statement->lexNext()) { + if (statement->variant() == IMPL_DECL) { SgImplicitStmt* implicitStatement = isSgImplicitStmt(statement); @@ -52,8 +99,8 @@ static void FunctionImplicitCheck(SgStatement* function) SgType* type = implicitStatement->implicitType(j); SgExpression* lettersExpression = implicitStatement->implicitRangeList(j); - AddLettersToMap(lettersExpression, type); - } + AddLettersToMap(lettersExpression, type, types); + } } else hasImplicitNone = true; @@ -63,9 +110,15 @@ static void FunctionImplicitCheck(SgStatement* function) break; } - for (SgStatement* statement = function; statement != function->lastExecutable(); statement = statement->lexNext()) + for (SgStatement* statement = function; + statement != NULL && statement->variant() != CONTAINS_STMT; statement = statement->lexNext()) + { for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++) - FindAllVars(statement->expr(expressionNumber)); + FindAllVars(statement->expr(expressionNumber), &allVars); + + if (statement == function->lastExecutable()) + break; + } for (auto var : allVars) { @@ -86,7 +139,8 @@ static void FunctionImplicitCheck(SgStatement* function) if (!hasImplicitNone) { - for (SgStatement* statement = function->lexNext(); statement != NULL;) + for (SgStatement* statement = function->lexNext(); + statement != NULL && statement->variant() != CONTAINS_STMT && isSgExecutableStatement(statement) == NULL;) { if (statement->variant() == IMPL_DECL) { @@ -100,70 +154,26 @@ static void FunctionImplicitCheck(SgStatement* function) function->insertStmtAfter(*implicitNoneDeclaration, *function); } -} -static void InitTypes() -{ - for (char letter = 'a'; letter <= 'z'; letter++) - types[letter] = NULL; -} - -static void FillCommonTypes() -{ - for (char letter : commonIntLetters) - if (types[letter] == NULL) - types[letter] = new SgType(T_INT); - - for (auto letter : types) - if (letter.second == NULL) - types[letter.first] = new SgType(T_FLOAT); -} - -static void CleanTypes() -{ - types.clear(); allVars.clear(); varsWithoutDecl.clear(); + + return types; } -static void FindAllVars(SgExpression* expr) +void ImplicitCheck(SgFile* file) { - if (expr == NULL) - return; + map> typesByFunctions; - if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF) - allVars.insert(expr->symbol()); - - FindAllVars(expr->lhs()); - FindAllVars(expr->rhs()); -} - -static char AddLettersToMap(SgExpression* expr, SgType* type) -{ - if (expr == NULL) - return NULL; - - if (expr->variant() == CHAR_VAL) + for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++) { - SgValueExp* val = isSgValueExp(expr); - return val->charValue(); + SgStatement* function = file->functions(functionNumber); + + map& types = FunctionImplicitCheck(function, typesByFunctions); + typesByFunctions[function] = types; } - char leftVal = AddLettersToMap(expr->lhs(), type); - char rightVal = AddLettersToMap(expr->rhs(), type); - - if (expr->variant() == DDOT) - if (leftVal != NULL && rightVal != NULL) - for (char letter = leftVal; letter <= rightVal; letter++) - types[letter] = type; + typesByFunctions.clear(); - if (expr->variant() == EXPR_LIST) - { - if (leftVal != NULL) - types[leftVal] = type; - if (rightVal != NULL) - types[rightVal] = type; - } - - return NULL; + printf("%s", file->firstStatement()->unparse()); } \ No newline at end of file From 35dc4302437d4c307f4ff9eb2af87d0a8b695e52 Mon Sep 17 00:00:00 2001 From: DenisDudarenko Date: Fri, 22 Mar 2024 09:19:14 +0300 Subject: [PATCH 12/68] Fix link transport --- .../_src/Transformations/set_implicit_none.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index c7c6eb9..1aaa4c5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -7,13 +7,13 @@ using std::set; static const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; -static void InitTypes(map types) +static void InitTypes(map& types) { for (char letter = 'a'; letter <= 'z'; letter++) types[letter] = NULL; } -static void FillCommonTypes(map types) +static void FillCommonTypes(map& types) { for (char letter : commonIntLetters) if (types[letter] == NULL) @@ -24,13 +24,13 @@ static void FillCommonTypes(map types) types[letter.first] = new SgType(T_FLOAT); } -static void FindAllVars(SgExpression* expr, set* allVars) +static void FindAllVars(SgExpression* expr, set& allVars) { if (expr == NULL) return; if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF) - allVars->insert(expr->symbol()); + allVars.insert(expr->symbol()); FindAllVars(expr->lhs(), allVars); FindAllVars(expr->rhs(), allVars); @@ -114,7 +114,7 @@ static map FunctionImplicitCheck(SgStatement* function, mapvariant() != CONTAINS_STMT; statement = statement->lexNext()) { for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++) - FindAllVars(statement->expr(expressionNumber), &allVars); + FindAllVars(statement->expr(expressionNumber), allVars); if (statement == function->lastExecutable()) break; @@ -174,6 +174,4 @@ void ImplicitCheck(SgFile* file) } typesByFunctions.clear(); - - printf("%s", file->firstStatement()->unparse()); } \ No newline at end of file From d27b9d1ed3effb33755ef3387fc0a0a925fbaaf8 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 22 Mar 2024 12:00:01 +0300 Subject: [PATCH 13/68] dvm updated, fixed and improved dead_code pass --- dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp | 9 +- dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c | 25 ----- dvm/fdvm/trunk/fdvm/dvm.cpp | 3 +- .../_src/ProjectManipulation/ConvertFiles.cpp | 2 - .../_src/Transformations/dead_code.cpp | 100 ++++++++++-------- .../_src/Transformations/dead_code.h | 3 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 7 files changed, 64 insertions(+), 80 deletions(-) diff --git a/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp b/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp index c748f71..dc7874e 100644 --- a/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp +++ b/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp @@ -26,7 +26,6 @@ extern "C" void exit(int status); #include "extcxx_low.h" extern "C" int number_of_ll_node; extern "C" PTR_SYMB last_file_symbol; -extern "C" PTR_SYMB FileLastSymbol(...); #undef USER @@ -1647,7 +1646,7 @@ SgFile &SgProject::file(int i) #ifdef __SPF SgStatement::setCurrProcessFile(pt->filename()); SgStatement::setCurrProcessLine(0); - last_file_symbol = FileLastSymbol(pt->filename()); + last_file_symbol = file->cur_symb; #endif return *pt; } @@ -1775,13 +1774,13 @@ int SgFile::switchToFile(const std::string &name) SgFile *file = &(CurrentProject->file(it->second.second)); current_file_id = it->second.second; current_file = file; - + SgStatement::setCurrProcessFile(file->filename()); SgStatement::setCurrProcessLine(0); + last_file_symbol = current_file->filept->cur_symb; } } - - last_file_symbol = FileLastSymbol(name.c_str()); + return it->second.second; } diff --git a/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c b/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c index 3b95b45..02bf326 100644 --- a/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c +++ b/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c @@ -83,12 +83,6 @@ int out_upper_case; int out_line_unlimit; int out_line_length; // out_line_length = 132 for -ffo mode; out_line_length = 72 for -uniForm mode PTR_SYMB last_file_symbol; -struct file_symbol { - char *fname; - PTR_SYMB last_symb; - struct file_symbol *next; -} ; -struct file_symbol *file_last_symbol = NULL; static int CountNullBifNext = 0; /* for internal debugging */ @@ -253,24 +247,6 @@ char* mymalloc(int size) return pt1; } -PTR_SYMB FileLastSymbol(char *file_name) -{ - struct file_symbol *fsl; - for(fsl=file_last_symbol; fsl; fsl=fsl->next) - if(!strcmp(file_name, fsl->fname)) - return fsl->last_symb; - return NULL; -} - -void addFileSymbolList(char *file_name, PTR_SYMB symb) -{ - struct file_symbol *fsl; - fsl = (struct file_symbol *) xmalloc(sizeof (struct file_symbol)); - fsl->last_symb = symb; - fsl->fname = file_name; - fsl->next = file_last_symbol; - file_last_symbol = fsl; -} /***************** Provides infos on nodes ******************************** * * * based on the table info in include dir *.def * @@ -1228,7 +1204,6 @@ int Init_Tool_Box() number_of_ll_node = CUR_FILE_NUM_LLNDS() + 1; number_of_bif_node = CUR_FILE_NUM_BIFS() + 1; number_of_symb_node = CUR_FILE_NUM_SYMBS() + 1; - addFileSymbolList(CUR_FILE_NAME(), CUR_FILE_CUR_SYMB()); /* podd 01.03.24 */ if (CUR_FILE_NAME()) strcpy(Current_File_name, CUR_FILE_NAME()); if (ToolBOX_INIT) return 0; diff --git a/dvm/fdvm/trunk/fdvm/dvm.cpp b/dvm/fdvm/trunk/fdvm/dvm.cpp index 58d9b7b..2244f69 100644 --- a/dvm/fdvm/trunk/fdvm/dvm.cpp +++ b/dvm/fdvm/trunk/fdvm/dvm.cpp @@ -82,7 +82,6 @@ extern "C" int out_upper_case; extern "C" int out_line_unlimit; extern "C" int out_line_length; extern "C" PTR_SYMB last_file_symbol; -extern "C" PTR_SYMB FileLastSymbol(...); Options options; @@ -418,7 +417,7 @@ int main(int argc, char *argv[]) fout_name_info_C = ChangeFto_info_C(fout_name); /*ACC*/ //set the last symbol of file - last_file_symbol = FileLastSymbol(file->filename()); //for low_level.c and not only + last_file_symbol = file->filept->cur_symb; //for low_level.c and not only initLibNames(); //for every file InitDVM(file); //for every file current_file = file; // global variable (used in SgTypeComplex) diff --git a/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp b/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp index db7a1ce..78610d8 100644 --- a/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp +++ b/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp @@ -31,7 +31,6 @@ extern "C" int out_upper_case; extern "C" int out_line_unlimit; extern "C" int out_line_length; extern "C" PTR_SYMB last_file_symbol; -extern "C" PTR_SYMB FileLastSymbol(...); static int convertFile(int argc, char* argv[], const set& filesInProj, const set& moduleDeclsInFiles) { @@ -353,7 +352,6 @@ static int convertFile(int argc, char* argv[], const set& filesInProj, c fout_name_info_C = ChangeFto_info_C(fout_name); /*ACC*/ //set the last symbol of file - last_file_symbol = FileLastSymbol(file->filename()); initLibNames(); //for every file InitDVM(file); //for every file current_file = file; // global variable (used in SgTypeComplex) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index e09ce14..1ec6519 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -13,7 +13,7 @@ using std::set; using std::remove_if; -#define PRINT_USELESS_STATEMENTS 0 +#define PRINT_USELESS_STATEMENTS 1 static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, @@ -329,10 +329,22 @@ public: void removeDeadCode(SgStatement* func, const map>& allFuncs, - const map& commonBlocks) + const map& commonBlocks, + SgStatement* intervalDelStart, SgStatement* intervalDelEnd) { + if (intervalDelStart && !intervalDelEnd || !intervalDelStart && intervalDelEnd) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + SgProgHedrStmt* prog = isSgProgHedrStmt(func); + if (intervalDelStart) + if (intervalDelStart->lineNumber() < prog->lineNumber() || intervalDelStart->lineNumber() > prog->lastNodeOfStmt()->lineNumber()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + if (intervalDelEnd) + if (intervalDelEnd->lineNumber() < prog->lineNumber() || intervalDelEnd->lineNumber() > prog->lastNodeOfStmt()->lineNumber()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + auto cfg = buildCFGforCurrentFunc(func, SAPFOR::CFG_Settings(true, false, false, false, false, false, false), commonBlocks, allFuncs); if(cfg.size() != 1) @@ -422,11 +434,8 @@ void removeDeadCode(SgStatement* func, } } } - +//TODO: need to add [intervalDelStart; intervalDelEnd] // remove dead statements - - SgStatement* end = func->lastNodeOfStmt(), *st = func; - set removable = { ASSIGN_STAT, @@ -435,49 +444,52 @@ void removeDeadCode(SgStatement* func, READ_STAT }; - while (st != end) + vector remove; + for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) { - SgStatement* next = st->lexNext(); - if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end()) + { + remove.push_back(st); + st = st->lastNodeOfStmt(); + } + } + + for (auto& rem : remove) + { + __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); + rem->deleteStmt(); + } + + remove.clear(); + //remove empty blocks + for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) + { + const int var = st->variant(); + if ((var == FOR_NODE || var == WHILE_NODE || var == IF_NODE || var == SWITCH_NODE) && + st->lexNext()->variant() == CONTROL_END) { - __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement '%s' on line %d]\n", st->unparse(), st->lineNumber()); - - st->deleteStmt(); - } - else - { - if (isSgControlEndStmt(st)) - { - SgStatement* parent = st->controlParent(); - SgStatement* parent_end; - - if (parent && (parent_end = parent->lastNodeOfStmt()) && parent_end == st) - { - bool empty_parent = false; - - switch (parent->variant()) - { - case IF_NODE: - empty_parent = - parent->lexNext() == parent_end || // IF THEN ENDIF - isSgControlEndStmt(parent->lexNext()) && - parent->lexNext()->lexNext() == parent_end; // IF THEN ELSE ENDIF - break; - default: - empty_parent = parent->lexNext() == parent_end; // DO, WHILE - break; - } - - if (empty_parent) - parent->deleteStmt(); - else if(isSgIfStmt(parent) && isSgControlEndStmt(parent_end->lexPrev())) // IF with empty ELSE branch - parent_end->deleteStmt(); - } - } + remove.push_back(st); + continue; } - st = next; + if (var == IF_NODE) + { + SgStatement* ifS = st; + while (ifS->lexNext()->variant() == ELSEIF_NODE) + ifS = ifS->lexNext(); + + if (ifS->lexNext()->variant() == CONTROL_END) + remove.push_back(st); + } + + //TODO: SWITCH and other block statements + } + + + for (auto& rem : remove) + { + __spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); + rem->deleteStmt(); } deleteCFG(cfg); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h index 7c83b1d..6f3ef35 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h @@ -11,4 +11,5 @@ void removeDeadCode(SgStatement* func, const std::map>&allFuncs, - const std::map& commonBlocks); \ No newline at end of file + const std::map& commonBlocks, + SgStatement* intervalDelStart = NULL, SgStatement* intervalDelEnd = NULL); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index bd7a65f..3b5edc5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2289" +#define VERSION_SPF "2290" From f345741accef33c897de26f443bea517d2a36ac2 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 23 Mar 2024 09:13:58 +0300 Subject: [PATCH 14/68] fixed pass --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 375238c..dffb6be 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -2542,6 +2542,7 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam case LOOPS_COMBINER: case FIX_COMMON_BLOCKS: case TEST_PASS: + case SET_IMPLICIT_NONE: runAnalysis(*project, curr_regime, false); case SUBST_EXPR_RD_AND_UNPARSE: case SUBST_EXPR_AND_UNPARSE: From c5866f2cf935713411423fc279768861eedc3ae9 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 23 Mar 2024 10:51:41 +0300 Subject: [PATCH 15/68] improved pass --- .../Transformations/set_implicit_none.cpp | 142 +++++++++--------- .../_src/Transformations/set_implicit_none.h | 4 - 2 files changed, 75 insertions(+), 71 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 1aaa4c5..623267f 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -1,3 +1,8 @@ +#include "../Utils/leak_detector.h" + +#include +#include + #include "Utils/SgUtils.h" #include "set_implicit_none.h" @@ -5,18 +10,18 @@ using std::vector; using std::map; using std::set; -static const char commonIntLetters[6] = {'i', 'j', 'k', 'm', 'n', 'l'}; +static const char commonIntLetters[6] = { 'i', 'j', 'k', 'm', 'n', 'l' }; static void InitTypes(map& types) { for (char letter = 'a'; letter <= 'z'; letter++) - types[letter] = NULL; + types[letter] = 0; } static void FillCommonTypes(map& types) { for (char letter : commonIntLetters) - if (types[letter] == NULL) + if (types[letter] == 0) types[letter] = new SgType(T_INT); for (auto letter : types) @@ -36,37 +41,47 @@ static void FindAllVars(SgExpression* expr, set& allVars) FindAllVars(expr->rhs(), allVars); } -static char AddLettersToMap(SgExpression* expr, SgType* type, map& types) +static char getValue(SgExpression* ex) { - if (expr == NULL) - return NULL; - - if (expr->variant() == CHAR_VAL) - { - SgValueExp* val = isSgValueExp(expr); - return val->charValue(); - } - - char leftVal = AddLettersToMap(expr->lhs(), type, types); - char rightVal = AddLettersToMap(expr->rhs(), type, types); - - if (expr->variant() == DDOT) - if (leftVal != NULL && rightVal != NULL) - for (char letter = leftVal; letter <= rightVal; letter++) - types[letter] = type; - - if (expr->variant() == EXPR_LIST) - { - if (leftVal != NULL) - types[leftVal] = type; - if (rightVal != NULL) - types[rightVal] = type; - } - - return NULL; + char charVal = 0; + if (ex && ex->variant() == CHAR_VAL) + charVal = isSgValueExp(ex)->charValue(); + return charVal; } -static map FunctionImplicitCheck(SgStatement* function, map>& typesByFunctions) +static void AddLettersToMap(SgExpression* expr, SgType* type, map& types) +{ + while (expr) + { + if (expr->variant() != EXPR_LIST) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + SgExpression* val = expr->lhs(); + if (val->variant() == DDOT) + { + char leftVal = getValue(val->lhs()); + char rightVal = getValue(val->rhs()); + + if (leftVal == 0 || rightVal == 0) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + for (char letter = leftVal; letter <= rightVal; letter++) + types[letter] = type; + } + else + { + char charVal = getValue(val); + if (charVal == 0) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + types[charVal] = type; + } + + expr = expr->rhs(); + } +} + +static map FunctionImplicitCheck(SgStatement* function, const map>& typesByFunctions) { set allVars; map types; @@ -75,26 +90,26 @@ static map FunctionImplicitCheck(SgStatement* function, mapcontrolParent()) != typesByFunctions.end()) - for (auto parentType : typesByFunctions[function->controlParent()]) - types[parentType.first] = parentType.second; + auto cp = function->controlParent(); + if (isSgProgHedrStmt(cp)) + if (typesByFunctions.find(cp) != typesByFunctions.end()) + for (auto& parentType : typesByFunctions.at(cp)) + types[parentType.first] = parentType.second; - auto implicitNoneDeclaration = new SgStatement(IMPL_DECL); auto hasImplicitNone = false; - - for (SgStatement* statement = function; statement != NULL; statement = statement->lexNext()) + auto endOfFunc = function->lastNodeOfStmt(); + for (auto st = function; st != endOfFunc; st = st->lexNext()) { - - if (statement->variant() == IMPL_DECL) + if (st->variant() == IMPL_DECL) { - SgImplicitStmt* implicitStatement = isSgImplicitStmt(statement); + SgImplicitStmt* implicitStatement = isSgImplicitStmt(st); if (implicitStatement != NULL) { - int numberOfTypes = implicitStatement->numberOfImplicitTypes(); + const int numberOfTypes = implicitStatement->numberOfImplicitTypes(); if (numberOfTypes > 0) { - for (int j = 0; j < numberOfTypes; j++) + for (int j = 0; j < numberOfTypes; ++j) { SgType* type = implicitStatement->implicitType(j); SgExpression* lettersExpression = implicitStatement->implicitRangeList(j); @@ -106,27 +121,21 @@ static map FunctionImplicitCheck(SgStatement* function, mapvariant() == CONTAINS_STMT || isSgExecutableStatement(statement) != NULL) + else if (st->variant() == CONTAINS_STMT || isSgExecutableStatement(st) != NULL) break; } - for (SgStatement* statement = function; - statement != NULL && statement->variant() != CONTAINS_STMT; statement = statement->lexNext()) - { - for (int expressionNumber = 0; expressionNumber < 3; expressionNumber++) - FindAllVars(statement->expr(expressionNumber), allVars); + for (auto st = function; st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) + for (int i = 0; i < 3; ++i) + FindAllVars(st->expr(i), allVars); - if (statement == function->lastExecutable()) - break; - } - - for (auto var : allVars) + for (auto& var : allVars) { vector _; SgStatement* declaredInStatement = declaratedInStmt(var, &_, false); if (declaredInStatement == NULL) { - char c = var->identifier()[0]; + const char c = var->identifier()[0]; if (types.find(c) != types.end()) var->setType(types[c]); @@ -139,20 +148,21 @@ static map FunctionImplicitCheck(SgStatement* function, maplexNext(); - statement != NULL && statement->variant() != CONTAINS_STMT && isSgExecutableStatement(statement) == NULL;) + for (auto st = function->lexNext(); + st != endOfFunc && st->variant() != CONTAINS_STMT && isSgExecutableStatement(st) == NULL; + ) { - if (statement->variant() == IMPL_DECL) + if (st->variant() == IMPL_DECL) { - auto tmpStatement = statement; - statement = statement->lexNext(); + auto tmpStatement = st; + st = st->lexNext(); tmpStatement->deleteStmt(); } else - statement = statement->lexNext(); + st = st->lexNext(); } - function->insertStmtAfter(*implicitNoneDeclaration, *function); + function->insertStmtAfter(*new SgStatement(IMPL_DECL), *function); } allVars.clear(); @@ -165,13 +175,11 @@ void ImplicitCheck(SgFile* file) { map> typesByFunctions; - for (int functionNumber = 0; functionNumber < file->numberOfFunctions(); functionNumber++) + for (int func = 0; func < file->numberOfFunctions(); ++func) { - SgStatement* function = file->functions(functionNumber); - - map& types = FunctionImplicitCheck(function, typesByFunctions); - typesByFunctions[function] = types; + SgStatement* function = file->functions(func); + typesByFunctions[function] = FunctionImplicitCheck(function, typesByFunctions); } typesByFunctions.clear(); -} \ No newline at end of file +} diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h index 5d2fb25..6d7e4bd 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h @@ -1,7 +1,3 @@ #pragma once -#include "Utils/SgUtils.h" - -#include -#include void ImplicitCheck(SgFile* file); \ No newline at end of file From 24fe7b4bad2d26a7f7f9204087f710d00ec1434b Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 23 Mar 2024 10:53:14 +0300 Subject: [PATCH 16/68] fixed cmake --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 7d0c5d2..82e446e 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -209,7 +209,7 @@ set(TRANSFORMS ${TR_LOOP_UNROLL} ${TR_GV} ${TR_PRIV_DEL} - ${TR_CONV} + ${TR_CONV} ${TR_PRIV_DEL} ${TR_IMPLICIT_NONE}) From bdb74c8ae72d4f82162017db9d39ec90ecc994b7 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 23 Mar 2024 11:17:46 +0300 Subject: [PATCH 17/68] fixed function names --- .../_src/Transformations/set_implicit_none.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 623267f..12e3b27 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -9,6 +9,7 @@ using std::vector; using std::map; using std::set; +using std::string; static const char commonIntLetters[6] = { 'i', 'j', 'k', 'm', 'n', 'l' }; @@ -131,6 +132,9 @@ static map FunctionImplicitCheck(SgStatement* function, const map for (auto& var : allVars) { + if (string(var->identifier()) == function->symbol()->identifier()) + continue; + vector _; SgStatement* declaredInStatement = declaratedInStmt(var, &_, false); if (declaredInStatement == NULL) @@ -162,7 +166,11 @@ static map FunctionImplicitCheck(SgStatement* function, const map st = st->lexNext(); } - function->insertStmtAfter(*new SgStatement(IMPL_DECL), *function); + auto implNone = new SgStatement(IMPL_DECL); + implNone->setlineNumber(function->lineNumber()); + implNone->setFileName(function->fileName()); + + function->insertStmtAfter(*implNone, *function); } allVars.clear(); From 277a1f8bef35cdc97828fbe58dc961c2371868ed Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 23 Mar 2024 11:20:56 +0300 Subject: [PATCH 18/68] version updated --- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 3b5edc5..6f967cf 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2290" +#define VERSION_SPF "2291" From 2d0104561e925bf07a12fbf27efc607e703972b7 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 23 Mar 2024 11:24:29 +0300 Subject: [PATCH 19/68] cleanup --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 526 +++++++++--------- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 2 +- .../Transformations/set_implicit_none.cpp | 254 ++++----- .../_src/Transformations/set_implicit_none.h | 2 +- 4 files changed, 392 insertions(+), 392 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 82e446e..224909a 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -55,47 +55,47 @@ include_directories(${zlib_sources}/include) include_directories(${pppa_sources}) set(PR_PARAM _src/ProjectParameters/projectParameters.cpp - _src/ProjectParameters/projectParameters.h) + _src/ProjectParameters/projectParameters.h) set(GR_LAYOUT _src/VisualizerCalls/graphLayout/algebra.cpp - _src/VisualizerCalls/graphLayout/algebra.hpp - _src/VisualizerCalls/graphLayout/fruchterman_reingold.cpp - _src/VisualizerCalls/graphLayout/fruchterman_reingold.hpp - _src/VisualizerCalls/graphLayout/kamada_kawai.cpp - _src/VisualizerCalls/graphLayout/kamada_kawai.hpp - _src/VisualizerCalls/graphLayout/layout.cpp - _src/VisualizerCalls/graphLayout/layout.hpp - _src/VisualizerCalls/graphLayout/nodesoup.cpp - _src/VisualizerCalls/graphLayout/nodesoup.hpp) - + _src/VisualizerCalls/graphLayout/algebra.hpp + _src/VisualizerCalls/graphLayout/fruchterman_reingold.cpp + _src/VisualizerCalls/graphLayout/fruchterman_reingold.hpp + _src/VisualizerCalls/graphLayout/kamada_kawai.cpp + _src/VisualizerCalls/graphLayout/kamada_kawai.hpp + _src/VisualizerCalls/graphLayout/layout.cpp + _src/VisualizerCalls/graphLayout/layout.hpp + _src/VisualizerCalls/graphLayout/nodesoup.cpp + _src/VisualizerCalls/graphLayout/nodesoup.hpp) + set(VS_CALLS _src/VisualizerCalls/get_information.cpp - _src/VisualizerCalls/get_information.h - _src/VisualizerCalls/SendMessage.cpp - _src/VisualizerCalls/SendMessage.h - _src/VisualizerCalls/BuildGraph.cpp - _src/VisualizerCalls/BuildGraph.h) - + _src/VisualizerCalls/get_information.h + _src/VisualizerCalls/SendMessage.cpp + _src/VisualizerCalls/SendMessage.h + _src/VisualizerCalls/BuildGraph.cpp + _src/VisualizerCalls/BuildGraph.h) + set(VERIF _src/VerificationCode/CorrectVarDecl.cpp _src/VerificationCode/IncludeChecker.cpp _src/VerificationCode/StructureChecker.cpp _src/VerificationCode/VerifySageStructures.cpp - _src/VerificationCode/verifications.h) + _src/VerificationCode/verifications.h) set(UTILS _src/Utils/AstWrapper.h - _src/Utils/BoostStackTrace.cpp - _src/Utils/CommonBlock.h - _src/Utils/DefUseList.h - _src/Utils/errors.h - _src/Utils/leak_detector.h - _src/Utils/RationalNum.cpp - _src/Utils/RationalNum.h + _src/Utils/BoostStackTrace.cpp + _src/Utils/CommonBlock.h + _src/Utils/DefUseList.h + _src/Utils/errors.h + _src/Utils/leak_detector.h + _src/Utils/RationalNum.cpp + _src/Utils/RationalNum.h _src/Utils/SgUtils.cpp - _src/Utils/SgUtils.h + _src/Utils/SgUtils.h _src/Utils/types.h _src/Utils/utils.cpp - _src/Utils/utils.h - _src/Utils/version.h) - + _src/Utils/utils.h + _src/Utils/version.h) + set(OMEGA _src/SageAnalysisTool/OmegaForSage/add-assert.cpp _src/SageAnalysisTool/OmegaForSage/affine.cpp _src/SageAnalysisTool/OmegaForSage/cover.cpp @@ -126,211 +126,211 @@ set(OMEGA _src/SageAnalysisTool/OmegaForSage/add-assert.cpp _src/SageAnalysisTool/set.cpp) set(PRIV _src/PrivateAnalyzer/private_analyzer.cpp - _src/PrivateAnalyzer/private_analyzer.h) + _src/PrivateAnalyzer/private_analyzer.h) set(FDVM ${fdvm_sources}/acc.cpp - ${fdvm_sources}/acc_across.cpp - ${fdvm_sources}/acc_across_analyzer.cpp - ${fdvm_sources}/acc_analyzer.cpp + ${fdvm_sources}/acc_across.cpp + ${fdvm_sources}/acc_across_analyzer.cpp + ${fdvm_sources}/acc_analyzer.cpp ${fdvm_sources}/acc_data.cpp - ${fdvm_sources}/acc_f2c.cpp - ${fdvm_sources}/acc_f2c_handlers.cpp - ${fdvm_sources}/acc_rtc.cpp - ${fdvm_sources}/acc_rtc.cpp + ${fdvm_sources}/acc_f2c.cpp + ${fdvm_sources}/acc_f2c_handlers.cpp + ${fdvm_sources}/acc_rtc.cpp + ${fdvm_sources}/acc_rtc.cpp ${fdvm_sources}/acc_utilities.cpp - ${fdvm_sources}/aks_analyzeLoops.cpp - ${fdvm_sources}/aks_structs.cpp - ${fdvm_sources}/checkpoint.cpp - ${fdvm_sources}/debug.cpp - ${fdvm_sources}/dvm.cpp + ${fdvm_sources}/aks_analyzeLoops.cpp + ${fdvm_sources}/aks_structs.cpp + ${fdvm_sources}/checkpoint.cpp + ${fdvm_sources}/debug.cpp + ${fdvm_sources}/dvm.cpp ${fdvm_sources}/calls.cpp - ${fdvm_sources}/funcall.cpp - ${fdvm_sources}/help.cpp - ${fdvm_sources}/hpf.cpp - ${fdvm_sources}/io.cpp - ${fdvm_sources}/omp.cpp - ${fdvm_sources}/ompdebug.cpp - ${fdvm_sources}/parloop.cpp - ${fdvm_sources}/stmt.cpp) - + ${fdvm_sources}/funcall.cpp + ${fdvm_sources}/help.cpp + ${fdvm_sources}/hpf.cpp + ${fdvm_sources}/io.cpp + ${fdvm_sources}/omp.cpp + ${fdvm_sources}/ompdebug.cpp + ${fdvm_sources}/parloop.cpp + ${fdvm_sources}/stmt.cpp) + set(PARALLEL_REG _src/ParallelizationRegions/ParRegions.cpp - _src/ParallelizationRegions/ParRegions.h - _src/ParallelizationRegions/ParRegions_func.h - _src/ParallelizationRegions/expand_extract_reg.cpp - _src/ParallelizationRegions/expand_extract_reg.h - _src/ParallelizationRegions/resolve_par_reg_conflicts.cpp - _src/ParallelizationRegions/resolve_par_reg_conflicts.h) + _src/ParallelizationRegions/ParRegions.h + _src/ParallelizationRegions/ParRegions_func.h + _src/ParallelizationRegions/expand_extract_reg.cpp + _src/ParallelizationRegions/expand_extract_reg.h + _src/ParallelizationRegions/resolve_par_reg_conflicts.cpp + _src/ParallelizationRegions/resolve_par_reg_conflicts.h) set(TR_DEAD_CODE _src/Transformations/dead_code.cpp - _src/Transformations/dead_code.h) + _src/Transformations/dead_code.h) set(TR_CP _src/Transformations/checkpoints.cpp - _src/Transformations/checkpoints.h) + _src/Transformations/checkpoints.h) set(TR_VECTOR _src/Transformations/array_assign_to_loop.cpp - _src/Transformations/array_assign_to_loop.h) + _src/Transformations/array_assign_to_loop.h) set(TR_ENDDO_LOOP _src/Transformations/enddo_loop_converter.cpp - _src/Transformations/enddo_loop_converter.h) + _src/Transformations/enddo_loop_converter.h) set(TR_LOOP_NEST _src/Transformations/loop_transform.cpp - _src/Transformations/loop_transform.h) + _src/Transformations/loop_transform.h) set(TR_LOOP_COMB _src/Transformations/loops_combiner.cpp - _src/Transformations/loops_combiner.h) + _src/Transformations/loops_combiner.h) set(TR_LOOP_SPLIT _src/Transformations/loops_splitter.cpp - _src/Transformations/loops_splitter.h) + _src/Transformations/loops_splitter.h) set(TR_LOOP_UNROLL _src/Transformations/loops_unrolling.cpp - _src/Transformations/loops_unrolling.h) + _src/Transformations/loops_unrolling.h) set(TR_PRIV_BR _src/Transformations/private_arrays_resizing.cpp - _src/Transformations/private_arrays_resizing.h) + _src/Transformations/private_arrays_resizing.h) set(TR_PRIV_DEL _src/Transformations/private_removing.cpp - _src/Transformations/private_removing.h) + _src/Transformations/private_removing.h) set(TR_SWAP_ARR_DIMS _src/Transformations/swap_array_dims.cpp - _src/Transformations/swap_array_dims.h) + _src/Transformations/swap_array_dims.h) set(TR_FUNC_DUP _src/Transformations/uniq_call_chain_dup.cpp - _src/Transformations/uniq_call_chain_dup.h) + _src/Transformations/uniq_call_chain_dup.h) set(TR_FUNC_PURE _src/Transformations/function_purifying.cpp - _src/Transformations/function_purifying.h) + _src/Transformations/function_purifying.h) set(TR_GV _src/Transformations/fix_common_blocks.cpp - _src/Transformations/fix_common_blocks.h) + _src/Transformations/fix_common_blocks.h) set(TR_CONV _src/Transformations/convert_to_c.cpp - _src/Transformations/convert_to_c.h) + _src/Transformations/convert_to_c.h) set(TR_IMPLICIT_NONE _src/Transformations/set_implicit_none.cpp - _src/Transformations/set_implicit_none.h) + _src/Transformations/set_implicit_none.h) set(TRANSFORMS - ${TR_DEAD_CODE} - ${TR_CP} - ${TR_VECTOR} - ${TR_ENDDO_LOOP} - ${TR_LOOP_NEST} - ${TR_LOOP_COMB} - ${TR_LOOP_SPLIT} - ${TR_PRIV_BR} - ${TR_SWAP_ARR_DIMS} - ${TR_FUNC_DUP} - ${TR_FUNC_PURE} - ${TR_LOOP_UNROLL} - ${TR_GV} - ${TR_PRIV_DEL} + ${TR_DEAD_CODE} + ${TR_CP} + ${TR_VECTOR} + ${TR_ENDDO_LOOP} + ${TR_LOOP_NEST} + ${TR_LOOP_COMB} + ${TR_LOOP_SPLIT} + ${TR_PRIV_BR} + ${TR_SWAP_ARR_DIMS} + ${TR_FUNC_DUP} + ${TR_FUNC_PURE} + ${TR_LOOP_UNROLL} + ${TR_GV} + ${TR_PRIV_DEL} ${TR_CONV} - ${TR_PRIV_DEL} - ${TR_IMPLICIT_NONE}) - + ${TR_PRIV_DEL} + ${TR_IMPLICIT_NONE}) + set(CFG _src/CFGraph/IR.cpp - _src/CFGraph/IR.h - _src/CFGraph/CFGraph.cpp - _src/CFGraph/CFGraph.h - _src/CFGraph/RD_subst.cpp - _src/CFGraph/RD_subst.h - _src/CFGraph/live_variable_analysis.cpp - _src/CFGraph/live_variable_analysis.h - _src/CFGraph/private_variables_analysis.cpp - _src/CFGraph/private_variables_analysis.h - ) - + _src/CFGraph/IR.h + _src/CFGraph/CFGraph.cpp + _src/CFGraph/CFGraph.h + _src/CFGraph/RD_subst.cpp + _src/CFGraph/RD_subst.h + _src/CFGraph/live_variable_analysis.cpp + _src/CFGraph/live_variable_analysis.h + _src/CFGraph/private_variables_analysis.cpp + _src/CFGraph/private_variables_analysis.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/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 + ) -set(CREATE_INTER_T _src/CreateInterTree/CreateInterTree.cpp - _src/CreateInterTree/CreateInterTree.h) +set(CREATE_INTER_T _src/CreateInterTree/CreateInterTree.cpp + _src/CreateInterTree/CreateInterTree.h) set(DIRA _src/DirectiveProcessing/DirectiveAnalyzer.cpp - _src/DirectiveProcessing/DirectiveAnalyzer.h - _src/DirectiveProcessing/directive_creator.cpp - _src/DirectiveProcessing/directive_creator_base.cpp - _src/DirectiveProcessing/directive_creator.h - _src/DirectiveProcessing/directive_creator_base_nodist.cpp - _src/DirectiveProcessing/directive_creator_nodist.h - _src/DirectiveProcessing/directive_creator_internal.h - _src/DirectiveProcessing/directive_parser.cpp - _src/DirectiveProcessing/directive_parser.h + _src/DirectiveProcessing/DirectiveAnalyzer.h + _src/DirectiveProcessing/directive_creator.cpp + _src/DirectiveProcessing/directive_creator_base.cpp + _src/DirectiveProcessing/directive_creator.h + _src/DirectiveProcessing/directive_creator_base_nodist.cpp + _src/DirectiveProcessing/directive_creator_nodist.h + _src/DirectiveProcessing/directive_creator_internal.h + _src/DirectiveProcessing/directive_parser.cpp + _src/DirectiveProcessing/directive_parser.h _src/DirectiveProcessing/insert_directive.cpp - _src/DirectiveProcessing/insert_directive.h - _src/DirectiveProcessing/remote_access.cpp - _src/DirectiveProcessing/remote_access_base.cpp - _src/DirectiveProcessing/remote_access.h - _src/DirectiveProcessing/shadow.cpp - _src/DirectiveProcessing/shadow.h - _src/DirectiveProcessing/spf_directive_preproc.cpp) - + _src/DirectiveProcessing/insert_directive.h + _src/DirectiveProcessing/remote_access.cpp + _src/DirectiveProcessing/remote_access_base.cpp + _src/DirectiveProcessing/remote_access.h + _src/DirectiveProcessing/shadow.cpp + _src/DirectiveProcessing/shadow.h + _src/DirectiveProcessing/spf_directive_preproc.cpp) + set(DISTR _src/Distribution/Array.cpp _src/Distribution/Array.h _src/Distribution/Arrays.h _src/Distribution/CreateDistributionDirs.cpp - _src/Distribution/CreateDistributionDirs.h + _src/Distribution/CreateDistributionDirs.h _src/Distribution/Cycle.cpp - _src/Distribution/Cycle.h + _src/Distribution/Cycle.h _src/Distribution/Distribution.cpp - _src/Distribution/Distribution.h + _src/Distribution/Distribution.h _src/Distribution/DvmhDirective.cpp - _src/Distribution/DvmhDirective.h - _src/Distribution/DvmhDirective_nodist.cpp - _src/Distribution/DvmhDirective_internal.h - _src/Distribution/DvmhDirective_func.h + _src/Distribution/DvmhDirective.h + _src/Distribution/DvmhDirective_nodist.cpp + _src/Distribution/DvmhDirective_internal.h + _src/Distribution/DvmhDirective_func.h _src/Distribution/DvmhDirectiveBase.cpp _src/Distribution/DvmhDirectiveBase_nodist.cpp - _src/Distribution/DvmhDirectiveBase.h + _src/Distribution/DvmhDirectiveBase.h _src/Distribution/GraphCSR.cpp - _src/Distribution/GraphCSR.h) - + _src/Distribution/GraphCSR.h) + set(DVMH_REG _src/DvmhRegions/DvmhRegionInserter.cpp - _src/DvmhRegions/DvmhRegionInserter.h - _src/DvmhRegions/RegionsMerger.cpp - _src/DvmhRegions/RegionsMerger.h - _src/DvmhRegions/ReadWriteAnalyzer.cpp - _src/DvmhRegions/ReadWriteAnalyzer.h - _src/DvmhRegions/LoopChecker.cpp - _src/DvmhRegions/LoopChecker.h - _src/DvmhRegions/DvmhRegion.cpp - _src/DvmhRegions/DvmhRegion.h - _src/DvmhRegions/VarUsages.cpp - _src/DvmhRegions/VarUsages.h - _src/DvmhRegions/TypedSymbol.cpp - _src/DvmhRegions/TypedSymbol.h) - + _src/DvmhRegions/DvmhRegionInserter.h + _src/DvmhRegions/RegionsMerger.cpp + _src/DvmhRegions/RegionsMerger.h + _src/DvmhRegions/ReadWriteAnalyzer.cpp + _src/DvmhRegions/ReadWriteAnalyzer.h + _src/DvmhRegions/LoopChecker.cpp + _src/DvmhRegions/LoopChecker.h + _src/DvmhRegions/DvmhRegion.cpp + _src/DvmhRegions/DvmhRegion.h + _src/DvmhRegions/VarUsages.cpp + _src/DvmhRegions/VarUsages.h + _src/DvmhRegions/TypedSymbol.cpp + _src/DvmhRegions/TypedSymbol.h) + set(DYNA _src/DynamicAnalysis/createParallelRegions.cpp - _src/DynamicAnalysis/createParallelRegions.h - _src/DynamicAnalysis/gcov_info.cpp - _src/DynamicAnalysis/gcov_info.h - _src/DynamicAnalysis/gCov_parser.cpp - _src/DynamicAnalysis/gCov_parser_func.h) + _src/DynamicAnalysis/createParallelRegions.h + _src/DynamicAnalysis/gcov_info.cpp + _src/DynamicAnalysis/gcov_info.h + _src/DynamicAnalysis/gCov_parser.cpp + _src/DynamicAnalysis/gCov_parser_func.h) set(EXPR_TRANSFORM _src/ExpressionTransform/control_flow_graph_part.cpp - _src/ExpressionTransform/expr_transform.cpp - _src/ExpressionTransform/expr_transform.h) - + _src/ExpressionTransform/expr_transform.cpp + _src/ExpressionTransform/expr_transform.h) + set(GR_CALL _src/GraphCall/graph_calls.cpp - _src/GraphCall/graph_calls.h - _src/GraphCall/graph_calls_base.cpp - _src/GraphCall/graph_calls_func.h - _src/GraphCall/select_array_conf.cpp - _src/GraphCall/select_array_conf.h) - + _src/GraphCall/graph_calls.h + _src/GraphCall/graph_calls_base.cpp + _src/GraphCall/graph_calls_func.h + _src/GraphCall/select_array_conf.cpp + _src/GraphCall/select_array_conf.h) + set(GR_LOOP _src/GraphLoop/graph_loops_base.cpp _src/GraphLoop/graph_loops.cpp - _src/GraphLoop/graph_loops.h - _src/GraphLoop/graph_loops_func.h) - + _src/GraphLoop/graph_loops.h + _src/GraphLoop/graph_loops_func.h) + set(INLINER _src/Inliner/inliner.cpp - _src/Inliner/inliner.h) - + _src/Inliner/inliner.h) + set(LOOP_ANALYZER _src/LoopAnalyzer/allocations_prepoc.cpp _src/LoopAnalyzer/dep_analyzer.cpp _src/LoopAnalyzer/loop_analyzer.cpp _src/LoopAnalyzer/loop_analyzer_nodist.cpp - _src/LoopAnalyzer/loop_analyzer_nodist.h - _src/LoopAnalyzer/loop_analyzer_internal.h - _src/LoopAnalyzer/loop_analyzer.h) + _src/LoopAnalyzer/loop_analyzer_nodist.h + _src/LoopAnalyzer/loop_analyzer_internal.h + _src/LoopAnalyzer/loop_analyzer.h) set(RENAME_SYMBOLS _src/RenameSymbols/rename_symbols.cpp - _src/RenameSymbols/rename_symbols.h) - + _src/RenameSymbols/rename_symbols.h) + set(MAIN _src/Sapfor.cpp - _src/Sapfor.h - _src/SapforData.h - _src/Utils/PassManager.h) + _src/Sapfor.h + _src/SapforData.h + _src/Utils/PassManager.h) set(PREDICTOR _src/Predictor/PredictScheme.cpp _src/Predictor/PredictScheme.h) @@ -346,88 +346,88 @@ set(PROJ_MAN _src/ProjectManipulation/ParseFiles.cpp _src/ProjectManipulation/ConvertFiles.h) set(PARSER ${parser_sources}/cftn.c - ${parser_sources}/errors.c - ${parser_sources}/gram1.tab.c - ${parser_sources}/hash.c - ${parser_sources}/init.c - ${parser_sources}/lexfdvm.c - ${parser_sources}/lists.c - ${parser_sources}/low_hpf.c - ${parser_sources}/misc.c - ${parser_sources}/stat.c - ${parser_sources}/sym.c - ${parser_sources}/types.c - ${parser_sources}/unparse_hpf.c) + ${parser_sources}/errors.c + ${parser_sources}/gram1.tab.c + ${parser_sources}/hash.c + ${parser_sources}/init.c + ${parser_sources}/lexfdvm.c + ${parser_sources}/lists.c + ${parser_sources}/low_hpf.c + ${parser_sources}/misc.c + ${parser_sources}/stat.c + ${parser_sources}/sym.c + ${parser_sources}/types.c + ${parser_sources}/unparse_hpf.c) set(PPPA ${pppa_sources}/inter.cpp - ${pppa_sources}/potensyn.cpp - ${pppa_sources}/stat.cpp - ${pppa_sources}/statfile.cpp - ${pppa_sources}/statinter.cpp - ${pppa_sources}/statlist.cpp - ${pppa_sources}/statprintf.cpp - ${pppa_sources}/statread.cpp - ${pppa_sources}/treeinter.cpp - - ${pppa_sources}/bool.h - ${pppa_sources}/dvmh_stat.h - ${pppa_sources}/inter.h - ${pppa_sources}/potensyn.h - ${pppa_sources}/statist.h - ${pppa_sources}/statlist.h - ${pppa_sources}/statprintf.h - ${pppa_sources}/statread.h - ${pppa_sources}/strall.h - ${pppa_sources}/sysstat.h - ${pppa_sources}/treeinter.h - ${pppa_sources}/ver.h - ${pppa_sources}/statinter.h - ${pppa_sources}/json.hpp) - + ${pppa_sources}/potensyn.cpp + ${pppa_sources}/stat.cpp + ${pppa_sources}/statfile.cpp + ${pppa_sources}/statinter.cpp + ${pppa_sources}/statlist.cpp + ${pppa_sources}/statprintf.cpp + ${pppa_sources}/statread.cpp + ${pppa_sources}/treeinter.cpp + + ${pppa_sources}/bool.h + ${pppa_sources}/dvmh_stat.h + ${pppa_sources}/inter.h + ${pppa_sources}/potensyn.h + ${pppa_sources}/statist.h + ${pppa_sources}/statlist.h + ${pppa_sources}/statprintf.h + ${pppa_sources}/statread.h + ${pppa_sources}/strall.h + ${pppa_sources}/sysstat.h + ${pppa_sources}/treeinter.h + ${pppa_sources}/ver.h + ${pppa_sources}/statinter.h + ${pppa_sources}/json.hpp) + set(ZLIB ${zlib_sources}/src/adler32.c - ${zlib_sources}/src/compress.c - ${zlib_sources}/src/crc32.c - ${zlib_sources}/src/deflate.c - ${zlib_sources}/src/gzio.c - ${zlib_sources}/src/infblock.c - ${zlib_sources}/src/infcodes.c - ${zlib_sources}/src/inffast.c - ${zlib_sources}/src/inflate.c - ${zlib_sources}/src/inftrees.c - ${zlib_sources}/src/infutil.c - ${zlib_sources}/src/trees.c - ${zlib_sources}/src/uncompr.c - ${zlib_sources}/src/zutil.c) + ${zlib_sources}/src/compress.c + ${zlib_sources}/src/crc32.c + ${zlib_sources}/src/deflate.c + ${zlib_sources}/src/gzio.c + ${zlib_sources}/src/infblock.c + ${zlib_sources}/src/infcodes.c + ${zlib_sources}/src/inffast.c + ${zlib_sources}/src/inflate.c + ${zlib_sources}/src/inftrees.c + ${zlib_sources}/src/infutil.c + ${zlib_sources}/src/trees.c + ${zlib_sources}/src/uncompr.c + ${zlib_sources}/src/zutil.c) -set(SOURCE_EXE - ${CFG} - ${DATA_FLOW} - ${CREATE_INTER_T} - ${DIRA} - ${DISTR} - ${DVMH_REG} - ${DYNA} - ${EXPR_TRANSFORM} - ${GR_CALL} - ${GR_LOOP} - ${INLINER} - ${LOOP_ANALYZER} - ${RENAME_SYMBOLS} - ${TRANSFORMS} - ${PARALLEL_REG} - ${PRIV} - ${FDVM} - ${OMEGA} - ${UTILS} - ${VERIF} - ${VS_CALLS} - ${MAIN} - ${PREDICTOR} - ${PARSER} - ${PPPA} - ${ZLIB} - ${GR_LAYOUT} - ${PR_PARAM} +set(SOURCE_EXE + ${CFG} + ${DATA_FLOW} + ${CREATE_INTER_T} + ${DIRA} + ${DISTR} + ${DVMH_REG} + ${DYNA} + ${EXPR_TRANSFORM} + ${GR_CALL} + ${GR_LOOP} + ${INLINER} + ${LOOP_ANALYZER} + ${RENAME_SYMBOLS} + ${TRANSFORMS} + ${PARALLEL_REG} + ${PRIV} + ${FDVM} + ${OMEGA} + ${UTILS} + ${VERIF} + ${VS_CALLS} + ${MAIN} + ${PREDICTOR} + ${PARSER} + ${PPPA} + ${ZLIB} + ${GR_LAYOUT} + ${PR_PARAM} ${PROJ_MAN}) add_executable(Sapfor_F ${SOURCE_EXE}) @@ -464,11 +464,11 @@ source_group (GraphCall FILES ${GR_CALL}) source_group (GraphLoop FILES ${GR_LOOP}) source_group (LoopAnalyzer FILES ${LOOP_ANALYZER}) source_group (ParallelizationRegions FILES ${PARALLEL_REG}) -source_group (PrivateAnalyzer FILES ${PRIV}) +source_group (PrivateAnalyzer FILES ${PRIV}) source_group (FDVM_Compiler FILES ${FDVM}) source_group (SageExtension FILES ${OMEGA}) source_group (Utils FILES ${UTILS}) -source_group (VerificationCode FILES ${VERIF}) +source_group (VerificationCode FILES ${VERIF}) source_group (ProjectParameters FILES ${PR_PARAM}) source_group (ProjectManipulation FILES ${PROJ_MAN}) @@ -508,15 +508,15 @@ add_definitions("-D __SPF_BUILT_IN_PARSER") add_definitions("-D __SPF_BUILT_IN_PPPA") if (WIN32) - target_link_libraries(Sapfor_F SageNewSrc SageLib SageOldSrc) + target_link_libraries(Sapfor_F SageNewSrc SageLib SageOldSrc) elseif(UNIX) - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) - target_link_libraries(Sapfor_F SageNewSrc SageLib SageOldSrc pthread stdc++fs) - else() - target_link_libraries(Sapfor_F SageNewSrc SageLib SageOldSrc pthread) - endif() + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) + target_link_libraries(Sapfor_F SageNewSrc SageLib SageOldSrc pthread stdc++fs) + else() + target_link_libraries(Sapfor_F SageNewSrc SageLib SageOldSrc pthread) + endif() endif() #install(TARGETS # LIBRARY DESTINATION -# RUNTIME DESTINATION ) +# RUNTIME DESTINATION ) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 7b2b1e2..c73372a 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1175,7 +1175,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne else if (curr_regime == CONVERT_TO_C) covertToC(file); else if (curr_regime == SET_IMPLICIT_NONE) - ImplicitCheck(file); + implicitCheck(file); else if (curr_regime == INSERT_NO_DISTR_FLAGS_FROM_GUI) addPrivatesToArraysFromGUI(file, declaredArrays, distrStateFromGUI); else if (curr_regime == REMOVE_DEAD_CODE) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index 12e3b27..bd0cc7f 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -15,179 +15,179 @@ static const char commonIntLetters[6] = { 'i', 'j', 'k', 'm', 'n', 'l' }; static void InitTypes(map& types) { - for (char letter = 'a'; letter <= 'z'; letter++) - types[letter] = 0; + for (char letter = 'a'; letter <= 'z'; letter++) + types[letter] = 0; } static void FillCommonTypes(map& types) { - for (char letter : commonIntLetters) - if (types[letter] == 0) - types[letter] = new SgType(T_INT); + for (char letter : commonIntLetters) + if (types[letter] == 0) + types[letter] = new SgType(T_INT); - for (auto letter : types) - if (letter.second == NULL) - types[letter.first] = new SgType(T_FLOAT); + for (auto letter : types) + if (letter.second == NULL) + types[letter.first] = new SgType(T_FLOAT); } static void FindAllVars(SgExpression* expr, set& allVars) { - if (expr == NULL) - return; + if (expr == NULL) + return; - if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF) - allVars.insert(expr->symbol()); + if (expr->variant() == VAR_REF || expr->variant() == ARRAY_REF) + allVars.insert(expr->symbol()); - FindAllVars(expr->lhs(), allVars); - FindAllVars(expr->rhs(), allVars); + FindAllVars(expr->lhs(), allVars); + FindAllVars(expr->rhs(), allVars); } static char getValue(SgExpression* ex) { - char charVal = 0; - if (ex && ex->variant() == CHAR_VAL) - charVal = isSgValueExp(ex)->charValue(); - return charVal; + char charVal = 0; + if (ex && ex->variant() == CHAR_VAL) + charVal = isSgValueExp(ex)->charValue(); + return charVal; } static void AddLettersToMap(SgExpression* expr, SgType* type, map& types) { - while (expr) - { - if (expr->variant() != EXPR_LIST) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + while (expr) + { + if (expr->variant() != EXPR_LIST) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - SgExpression* val = expr->lhs(); - if (val->variant() == DDOT) - { - char leftVal = getValue(val->lhs()); - char rightVal = getValue(val->rhs()); + SgExpression* val = expr->lhs(); + if (val->variant() == DDOT) + { + char leftVal = getValue(val->lhs()); + char rightVal = getValue(val->rhs()); - if (leftVal == 0 || rightVal == 0) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + if (leftVal == 0 || rightVal == 0) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - for (char letter = leftVal; letter <= rightVal; letter++) - types[letter] = type; - } - else - { - char charVal = getValue(val); - if (charVal == 0) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + for (char letter = leftVal; letter <= rightVal; letter++) + types[letter] = type; + } + else + { + char charVal = getValue(val); + if (charVal == 0) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - types[charVal] = type; - } + types[charVal] = type; + } - expr = expr->rhs(); - } + expr = expr->rhs(); + } } static map FunctionImplicitCheck(SgStatement* function, const map>& typesByFunctions) { - set allVars; - map types; - vector varsWithoutDecl; - - InitTypes(types); - FillCommonTypes(types); + set allVars; + map types; + vector varsWithoutDecl; + + InitTypes(types); + FillCommonTypes(types); - auto cp = function->controlParent(); - if (isSgProgHedrStmt(cp)) - if (typesByFunctions.find(cp) != typesByFunctions.end()) - for (auto& parentType : typesByFunctions.at(cp)) - types[parentType.first] = parentType.second; + auto cp = function->controlParent(); + if (isSgProgHedrStmt(cp)) + if (typesByFunctions.find(cp) != typesByFunctions.end()) + for (auto& parentType : typesByFunctions.at(cp)) + types[parentType.first] = parentType.second; - auto hasImplicitNone = false; - auto endOfFunc = function->lastNodeOfStmt(); - for (auto st = function; st != endOfFunc; st = st->lexNext()) - { - if (st->variant() == IMPL_DECL) - { - SgImplicitStmt* implicitStatement = isSgImplicitStmt(st); - if (implicitStatement != NULL) - { - const int numberOfTypes = implicitStatement->numberOfImplicitTypes(); + auto hasImplicitNone = false; + auto endOfFunc = function->lastNodeOfStmt(); + for (auto st = function; st != endOfFunc; st = st->lexNext()) + { + if (st->variant() == IMPL_DECL) + { + SgImplicitStmt* implicitStatement = isSgImplicitStmt(st); + if (implicitStatement != NULL) + { + const int numberOfTypes = implicitStatement->numberOfImplicitTypes(); - if (numberOfTypes > 0) - { - for (int j = 0; j < numberOfTypes; ++j) - { - SgType* type = implicitStatement->implicitType(j); - SgExpression* lettersExpression = implicitStatement->implicitRangeList(j); + if (numberOfTypes > 0) + { + for (int j = 0; j < numberOfTypes; ++j) + { + SgType* type = implicitStatement->implicitType(j); + SgExpression* lettersExpression = implicitStatement->implicitRangeList(j); - AddLettersToMap(lettersExpression, type, types); - } - } - else - hasImplicitNone = true; - } - } - else if (st->variant() == CONTAINS_STMT || isSgExecutableStatement(st) != NULL) - break; - } + AddLettersToMap(lettersExpression, type, types); + } + } + else + hasImplicitNone = true; + } + } + else if (st->variant() == CONTAINS_STMT || isSgExecutableStatement(st) != NULL) + break; + } - for (auto st = function; st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) - for (int i = 0; i < 3; ++i) - FindAllVars(st->expr(i), allVars); + for (auto st = function; st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) + for (int i = 0; i < 3; ++i) + FindAllVars(st->expr(i), allVars); - for (auto& var : allVars) - { - if (string(var->identifier()) == function->symbol()->identifier()) - continue; + for (auto& var : allVars) + { + if (string(var->identifier()) == function->symbol()->identifier()) + continue; - vector _; - SgStatement* declaredInStatement = declaratedInStmt(var, &_, false); - if (declaredInStatement == NULL) - { - const char c = var->identifier()[0]; + vector _; + SgStatement* declaredInStatement = declaratedInStmt(var, &_, false); + if (declaredInStatement == NULL) + { + const char c = var->identifier()[0]; - if (types.find(c) != types.end()) - var->setType(types[c]); + if (types.find(c) != types.end()) + var->setType(types[c]); - varsWithoutDecl.push_back(var); - } - } + varsWithoutDecl.push_back(var); + } + } - makeDeclaration(varsWithoutDecl, function, NULL); + makeDeclaration(varsWithoutDecl, function, NULL); - if (!hasImplicitNone) - { - for (auto st = function->lexNext(); - st != endOfFunc && st->variant() != CONTAINS_STMT && isSgExecutableStatement(st) == NULL; - ) - { - if (st->variant() == IMPL_DECL) - { - auto tmpStatement = st; - st = st->lexNext(); - tmpStatement->deleteStmt(); - } - else - st = st->lexNext(); - } + if (!hasImplicitNone) + { + for (auto st = function->lexNext(); + st != endOfFunc && st->variant() != CONTAINS_STMT && isSgExecutableStatement(st) == NULL; + ) + { + if (st->variant() == IMPL_DECL) + { + auto tmpStatement = st; + st = st->lexNext(); + tmpStatement->deleteStmt(); + } + else + st = st->lexNext(); + } - auto implNone = new SgStatement(IMPL_DECL); - implNone->setlineNumber(function->lineNumber()); - implNone->setFileName(function->fileName()); + auto implNone = new SgStatement(IMPL_DECL); + implNone->setlineNumber(function->lineNumber()); + implNone->setFileName(function->fileName()); - function->insertStmtAfter(*implNone, *function); - } + function->insertStmtAfter(*implNone, *function); + } - allVars.clear(); - varsWithoutDecl.clear(); + allVars.clear(); + varsWithoutDecl.clear(); - return types; + return types; } -void ImplicitCheck(SgFile* file) +void implicitCheck(SgFile* file) { - map> typesByFunctions; + map> typesByFunctions; - for (int func = 0; func < file->numberOfFunctions(); ++func) - { - SgStatement* function = file->functions(func); - typesByFunctions[function] = FunctionImplicitCheck(function, typesByFunctions); - } + for (int func = 0; func < file->numberOfFunctions(); ++func) + { + SgStatement* function = file->functions(func); + typesByFunctions[function] = FunctionImplicitCheck(function, typesByFunctions); + } - typesByFunctions.clear(); + typesByFunctions.clear(); } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h index 6d7e4bd..03e600c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.h @@ -1,3 +1,3 @@ #pragma once -void ImplicitCheck(SgFile* file); \ No newline at end of file +void implicitCheck(SgFile* file); \ No newline at end of file From 763be1857ac5790dcaeade7b31382c152bb38c8a Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 24 Mar 2024 15:13:53 +0300 Subject: [PATCH 20/68] fixed and improved private array resizing pass --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 15 +- .../private_arrays_resizing.cpp | 271 +++++++++++++----- .../Transformations/private_arrays_resizing.h | 2 +- .../experts/Sapfor_2017/_src/Utils/utils.cpp | 8 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- .../_src/VisualizerCalls/get_information.cpp | 12 +- 6 files changed, 220 insertions(+), 90 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index c73372a..8ab8e47 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1061,11 +1061,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { auto founded = loopGraph.find(file->filename()); if (founded != loopGraph.end()) - { - int err = privateArraysResizing(file, founded->second, getObjectForFileFromMap(file_name, SPF_messages), usersDirectives, true); - if (err != 0) - internalExit = -1; - } + privateArraysResizing(file, founded->second, getObjectForFileFromMap(file_name, SPF_messages), countOfTransform, usersDirectives, true); } else if (curr_regime == PRIVATE_ARRAYS_SHRINKING_ANALYSIS) { @@ -1077,11 +1073,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { auto founded = loopGraph.find(file->filename()); if (founded != loopGraph.end()) - { - int err = privateArraysResizing(file, founded->second, getObjectForFileFromMap(file_name, SPF_messages), usersDirectives, false); - if (err != 0) - internalExit = -1; - } + privateArraysResizing(file, founded->second, getObjectForFileFromMap(file_name, SPF_messages), countOfTransform, usersDirectives, false); } else if(curr_regime == LOOPS_SPLITTER) { @@ -1195,7 +1187,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne if (internalExit < 0) throw -1; - bool applyFor = (curr_regime == LOOPS_SPLITTER || curr_regime == LOOPS_COMBINER || curr_regime == PRIVATE_REMOVING); + bool applyFor = (curr_regime == LOOPS_SPLITTER || curr_regime == LOOPS_COMBINER || curr_regime == PRIVATE_REMOVING || + curr_regime == PRIVATE_ARRAYS_EXPANSION || curr_regime == PRIVATE_ARRAYS_SHRINKING); if ((countOfTransform == 0 || internalExit > 0) && applyFor) { SgStatement* mainUnit = findMainUnit(&project, SPF_messages); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp index 4021b21..8a7d656 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp @@ -135,13 +135,17 @@ static const string constructNewBoundName(const char *oldName, int loopLineNumbe return newName; } -static SgSymbol* createNewArrayNameSymbol(SgExpression* declaration, bool isExpansion) +static SgSymbol* createNewArrayNameSymbol(SgExpression* declaration, bool isExpansion, bool canBeStatic) { SgType* type = new SgType(T_ARRAY); char* newNameStr = constructNewArrayName(declaration->symbol()->identifier(), isExpansion); - SgSymbol* newName = new SgSymbol(VARIABLE_NAME, newNameStr, type, NULL); - newName->setAttribute(declaration->symbol()->attributes()); + SgSymbol* newName = new SgSymbol(VARIABLE_NAME, newNameStr, type, NULL); + auto attrs = declaration->symbol()->attributes(); + if (!canBeStatic) + attrs |= ALLOCATABLE_BIT; + + newName->setAttribute(attrs); return newName; } @@ -155,7 +159,17 @@ static void fillLoopBoundExprs(const LoopGraph* forLoop, int depthOfResize, cons { if (indexes[j] && isEqSymbols(loopStmt->doName(), indexes[j])) { - bounds[j] = new SgExpression(DDOT, loopStmt->start()->copyPtr(), loopStmt->end()->copyPtr(), NULL); + //TODO: add MIN and MAX call for bounds + if (curLoop->stepVal == 0) + { + __spf_print(1, "unknown step sign of loop on line %d\n", curLoop->lineNum); + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + } + + if (curLoop->stepVal > 0) + bounds[j] = new SgExpression(DDOT, loopStmt->start()->copyPtr(), loopStmt->end()->copyPtr(), NULL); + else + bounds[j] = new SgExpression(DDOT, loopStmt->end()->copyPtr(), loopStmt->start()->copyPtr(), NULL); break; } } @@ -335,7 +349,7 @@ static SgSymbol* alterExtendArrayDeclaration(const LoopGraph* forLoop, SgStateme SgExpression* array = findSymbolInExprList(arraySymbol, declarationStmt->expr(0)); SgExpression* newArray = array->copyPtr(); - newArraySymbol = createNewArrayNameSymbol(newArray, true); + newArraySymbol = createNewArrayNameSymbol(newArray, true, canBeStatic); if (newArraySymbol == NULL) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -350,13 +364,14 @@ static SgSymbol* alterExtendArrayDeclaration(const LoopGraph* forLoop, SgStateme return newArraySymbol; } -static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, SgSymbol *arraySymbol, vector &dimensions) +static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, SgSymbol *arraySymbol, + vector &dimensions, bool canBeStatic) { SgSymbol *newArraySymbol = NULL; SgExpression *array = findSymbolInExprList(arraySymbol, declarationStatement->expr(0)); SgExpression *newArray = array->copyPtr(); - newArraySymbol = createNewArrayNameSymbol(newArray, false); + newArraySymbol = createNewArrayNameSymbol(newArray, false, canBeStatic); reduceArray(dimensions, newArray, newArraySymbol); @@ -369,35 +384,25 @@ static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, return newArraySymbol; } -static void extendArrayRefsInExpr(const vector& indexes, SgExpression* expr, SgSymbol* arraySymbol, - SgSymbol* newArraySymbol, const vector& lowBounds) +static void extendArrayRefsInExpr(const vector& indexes, SgExpression* expr, + SgSymbol* arraySymbol, SgSymbol* newArraySymbol, + const vector& lowBounds) { - SgExpression *lhs = expr->lhs(), *rhs = expr->rhs(); - - if (lhs) + if (expr) { - if (isArrayRef(lhs) && isEqSymbols(arraySymbol, lhs->symbol())) - extendArrayRef(indexes, lhs, newArraySymbol, lowBounds); - else if (lhs->variant() == VAR_REF && isEqSymbols(arraySymbol, lhs->symbol())) - { - SgExpression* extended = extendArrayRef(indexes, lhs, newArraySymbol, lowBounds); - expr->setLhs(extended); - } - else - extendArrayRefsInExpr(indexes, lhs, arraySymbol, newArraySymbol, lowBounds); - } + extendArrayRefsInExpr(indexes, expr->lhs(), arraySymbol, newArraySymbol, lowBounds); + extendArrayRefsInExpr(indexes, expr->rhs(), arraySymbol, newArraySymbol, lowBounds); - if (rhs) - { - if (isArrayRef(rhs) && isEqSymbols(arraySymbol, rhs->symbol())) - extendArrayRef(indexes, rhs, newArraySymbol, lowBounds); - else if (rhs->variant() == VAR_REF && isEqSymbols(arraySymbol, rhs->symbol())) + if (isArrayRef(expr) && isEqSymbols(arraySymbol, expr->symbol())) + extendArrayRef(indexes, expr, newArraySymbol, lowBounds); + else if (expr->variant() == VAR_REF && isEqSymbols(arraySymbol, expr->symbol())) { - SgExpression* extended = extendArrayRef(indexes, rhs, newArraySymbol, lowBounds); - expr->setRhs(extended); + SgExpression* extended = extendArrayRef(indexes, expr, newArraySymbol, lowBounds); + + expr->setSymbol(extended->symbol()); + expr->setLhs(extended->lhs()); + expr->setRhs(extended->rhs()); } - else - extendArrayRefsInExpr(indexes, rhs, arraySymbol, newArraySymbol, lowBounds); } } @@ -406,18 +411,22 @@ static void extendArrayRefs(const vector &indexes, SgStatement *st, S { for (int i = 0; i < 3; ++i) { - if (st->expr(i)) + if (st->variant() == PROC_STAT) { - if (isArrayRef(st->expr(i)) && isEqSymbols(arraySymbol, st->expr(i)->symbol())) - extendArrayRef(indexes, st->expr(i), newArraySymbol, lowBounds); - else if (st->expr(i)->variant() == VAR_REF && isEqSymbols(arraySymbol, st->expr(i)->symbol())) + SgCallStmt* call = isSgCallStmt(st); + for (int arg = 0; arg < call->numberOfArgs(); ++arg) { - SgExpression* extended = extendArrayRef(indexes, st->expr(i), newArraySymbol, lowBounds); - st->setExpression(i, *extended); + auto argRef = call->arg(arg); + if ((isArrayRef(argRef) || argRef->variant() == VAR_REF) && isEqSymbols(argRef->symbol(), arraySymbol)) + { + __spf_print(1, "unsupported private array extension under call on line %d\n", st->lineNumber()); + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + } } - else - extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds); } + + if (st->expr(i)) + extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds); } } @@ -428,6 +437,8 @@ static SgStatement* createNewDeclarationStatemnet(SgStatement *loop, SgStatement { if (isSgExecutableStatement(lastDecl)) break; + if (lastDecl->variant() == CONTAINS_STMT) + break; lastDecl = lastDecl->lexNext(); } @@ -559,7 +570,7 @@ static SgExpression* constructArrayAllocationExp(const LoopGraph* forLoop, SgExp return new SgExpression(EXPR_LIST, arrayRef, (SgExpression*)NULL, (SgSymbol*)NULL); } -static void insertAllocDealloc(const LoopGraph* forLoop, SgSymbol* origArraySymbol, SgSymbol* arraySymbol, +static void insertAllocDealloc(const LoopGraph* forLoop, SgSymbol* origArraySymbol, SgSymbol* arraySymbol, SgSymbol* allocDone, bool isExpansion, const vector* indexes = NULL, const vector* shrinkIndexes = NULL) { SgForStmt *loopStmt = (SgForStmt*)(forLoop->loop->GetOriginal()); @@ -589,11 +600,17 @@ static void insertAllocDealloc(const LoopGraph* forLoop, SgSymbol* origArraySymb new SgExpression(ARRAY_REF, (SgExpression*)NULL, (SgExpression*)NULL, arraySymbol), (SgExpression*)NULL, (SgSymbol*)NULL); - SgStatement *allocate = new SgStatement(ALLOCATE_STMT, (SgLabel*)NULL, (SgSymbol*)NULL, arrayAllocation, (SgExpression*)NULL, (SgExpression*)NULL); - SgStatement *deallocate = new SgStatement(DEALLOCATE_STMT, (SgLabel*)NULL, (SgSymbol*)NULL, arrayDeallocation, (SgExpression*)NULL, (SgExpression*)NULL); + - loopStmt->insertStmtBefore(*allocate, *loopStmt->controlParent()); - loopStmt->lastNodeOfStmt()->insertStmtAfter(*deallocate, *loopStmt->controlParent()); + SgStatement *allocate = new SgStatement(ALLOCATE_STMT, (SgLabel*)NULL, (SgSymbol*)NULL, arrayAllocation, (SgExpression*)NULL, (SgExpression*)NULL); + SgIfStmt* ifSt = new SgIfStmt(SgEqOp(*new SgVarRefExp(allocDone), *new SgValueExp(0)), *allocate); + + loopStmt->insertStmtBefore(*ifSt, *loopStmt->controlParent()); + + + // insert allocates as save + //SgStatement* deallocate = new SgStatement(DEALLOCATE_STMT, (SgLabel*)NULL, (SgSymbol*)NULL, arrayDeallocation, (SgExpression*)NULL, (SgExpression*)NULL); + //loopStmt->lastNodeOfStmt()->insertStmtAfter(*deallocate, *loopStmt->controlParent()); } static bool containsFunctionCall(SgExpression* exp) @@ -781,6 +798,61 @@ static void renamePrivateVarsInAttributes(const vector& attrs, con } } +static void removePrivateVarsInAttributes(const vector& attrs, const map& symbols) +{ + for (SgStatement* st : attrs) + { + if (st->variant() != SPF_ANALYSIS_DIR) + return; + + SgExpression* exprList = st->expr(0); + vector newL; + bool remList = false; + while (exprList) + { + if (exprList->lhs()->variant() == ACC_PRIVATE_OP) + { + vector newL; + bool removed = false; + SgExpression* list = exprList->lhs()->lhs(); + while (list) + { + bool found = false; + for (auto& pair : symbols) + { + if (isEqSymbols(pair.first, list->lhs()->symbol())) + found = true; + if (found) + break; + } + if (!found) + newL.push_back(list->lhs()); + else + removed = true; + list = list->rhs(); + } + + if (removed) + { + if (newL.size() == 0) + remList = true; + else + { + exprList->lhs()->setLhs(makeExprList(newL)); + newL.push_back(exprList->lhs()); + } + } + } + else + newL.push_back(exprList->lhs()); + exprList = exprList->rhs(); + } + + if (remList) + st->setExpression(0, makeExprList(newL)); + } +} + static int getArrayDimensionality(SgSymbol* array) { if (array->type()->variant() != T_ARRAY) @@ -975,7 +1047,7 @@ static int fillIndexesToExtend(const LoopGraph* loop, int origDim, int depthOfRe return 0; } -static SgSymbol* shrinkArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, vector &indexes) +static SgSymbol* shrinkArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, vector &indexes, SgSymbol *allocDone) { int maxDepth = forLoop->perfectLoop; const LoopGraph *curLoop = forLoop; @@ -1005,16 +1077,17 @@ static SgSymbol* shrinkArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, ve SgStatement *originalDeclaration = declaratedInStmt(arraySymbol); SgStatement *copiedDeclaration = createNewDeclarationStatemnet(forLoop->loop->GetOriginal(), originalDeclaration, arraySymbol); + bool canBeStatic = !(!reduceToVariable && isAllocatable(arraySymbol)); SgSymbol *newSymbol = reduceToVariable ? createReducedToVariableArray(copiedDeclaration, forLoop->lineNum, arraySymbol) - : alterShrinkArrayDeclaration(copiedDeclaration, arraySymbol, indexes); + : alterShrinkArrayDeclaration(copiedDeclaration, arraySymbol, indexes, canBeStatic); if (newSymbol) { SgForStmt *loopStmt = (SgForStmt*)(forLoop->loop->GetOriginal()); if (!reduceToVariable && isAllocatable(arraySymbol)) - insertAllocDealloc(forLoop, arraySymbol, newSymbol, false, NULL, &indexes); + insertAllocDealloc(forLoop, arraySymbol, newSymbol, false, allocDone, NULL, &indexes); for (SgStatement *st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt()->lexNext(); st = st->lexNext()) if (st->variant() != ALLOCATE_STMT && st->variant() != DEALLOCATE_STMT) @@ -1026,7 +1099,7 @@ static SgSymbol* shrinkArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, ve return NULL; } -static SgSymbol* resizeArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, int depthOfResize) +static SgSymbol* resizeArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, int depthOfResize, SgSymbol *allocDone) { if (depthOfResize < 0 || depthOfResize > forLoop->perfectLoop) depthOfResize = forLoop->perfectLoop; @@ -1074,7 +1147,8 @@ static SgSymbol* resizeArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, in { SgForStmt *loopStmt = (SgForStmt*)(forLoop->loop->GetOriginal()); if (!canBeStatic || isAllocatable(newArraySymbol)) - insertAllocDealloc(forLoop, arraySymbol, newArraySymbol, true, &indexes, NULL); + insertAllocDealloc(forLoop, arraySymbol, newArraySymbol, allocDone, true, &indexes, NULL); + for (SgStatement *st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt()->lexNext(); st = st->lexNext()) if (st->variant() != ALLOCATE_STMT && st->variant() != DEALLOCATE_STMT) extendArrayRefs(indexes, st, arraySymbol, newArraySymbol, lowBounds); @@ -1257,13 +1331,27 @@ void analyzeShrinking(SgFile* file, const vector& loopGraphs, vector } } +static void createAllocDoneSymbol(map& allocDoneByFunc, SgStatement* func) +{ + if (allocDoneByFunc.find(func) == allocDoneByFunc.end()) + { + auto newName = (string("spf_") + string(func->symbol()->identifier()) + "_alloc_"); + allocDoneByFunc[func] = new SgSymbol(VARIABLE_NAME, newName.c_str(), SgTypeInt(), func); + } +} + //Вычислять размер массива с учётом шага цикла - //TODO -int privateArraysResizing(SgFile *file, const vector &loopGraphs, vector &messages, - const map, set>& usersDirectives, bool isExpand) +void privateArraysResizing(SgFile *file, const vector &loopGraphs, vector &messages, int& countOfTransform, + const map, set>& usersDirectives, bool isExpand) { map mapLoopGraph; createMapLoopGraph(loopGraphs, mapLoopGraph); + map allocDoneByFunc; + map usedAllocDoneByFunc; + + map> saveDecls; + for (auto &loopPair : mapLoopGraph) { LoopGraph *loop = loopPair.second; @@ -1275,6 +1363,9 @@ int privateArraysResizing(SgFile *file, const vector &loopGraphs, ve auto attrPrivInCode = getAttributes(loopSt, set{ SPF_ANALYSIS_DIR }); auto arrayPrivates = fillPrivates(usersDirectives, loop); + auto func = getFuncStat(loopSt); + + set symbolsToDecl; if (arrayPrivates.size() == 0) { @@ -1284,9 +1375,7 @@ int privateArraysResizing(SgFile *file, const vector &loopGraphs, ve else __spf_printToBuf(str, "Can not do PRIVATE SHRINK for this loop - privates not found"); - //TODO: - //messages.push_back(Messages(NOTE, loop->lineNum, str, 2008)); - __spf_print(1, "%s on line %d\n", str.c_str(), loop->lineNum); + __spf_print(0, "%s on line %d\n", str.c_str(), loop->lineNum); } else { @@ -1301,7 +1390,9 @@ int privateArraysResizing(SgFile *file, const vector &loopGraphs, ve symbols.clear(); if (list->lhs()->variant() == SPF_EXPAND_OP && isExpand) - { + { + createAllocDoneSymbol(allocDoneByFunc, func); + int deep = -1; if (list->lhs()->lhs() != NULL) { @@ -1311,15 +1402,25 @@ int privateArraysResizing(SgFile *file, const vector &loopGraphs, ve } for (SgSymbol* privArr : arrayPrivates) - { - SgSymbol* newSymbol = resizeArray(loop, privArr, deep); + { + SgSymbol* newSymbol = resizeArray(loop, privArr, deep, allocDoneByFunc[func]); + if (newSymbol) + { symbols.insert(std::make_pair(privArr, newSymbol)); + usedAllocDoneByFunc[func] = allocDoneByFunc[func]; + countOfTransform++; + + if (isAllocatable(newSymbol)) + symbolsToDecl.insert(newSymbol); + } } - renamePrivateVarsInAttributes(attrPrivInCode, symbols); + removePrivateVarsInAttributes(attrPrivInCode, symbols); } else if (list->lhs()->variant() == SPF_SHRINK_OP && !isExpand) { + createAllocDoneSymbol(allocDoneByFunc, func); + SgExprListExp* listExp = isSgExprListExp(list->lhs()->lhs()); checkNull(listExp, convertFileName(__FILE__).c_str(), __LINE__); @@ -1335,9 +1436,17 @@ int privateArraysResizing(SgFile *file, const vector &loopGraphs, ve if (!indexes.empty() && !skip) { - SgSymbol* newSymbol = shrinkArray(loop, privArr, indexes); + SgSymbol* newSymbol = shrinkArray(loop, privArr, indexes, allocDoneByFunc[func]); + if (newSymbol) + { symbols.insert(std::make_pair(privArr, newSymbol)); + usedAllocDoneByFunc[func] = allocDoneByFunc[func]; + countOfTransform++; + + if (isAllocatable(newSymbol)) + symbolsToDecl.insert(newSymbol); + } } } renamePrivateVarsInAttributes(attrPrivInCode, symbols); @@ -1348,23 +1457,39 @@ int privateArraysResizing(SgFile *file, const vector &loopGraphs, ve list = list->rhs(); } - SgExpression *ex = NULL; - SgExpression *p = NULL; - for (int z = 0; z < newL.size(); ++z) - { - if (z == 0) - p = ex = newL[z]; - else - { - ex->setRhs(newL[z]); - ex = ex->rhs(); - } - } - attr->setExpression(0, p); + attr->setExpression(0, makeExprList(newL, false)); //__spf_print(1, "set new %d attributes to line %d\n", newL.size(), loop->lineNum); } } + + for (auto& elem : symbolsToDecl) + saveDecls[func].push_back(new SgVarRefExp(elem)); } - return 0; + for (auto& funcPair : saveDecls) + { + auto func = funcPair.first; + if (usedAllocDoneByFunc.find(func) == usedAllocDoneByFunc.end()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + SgSymbol* allocVar = usedAllocDoneByFunc[func]; + auto list = makeExprList(funcPair.second); + SgStatement* save = new SgStatement(SAVE_DECL, NULL, NULL, list); + + SgStatement* st = func->lexNext(); + while (!isSgExecutableStatement(st)) + { + if (st->variant() == CONTAINS_STMT) + break; + st = st->lexNext(); + } + + vector init = { new SgValueExp(-1) }; + makeDeclaration(func, { allocVar }, &init); + + st->insertStmtBefore(*save, *func); + + SgAssignStmt* assign = new SgAssignStmt(*new SgVarRefExp(allocVar), *new SgVarRefExp(allocVar) + *new SgValueExp(1)); + st->insertStmtBefore(*assign, *func); + } } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.h b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.h index 05a1c55..1ad162d 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.h @@ -5,5 +5,5 @@ #include -int privateArraysResizing(SgFile *file, const std::vector &loopGraphs, std::vector &messages, const std::map, std::set>& usersDirectives, bool isExpand); +void privateArraysResizing(SgFile *file, const std::vector &loopGraphs, std::vector &messages, int& countOfTransform, const std::map, std::set>& usersDirectives, bool isExpand); void analyzeShrinking(SgFile* file, const std::vector& loopGraphs, std::vector& messages, const std::map, std::set>& usersDirectives); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp index 61e438b..3accd34 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp @@ -184,6 +184,7 @@ extern int staticShadowAnalysis; extern int keepDvmDirectives; extern int ignoreIO; extern int keepSpfDirs; +extern int maxShadowWidth; const string printVersionAsFortranComm() { @@ -199,13 +200,14 @@ const string printVersionAsFortranComm() ret += "! *** shadow optimization\n"; if (keepDvmDirectives) ret += "! *** consider DVMH directives\n"; + if (keepSpfDirs) + ret += "! *** save SPF directives\n"; if (mpiProgram) ret += "! *** MPI program regime (shared memory parallelization)\n"; if (ignoreIO) ret += "! *** ignore I/O checker for arrays (DVM I/O limitations)\n"; - if (keepSpfDirs) - ret += "! *** save SPF directives\n"; - + if (maxShadowWidth > 0) + ret += "! *** maximum shadow width is " + std::to_string(maxShadowWidth) + " percent\n"; ret += "! *** generated by SAPFOR\n"; return ret; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 6f967cf..fabd458 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2291" +#define VERSION_SPF "2292" diff --git a/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp b/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp index dc3a5a9..10fe288 100644 --- a/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp +++ b/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp @@ -1904,13 +1904,21 @@ int SPF_InsertPrivateFromGUI(void*& context, int winHandler, short* options, sho } int SPF_RemoveDeadCode(void*& context, int winHandler, short* options, short* projName, short* folderName, short*& output, - int*& outputSize, short*& outputMessage, int*& outputMessageSize) + int*& outputSize, short*& outputMessage, int*& outputMessageSize) { MessageManager::clearCache(); MessageManager::setWinHandler(winHandler); return simpleTransformPass(REMOVE_DEAD_CODE_AND_UNPARSE, options, projName, folderName, output, outputSize, outputMessage, outputMessageSize); } +int SPF_InsertImplicitNone(void*& context, int winHandler, short* options, short* projName, short* folderName, short*& output, + int*& outputSize, short*& outputMessage, int*& outputMessageSize) +{ + MessageManager::clearCache(); + MessageManager::setWinHandler(winHandler); + return simpleTransformPass(SET_IMPLICIT_NONE, options, projName, folderName, output, outputSize, outputMessage, outputMessageSize); +} + static inline void convertBackSlash(char *str, int strL) { for (int z = 0; z < strL; ++z) @@ -2625,6 +2633,8 @@ const wstring Sapfor_RunTransformation(const char* transformName_c, const char* retCode = SPF_InsertPrivateFromGUI(context, winHandler, optSh, projSh, fold, output, outputSize, outputMessage, outputMessageSize); else if (whichRun == "SPF_RemoveDeadCode") retCode = SPF_RemoveDeadCode(context, winHandler, optSh, projSh, fold, output, outputSize, outputMessage, outputMessageSize); + else if (whichRun == "SPF_InsertImplicitNone") + retCode = SPF_InsertImplicitNone(context, winHandler, optSh, projSh, fold, output, outputSize, outputMessage, outputMessageSize); else { if (showDebug) From 947747962dc96802f713a72456a5d3c738a4a2b4 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 24 Mar 2024 15:21:02 +0300 Subject: [PATCH 21/68] fixed --- .../_src/Transformations/private_arrays_resizing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp index 8a7d656..e5be7e9 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp @@ -1087,7 +1087,7 @@ static SgSymbol* shrinkArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, ve SgForStmt *loopStmt = (SgForStmt*)(forLoop->loop->GetOriginal()); if (!reduceToVariable && isAllocatable(arraySymbol)) - insertAllocDealloc(forLoop, arraySymbol, newSymbol, false, allocDone, NULL, &indexes); + insertAllocDealloc(forLoop, arraySymbol, newSymbol, allocDone, false, NULL, &indexes); for (SgStatement *st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt()->lexNext(); st = st->lexNext()) if (st->variant() != ALLOCATE_STMT && st->variant() != DEALLOCATE_STMT) From 8a689b5ee35167a963cf79cddfc01921b1331ac8 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 24 Mar 2024 21:24:32 +0300 Subject: [PATCH 22/68] refactoring --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 1 - .../DirectiveProcessing/directive_creator.cpp | 62 ++++++ .../DirectiveProcessing/directive_creator.h | 19 +- .../directive_creator_base.cpp | 1 - .../directive_creator_base_nodist.cpp | 1 - .../directive_creator_internal.h | 23 --- .../DirectiveProcessing/insert_directive.cpp | 63 ++++++ .../DirectiveProcessing/insert_directive.h | 15 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 181 ++---------------- .../private_arrays_resizing.cpp | 22 ++- .../experts/Sapfor_2017/_src/Utils/utils.cpp | 68 +++++++ sapfor/experts/Sapfor_2017/_src/Utils/utils.h | 6 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 13 files changed, 265 insertions(+), 199 deletions(-) delete mode 100644 sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 224909a..f3cca8e 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -242,7 +242,6 @@ set(DIRA _src/DirectiveProcessing/DirectiveAnalyzer.cpp _src/DirectiveProcessing/directive_creator.h _src/DirectiveProcessing/directive_creator_base_nodist.cpp _src/DirectiveProcessing/directive_creator_nodist.h - _src/DirectiveProcessing/directive_creator_internal.h _src/DirectiveProcessing/directive_parser.cpp _src/DirectiveProcessing/directive_parser.h _src/DirectiveProcessing/insert_directive.cpp diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp index ebfafbb..a4fd864 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp @@ -45,6 +45,8 @@ using std::get; using std::string; using std::wstring; +extern int mpiProgram; + static vector>> groupRealignsDirs(const vector>>& toRealign) { @@ -423,6 +425,66 @@ bool analyzeLoopBody(LoopGraph* loopV, return true; } +void createParallelDirs(File *file, + map>& createdDirectives, + vector& messages, + const vector& loopsInFile, + const map>& allFuncInfo, + const vector& parallelRegions, + const map& depInfoForLoopGraph, + const map>& arrayLinksByFuncCalls) +{ + const string file_name = file->filename(); + map mapLoopsInFile; + createMapLoopGraph(loopsInFile, mapLoopsInFile); + + map mapFuncInfo; + createMapOfFunc(allFuncInfo, mapFuncInfo); + + for (int z = 0; z < parallelRegions.size(); ++z) + { + vector toInsert; + + const DataDirective& dataDirectives = parallelRegions[z]->GetDataDir(); + const vector& currentVariant = parallelRegions[z]->GetCurrentVariant(); + DIST::GraphCSR& reducedG = parallelRegions[z]->GetReducedGraphToModify(); + DIST::Arrays& allArrays = parallelRegions[z]->GetAllArraysToModify(); + + auto& tmp = dataDirectives.distrRules; + vector> currentVar; + + if (mpiProgram == 0) + { + for (int z1 = 0; z1 < currentVariant.size(); ++z1) + currentVar.push_back(make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]])); + } + else + { + for (auto& loop : mapLoopsInFile) + { + auto& rules = loop.second->getDataDir().distrRules; + for (auto& rule : rules) + currentVar.push_back(make_pair(rule.first, &rule.second[0])); + } + } + + selectParallelDirectiveForVariant(file, parallelRegions[z], reducedG, allArrays, loopsInFile, + mapLoopsInFile, mapFuncInfo, currentVar, + toInsert, parallelRegions[z]->GetId(), arrayLinksByFuncCalls, + depInfoForLoopGraph, messages); + + if (toInsert.size() > 0) + { + auto it = createdDirectives.find(file_name); + if (it == createdDirectives.end()) + createdDirectives.insert(it, make_pair(file_name, toInsert)); + else + for (int m = 0; m < toInsert.size(); ++m) + it->second.push_back(toInsert[m]); + } + } +} + #undef PRINT_DIR_RESULT #undef FIRST #undef SECOND diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h index 72462e8..c2f24cd 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h @@ -43,4 +43,21 @@ DIST::Array* getRealArrayRef(DIST::Array* in, const uint64_t regId, const std::m void shiftAlignRulesForTemplates(const std::set& arrays, const uint64_t regId, DataDirective& dataDirectives, const std::map>& arrayLinksByFuncCalls); -void createShadowSpec(const std::map>& loopGraph, const std::map>& arrayLinksByFuncCalls, const std::set& forArrays); \ No newline at end of file +void createShadowSpec(const std::map>& loopGraph, const std::map>& arrayLinksByFuncCalls, const std::set& forArrays); + +void addShadowFromAnalysis(ParallelDirective* dir, const std::map& currAccesses); + +bool checkForConflict(const std::map& currAccesses, + const LoopGraph* currentLoop, + std::map>, DIST::ArrayComparator>& arrayWriteAcc, + const std::vector, std::vector>>>& acrossInfo, + std::set& acrossOutArrays); + +void createParallelDirs(File* file, + std::map>& createdDirectives, + std::vector& messages, + const std::vector& loopsInFile, + const std::map>& allFuncInfo, + const std::vector& parallelRegions, + const std::map& depInfoForLoopGraph, + const std::map>& arrayLinksByFuncCalls); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp index 69bde5b..563c44c 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp @@ -15,7 +15,6 @@ #include "../Utils/errors.h" #include "directive_parser.h" #include "directive_creator.h" -#include "directive_creator_internal.h" #define PRINT_PROF_INFO 1 #define PRINT_DIR_RESULT 0 diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp index 0387428..27eb9d6 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp @@ -15,7 +15,6 @@ #include "../Utils/errors.h" #include "directive_parser.h" #include "directive_creator.h" -#include "directive_creator_internal.h" #include "directive_creator_nodist.h" #define PRINT_PROF_INFO 1 diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h deleted file mode 100644 index 0061885..0000000 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "../Distribution/Distribution.h" -#include "../Utils/errors.h" -#include "../GraphLoop/graph_loops.h" -#include "../Utils/types.h" - -#define FIRST(x) get<0>(x) -#define SECOND(x) get<1>(x) -#define THIRD(x) get<2>(x) - -void addShadowFromAnalysis(ParallelDirective* dir, const std::map& currAccesses); - -bool checkForConflict(const std::map& currAccesses, - const LoopGraph* currentLoop, - std::map>, DIST::ArrayComparator>& arrayWriteAcc, - const std::vector, std::vector>>>& acrossInfo, - std::set& acrossOutArrays); diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp index 262884b..b9e3678 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp @@ -39,6 +39,8 @@ using std::make_tuple; static const string dvmhModuleName = "dvmh_template_mod"; +extern int mpiProgram; + //the size of vector indiceates type of DVM_DIR SgStatement* createStatFromExprs(const vector &exprs) { @@ -2364,4 +2366,65 @@ void insertDistributeDirsToParallelRegions(const vector *cu } } } +} + +void insertParallelDirs(SgFile *file, bool extract, + vector& createdDirectives, + vector& messages, + map& templateDeclInIncludes, + map>>& commentsToInclude, + const vector& callGraph, + const vector& parallelRegions, + const map>& loopGraph, + const set& allFileNames, + const map>& arrayLinksByFuncCalls, + const map, pair>& declaredArrays, + const map>& tableOfUniqNamesByArray) +{ + const char* file_name = file->filename(); + insertDirectiveToFile(file, file_name, createdDirectives, extract, messages); + + if (mpiProgram == 0) + { + map mapFuncInfo; + createMapOfFunc(callGraph, mapFuncInfo); + + for (int z = 0; z < parallelRegions.size(); ++z) + { + ParallelRegion* currReg = parallelRegions[z]; + + const DataDirective& dataDirectives = currReg->GetDataDir(); + const vector& currentVariant = currReg->GetCurrentVariant(); + const DIST::Arrays& allArrays = currReg->GetAllArrays(); + DIST::GraphCSR& reducedG = currReg->GetReducedGraphToModify(); + + const set distrArrays = fillDistributedArrays(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls); + const vector distrRules = dataDirectives.GenRule(currentVariant); + const vector> distrRulesSt = dataDirectives.GenRule(currentVariant, 0); + const vector alignRules = dataDirectives.GenAlignsRules(); + + + insertDistributionToFile(file, file_name, dataDirectives, distrArrays, distrRules, distrRulesSt, alignRules, loopGraph, + allArrays, reducedG, commentsToInclude, templateDeclInIncludes, extract, messages, + arrayLinksByFuncCalls, mapFuncInfo, currReg->GetId(), allFileNames); + + insertLoopTempalteDeclaration(file, dataDirectives, distrRules, distrRulesSt, allArrays, extract, currReg->GetId()); + } + } + + if (extract) + { + createdDirectives.clear(); + + //clear shadow specs + for (auto& array : declaredArrays) + array.second.first->ClearShadowSpecs(); + } + else if (mpiProgram == 0) + { + set regNum; + for (int z = 0; z < parallelRegions.size(); ++z) + regNum.insert(parallelRegions[z]->GetId()); + insertTemplateModuleUse(file, regNum, arrayLinksByFuncCalls); + } } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h index 989bef5..e222067 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h @@ -47,4 +47,17 @@ void insertDistributeDirsToParallelRegions(const std::vector& regNum, const std::map>& arrayLinksByFuncCalls); void removeStatementsFromAllproject(const std::set& variants); -void correctTemplateModuleDeclaration(const std::string& folderName); \ No newline at end of file +void correctTemplateModuleDeclaration(const std::string& folderName); + +void insertParallelDirs(SgFile* file, bool extract, + std::vector& createdDirectives, + std::vector& messages, + std::map& templateDeclInIncludes, + std::map>>& commentsToInclude, + const std::vector& callGraph, + const std::vector& parallelRegions, + const std::map>& loopGraph, + const std::set& allFileNames, + const std::map>& arrayLinksByFuncCalls, + const std::map, std::pair>& declaredArrays, + const std::map>& tableOfUniqNamesByArray); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 8ab8e47..33c7e9b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -378,68 +378,6 @@ string unparseProjectToString(SgFile *file, const int curr_regime) return unparseProjectIfNeed(file, curr_regime, true, "", NULL, allIncludeFiles, true); } -static bool isNotNullIntersection(const set &first, const set &second) -{ - for (auto &elem1 : first) - if (second.find(elem1) != second.end()) - return true; - - return false; -} - -static set fillDistributedArraysD(const DataDirective& dataDirectives, bool onlyCommon = false) -{ - set distrArrays; - set distrArraysD; - set distrArraysAdded; - - for (int z = 0; z < dataDirectives.distrRules.size(); ++z) - distrArraysD.insert(dataDirectives.distrRules[z].first); - for (int z = 0; z < dataDirectives.alignRules.size(); ++z) - distrArraysD.insert(dataDirectives.alignRules[z].alignArray); - - for (auto& elem : tableOfUniqNamesByArray) - { - set realRefs; - getRealArrayRefs(elem.first, elem.first, realRefs, arrayLinksByFuncCalls); - if (isNotNullIntersection(realRefs, distrArraysD)) - distrArraysAdded.insert(elem.first); - } - - for (auto& elem : distrArraysD) - { - if (onlyCommon) - { - if (elem->GetLocation().first == DIST::l_COMMON) - distrArrays.insert(elem); - } - else - distrArrays.insert(elem); - } - - for (auto& elem : distrArraysAdded) - { - if (onlyCommon) - { - if (elem->GetLocation().first == DIST::l_COMMON) - distrArrays.insert(elem); - } - else - distrArrays.insert(elem); - } - return distrArrays; -} - -static set fillDistributedArrays(const DataDirective &dataDirectives, bool onlyCommon = false, bool shortName = false) -{ - set distrArrays; - set ret = fillDistributedArraysD(dataDirectives, onlyCommon); - - for (auto& elem : ret) - distrArrays.insert(shortName ? elem->GetShortName() : elem->GetName()); - return distrArrays; -} - static bool runAnalysis(SgProject &project, const int curr_regime, const bool need_to_unparse, const char *newVer = NULL, const char *folderName = NULL) { if (PASSES_DONE_INIT == false) @@ -497,6 +435,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne } auto rw_analyzer = ReadWriteAnalyzer(allFuncInfo); // doesn't analyze anything until first query + int global_err = 0; for (int i = n - 1; i >= 0; --i) { @@ -526,7 +465,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { vector tmp; loopAnalyzer(file, parallelRegions, createdArrays, tmp, DATA_DISTR, - allFuncInfo, declaredArrays, declaratedArraysSt, arrayLinksByFuncCalls, createDefUseMapByPlace(), true, &(loopGraph.find(file_name)->second)); + allFuncInfo, declaredArrays, declaratedArraysSt, arrayLinksByFuncCalls, createDefUseMapByPlace(), + true, &(loopGraph.find(file_name)->second)); } else if (curr_regime == LOOP_ANALYZER_DATA_DIST_S1 || curr_regime == ONLY_ARRAY_GRAPH) { @@ -596,113 +536,24 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne verifyOK &= res; } else if (curr_regime == CORRECT_FORMAT_PLACE) - checkAndMoveFormatOperators(file, getObjectForFileFromMap(file_name, SPF_messages), false); + checkAndMoveFormatOperators(file, getObjectForFileFromMap(file_name, SPF_messages), false); else if (curr_regime == CREATE_PARALLEL_DIRS) { auto &loopsInFile = getObjectForFileFromMap(file_name, loopGraph); - map mapLoopsInFile; - createMapLoopGraph(loopsInFile, mapLoopsInFile); + map depInfoForLoopGraphV; + for (auto& elem : depInfoForLoopGraph) + depInfoForLoopGraphV[elem.first] = elem.second; - map mapFuncInfo; - createMapOfFunc(allFuncInfo, mapFuncInfo); - - for (int z = 0; z < parallelRegions.size(); ++z) - { - vector toInsert; - - const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir(); - const vector ¤tVariant = parallelRegions[z]->GetCurrentVariant(); - DIST::GraphCSR &reducedG = parallelRegions[z]->GetReducedGraphToModify(); - DIST::Arrays &allArrays = parallelRegions[z]->GetAllArraysToModify(); - - auto& tmp = dataDirectives.distrRules; - vector> currentVar; - - if (mpiProgram == 0) - { - for (int z1 = 0; z1 < currentVariant.size(); ++z1) - currentVar.push_back(make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]])); - } - else - { - for (auto& loop : mapLoopsInFile) - { - auto& rules = loop.second->getDataDir().distrRules; - for (auto& rule : rules) - currentVar.push_back(make_pair(rule.first, &rule.second[0])); - } - } - - map depInfoForLoopGraphV; - for (auto& elem : depInfoForLoopGraph) - depInfoForLoopGraphV[elem.first] = elem.second; - - selectParallelDirectiveForVariant(new File(file), parallelRegions[z], reducedG, allArrays, loopsInFile, mapLoopsInFile, mapFuncInfo, currentVar, - toInsert, parallelRegions[z]->GetId(), arrayLinksByFuncCalls, - depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages)); - - if (toInsert.size() > 0) - { - auto it = createdDirectives.find(file_name); - if (it == createdDirectives.end()) - createdDirectives.insert(it, make_pair(file_name, toInsert)); - else - for (int m = 0; m < toInsert.size(); ++m) - it->second.push_back(toInsert[m]); - } - } + createParallelDirs(new File(file), createdDirectives, getObjectForFileFromMap(file_name, SPF_messages), + loopsInFile, allFuncInfo, parallelRegions, depInfoForLoopGraphV, arrayLinksByFuncCalls); } else if (curr_regime == INSERT_PARALLEL_DIRS || curr_regime == EXTRACT_PARALLEL_DIRS) { const bool extract = (curr_regime == EXTRACT_PARALLEL_DIRS); - - insertDirectiveToFile(file, file_name, createdDirectives[file_name], extract, getObjectForFileFromMap(file_name, SPF_messages)); - - if (mpiProgram == 0) - { - auto callGraph = getObjectForFileFromMap(file_name, allFuncInfo); - map mapFuncInfo; - createMapOfFunc(callGraph, mapFuncInfo); - - for (int z = 0; z < parallelRegions.size(); ++z) - { - ParallelRegion* currReg = parallelRegions[z]; - - const DataDirective& dataDirectives = currReg->GetDataDir(); - const vector& currentVariant = currReg->GetCurrentVariant(); - const DIST::Arrays& allArrays = currReg->GetAllArrays(); - DIST::GraphCSR& reducedG = currReg->GetReducedGraphToModify(); - - const set distrArrays = fillDistributedArrays(dataDirectives); - const vector distrRules = dataDirectives.GenRule(currentVariant); - const vector> distrRulesSt = dataDirectives.GenRule(currentVariant, 0); - const vector alignRules = dataDirectives.GenAlignsRules(); - - - insertDistributionToFile(file, file_name, dataDirectives, distrArrays, distrRules, distrRulesSt, alignRules, loopGraph, - allArrays, reducedG, commentsToInclude, templateDeclInIncludes, extract, getObjectForFileFromMap(file_name, SPF_messages), - arrayLinksByFuncCalls, mapFuncInfo, currReg->GetId(), allFileNames); - - insertLoopTempalteDeclaration(file, dataDirectives, distrRules, distrRulesSt, allArrays, extract, currReg->GetId()); - } - } - - if (extract) - { - createdDirectives[file_name].clear(); - - //clear shadow specs - for (auto& array : declaredArrays) - array.second.first->ClearShadowSpecs(); - } - else if (mpiProgram == 0) - { - set regNum; - for (int z = 0; z < parallelRegions.size(); ++z) - regNum.insert(parallelRegions[z]->GetId()); - insertTemplateModuleUse(file, regNum, arrayLinksByFuncCalls); - } + insertParallelDirs(file, extract, createdDirectives[file_name], getObjectForFileFromMap(file_name, SPF_messages), + templateDeclInIncludes, commentsToInclude, getObjectForFileFromMap(file_name, allFuncInfo), + parallelRegions, loopGraph, allFileNames, arrayLinksByFuncCalls, declaredArrays, tableOfUniqNamesByArray); } else if (curr_regime == LOOP_ANALYZER_NODIST) { @@ -734,7 +585,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne depInfoForLoopGraphV[elem.first] = elem.second; selectParallelDirectiveForVariantNoDist(new File(file), parallelRegions[z], allArrays, loopsInFile, mapLoopsInFile, mapFuncInfo, - toInsert, arrayLinksByFuncCalls, depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages)); + toInsert, arrayLinksByFuncCalls, depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages)); if (toInsert.size() > 0) { @@ -758,7 +609,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne DataDirective &dataDirectives = currReg->GetDataDirToModify(); DIST::GraphCSR &reducedG = parallelRegions[z]->GetReducedGraphToModify(); - set distrArraysF = fillDistributedArrays(dataDirectives); + set distrArraysF = fillDistributedArrays(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls); set distrArrays; for (auto& elem : distrArraysF) @@ -775,7 +626,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { ParallelRegion* currReg = parallelRegions[z]; DataDirective& dataDirectives = currReg->GetDataDirToModify(); - const set distrCommonArrays = fillDistributedArraysD(dataDirectives, true); + const set distrCommonArrays = fillDistributedArraysD(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls, true); insertRealignsBeforeFragments(currReg, file, distrCommonArrays, arrayLinksByFuncCalls); } } @@ -1183,7 +1034,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne unparseProjectIfNeed(file, curr_regime, need_to_unparse, newVer, folderName, allIncludeFiles); } // end of FOR by files - + if (internalExit < 0) throw -1; diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp index e5be7e9..013f3c6 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp @@ -386,12 +386,26 @@ static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, static void extendArrayRefsInExpr(const vector& indexes, SgExpression* expr, SgSymbol* arraySymbol, SgSymbol* newArraySymbol, - const vector& lowBounds) + const vector& lowBounds, int line) { if (expr) { - extendArrayRefsInExpr(indexes, expr->lhs(), arraySymbol, newArraySymbol, lowBounds); - extendArrayRefsInExpr(indexes, expr->rhs(), arraySymbol, newArraySymbol, lowBounds); + if (expr->variant() == FUNC_CALL) + { + SgFunctionCallExp* call = isSgFunctionCallExp(expr); + for (int arg = 0; arg < call->numberOfArgs(); ++arg) + { + auto argRef = call->arg(arg); + if ((isArrayRef(argRef) || argRef->variant() == VAR_REF) && isEqSymbols(argRef->symbol(), arraySymbol)) + { + __spf_print(1, "unsupported private array extension under call on line %d\n", line); + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + } + } + } + + extendArrayRefsInExpr(indexes, expr->lhs(), arraySymbol, newArraySymbol, lowBounds, line); + extendArrayRefsInExpr(indexes, expr->rhs(), arraySymbol, newArraySymbol, lowBounds, line); if (isArrayRef(expr) && isEqSymbols(arraySymbol, expr->symbol())) extendArrayRef(indexes, expr, newArraySymbol, lowBounds); @@ -426,7 +440,7 @@ static void extendArrayRefs(const vector &indexes, SgStatement *st, S } if (st->expr(i)) - extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds); + extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds, st->lineNumber()); } } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp index 3accd34..c6d98a5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp @@ -1575,3 +1575,71 @@ vector splitAndArgvCreate(const string& options) } return optSplited1; } + +static bool isNotNullIntersection(const set& first, const set& second) +{ + for (auto& elem1 : first) + if (second.find(elem1) != second.end()) + return true; + + return false; +} + +set fillDistributedArraysD(const DataDirective& dataDirectives, + const map>& tableOfUniqNamesByArray, + const map>& arrayLinksByFuncCalls, + bool onlyCommon) +{ + set distrArrays; + set distrArraysD; + set distrArraysAdded; + + for (int z = 0; z < dataDirectives.distrRules.size(); ++z) + distrArraysD.insert(dataDirectives.distrRules[z].first); + for (int z = 0; z < dataDirectives.alignRules.size(); ++z) + distrArraysD.insert(dataDirectives.alignRules[z].alignArray); + + for (auto& elem : tableOfUniqNamesByArray) + { + set realRefs; + getRealArrayRefs(elem.first, elem.first, realRefs, arrayLinksByFuncCalls); + if (isNotNullIntersection(realRefs, distrArraysD)) + distrArraysAdded.insert(elem.first); + } + + for (auto& elem : distrArraysD) + { + if (onlyCommon) + { + if (elem->GetLocation().first == DIST::l_COMMON) + distrArrays.insert(elem); + } + else + distrArrays.insert(elem); + } + + for (auto& elem : distrArraysAdded) + { + if (onlyCommon) + { + if (elem->GetLocation().first == DIST::l_COMMON) + distrArrays.insert(elem); + } + else + distrArrays.insert(elem); + } + return distrArrays; +} + +set fillDistributedArrays(const DataDirective& dataDirectives, + const map>& tableOfUniqNamesByArray, + const map>& arrayLinksByFuncCalls, + bool onlyCommon, bool shortName) +{ + set distrArrays; + set ret = fillDistributedArraysD(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls, onlyCommon); + + for (auto& elem : ret) + distrArrays.insert(shortName ? elem->GetShortName() : elem->GetName()); + return distrArrays; +} \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.h b/sapfor/experts/Sapfor_2017/_src/Utils/utils.h index e878329..df8e325 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.h @@ -4,10 +4,11 @@ #include #include +struct DataDirective; namespace Distribution { class Array; - class ArrayAccessInfo; + class ArrayAccessInfo; template class Arrays; } namespace DIST = Distribution; @@ -90,3 +91,6 @@ std::wstring fixedLongFormat(const wchar_t* old); std::map sortArraysByName(const std::set& toSort); bool createDirectory(const std::string& name); std::vector splitAndArgvCreate(const std::string& options); + +std::set fillDistributedArraysD(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false); +std::set fillDistributedArrays(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false, bool shortName = false); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index fabd458..931f5d8 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2292" +#define VERSION_SPF "2293" From 83f4e1289c98903cd20f446a8f2f26731125726c Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Tue, 26 Mar 2024 13:58:00 +0300 Subject: [PATCH 23/68] fix select_array_conf pass for nested loops --- .../Sapfor_2017/_src/GraphCall/select_array_conf.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp index 8302950..b4567c7 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp @@ -121,11 +121,9 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const setchildren) - preventLoopsFromParallelizations(child, prevent, createdDirectives, messagesForFile); - } + + for (LoopGraph* child : loop->children) + preventLoopsFromParallelizations(child, prevent, createdDirectives, messagesForFile); } struct DimConf From ebca0b4c416d9c12bbb32386fad09e26708b0350 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Tue, 26 Mar 2024 13:59:48 +0300 Subject: [PATCH 24/68] shared memory: private arrays, free loops --- .../_src/LoopAnalyzer/loop_analyzer.cpp | 15 +- .../LoopAnalyzer/loop_analyzer_internal.h | 16 +- .../LoopAnalyzer/loop_analyzer_nodist.cpp | 235 ++++++++++++++++-- 3 files changed, 229 insertions(+), 37 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp index f618651..71da168 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp @@ -125,9 +125,8 @@ static void addInfoToMap(map> &loopInfo, S __spf_print(DEB, "RemoteAccess[%d]: true for dim %d and array %s, loop line %d\n", __LINE__, dimNum, symb->identifier(), position->lineNumber()); } -enum { READ_OP, WRITE_OP, UNREC_OP }; -static void addInfoToVectors(map> &loopInfo, SgForStmt *position, SgSymbol *symb, - const int dimNum, const pair newCoef, int type, const int maxDimSize, const double currentW) +void addInfoToVectors(map> &loopInfo, SgForStmt *position, SgSymbol *symb, + const int dimNum, const pair newCoef, int type, const int maxDimSize, const double currentW) { auto itLoop = loopInfo.find(position); if (itLoop == loopInfo.end()) @@ -159,10 +158,10 @@ static void addInfoToVectors(map> &loopInf } -static vector matchSubscriptToLoopSymbols(const vector &parentLoops, SgExpression *subscr, - SgArrayRefExp *arrayRefIn, const int side, const int dimNum, - map> &loopInfo, - const int currLine, const int numOfSubscriptions, const double currentW) +vector matchSubscriptToLoopSymbols(const vector &parentLoops, SgExpression *subscr, + SgArrayRefExp *arrayRefIn, const int side, const int dimNum, + map> &loopInfo, + const int currLine, const int numOfSubscriptions, const double currentW) { SgExpression *origSubscr = subscr; ArrayRefExp *arrayRef = new ArrayRefExp(arrayRefIn); @@ -557,7 +556,7 @@ static void mapArrayRef(SgStatement* currentSt, SgExpression* currExp, __spf_print(PRINT_ARRAY_ARCS, "\n"); } -void findArrayRef(const vector &parentLoops, SgExpression *currExp, const int lineNum, const int side, +static void findArrayRef(const vector &parentLoops, SgExpression *currExp, const int lineNum, const int side, map> &loopInfo, const set &privatesVars, vector>& privatesVarsForLoop, map &sortedLoopGraph, const map> &commonBlocks, diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_internal.h b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_internal.h index a01cb76..9ab28a7 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_internal.h +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_internal.h @@ -58,13 +58,13 @@ void changeLoopWeight(double& currentWeight, const std::map& so SgStatement* takeOutConditions(std::stack& conditions, std::stack& ifBlocks, SgStatement* st); -void findArrayRef(const std::vector& parentLoops, SgExpression* currExp, const int lineNum, const int side, - std::map>& loopInfo, const std::set& privatesVars, - std::vector>& privatesVarsForLoop, std::map& sortedLoopGraph, - const std::map>& commonBlocks, - const std::map, std::pair>& declaredArrays, - bool wasDistributedArrayRef, std::map>& notMappedDistributedArrays, - std::set& mappedDistrbutedArrays, SgStatement* currentSt, const ParallelRegion* reg, const double currentW, - const std::map>& arrayLinksByFuncCalls); +enum { READ_OP, WRITE_OP, UNREC_OP }; +void addInfoToVectors(std::map>& loopInfo, SgForStmt* position, SgSymbol* symb, + const int dimNum, const std::pair newCoef, int type, const int maxDimSize, const double currentW); + +std::vector matchSubscriptToLoopSymbols(const std::vector& parentLoops, SgExpression* subscr, + SgArrayRefExp* arrayRefIn, const int side, const int dimNum, + std::map>& loopInfo, + const int currLine, const int numOfSubscriptions, const double currentW); bool hasNonPureFunctions(SgExpression* ex, LoopGraph* loopRef, std::vector& messagesForFile, const int line, const std::map& funcByName); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp index 777b7a8..a91df00 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp @@ -36,7 +36,6 @@ extern void createMapLoopGraph(map& sortedLoopGraph, const vect extern map> tableOfUniqNamesByArray; static void convertOneLoopNoDist(LoopGraph* currLoop, map>& outInfo, const map& toConvert, - const set& privateArrays, const map>& commonBlocks, const map, pair>& declaredArrays, const map>& arrayLinksByFuncCalls, @@ -109,7 +108,6 @@ static void convertOneLoopNoDist(LoopGraph* currLoop, map> convertLoopInfoNoDist(const map>& loopInfo, const map& sortedLoopGraph, - const set& privateArrays, const map>& commonBlocks, const map, pair>& declaredArrays, const map>& arrayLinksByFuncCalls, @@ -123,12 +121,188 @@ convertLoopInfoNoDist(const map>& loopInfo if (itGraph == sortedLoopGraph.end()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - convertOneLoopNoDist(itGraph->second, outInfo, it->second, privateArrays, commonBlocks, declaredArrays, arrayLinksByFuncCalls, createdArrays); + convertOneLoopNoDist(itGraph->second, outInfo, it->second, commonBlocks, declaredArrays, arrayLinksByFuncCalls, createdArrays); } return outInfo; } +static vector matchArrayToLoopSymbols(const vector &parentLoops, vector>& privatesVarsForLoop, + SgExpression *currExp, const int side, + map> &loopInfo, const int currLine, + map &sortedLoopGraph, const ParallelRegion *reg, const double currentW, + const map> &arrayLinksByFuncCalls) +{ + SgArrayRefExp *arrayRef = (SgArrayRefExp*)currExp; + int numOfSubs = arrayRef->numberOfSubscripts(); + + currExp = currExp->lhs(); + vector wasFoundForLoop(parentLoops.size()); + vector matched(numOfSubs); + vector matchedToDim(parentLoops.size()); + std::fill(wasFoundForLoop.begin(), wasFoundForLoop.end(), 0); + std::fill(matched.begin(), matched.end(), -1); + std::fill(matchedToDim.begin(), matchedToDim.end(), -1); + int maxMatched = 0; + int sumMatched = 0; + + for (int i = 0; i < numOfSubs; ++i) + { + vector matchToLoops = matchSubscriptToLoopSymbols(parentLoops, currExp->lhs(), arrayRef, side, i, loopInfo, currLine, numOfSubs, currentW); + for (int k = 0; k < matchToLoops.size(); ++k) + { + wasFoundForLoop[matchToLoops[k]]++; + matchedToDim[matchToLoops[k]] = i; + } + + matched[i] = matchToLoops.size(); + sumMatched += matchToLoops.size(); + maxMatched = std::max(maxMatched, (int)matchToLoops.size()); + currExp = currExp->rhs(); + } + + //full array is used, add unknown operations to all loops + if (numOfSubs == 0) + { + SgSymbol *currOrigArrayS = OriginalSymbol(arrayRef->symbol()); + auto arrType = isSgArrayType(currOrigArrayS->type()); + if (arrType != NULL) + { + for (int d = 0; d < arrType->dimension(); ++d) + for (int i = 0; i < parentLoops.size(); ++i) + addInfoToVectors(loopInfo, parentLoops[i], currOrigArrayS, d, make_pair(0, 0), UNREC_OP, arrType->dimension(), currentW); + } + } + + bool ifUnknownArrayAssignFound = false; + vector canNotMapToLoop; + for (int i = 0; i < wasFoundForLoop.size(); ++i) + { + if (wasFoundForLoop[i] != 1 && + privatesVarsForLoop[i].find(string(arrayRef->symbol()->identifier())) == privatesVarsForLoop[i].end()) + { + auto itLoop = sortedLoopGraph.find(parentLoops[i]->lineNumber()); + if (itLoop == sortedLoopGraph.end()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + ifUnknownArrayAssignFound = true; + if (side == LEFT) + itLoop->second->hasUnknownArrayAssigns = true; + + itLoop->second->hasUnknownDistributedMap = true; + canNotMapToLoop.push_back(parentLoops[i]->lineNumber()); + } + } + + if (side == LEFT) + { + if (ifUnknownArrayAssignFound) + { + const string arrayRefS = arrayRef->unparse(); + for (auto &line : canNotMapToLoop) + { + __spf_print(1, "WARN: can not map write to array '%s' to loop on line %d\n", arrayRefS.c_str(), line); + wstring messageE, messageR; + __spf_printToLongBuf(messageE, L"can not map write to array '%s' to this loop", to_wstring(arrayRefS).c_str()); + + __spf_printToLongBuf(messageR, R59, to_wstring(arrayRefS).c_str()); + + if (line > 0) + currMessages->push_back(Messages(WARR, line, messageR, messageE, 1025)); + } + } + } + + return wasFoundForLoop; +} + +static void mapArrayRef(SgStatement* currentSt, SgExpression* currExp, + const vector& parentLoops, const int side, const int lineNum, + map>& loopInfo, + vector>& privatesVarsForLoop, + map& sortedLoopGraph, map>& notMappedDistributedArrays, + set& mappedDistrbutedArrays, + const ParallelRegion* reg, const double currentW, const map>& arrayLinksByFuncCalls) +{ + const char* printSide = NULL; + if (PRINT_ARRAY_ARCS) + printBlanks(2, (int)parentLoops.size()); + if (side == LEFT) + printSide = "W_OP"; + else + printSide = "R_OP"; + + __spf_print(PRINT_ARRAY_ARCS, "%s to array <%s> on line %d: ", printSide, OriginalSymbol(currExp->symbol())->identifier(), lineNum); + bool wasMapped = false; + vector matched = matchArrayToLoopSymbols(parentLoops, privatesVarsForLoop, currExp, side, loopInfo, lineNum, sortedLoopGraph, reg, currentW, arrayLinksByFuncCalls); + for (int z = 0; z < matched.size(); ++z) + wasMapped |= (matched[z] != 0); + + if (parentLoops.size() == 0) + { + SgSymbol* symb = currExp->symbol(); + if (symb->type()->variant() == T_ARRAY) + notMappedDistributedArrays[symb->identifier()] = make_pair(symb, currentSt); + } + else + { + if (wasMapped) + mappedDistrbutedArrays.insert(currExp->symbol()->identifier()); + else + { + SgSymbol* symb = currExp->symbol(); + if (symb->type()->variant() == T_ARRAY) + notMappedDistributedArrays[symb->identifier()] = make_pair(symb, currentSt); + } + } + __spf_print(PRINT_ARRAY_ARCS, "\n"); +} + +static void findArrayRef(const vector& parentLoops, SgExpression* currExp, const int lineNum, const int side, + map>& loopInfo, + vector>& privatesVarsForLoop, map& sortedLoopGraph, + map>& notMappedDistributedArrays, + set& mappedDistrbutedArrays, SgStatement* currentSt, const ParallelRegion* reg, const double currentW, + const map>& arrayLinksByFuncCalls) +{ + int nextSide = side; + if (isArrayRef(currExp)) + { + mapArrayRef(currentSt, currExp, parentLoops, side, lineNum, loopInfo, privatesVarsForLoop, sortedLoopGraph, + notMappedDistributedArrays, mappedDistrbutedArrays, reg, currentW, arrayLinksByFuncCalls); + nextSide = (side == LEFT) ? RIGHT : side; + } + + bool needToContinue = true; + if (currExp->variant() == FUNC_CALL) + { + SgFunctionCallExp* funcExp = (SgFunctionCallExp*)currExp; + auto currFunc = isUserFunctionInProject(funcExp->funName()->identifier()); + if (currFunc) + { + for (int z = 0; z < funcExp->numberOfArgs(); ++z) + { + if ((currFunc->funcParams.inout_types[z] & OUT_BIT) != 0) + nextSide = LEFT; + else + nextSide = RIGHT; + findArrayRef(parentLoops, funcExp->arg(z), lineNum, nextSide, loopInfo, privatesVarsForLoop, sortedLoopGraph, + notMappedDistributedArrays, mappedDistrbutedArrays, currentSt, reg, currentW, arrayLinksByFuncCalls); + } + needToContinue = false; + } + } + + if (needToContinue) + { + if (currExp->lhs()) + findArrayRef(parentLoops, currExp->lhs(), lineNum, nextSide, loopInfo, privatesVarsForLoop, sortedLoopGraph, + notMappedDistributedArrays, mappedDistrbutedArrays, currentSt, reg, currentW, arrayLinksByFuncCalls); + if (currExp->rhs()) + findArrayRef(parentLoops, currExp->rhs(), lineNum, nextSide, loopInfo, privatesVarsForLoop, sortedLoopGraph, + notMappedDistributedArrays, mappedDistrbutedArrays, currentSt, reg, currentW, arrayLinksByFuncCalls); + } +} + void loopAnalyzerNoDist(SgFile* file, vector& regions, map, DIST::Array*>& createdArrays, vector& messagesForFile, const map>& AllfuncInfo, const map, pair>& declaredArrays, @@ -187,8 +361,6 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, map> loopInfo; set loopWithOutArrays; - set privatesVars; - SgStatement* st = file->functions(i); string funcName = ""; if (st->variant() == PROG_HEDR) @@ -210,6 +382,9 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapsymbol()->identifier(); } + if (funcName == string("interp")) + int a = 0; + vector loopsForFunction; for (auto& loop : *loopGraph) { @@ -269,7 +444,7 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapvariant(); if (currV == FOR_NODE) { - tryToFindPrivateInAttributes(st, privatesVars); + //tryToFindPrivateInAttributes(st, privatesVars); set toAdd; tryToFindPrivateInAttributes(st, toAdd); @@ -312,12 +487,12 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapexpr(0)) - findArrayRef(parentLoops, st->expr(0), st->lineNumber(), LEFT, loopInfo, privatesVars, privatesVarsForLoop, - sortedLoopGraph, commonBlocks, declaredArrays, false, notMappedDistributedArrays, + findArrayRef(parentLoops, st->expr(0), st->lineNumber(), LEFT, loopInfo, privatesVarsForLoop, + sortedLoopGraph, notMappedDistributedArrays, mappedDistrbutedArrays, st, currReg, currentWeight, arrayLinksByFuncCalls); if (st->expr(1)) - findArrayRef(parentLoops, st->expr(1), st->lineNumber(), RIGHT, loopInfo, privatesVars, privatesVarsForLoop, - sortedLoopGraph, commonBlocks, declaredArrays, false, notMappedDistributedArrays, + findArrayRef(parentLoops, st->expr(1), st->lineNumber(), RIGHT, loopInfo, privatesVarsForLoop, + sortedLoopGraph, notMappedDistributedArrays, mappedDistrbutedArrays, st, currReg, currentWeight, arrayLinksByFuncCalls); } else if (currV == IF_NODE || currV == ELSEIF_NODE || currV == LOGIF_NODE || currV == SWITCH_NODE) @@ -325,8 +500,8 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapexpr(0)) { - findArrayRef(parentLoops, st->expr(0), st->lineNumber(), RIGHT, loopInfo, privatesVars, privatesVarsForLoop, - sortedLoopGraph, commonBlocks, declaredArrays, false, notMappedDistributedArrays, + findArrayRef(parentLoops, st->expr(0), st->lineNumber(), RIGHT, loopInfo, privatesVarsForLoop, + sortedLoopGraph, notMappedDistributedArrays, mappedDistrbutedArrays, st, currReg, currentWeight, arrayLinksByFuncCalls); } } @@ -344,12 +519,12 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapelem(z); if ((func->funcParams.inout_types[z] & OUT_BIT) != 0) - findArrayRef(parentLoops, par, st->lineNumber(), LEFT, loopInfo, privatesVars, privatesVarsForLoop, - sortedLoopGraph, commonBlocks, declaredArrays, false, notMappedDistributedArrays, + findArrayRef(parentLoops, par, st->lineNumber(), LEFT, loopInfo, privatesVarsForLoop, + sortedLoopGraph, notMappedDistributedArrays, mappedDistrbutedArrays, st, currReg, currentWeight, arrayLinksByFuncCalls); else - findArrayRef(parentLoops, par, st->lineNumber(), RIGHT, loopInfo, privatesVars, privatesVarsForLoop, - sortedLoopGraph, commonBlocks, declaredArrays, false, notMappedDistributedArrays, + findArrayRef(parentLoops, par, st->lineNumber(), RIGHT, loopInfo, privatesVarsForLoop, + sortedLoopGraph, notMappedDistributedArrays, mappedDistrbutedArrays, st, currReg, currentWeight, arrayLinksByFuncCalls); } @@ -385,8 +560,8 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapexpr(z)) - findArrayRef(parentLoops, st->expr(z), st->lineNumber(), side, loopInfo, privatesVars, privatesVarsForLoop, - sortedLoopGraph, commonBlocks, declaredArrays, false, notMappedDistributedArrays, + findArrayRef(parentLoops, st->expr(z), st->lineNumber(), side, loopInfo, privatesVarsForLoop, + sortedLoopGraph, notMappedDistributedArrays, mappedDistrbutedArrays, st, currReg, currentWeight, arrayLinksByFuncCalls); } @@ -395,7 +570,7 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, maplexNext(); } - auto convertedLoopInfo = convertLoopInfoNoDist(loopInfo, sortedLoopGraph, privatesVars, commonBlocks, declaredArrays, arrayLinksByFuncCalls, createdArrays); + auto convertedLoopInfo = convertLoopInfoNoDist(loopInfo, sortedLoopGraph, commonBlocks, declaredArrays, arrayLinksByFuncCalls, createdArrays); processLoopInformationForFunction(convertedLoopInfo); @@ -469,8 +644,26 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapwithoutDistributedArrays && loopRef->region && !loopRef->hasLimitsToParallel() && loopRef->lineNum > 0) + { + int nesting = 0; + LoopGraph* it = loopRef; + for (int z = 0; z < loopRef->perfectLoop; ++z, it->children.size() ? it = it->children[0] : it) + if (it->withoutDistributedArrays && it->region && !it->hasLimitsToParallel() && it->lineNum > 0) + ++nesting; + + map> convertedLoopInfo; + + it = loopRef; + for (int z = 0; z < nesting; ++z, it->children.size() ? it = it->children[0] : it) + convertedLoopInfo.insert(make_pair(it, map())); + + createParallelDirectivesNoDist(convertedLoopInfo, regions, map>(), messagesForFile); + } + } __spf_print(PRINT_PROF_INFO, "Function ended\n"); } From 5c83e36a62960fb7cc1b1b9036892cae5c904c12 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Tue, 26 Mar 2024 14:00:40 +0300 Subject: [PATCH 25/68] recalculateParallelDirective: dereference of a null pointer --- sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h index 50878b7..d483eda 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h +++ b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h @@ -211,7 +211,7 @@ public: } ParallelDirective *parDirective = baseDirs[0]; - for (int z = 1; z < baseDirs.size(); ++z) + for (int z = 1; z < baseDirs.size() && baseDirs[z]; ++z) { ParallelDirective *old = parDirective; parDirective = *parDirective + *baseDirs[z]; From 1326c5e09d87fe350b908a6988215d79d0e4c783 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 26 Mar 2024 16:36:01 +0300 Subject: [PATCH 26/68] fixed, vesion updated --- .../Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp | 3 --- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp index a91df00..e788d25 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp @@ -382,9 +382,6 @@ void loopAnalyzerNoDist(SgFile* file, vector& regions, mapsymbol()->identifier(); } - if (funcName == string("interp")) - int a = 0; - vector loopsForFunction; for (auto& loop : *loopGraph) { diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 931f5d8..1d19453 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2293" +#define VERSION_SPF "2294" From 09d0195693c7f33f83c62b16eabba94227656670 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Thu, 28 Mar 2024 21:57:06 +0300 Subject: [PATCH 27/68] improved privated removing --- .../_src/Transformations/dead_code.cpp | 9 ++- .../private_arrays_resizing.cpp | 76 ++++++++++++++----- .../_src/Transformations/private_removing.cpp | 10 ++- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 4 files changed, 73 insertions(+), 24 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 1ec6519..f7493d2 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -434,7 +434,7 @@ void removeDeadCode(SgStatement* func, } } } -//TODO: need to add [intervalDelStart; intervalDelEnd] + // remove dead statements set removable = { @@ -445,7 +445,10 @@ void removeDeadCode(SgStatement* func, }; vector remove; - for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) + SgStatement* start = intervalDelStart ? intervalDelStart : func; + SgStatement* end = intervalDelEnd ? intervalDelEnd : func->lastNodeOfStmt(); + + for (auto st = start; st != end; st = st->lexNext()) { if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end()) { @@ -462,7 +465,7 @@ void removeDeadCode(SgStatement* func, remove.clear(); //remove empty blocks - for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) + for (auto st = start; st != end; st = st->lexNext()) { const int var = st->variant(); if ((var == FOR_NODE || var == WHILE_NODE || var == IF_NODE || var == SWITCH_NODE) && diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp index 013f3c6..f0df286 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp @@ -89,19 +89,24 @@ static void fillIterationVariables(const LoopGraph* loop, set& vars, int } } -static SgExpression* findSymbolInExprList(SgSymbol* symbol, SgExpression* list) +static SgExpression* findSymbol(SgSymbol* symbol, SgExpression* list) { - while (list) + if (list) { - if (list->variant() != EXPR_LIST || list->lhs()->symbol() == NULL) - return NULL; + if (list->variant() == VAR_REF || list->variant() == ARRAY_REF) + { + if (isEqSymbols(list->symbol(), symbol)) + return list; + } - if (isEqSymbols(list->lhs()->symbol(), symbol)) - return list->lhs(); + auto left = findSymbol(symbol, list->lhs()); + if (left) + return left; - list = list->rhs(); + auto right = findSymbol(symbol, list->rhs()); + if (right) + return right; } - return NULL; } @@ -342,11 +347,40 @@ static void setAllocatable(SgStatement *newDecl, SgSymbol *origSymbol) } } +static SgExpression* checkArrayDecl(SgExpression* array, SgSymbol* arraySymbol, SgStatement* checkedDecl) +{ + if (array->lhs() == NULL) + { + vector allDecls; + auto mainDecl = declaratedInStmt(arraySymbol, &allDecls); + if (allDecls.size() < 2) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + for (auto& decl : allDecls) + { + if (decl == mainDecl) + continue; + if (decl == checkedDecl) + continue; + + array = findSymbol(arraySymbol, decl->expr(0)); + if (array->lhs()) + break; + array = NULL; + } + + checkNull(array, convertFileName(__FILE__).c_str(), __LINE__); + } + + return array; +} + static SgSymbol* alterExtendArrayDeclaration(const LoopGraph* forLoop, SgStatement* declarationStmt, SgSymbol* arraySymbol, bool canBeStatic, const vector& indexes) { SgSymbol* newArraySymbol = NULL; - SgExpression* array = findSymbolInExprList(arraySymbol, declarationStmt->expr(0)); + SgExpression* array = findSymbol(arraySymbol, declarationStmt->expr(0)); + array = checkArrayDecl(array, arraySymbol, declarationStmt); SgExpression* newArray = array->copyPtr(); newArraySymbol = createNewArrayNameSymbol(newArray, true, canBeStatic); @@ -368,7 +402,7 @@ static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, vector &dimensions, bool canBeStatic) { SgSymbol *newArraySymbol = NULL; - SgExpression *array = findSymbolInExprList(arraySymbol, declarationStatement->expr(0)); + SgExpression *array = findSymbol(arraySymbol, declarationStatement->expr(0)); SgExpression *newArray = array->copyPtr(); newArraySymbol = createNewArrayNameSymbol(newArray, false, canBeStatic); @@ -460,7 +494,9 @@ static SgStatement* createNewDeclarationStatemnet(SgStatement *loop, SgStatement while (!isEqSymbols(exprList->lhs()->symbol(), arraySymbol)) exprList = exprList->rhs(); - SgExpression newExprList(EXPR_LIST, exprList->lhs(), NULL, NULL); + checkNull(exprList, convertFileName(__FILE__).c_str(), __LINE__); + + SgExpression newExprList(EXPR_LIST, exprList->lhs()->copyPtr(), NULL, NULL); SgStatement *newDeclaration = originalDeclaration->copyPtr(); newDeclaration->setExpression(0, newExprList); @@ -504,7 +540,7 @@ static SgStatement* getAllocationStmt(const LoopGraph* loop, SgSymbol* symbol) if (alloc->variant() != ALLOCATE_STMT) continue; - if (NULL == findSymbolInExprList(symbol, alloc->expr(0))) + if (findSymbol(symbol, alloc->expr(0)) == NULL) continue; if (allocationStmt == NULL) @@ -527,10 +563,10 @@ static void fillLowBounds(const LoopGraph* forLoop, SgSymbol* origArraySymbol, S if (isAllocatable(origArraySymbol)) { SgStatement* allocationStmt = getAllocationStmt(forLoop, origArraySymbol); - origArray = findSymbolInExprList(origArraySymbol, allocationStmt->expr(0)); + origArray = findSymbol(origArraySymbol, allocationStmt->expr(0)); } else - origArray = findSymbolInExprList(origArraySymbol, originalDecl->expr(0)); + origArray = findSymbol(origArraySymbol, originalDecl->expr(0)); SgExpression* arrayRef = origArray->copyPtr(); SgExpression* oldTail = arrayRef->lhs(); @@ -596,10 +632,13 @@ static void insertAllocDealloc(const LoopGraph* forLoop, SgSymbol* origArraySymb if (isAllocatable(origArraySymbol)) { SgStatement *allocationStmt = getAllocationStmt(forLoop, origArraySymbol); - origArray = findSymbolInExprList(origArraySymbol, allocationStmt->expr(0)); + origArray = findSymbol(origArraySymbol, allocationStmt->expr(0)); } else - origArray = findSymbolInExprList(origArraySymbol, originalDeclaration->expr(0)); + { + origArray = findSymbol(origArraySymbol, originalDeclaration->expr(0)); + origArray = checkArrayDecl(origArray, origArraySymbol, originalDeclaration); + } int depthOfResize = 0; if (isExpansion) @@ -765,7 +804,7 @@ static void reduceArrayRefs(SgStatement *st, SgSymbol *arraySymbol, SgSymbol *ne static void fillIndexesToShrink(SgSymbol* arr, SgExprListExp* listExp, vector& indexes) { - SgExpression* sym = findSymbolInExprList(arr, listExp); + SgExpression* sym = findSymbol(arr, listExp); if (sym) { SgExpression* expr = sym->lhs(); @@ -1130,7 +1169,8 @@ static SgSymbol* resizeArray(const LoopGraph *forLoop, SgSymbol *arraySymbol, in for (int i = 0; i < depthOfResize; ++i) { - if (curLoop->calculatedCountOfIters == 0) + //TODO: add checking for PARAMETER + //if (curLoop->calculatedCountOfIters == 0) canBeStatic = false; if (areIndexesFilled != 0) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index eef5fca..3bcfc20 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -833,6 +833,7 @@ void removePrivates(string filename, vector& messages, const map>& allFuncInfo, int& countOfTransform) { + set removedDC; for (auto& varToRemove : privatesToRemoveGlobal) { if (filename != varToRemove.loop->fileName) @@ -850,7 +851,12 @@ void removePrivates(string filename, vector& messages, if (currFunc == nullptr) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - removeDeadCode(currFunc->funcPointer, allFuncInfo, commonBlocks); + if (removedDC.find(varToRemove.loop) == removedDC.end()) + { + removeDeadCode(currFunc->funcPointer, allFuncInfo, commonBlocks, + varToRemove.loop->loop, varToRemove.loop->loop->lastNodeOfStmt()); + removedDC.insert(varToRemove.loop); + } vector varRefs = getDirectArrayRefs(loopStmt, varToRemove.varSymbol); int loopLineNum = varToRemove.loop->lineNum; @@ -863,7 +869,7 @@ void removePrivates(string filename, vector& messages, } else { - varRefs = removeDuplicateArrayRefs(varRefs, fixedDimensions, varToRemove.regime, + varRefs = removeDuplicateArrayRefs(varRefs, fixedDimensions, varToRemove.regime, varToRemove.arrayRefToIterationVarsMap); for (auto& varRef : varRefs) { diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 1d19453..c7604bc 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2294" +#define VERSION_SPF "2296" From 66feb1571419599087368b4e492eadf1279ec389 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Fri, 29 Mar 2024 15:27:41 +0300 Subject: [PATCH 28/68] fix for analysis mode --- .../_src/GraphCall/select_array_conf.cpp | 155 ++++-------------- .../_src/GraphCall/select_array_conf.h | 10 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 3 +- .../Sapfor_2017/_src/Utils/PassManager.h | 4 +- .../_src/VisualizerCalls/get_information.cpp | 2 +- 5 files changed, 38 insertions(+), 136 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp index b4567c7..3e11f6b 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp @@ -65,26 +65,13 @@ static void findUsedArraysInParallelLoops(LoopGraph* loop, set& re } static void preventLoopsFromParallelizations(LoopGraph* loop, const set& prevent, - vector& createdDirectives,vector& messagesForFile) + vector& messagesForFile) { if (loop->directive) { if (IsSetsIntersect(prevent, loop->usedArraysAll)) { // prevent this loop - int loopLine = loop->lineNum; - - for (auto dir_it = createdDirectives.begin(); dir_it != createdDirectives.end(); dir_it++) - { - if ((*dir_it)->line == loopLine) - { - delete *dir_it; - dir_it = createdDirectives.erase(dir_it); - - break; - } - } - delete loop->directive; loop->directive = NULL; @@ -123,7 +110,7 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const setchildren) - preventLoopsFromParallelizations(child, prevent, createdDirectives, messagesForFile); + preventLoopsFromParallelizations(child, prevent, messagesForFile); } struct DimConf @@ -169,9 +156,9 @@ pickBest(const map>>& arrs) } void SelectArrayConfForParallelization(SgProject* proj, map>& funcByFile, - const map>& loopGraph, map>& createdDirectives, - map>& allMessages, const map>& arrayLinksByFuncCalls, - const vector& regions) + const map>& loopGraph, + map>& allMessages, + const map>& arrayLinksByFuncCalls) { map funcByName; for (const auto& byFile : funcByFile) @@ -265,121 +252,43 @@ void SelectArrayConfForParallelization(SgProject* proj, map& fileM = getObjectForFileFromMap(byFile.first.c_str(), allMessages); - auto dirs_it = createdDirectives.find(byFile.first); - if (dirs_it != createdDirectives.end()) + SgFile::switchToFile(byFile.first); + + auto& loops = byFile.second; + + auto file_funcs_it = funcByFile.find(byFile.first); + + if (file_funcs_it == funcByFile.end()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); // no such file in funcByFile + + map> usedInLoops; + + for (const auto& loop : loops) { - SgFile::switchToFile(byFile.first); + SgStatement* search_func = loop->loop->GetOriginal(); - auto& loops = byFile.second; + while (search_func && (!isSgProgHedrStmt(search_func))) + search_func = search_func->controlParent(); - auto file_funcs_it = funcByFile.find(byFile.first); + if (!search_func) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); //loop statement outside any function statement - if (file_funcs_it == funcByFile.end()) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); // no such file in funcByFile - - map> usedInLoops; - - for (const auto& loop : loops) + bool loop_analyzed = false; + for (const auto& byFunc : file_funcs_it->second) { - SgStatement* search_func = loop->loop->GetOriginal(); - - while (search_func && (!isSgProgHedrStmt(search_func))) - search_func = search_func->controlParent(); - - if (!search_func) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); //loop statement outside any function statement - - bool loop_analyzed = false; - for (const auto& byFunc : file_funcs_it->second) + if (byFunc->funcPointer->GetOriginal() == search_func) { - if (byFunc->funcPointer->GetOriginal() == search_func) - { - auto prevent_it = preventFromParallelization.find(byFunc); - if (prevent_it != preventFromParallelization.end()) - preventLoopsFromParallelizations(loop, prevent_it->second, dirs_it->second, fileM); + auto prevent_it = preventFromParallelization.find(byFunc); + if (prevent_it != preventFromParallelization.end()) + preventLoopsFromParallelizations(loop, prevent_it->second, fileM); - loop_analyzed = true; - break; - } - } - - if (!loop_analyzed) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); //no func found for loop - } - } - } -} - -void removeRegionsWithoutDirs(const map>& createdDirectives, - vector& parallelRegions, - const map>& allFuncInfo, - map>& SPF_messages) -{ - set empty_regs(parallelRegions.begin(), parallelRegions.end()); - - for (const auto& byFile : createdDirectives) - for (const auto& dir : byFile.second) - empty_regs.erase(getRegionByLine(parallelRegions, byFile.first, dir->line)); - - set idxToDel; - for (int z = 0; z < parallelRegions.size(); ++z) - { - if (empty_regs.find(parallelRegions[z]) != empty_regs.end()) - { - __spf_print(1, " no parallel directives for parallel region '%s'\n", parallelRegions[z]->GetName().c_str()); - - if (parallelRegions[z]->GetId() == 0) // DEFAULT - { - wstring bufE, bufR; - __spf_printToLongBuf(bufE, L"Can not find arrays or free loops for distribution in this project"); - __spf_printToLongBuf(bufR, R130); - - for (auto& funcByFile : allFuncInfo) - { - vector& fileM = getObjectForFileFromMap(funcByFile.first.c_str(), SPF_messages); - for (auto& func : funcByFile.second) - { - auto stat = func->funcPointer->GetOriginal(); - if (stat->variant() == PROG_HEDR) - fileM.push_back(Messages(ERROR, stat->lineNumber(), bufR, bufE, 3010)); - } + loop_analyzed = true; + break; } } - else - { - wstring bufE, bufR; - __spf_printToLongBuf(bufE, L"Can not find arrays or free loops for distribution in this region"); - __spf_printToLongBuf(bufR, R131); - for (auto& linesByFile : parallelRegions[z]->GetAllLines()) - { - vector& fileM = getObjectForFileFromMap(linesByFile.first.c_str(), SPF_messages); - for (auto& lines : linesByFile.second) - if (!lines.isImplicit()) - fileM.push_back(Messages(ERROR, lines.lines.first, bufR, bufE, 3010)); - } - } - idxToDel.insert(z); + if (!loop_analyzed) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); //no func found for loop } } - - vector newParReg; - for (int z = 0; z < parallelRegions.size(); ++z) - { - if (idxToDel.find(z) != idxToDel.end()) - { - ParallelRegion* regToDel = parallelRegions[z]; -#ifdef _WIN32 - removeFromCollection(parallelRegions[z]); -#endif - delete parallelRegions[z]; - } - else - newParReg.push_back(parallelRegions[z]); - } - parallelRegions.clear(); - parallelRegions = newParReg; - - if (parallelRegions.size() == 0) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h index cb35893..4d2e392 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h @@ -11,12 +11,6 @@ void SelectArrayConfForParallelization(SgProject* proj, std::map>& funcByFile, - const std::map>& loopGraph, - std::map>& createdDirectives, + const std::map>& loopGraph, std::map>& allMessages, - const std::map>& arrayLinksByFuncCalls, const std::vector& regions); - -void removeRegionsWithoutDirs(const std::map>& createdDirectives, - std::vector& parallelRegions, - const std::map>& allFuncInfo, - std::map>& SPF_messages); \ No newline at end of file + const std::map>& arrayLinksByFuncCalls); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 33c7e9b..a1bc01d 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1924,8 +1924,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne else if (curr_regime == FIX_COMMON_BLOCKS) fixCommonBlocks(allFuncInfo, commonBlocks, &project); else if (curr_regime == SELECT_ARRAY_DIM_CONF) { - SelectArrayConfForParallelization(&project, allFuncInfo, loopGraph, createdDirectives, SPF_messages, arrayLinksByFuncCalls, parallelRegions); - removeRegionsWithoutDirs(createdDirectives, parallelRegions, allFuncInfo, SPF_messages); + SelectArrayConfForParallelization(&project, allFuncInfo, loopGraph, SPF_messages, arrayLinksByFuncCalls); } else if (curr_regime == GET_MIN_MAX_BLOCK_DIST) { diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index 7a4a3f2..b8e6c2e 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -233,7 +233,7 @@ void InitPassesDependencies(map> &passDepsIn, set list({ GET_ALL_ARRAY_DECL, CALL_GRAPH2, CODE_CHECKER_PASSES, SUBST_EXPR_RD, ARRAY_ACCESS_ANALYSIS_FOR_CORNER }) <= list({ LOOP_ANALYZER_NODIST, LOOP_ANALYZER_DATA_DIST_S0, LOOP_ANALYZER_DATA_DIST_S1, ONLY_ARRAY_GRAPH }); - list({ LOOP_ANALYZER_NODIST, REMOVE_OMP_DIRS }) <= Pass(INSERT_PARALLEL_DIRS_NODIST); + list({ LOOP_ANALYZER_NODIST, REMOVE_OMP_DIRS }) <= Pass(SELECT_ARRAY_DIM_CONF) <= Pass(INSERT_PARALLEL_DIRS_NODIST); Pass(CHECK_ARGS_DECL) <= Pass(CREATE_TEMPLATE_LINKS); @@ -251,7 +251,7 @@ void InitPassesDependencies(map> &passDepsIn, set list({ CORRECT_VAR_DECL, PREPROC_SPF }) <= list({ LOOP_GRAPH, CALL_GRAPH, CALL_GRAPH2 }); - list({ PREPROC_SPF, CALL_GRAPH2 }) <= Pass(FILL_PAR_REGIONS_LINES) <= list({ EXPAND_EXTRACT_PAR_REGION, CHECK_FUNC_TO_INCLUDE, FIND_FUNC_TO_INCLUDE, CHECK_ARGS_DECL, SELECT_ARRAY_DIM_CONF}); + list({ PREPROC_SPF, CALL_GRAPH2 }) <= Pass(FILL_PAR_REGIONS_LINES) <= list({ EXPAND_EXTRACT_PAR_REGION, CHECK_FUNC_TO_INCLUDE, FIND_FUNC_TO_INCLUDE, CHECK_ARGS_DECL }); list({ PREPROC_SPF, CALL_GRAPH2, FILL_PAR_REGIONS_LINES }) <= Pass(FILL_PAR_REGIONS) <= Pass(RESOLVE_PAR_REGIONS); diff --git a/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp b/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp index 10fe288..5acca3b 100644 --- a/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp +++ b/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp @@ -820,7 +820,7 @@ int SPF_GetArrayDistribution(void*& context, int winHandler, short *options, sho else if (regime == 1) { if (mpiProgram) - runPassesForVisualizer(projName, { LOOP_ANALYZER_NODIST }); + runPassesForVisualizer(projName, { SELECT_ARRAY_DIM_CONF }); else runPassesForVisualizer(projName, { LOOP_ANALYZER_DATA_DIST_S1 }); } From 1713c26547c7f0b9cc5575050ff1913b35644d57 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Fri, 29 Mar 2024 18:01:08 +0300 Subject: [PATCH 29/68] prevent loops with return statements from parallelization --- sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp index 1141841..1d00443 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp @@ -643,7 +643,7 @@ void loopGraphAnalyzer(SgFile *file, vector &loopGraph, const vector newLoop->perfectLoop = countPerfectLoopNest(st); newLoop->hasGoto = hasGoto(st, st->lastNodeOfStmt(), newLoop->linesOfInternalGoTo, newLoop->linesOfExternalGoTo, labelsRef, newLoop->linesOfCycle); newLoop->hasPrints = hasThisIds(st, newLoop->linesOfIO, { WRITE_STAT, READ_STAT, OPEN_STAT, CLOSE_STAT, PRINT_STAT } ); // FORMAT_STAT - newLoop->hasStops = hasThisIds(st, newLoop->linesOfStop, { STOP_STAT, PAUSE_NODE }); + newLoop->hasStops = hasThisIds(st, newLoop->linesOfStop, { STOP_STAT, PAUSE_NODE, RETURN_STAT }); newLoop->hasDvmIntervals = hasThisIds(st, tmpLines, { DVM_INTERVAL_DIR, DVM_ENDINTERVAL_DIR, DVM_EXIT_INTERVAL_DIR }); newLoop->isFor = isSgForStmt(st) ? true : false; newLoop->inCanonicalFrom = isSgForStmt(st) ? true : false; From e32bdb0e07dea888d6202043d4e728e704b456a0 Mon Sep 17 00:00:00 2001 From: XNPSTER Date: Sat, 30 Mar 2024 18:51:36 +0300 Subject: [PATCH 30/68] fix linux build --- sapfor/experts/Sapfor_2017/_src/Utils/utils.h | 1 + 1 file changed, 1 insertion(+) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.h b/sapfor/experts/Sapfor_2017/_src/Utils/utils.h index df8e325..d46a9db 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.h @@ -3,6 +3,7 @@ #include #include #include +#include struct DataDirective; namespace Distribution From b9a488c7ea0df1c9d138497a4b5a30a4a3d01c5a Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sat, 30 Mar 2024 19:04:49 +0300 Subject: [PATCH 31/68] remove redunant call of SELECT_ARRAY_DIM_CONF pass --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index a1bc01d..a5d55e3 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -2153,8 +2153,6 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam runPass(REVERT_SUBST_EXPR_RD, proj_name, folderName); runPass(CONVERT_LOOP_TO_ASSIGN, proj_name, folderName); - - runPass(SELECT_ARRAY_DIM_CONF, proj_name, folderName); runPass(REVERT_SUBST_EXPR_RD, proj_name, folderName); From 9812ced8ca52661c29e8cbc938829ba18980716e Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sat, 30 Mar 2024 19:07:24 +0300 Subject: [PATCH 32/68] fix russian messages in loop_ananlyzer_nodist.cpp --- .../Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp index e788d25..b423e47 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer_nodist.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include From 2d7fea1d7c9281f8fe7c72ec9f55c4b34460d91b Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 30 Mar 2024 19:27:38 +0300 Subject: [PATCH 33/68] improved --- sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp | 8 +++++++- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp index 1d00443..0eb0896 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp @@ -207,6 +207,12 @@ static inline bool hasGoto(SgStatement *begin, SgStatement *end, has = true; } + if (curr->variant() == RETURN_STAT) + { + linesOfIntGoTo.push_back(curr->lineNumber()); + has = true; + } + if (curr->variant() == CYCLE_STMT) cycleStmts.push_back(curr->lineNumber()); curr = curr->lexNext(); @@ -643,7 +649,7 @@ void loopGraphAnalyzer(SgFile *file, vector &loopGraph, const vector newLoop->perfectLoop = countPerfectLoopNest(st); newLoop->hasGoto = hasGoto(st, st->lastNodeOfStmt(), newLoop->linesOfInternalGoTo, newLoop->linesOfExternalGoTo, labelsRef, newLoop->linesOfCycle); newLoop->hasPrints = hasThisIds(st, newLoop->linesOfIO, { WRITE_STAT, READ_STAT, OPEN_STAT, CLOSE_STAT, PRINT_STAT } ); // FORMAT_STAT - newLoop->hasStops = hasThisIds(st, newLoop->linesOfStop, { STOP_STAT, PAUSE_NODE, RETURN_STAT }); + newLoop->hasStops = hasThisIds(st, newLoop->linesOfStop, { STOP_STAT, PAUSE_NODE }); newLoop->hasDvmIntervals = hasThisIds(st, tmpLines, { DVM_INTERVAL_DIR, DVM_ENDINTERVAL_DIR, DVM_EXIT_INTERVAL_DIR }); newLoop->isFor = isSgForStmt(st) ? true : false; newLoop->inCanonicalFrom = isSgForStmt(st) ? true : false; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index c7604bc..8a3f0fb 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2296" +#define VERSION_SPF "2298" From d0fa88eea27971aca13f4628510f8127db275a87 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 30 Mar 2024 19:29:13 +0300 Subject: [PATCH 34/68] fixed privates resizing --- .../private_arrays_resizing.cpp | 46 +++++++++++-------- .../experts/Sapfor_2017/_src/Utils/utils.cpp | 1 + .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp index f0df286..25d2766 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp @@ -276,11 +276,10 @@ static SgExpression* constructExtendedArrayRefTail(SgExpression* oldTail, const return newTail; } -static SgExpression* extendArrayRef(const vector& indexes, SgExpression* expressionToExtend, - SgSymbol* newSymbol, const vector& lowBounds) +static void extendArrayRef(const vector& indexes, SgExpression*& expressionToExtend, + SgSymbol* newSymbol, const vector& lowBounds) { SgExpression* newTail = constructExtendedArrayRefTail(expressionToExtend->lhs(), indexes); - SgExpression* oldTail = expressionToExtend->lhs(); if (oldTail == NULL) { @@ -305,8 +304,6 @@ static SgExpression* extendArrayRef(const vector& indexes, SgExpressi expressionToExtend->setLhs(newTail); expressionToExtend->setSymbol(newSymbol); } - - return expressionToExtend; } static bool isAllocatable(SgSymbol* symbol) @@ -348,14 +345,21 @@ static void setAllocatable(SgStatement *newDecl, SgSymbol *origSymbol) } static SgExpression* checkArrayDecl(SgExpression* array, SgSymbol* arraySymbol, SgStatement* checkedDecl) -{ +{ if (array->lhs() == NULL) { vector allDecls; auto mainDecl = declaratedInStmt(arraySymbol, &allDecls); - if (allDecls.size() < 2) + if (allDecls.size() == 0) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + if (allDecls.size() == 1) + { + array = findSymbol(arraySymbol, mainDecl->expr(0)); + checkNull(array, convertFileName(__FILE__).c_str(), __LINE__); + return array; + } + for (auto& decl : allDecls) { if (decl == mainDecl) @@ -418,7 +422,7 @@ static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, return newArraySymbol; } -static void extendArrayRefsInExpr(const vector& indexes, SgExpression* expr, +static void extendArrayRefsInExpr(const vector& indexes, SgExpression*& expr, SgSymbol* arraySymbol, SgSymbol* newArraySymbol, const vector& lowBounds, int line) { @@ -438,19 +442,20 @@ static void extendArrayRefsInExpr(const vector& indexes, SgExpression } } - extendArrayRefsInExpr(indexes, expr->lhs(), arraySymbol, newArraySymbol, lowBounds, line); - extendArrayRefsInExpr(indexes, expr->rhs(), arraySymbol, newArraySymbol, lowBounds, line); + SgExpression* left = expr->lhs(); + extendArrayRefsInExpr(indexes, left, arraySymbol, newArraySymbol, lowBounds, line); + if (left != expr->lhs()) + expr->setLhs(left); + + SgExpression* right = expr->rhs(); + extendArrayRefsInExpr(indexes, right, arraySymbol, newArraySymbol, lowBounds, line); + if (right != expr->rhs()) + expr->setRhs(right); if (isArrayRef(expr) && isEqSymbols(arraySymbol, expr->symbol())) extendArrayRef(indexes, expr, newArraySymbol, lowBounds); else if (expr->variant() == VAR_REF && isEqSymbols(arraySymbol, expr->symbol())) - { - SgExpression* extended = extendArrayRef(indexes, expr, newArraySymbol, lowBounds); - - expr->setSymbol(extended->symbol()); - expr->setLhs(extended->lhs()); - expr->setRhs(extended->rhs()); - } + extendArrayRef(indexes, expr, newArraySymbol, lowBounds); } } @@ -474,7 +479,12 @@ static void extendArrayRefs(const vector &indexes, SgStatement *st, S } if (st->expr(i)) - extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds, st->lineNumber()); + { + SgExpression* ex = st->expr(i); + extendArrayRefsInExpr(indexes, ex, arraySymbol, newArraySymbol, lowBounds, st->lineNumber()); + if (ex != st->expr(i)) + st->setExpression(i, ex); + } } } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp index c6d98a5..b5a3eab 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "utils.h" #include "errors.h" diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 8a3f0fb..071b745 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2298" +#define VERSION_SPF "2298" From 1840fb7d45b1c742f0d59c2302a07d6fe4fcc652 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Mon, 1 Apr 2024 16:35:26 +0300 Subject: [PATCH 35/68] fixed privates removing --- .../_src/GraphLoop/graph_loops.cpp | 7 ++ .../_src/Transformations/private_removing.cpp | 91 +++---------------- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- .../_src/VisualizerCalls/get_information.cpp | 7 +- 4 files changed, 27 insertions(+), 80 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp index 0eb0896..9393b87 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.cpp @@ -872,6 +872,13 @@ static void printToBuffer(const LoopGraph *currLoop, const int childSize, char b else loopState = 1; } + else if (PASSES_DONE[SELECT_ARRAY_DIM_CONF]) + { + if (currLoop->hasLimitsToParallel()) + loopState = 2; + else + loopState = 1; + } else { if (currLoop->hasLimitsToParallel()) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index 3bcfc20..6e97d06 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -599,40 +599,6 @@ static bool isVarChangedBetween(string var, SgStatement* first, SgStatement* sec return false; } -// TODO: remove if needless -// removeDeadCodeFromLoop removes assign statements to private scalar vars which are not read in loop -//static void removeDeadCodeFromLoop(LoopGraph* loop) -//{ -// SgForStmt* loopStmt = (SgForStmt*) loop->loop->GetOriginal(); -// set privateVars; -// for (auto data : getAttributes(loopStmt, set{ SPF_ANALYSIS_DIR })) -// fillPrivatesFromComment(new Statement(data), privateVars); -// -// set privates; -// for (Symbol* symbol : privateVars) -// privates.insert(OriginalSymbol((SgSymbol*)symbol)->identifier()); -// -// vector stmtsToDelete; -// for (SgStatement* st = loopStmt->lexNext(); st != loopStmt->lastNodeOfStmt(); st = st->lexNext()) -// { -// if (st->variant() != ASSIGN_STAT) -// continue; -// -// SgSymbol* var = st->expr(0)->symbol(); -// if (var == nullptr || var->variant() != VARIABLE_NAME) -// continue; -// -// if (privates.find(var->identifier()) != privates.end() && !isVarReadInLoop(var, loopStmt)) -// stmtsToDelete.push_back(st); -// } -// -// for (auto stmt : stmtsToDelete) -// stmt->deleteStmt(); -// -// for (auto childLoop : loop->children) -// removeDeadCodeFromLoop(childLoop); -//} - // 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, @@ -698,32 +664,6 @@ static void removeExcessiveDefs(const PrivateToRemove& var) st->deleteStmt(); } -// TODO: remove is needless -// removeEmptyLoops removes loops with empty body and create messages -//static void removeEmptyLoops(LoopGraph* loop, vector& messages) -//{ -// vector loopsToDelete; -// vector newChildrenVector; -// for (auto childLoop : loop->children) -// { -// SgStatement* loopStmt = childLoop->loop->GetOriginal(); -// if (loopStmt->lastNodeOfStmt() == loopStmt->lexNext()) -// loopsToDelete.push_back(childLoop); -// else -// newChildrenVector.push_back(childLoop); -// } -// -// for (auto loopToDelete : loopsToDelete) -// { -// addMessageRemoveLoop(messages, loopToDelete->lineNum); -// loopToDelete->loop->extractStmt(); -// } -// -// loop->children.swap(newChildrenVector); -// for (auto childLoop : loop->children) -// removeEmptyLoops(childLoop, messages); -//} - // removeVarFromPrivateAttributes removes var from SPF ANALYSIS PRIVATE attributes of loop static void removeVarFromPrivateAttributes(SgSymbol* var, LoopGraph* loop) { @@ -833,7 +773,7 @@ void removePrivates(string filename, vector& messages, const map>& allFuncInfo, int& countOfTransform) { - set removedDC; + set removeDC; for (auto& varToRemove : privatesToRemoveGlobal) { if (filename != varToRemove.loop->fileName) @@ -842,23 +782,10 @@ void removePrivates(string filename, vector& messages, auto removedDimensions = removeArray(filename, varToRemove); countOfTransform++; - //removeDeadCodeFromLoop(varToRemove.loop); removeExcessiveDefs(varToRemove); - //removeEmptyLoops(varToRemove.loop, messages); + removeDC.insert(varToRemove.loop); - SgForStmt* loopStmt = (SgForStmt*)varToRemove.loop->loop->GetOriginal(); - FuncInfo* currFunc = getCurrectFunc(loopStmt, allFuncInfo); - if (currFunc == nullptr) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - - if (removedDC.find(varToRemove.loop) == removedDC.end()) - { - removeDeadCode(currFunc->funcPointer, allFuncInfo, commonBlocks, - varToRemove.loop->loop, varToRemove.loop->loop->lastNodeOfStmt()); - removedDC.insert(varToRemove.loop); - } - - vector varRefs = getDirectArrayRefs(loopStmt, varToRemove.varSymbol); + vector varRefs = getDirectArrayRefs(varToRemove.loop->loop, varToRemove.varSymbol); int loopLineNum = varToRemove.loop->lineNum; string varName = varToRemove.varSymbol->identifier(); auto& fixedDimensions = varToRemove.fixedDimensions; @@ -892,6 +819,18 @@ void removePrivates(string filename, vector& messages, } } } + + for (auto& dcLoopRem : removeDC) + { + auto loopStmt = dcLoopRem->loop->GetOriginal(); + FuncInfo* currFunc = getCurrectFunc(loopStmt, allFuncInfo); + + if (currFunc == nullptr) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + removeDeadCode(currFunc->funcPointer, allFuncInfo, commonBlocks, + loopStmt, loopStmt->lastNodeOfStmt()); + } } /* ****************************************** * diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 071b745..6678a59 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2298" +#define VERSION_SPF "2301" diff --git a/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp b/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp index 5acca3b..bc2d60f 100644 --- a/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp +++ b/sapfor/experts/Sapfor_2017/_src/VisualizerCalls/get_information.cpp @@ -1674,10 +1674,11 @@ int SPF_SetDistributionFlagToArrays(void*& context, const char* keys, const char } static int simpleTransformPass(const passes PASS_NAME, short *options, short *projName, short *folderName, - short *&output, int *&outputSize, short *&outputMessage, int *&outputMessageSize) + short *&output, int *&outputSize, short *&outputMessage, int *&outputMessageSize, + bool isBuildParallel = false) { clearGlobalMessagesBuffer(); - setOptions(options); + setOptions(options, isBuildParallel); int retCode = 0; try @@ -1892,7 +1893,7 @@ int SPF_SharedMemoryParallelization(void*& context, int winHandler, short* optio MessageManager::setWinHandler(winHandler); ignoreArrayDistributeState = true; mpiProgram = 1; - return simpleTransformPass(INSERT_PARALLEL_DIRS_NODIST, options, projName, folderName, output, outputSize, outputMessage, outputMessageSize); + return simpleTransformPass(INSERT_PARALLEL_DIRS_NODIST, options, projName, folderName, output, outputSize, outputMessage, outputMessageSize, true); } int SPF_InsertPrivateFromGUI(void*& context, int winHandler, short* options, short* projName, short* folderName, short*& output, From b65437a75ccd5792579ae2c9a4c02e2640fa18e2 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 2 Apr 2024 17:48:48 +0300 Subject: [PATCH 36/68] fixed and improved OMP parser --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 6 +- ...iveAnalyzer.cpp => directive_analyzer.cpp} | 2 +- ...rectiveAnalyzer.h => directive_analyzer.h} | 0 .../directive_creator_base.cpp | 7 +- .../directive_omp_parser.cpp | 524 ++++++++++++++++++ .../directive_omp_parser.h | 22 + .../DirectiveProcessing/directive_parser.cpp | 347 ------------ .../DirectiveProcessing/directive_parser.h | 11 - .../spf_directive_preproc.cpp | 23 +- .../_src/LoopAnalyzer/loop_analyzer.cpp | 3 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 5 +- sapfor/experts/Sapfor_2017/_src/Sapfor.h | 2 + .../Sapfor_2017/_src/Utils/PassManager.h | 2 +- .../experts/Sapfor_2017/_src/Utils/utils.cpp | 2 + .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- .../VerificationCode/StructureChecker.cpp | 34 -- 16 files changed, 587 insertions(+), 405 deletions(-) rename sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/{DirectiveAnalyzer.cpp => directive_analyzer.cpp} (95%) rename sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/{DirectiveAnalyzer.h => directive_analyzer.h} (100%) create mode 100644 sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp create mode 100644 sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index f3cca8e..7e5220f 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -235,8 +235,8 @@ set(DATA_FLOW set(CREATE_INTER_T _src/CreateInterTree/CreateInterTree.cpp _src/CreateInterTree/CreateInterTree.h) -set(DIRA _src/DirectiveProcessing/DirectiveAnalyzer.cpp - _src/DirectiveProcessing/DirectiveAnalyzer.h +set(DIRA _src/DirectiveProcessing/directive_analyzer.cpp + _src/DirectiveProcessing/directive_analyzer.h _src/DirectiveProcessing/directive_creator.cpp _src/DirectiveProcessing/directive_creator_base.cpp _src/DirectiveProcessing/directive_creator.h @@ -244,6 +244,8 @@ set(DIRA _src/DirectiveProcessing/DirectiveAnalyzer.cpp _src/DirectiveProcessing/directive_creator_nodist.h _src/DirectiveProcessing/directive_parser.cpp _src/DirectiveProcessing/directive_parser.h + _src/DirectiveProcessing/directive_omp_parser.cpp + _src/DirectiveProcessing/directive_omp_parser.h _src/DirectiveProcessing/insert_directive.cpp _src/DirectiveProcessing/insert_directive.h _src/DirectiveProcessing/remote_access.cpp diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/DirectiveAnalyzer.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_analyzer.cpp similarity index 95% rename from sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/DirectiveAnalyzer.cpp rename to sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_analyzer.cpp index 9a60ef2..afc3da8 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/DirectiveAnalyzer.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_analyzer.cpp @@ -17,7 +17,7 @@ #include "../Distribution/DvmhDirective.h" #include "../GraphLoop/graph_loops.h" -#include "DirectiveAnalyzer.h" +#include "directive_analyzer.h" #include "../Utils/utils.h" using std::vector; diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/DirectiveAnalyzer.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_analyzer.h similarity index 100% rename from sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/DirectiveAnalyzer.h rename to sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_analyzer.h diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp index 563c44c..b9fa856 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp @@ -1091,6 +1091,9 @@ static bool tryToResolveUnmatchedDims(const map> &dim printInternalError(convertFileName(__FILE__).c_str(), __LINE__); } + set privates; + +#if __SPF tmpL = loop->parent; while (tmpL) { @@ -1109,11 +1112,9 @@ static bool tryToResolveUnmatchedDims(const map> &dim tmpL = tmpL->parent; } - set privates; -#if __SPF tryToFindPrivateInAttributes(loop->loop->GetOriginal(), privates); #else -#error 'TODO - fill privates for this loop' +#error 'TODO - fill privates for this loop and check all inductive variables' #endif //try to resolve from write operations diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp new file mode 100644 index 0000000..581886d --- /dev/null +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp @@ -0,0 +1,524 @@ +#include "../Utils/leak_detector.h" + +#include +#include +#include +#include + +#include "dvm.h" +#include "directive_omp_parser.h" +#include "directive_parser.h" + +#include "../Utils/SgUtils.h" + +using std::vector; +using std::map; +using std::set; +using std::string; + + +void removeOmpDir(SgStatement* st) +{ + char* lineS = st->comments(); + if (!lineS) + return; + + vector split; + splitString(lineS, '\n', split); + + int idx = 0; + for (auto& elem : split) + { + string line = elem; + convertToLower(line); + if (line.substr(0, 5) == "!$omp") + lineS[idx + 1] = '_'; + else if (line.substr(0, 3) == "!$ ") + lineS[idx + 1] = '_'; + idx += line.size() + 1; // with '\n' + } +} + +static inline void addToAttribute(SgStatement* st, int var, vector list) +{ + if (list.size()) + { + SgExprListExp* ex = new SgExprListExp(); + ex->setLhs(new SgExpression(var, makeExprList(list), NULL)); + SgStatement* toAdd = new SgStatement(SPF_ANALYSIS_DIR, NULL, NULL, ex, NULL, NULL); + toAdd->setlineNumber(st->lineNumber()); + toAdd->setLocalLineNumber(888); + + //filter + if (var == ACC_PRIVATE_OP) + { + vector list_new; + + auto attributes = getAttributes(st, set{SPF_ANALYSIS_DIR}); + set privates; + for (auto& attr : attributes) + fillPrivatesFromComment(new Statement(attr), privates); + + if (privates.size()) + { + for (auto& elem : list) + if (privates.find(elem->unparse()) == privates.end()) + list_new.push_back(elem); + list = list_new; + + if (!list.size()) + { + __spf_print(1, "-- skip privates on line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); + return; + } + } + } + else if (var == REDUCTION_OP) + { + auto attributes = getAttributes(st, set{SPF_ANALYSIS_DIR}); + map> reduction; + for (auto& attr : attributes) + fillReductionsFromComment(new Statement(attr), reduction); + + map> reductionToAdd; + fillReductionsFromComment(new Statement(toAdd), reductionToAdd); + + vector list_new; + if (reduction.size()) + { + if (reduction == reductionToAdd) + { + __spf_print(1, "-- skip reduction on line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); + return; + } + + map> reductionToAddNew; + for (auto& redPair : reductionToAdd) + { + auto it = reduction.find(redPair.first); + if (it == reduction.end()) + reductionToAddNew[redPair.first] = redPair.second; + else + { + set newVar; + for (auto& var : redPair.second) + { + auto itVar = it->second.find(var); + if (itVar == it->second.end()) + reductionToAddNew[redPair.first].insert(var); + } + } + } + + if (!reductionToAddNew.size()) + { + __spf_print(1, "-- skip reduction on line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); + return; + } + + if (reductionToAddNew != reductionToAdd) + { + list.clear(); + for (auto& redPair : reductionToAddNew) + for (auto& var : redPair.second) + list.push_back(new SgExpression(ARRAY_OP, + new SgKeywordValExp(redPair.first.c_str()), + new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st))))); + } + } + } + + ex = new SgExprListExp(); + ex->setLhs(new SgExpression(var, makeExprList(list), NULL)); + toAdd = new SgStatement(SPF_ANALYSIS_DIR, NULL, NULL, ex, NULL, NULL); + + st->addAttribute(SPF_ANALYSIS_DIR, toAdd, sizeof(SgStatement)); + + if (var == ACC_PRIVATE_OP) + __spf_print(1, "-- set private attribute to line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); + else if (var == REDUCTION_OP) + __spf_print(1, "-- set reduction attribute to line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); + } +} + +static bool is_write_in_do(SgStatement* st, const string& var) +{ + checkNull(st, convertFileName(__FILE__).c_str(), __LINE__); + + if (st->variant() != FOR_NODE) + return false; + + SgStatement* lastNode = st->lastNodeOfStmt(); + for (SgStatement* op = st->lexNext(); st != lastNode; st = st->lexNext()) + { + if (st->variant() == ASSIGN_STAT) + { + SgExpression* ex = st->expr(0); + if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF) + if (var == ex->symbol()->identifier()) + return true; + } + else if (st->variant() == FOR_NODE) + { + if (var == isSgForStmt(st)->doName()->identifier()) + return true; + } + } + return false; +} + +vector parseOmpInStatement(SgStatement* st, const set& globalPriv, bool forDo) +{ + vector resultAll; + + const char* lineS = st->comments(); + if (!lineS) + return resultAll; + + string comment(lineS); + convertToLower(comment); + + vector split; + splitString(comment, '\n', split); + + for (int z = split.size() - 1; z >= 0; z--) + { + string line = split[z]; + + if (line.substr(0, 6) == "!$omp&") + { + if (z - 1 < 0) + break; + split[z - 1] += line.substr(6); + split[z] = ""; + } + } + + for (auto& line : split) + { + if (line.substr(0, 5) == "!$omp") + { + OmpDir result; + + string line1 = ""; + int space = 0; + int brake = 0; + for (int z = 0; z < line.size(); ++z) + { + if (brake < 0) + return vector(); // error + + if (brake == 0) + { + if (line[z] == ' ') + space++; + else + space = 0; + if ((line[z] == ' ' && space <= 1) || line[z] != ' ') + line1 += line[z]; + } + else + { + if (line[z] != ' ') + line1 += line[z]; + } + + if (line[z] == '(') + { + while (line1.size() > 2 && line1[line1.size() - 2] == ' ') + line1 = line1.erase(line1.size() - 2, 1); + brake++; + space = 0; + } + else if (line[z] == ')') + brake--; + } + vector lexems; + splitString(line1, ' ', lexems); + bool doLexem = false; + bool end = false; + bool parallel = false; + bool privat = false; + + for (auto& lexem : lexems) + { + if (lexem == "do") + { + doLexem = true; + result.keys.insert(lexem); + } + if (lexem == "end") + { + end = true; + result.keys.insert(lexem); + } + if (lexem == "parallel") + { + parallel = true; + result.keys.insert(lexem); + } + if (lexem == "private") + { + privat = true; + result.keys.insert(lexem); + } + } + + if (privat == false) + { + if (forDo && doLexem) + { + vector list; + for (auto& var : globalPriv) + if (is_write_in_do(st, var)) + list.push_back(new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st)))); + + if (list.size()) + addToAttribute(st, ACC_PRIVATE_OP, list); + } + } + + for (auto& lexem : lexems) + { + bool priv = lexem.substr(0, strlen("private(")) == "private("; + bool threadpriv = lexem.substr(0, strlen("threadprivate(")) == "threadprivate("; + bool red = lexem.substr(0, strlen("reduction(")) == "reduction("; + if (priv || threadpriv) + { + vector sublex; + splitString(lexem, '(', sublex); + if (sublex.size() == 2 && lexem.back() == ')') + { + splitString(sublex[1].erase(sublex[1].size() - 1), ',', sublex); + + vector list; + set uniqList; + for (auto& varG : globalPriv) + uniqList.insert(varG); + + for (auto& var : sublex) + uniqList.insert(var); + + for (auto& var : uniqList) + { + if (priv) + { + result.privVars.insert(var); + list.push_back(new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st)))); + } + else + result.threadPrivVars.insert(var); + } + + if (forDo && doLexem && priv) + addToAttribute(st, ACC_PRIVATE_OP, list); + } + } + else if (red) + { + vector sublex; + splitString(lexem, '(', sublex); + if (sublex.size() == 2 && lexem.back() == ')') + { + splitString(sublex[1].erase(sublex[1].size() - 1), ':', sublex); + + vector vars; + vector list; + splitString(sublex[1], ',', vars); + string op = ""; + + if (sublex[0] == "+") + op = "sum"; + else if (sublex[0] == "*") + op = "prod"; + else if (sublex[0] == "max") + op = "max"; + else if (sublex[0] == "min") + op = "min"; + else if (sublex[0] == ".or." || sublex[0] == "or") + op = "or"; + else if (sublex[0] == ".and." || sublex[0] == "and") + op = "and"; + else if (sublex[0] == ".eqv." || sublex[0] == "eqv") + op = "eqv"; + else if (sublex[0] == ".neqv." || sublex[0] == "neqv") + op = "neqv"; + + if (op != "") + { + for (auto& var : vars) + { + result.redVars[sublex[0]].insert(var); + list.push_back(new SgExpression(ARRAY_OP, new SgKeywordValExp(op.c_str()), new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st))))); + } + } + + if (forDo && doLexem && op != "") + addToAttribute(st, REDUCTION_OP, list); + } + } + } + + resultAll.push_back(result); + } + } + + return resultAll; +} + +//TODO: need to use IR and RD for checking +static void filterPrivates(OmpDir& dir) +{ + if (dir.privVars.size() == 0) + return; + + for (auto st = dir.start; st != dir.end; st = st->lexNext()) + { + vector res; + if (st != dir.start) + { + set dummy; + res = parseOmpInStatement(st, dummy); + } + + bool hasParallelDo = false; + for (auto& dir : res) + { + if (dir.keys.find("parallel") != dir.keys.end() || + dir.keys.find("do") != dir.keys.end()) + { + hasParallelDo = true; + } + } + + if (res.size() == 0 || !hasParallelDo) + { + if (st->variant() == ASSIGN_STAT) + { + if (st->expr(0)) + { + string ref = st->expr(0)->symbol()->identifier(); + dir.privVars.erase(ref); + } + } + } + } +} + +static vector findAllGlobalParallelRegions(SgStatement* stFunc) +{ + vector sections; + + SgStatement* lastNode = stFunc->lastNodeOfStmt(); + for (auto st = stFunc; st != lastNode; st = st->lexNext()) + { + if (st == NULL) + { + __spf_print(1, "internal error in analysis, parallel directives will not be generated for this file!\n"); + break; + } + + if (st->variant() == CONTAINS_STMT) + break; + + set dummy; + auto res = parseOmpInStatement(st, dummy); + + for (auto& dir : res) + { + auto end = dir.keys.end(); + if (dir.keys.find("parallel") != end + && dir.keys.find("do") == end + && dir.keys.find("end") == end) + { + if (sections.size() && sections.back().end == NULL) // has open parallel region + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + sections.push_back(dir); + sections.back().start = st; + } + else if (dir.keys.find("parallel") != end + && dir.keys.find("do") == end + && dir.keys.find("end") != end) + { + sections.back().end = st; + } + } + } + + for (auto& dir : sections) + filterPrivates(dir); + + return sections; +} + +static set getGlobalPrivate(SgStatement* st, const vector& globalParallelRegions) +{ + set globalPrivates; + const int line = st->lineNumber(); + if (line > 0) + { + for (auto& reg : globalParallelRegions) + { + if (reg.start->lineNumber() <= line && line < reg.end->lineNumber()) + { + if (reg.privVars.size()) + return reg.privVars; + else + return globalPrivates; + } + } + } + else + { + for (auto& reg : globalParallelRegions) + { + for (auto stF = reg.start; stF != reg.end; stF = stF->lexNext()) + { + if (st == stF) + { + if (reg.privVars.size()) + return reg.privVars; + else + return globalPrivates; + } + } + } + } + + return globalPrivates; +} + +void parseOmpDirectives(SgFile* file, vector& currMessages) +{ + int funcNum = file->numberOfFunctions(); + + for (int i = 0; i < funcNum; ++i) + { + SgStatement* st = file->functions(i); + SgStatement* lastNode = st->lastNodeOfStmt(); + + vector globalParallelRegions = findAllGlobalParallelRegions(st); + + while (st != lastNode) + { + if (st == NULL) + { + __spf_print(1, "internal error in analysis, parallel directives will not be generated for this file!\n"); + break; + } + + if (st->variant() == CONTAINS_STMT) + break; + + if (st->variant() == FOR_NODE) + { + SgForStmt* currSt = (SgForStmt*)st; + if (currSt->isEnddoLoop() == 0) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + else + parseOmpInStatement(st, getGlobalPrivate(st, globalParallelRegions), true); + } + st = st->lexNext(); + } + } +} diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h new file mode 100644 index 0000000..e241f38 --- /dev/null +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h @@ -0,0 +1,22 @@ +#pragma once +#include +#include +#include +#include + +#include "../Utils/errors.h" + +struct OmpDir +{ + std::set privVars; + std::set threadPrivVars; + std::map> redVars; + std::set keys; + + SgStatement* start = NULL; + SgStatement* end = NULL; +}; + +void removeOmpDir(SgStatement* st); +std::vector parseOmpInStatement(SgStatement* st, const std::set& globalPriv, bool forDo = false); +void parseOmpDirectives(SgFile* file, std::vector& currMessages); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp index 029fd3b..d2860c5 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp @@ -594,350 +594,3 @@ void fillInfoFromDirectives(const LoopGraph *loopInfo, ParallelDirective *direct } } } - -void removeOmpDir(void* stIn) -{ - SgStatement* st = (SgStatement*)stIn; - - char* lineS = st->comments(); - if (!lineS) - return; - - vector split; - splitString(lineS, '\n', split); - - int idx = 0; - for (auto& elem : split) - { - string line = elem; - convertToLower(line); - if (line.substr(0, 5) == "!$omp") - lineS[idx + 1] = '_'; - else if (line.substr(0, 3) == "!$ ") - lineS[idx + 1] = '_'; - idx += line.size() + 1; // with '\n' - } -} - -static inline void addToAttribute(SgStatement* st, int var, vector list) -{ - if (list.size()) - { - SgExprListExp* ex = new SgExprListExp(); - ex->setLhs(new SgExpression(var, makeExprList(list), NULL)); - SgStatement* toAdd = new SgStatement(SPF_ANALYSIS_DIR, NULL, NULL, ex, NULL, NULL); - toAdd->setlineNumber(st->lineNumber()); - toAdd->setLocalLineNumber(888); - - //filter - if (var == ACC_PRIVATE_OP) - { - vector list_new; - - auto attributes = getAttributes(st, set{SPF_ANALYSIS_DIR}); - set privates; - for (auto& attr : attributes) - fillPrivatesFromComment(new Statement(attr), privates); - - if (privates.size()) - { - for (auto& elem : list) - if (privates.find(elem->unparse()) == privates.end()) - list_new.push_back(elem); - list = list_new; - - if (!list.size()) - { - __spf_print(1, "-- skip privates on line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); - return; - } - } - } - else if (var == REDUCTION_OP) - { - auto attributes = getAttributes(st, set{SPF_ANALYSIS_DIR}); - map> reduction; - for (auto& attr : attributes) - fillReductionsFromComment(new Statement(attr), reduction); - - map> reductionToAdd; - fillReductionsFromComment(new Statement(st), reductionToAdd); - - vector list_new; - if (reduction.size()) - { - if (reduction == reductionToAdd) - { - __spf_print(1, "-- skip reduction on line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); - return; - } - - map> reductionToAddNew; - for (auto& redPair : reductionToAdd) - { - auto it = reduction.find(redPair.first); - if (it == reduction.end()) - reductionToAddNew[redPair.first] = redPair.second; - else - { - set newVar; - for (auto& var : redPair.second) - { - auto itVar = it->second.find(var); - if (itVar == it->second.end()) - reductionToAddNew[redPair.first].insert(var); - } - } - } - - if (!reductionToAddNew.size()) - { - __spf_print(1, "-- skip reduction on line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); - return; - } - - if (reductionToAddNew != reductionToAdd) - { - list.clear(); - for (auto& redPair : reductionToAddNew) - for (auto& var : redPair.second) - list.push_back(new SgExpression(ARRAY_OP, - new SgKeywordValExp(redPair.first.c_str()), - new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st))))); - } - } - } - - ex = new SgExprListExp(); - ex->setLhs(new SgExpression(var, makeExprList(list), NULL)); - toAdd = new SgStatement(SPF_ANALYSIS_DIR, NULL, NULL, ex, NULL, NULL); - - st->addAttribute(SPF_ANALYSIS_DIR, toAdd, sizeof(SgStatement)); - - if (var == ACC_PRIVATE_OP) - __spf_print(1, "-- set private attribute to line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); - else if (var == REDUCTION_OP) - __spf_print(1, "-- set reduction attribute to line %d from OMP dir\n%s", st->lineNumber(), toAdd->unparse()); - } -} - -static bool is_private_in_do(SgStatement* st, const string& var) -{ - checkNull(st, convertFileName(__FILE__).c_str(), __LINE__); - - if (st->variant() != FOR_NODE) - return false; - - SgStatement* lastNode = st->lastNodeOfStmt(); - for (SgStatement* op = st->lexNext(); st != lastNode; st = st->lexNext()) - { - if (st->variant() == ASSIGN_STAT) - { - SgExpression* ex = st->expr(0); - if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF) - if (var == ex->symbol()->identifier()) - return true; - } - } - return false; -} - -vector parseOmpDirs(void* stIn, const set &globalPriv, bool forDo) -{ - SgStatement* st = (SgStatement*)stIn; - vector resultAll; - - const char* lineS = st->comments(); - if (!lineS) - return resultAll; - - string comment(lineS); - convertToLower(comment); - - vector split; - splitString(comment, '\n', split); - - for (int z = split.size() - 1; z >= 0; z--) - { - string line = split[z]; - - if (line.substr(0, 6) == "!$omp&") - { - if (z - 1 < 0) - break; - split[z - 1] += line.substr(6); - split[z] = ""; - } - } - - for (auto& line : split) - { - if (line.substr(0, 5) == "!$omp") - { - OmpDir result; - - string line1 = ""; - int space = 0; - int brake = 0; - for (int z = 0; z < line.size(); ++z) - { - if (brake < 0) - return vector(); // error - - if (brake == 0) - { - if (line[z] == ' ') - space++; - else - space = 0; - if ((line[z] == ' ' && space <= 1) || line[z] != ' ') - line1 += line[z]; - } - else - { - if (line[z] != ' ') - line1 += line[z]; - } - - if (line[z] == '(') - { - while (line1.size() > 2 && line1[line1.size() - 2] == ' ') - line1 = line1.erase(line1.size() - 2, 1); - brake++; - space = 0; - } - else if (line[z] == ')') - brake--; - } - vector lexems; - splitString(line1, ' ', lexems); - bool doLexem = false; - bool end = false; - bool parallel = false; - bool privat = false; - - for (auto& lexem : lexems) - { - if (lexem == "do") - { - doLexem = true; - result.keys.insert(lexem); - } - if (lexem == "end") - { - end = true; - result.keys.insert(lexem); - } - if (lexem == "parallel") - { - parallel = true; - result.keys.insert(lexem); - } - if (lexem == "private") - { - privat = true; - result.keys.insert(lexem); - } - } - - if (privat == false) - { - if (forDo && doLexem) - { - vector list; - for (auto& var : globalPriv) - if (is_private_in_do(st, var)) - list.push_back(new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st)))); - - if (list.size()) - addToAttribute(st, ACC_PRIVATE_OP, list); - } - } - - for (auto& lexem : lexems) - { - bool priv = lexem.substr(0, strlen("private(")) == "private("; - bool threadpriv = lexem.substr(0, strlen("threadprivate(")) == "threadprivate("; - bool red = lexem.substr(0, strlen("reduction(")) == "reduction("; - if (priv || threadpriv) - { - vector sublex; - splitString(lexem, '(', sublex); - if (sublex.size() == 2 && lexem.back() == ')') - { - splitString(sublex[1].erase(sublex[1].size() - 1), ',', sublex); - - vector list; - set uniqList; - for (auto& varG : globalPriv) - uniqList.insert(varG); - - for (auto& var : sublex) - uniqList.insert(var); - - for (auto& var : uniqList) - { - if (priv) - { - result.privVars.insert(var); - list.push_back(new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st)))); - } - else - result.threadPrivVars.insert(var); - } - - if (forDo && doLexem && priv) - addToAttribute(st, ACC_PRIVATE_OP, list); - } - } - else if (red) - { - vector sublex; - splitString(lexem, '(', sublex); - if (sublex.size() == 2 && lexem.back() == ')') - { - splitString(sublex[1].erase(sublex[1].size() - 1), ':', sublex); - - vector vars; - vector list; - splitString(sublex[1], ',', vars); - string op = ""; - - if (sublex[0] == "+") - op = "sum"; - else if (sublex[0] == "*") - op = "prod"; - else if (sublex[0] == "max") - op = "max"; - else if (sublex[0] == "min") - op = "min"; - else if (sublex[0] == ".or." || sublex[0] == "or") - op = "or"; - else if (sublex[0] == ".and." || sublex[0] == "and") - op = "and"; - else if (sublex[0] == ".eqv." || sublex[0] == "eqv") - op = "eqv"; - else if (sublex[0] == ".neqv." || sublex[0] == "neqv") - op = "neqv"; - - if (op != "") - { - for (auto& var : vars) - { - result.redVars[sublex[0]].insert(var); - list.push_back(new SgExpression(ARRAY_OP, new SgKeywordValExp(op.c_str()), new SgVarRefExp(findSymbolOrCreate(current_file, var, NULL, getFuncStat(st))))); - } - } - - if (forDo && doLexem && op != "") - addToAttribute(st, REDUCTION_OP, list); - } - } - } - - resultAll.push_back(result); - } - } - - return resultAll; -} \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h index 8955e96..92e7acd 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h @@ -40,14 +40,3 @@ void fillShrinkFromComment(Statement *stIn, std::vector void fillCheckpointFromComment(Statement *stIn, std::map &clauses, std::set &vars, std::set &expt); - -struct OmpDir -{ - std::set privVars; - std::set threadPrivVars; - std::map> redVars; - std::set keys; -}; - -void removeOmpDir(void* stIn); -std::vector parseOmpDirs(void* st, const std::set& globalPriv, bool forDo = false); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp index 0d737eb..aa7f440 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp @@ -2121,6 +2121,23 @@ static bool moveSpfParameterForImplicitLoops(SgStatement* st, SgStatement* toAdd return moveNext; } +static void insertBefore(SgStatement* st, SgStatement* toAdd) +{ + if (toAdd == NULL) + return; + + st->insertStmtBefore(*toAdd, *st->controlParent()); + if (st->variant() == FOR_NODE) + { + auto com = st->comments(); + if (com) + { + st->lexPrev()->addComment(com); + st->delComments(); + } + } +} + void revertion_spf_dirs(SgFile *file, map, pair> declaredArrays, map>> declaratedArraysSt) @@ -2163,7 +2180,7 @@ void revertion_spf_dirs(SgFile *file, toAdd = UniteAttributes(sameAtt); if (toAdd) if (!moveSpfParameterForImplicitLoops(st, toAdd)) - st->insertStmtBefore(*toAdd, *st->controlParent()); + insertBefore(st, toAdd); } //check previosly directives SPF_PARALLEL @@ -2174,7 +2191,7 @@ void revertion_spf_dirs(SgFile *file, { if (toAdd) toAdd = UniteAttributes(sameAtt); - st->insertStmtBefore(*toAdd, *st->controlParent()); + insertBefore(st, toAdd); } } @@ -2188,7 +2205,7 @@ void revertion_spf_dirs(SgFile *file, SgStatement *toAdd = &(data->copy()); if (toAdd) - st->insertStmtBefore(*toAdd, *st->controlParent()); + insertBefore(st, toAdd); } } } diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp index 71da168..8807af9 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp @@ -16,6 +16,7 @@ #include "loop_analyzer_internal.h" #include "loop_analyzer.h" +#include "../DirectiveProcessing/directive_omp_parser.h" using std::vector; using std::pair; @@ -2598,7 +2599,7 @@ static bool findOmpThreadPrivDecl(SgStatement* st, map { st = st->lexNext(); - auto res = parseOmpDirs(st, dummy); + auto res = parseOmpInStatement(st, dummy); for (auto& dir : res) for (auto& var : dir.threadPrivVars) it->second.insert(var); diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index a5d55e3..e17ee2c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -46,10 +46,11 @@ #include "DynamicAnalysis/gCov_parser_func.h" #include "DynamicAnalysis/createParallelRegions.h" -#include "DirectiveProcessing/DirectiveAnalyzer.h" +#include "DirectiveProcessing/directive_analyzer.h" #include "DirectiveProcessing/directive_creator.h" #include "DirectiveProcessing/directive_creator_nodist.h" #include "DirectiveProcessing/insert_directive.h" +#include "DirectiveProcessing/directive_omp_parser.h" #include "VerificationCode/verifications.h" #include "Distribution/CreateDistributionDirs.h" #include "PrivateAnalyzer/private_analyzer.h" @@ -1007,6 +1008,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne for (SgStatement* st = file->firstStatement(); st; st = st->lexNext()) removeOmpDir(st); } + else if (curr_regime == PARSE_OMP_DIRS) + parseOmpDirectives(file, getObjectForFileFromMap(file_name, SPF_messages)); else if (curr_regime == REMOVE_COMMENTS) { for (SgStatement* st = file->firstStatement(); st; st = st->lexNext()) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.h b/sapfor/experts/Sapfor_2017/_src/Sapfor.h index 4a08593..1337941 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.h +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.h @@ -169,6 +169,7 @@ enum passes { REMOVE_DEAD_CODE_AND_UNPARSE, FIX_COMMON_BLOCKS, + PARSE_OMP_DIRS, REMOVE_OMP_DIRS, REMOVE_OMP_DIRS_TRANSFORM, REMOVE_COMMENTS, @@ -351,6 +352,7 @@ static void setPassValues() passNames[REMOVE_DEAD_CODE_AND_UNPARSE] = "REMOVE_DEAD_CODE_AND_UNPARSE"; passNames[FIX_COMMON_BLOCKS] = "FIX_COMMON_BLOCKS"; + passNames[PARSE_OMP_DIRS] = "PARSE_OMP_DIRS"; passNames[REMOVE_OMP_DIRS] = "REMOVE_OMP_DIRS"; passNames[REMOVE_OMP_DIRS_TRANSFORM] = "REMOVE_OMP_DIRS_TRANSFORM"; passNames[REMOVE_COMMENTS] = "REMOVE_COMMENTS"; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index b8e6c2e..0e07092 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -227,7 +227,7 @@ void InitPassesDependencies(map> &passDepsIn, set list({ VERIFY_ENDDO, VERIFY_INCLUDE, PREPROC_SPF, PREPROC_ALLOCATES, GET_ALL_ARRAY_DECL, GCOV_PARSER }) <= list({ CALL_GRAPH, MACRO_EXPANSION, DEF_USE_STAGE1 }); - list({ VERIFY_ENDDO, VERIFY_INCLUDE, PREPROC_ALLOCATES, FILL_PARALLEL_REG_IR }) <= list({ GET_ALL_ARRAY_DECL, FILL_COMMON_BLOCKS }) <= Pass(PREPROC_SPF); + list({ VERIFY_ENDDO, VERIFY_INCLUDE, PREPROC_ALLOCATES, FILL_PARALLEL_REG_IR }) <= list({ GET_ALL_ARRAY_DECL, FILL_COMMON_BLOCKS, PARSE_OMP_DIRS }) <= Pass(PREPROC_SPF); Pass(CHECK_PAR_REG_DIR) <= Pass(FILL_PARALLEL_REG_IR); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp index b5a3eab..9bc31d2 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp @@ -1162,7 +1162,9 @@ template vector& getObjectForFileFromMap(const char *fileName, map& getObjectForFileFromMap(const char *fileName, map>&); template map& getObjectForFileFromMap(const char *fileName, map>&); template map& getObjectForFileFromMap(const char *fileName, map>&); +#if __SPF template map>& getObjectForFileFromMap(const char* fileName, map>>&); +#endif static set mpiFunctions; bool isMpiFunction(const string& func) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 6678a59..454143e 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2301" +#define VERSION_SPF "2303" diff --git a/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp b/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp index 9e19936..757b9ae 100644 --- a/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp +++ b/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp @@ -12,7 +12,6 @@ #include "../Utils/utils.h" #include "../Utils/SgUtils.h" #include "../Utils/errors.h" -#include "../DirectiveProcessing/directive_parser.h" using std::vector; using std::map; @@ -32,7 +31,6 @@ bool EndDoLoopChecker(SgFile *file, vector &currMessages) SgStatement *st = file->functions(i); SgStatement *lastNode = st->lastNodeOfStmt(); - OmpDir globalParallelSection; while (st != lastNode) { if (st == NULL) @@ -44,31 +42,6 @@ bool EndDoLoopChecker(SgFile *file, vector &currMessages) if (st->variant() == CONTAINS_STMT) break; - { - set globalPriv; - auto res = parseOmpDirs(st, globalPriv); - - for (auto& dir : res) - { - auto end = dir.keys.end(); - if (dir.keys.find("parallel") != end - && dir.keys.find("do") == end - && dir.privVars.size() - && dir.keys.find("end") == end) - { - if (globalParallelSection.keys.size()) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - globalParallelSection = dir; - } - else if (dir.keys.find("parallel") != end - && dir.keys.find("do") == end - && dir.keys.find("end") != end) - { - globalParallelSection = OmpDir(); - } - } - } - if (st->variant() == FOR_NODE) { SgForStmt *currSt = (SgForStmt*)st; @@ -78,13 +51,6 @@ bool EndDoLoopChecker(SgFile *file, vector &currMessages) currMessages.push_back(Messages(ERROR, st->lineNumber(), R51, L"This loop does not have END DO format", 1018)); checkOK = false; } - else - { - set globalPriv; - if (globalParallelSection.privVars.size()) - globalPriv = globalParallelSection.privVars; - auto res = parseOmpDirs(st, globalPriv, true); - } } if (st->variant() == FORALL_NODE || st->variant() == FORALL_STAT || From 1ac7fcca2affd230d1c4ca9d7d1d91b39edbd8be Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Wed, 3 Apr 2024 21:13:56 +0300 Subject: [PATCH 37/68] fixes for dead code removing pass --- .../_src/CFGraph/DataFlow/data_flow.h | 1 + .../_src/CFGraph/DataFlow/data_flow_impl.h | 6 ++-- .../_src/Transformations/dead_code.cpp | 33 +++++++++++-------- .../Sapfor_2017/_src/Utils/PassManager.h | 4 +-- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow.h index 8067bd7..561d1b3 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow.h @@ -29,6 +29,7 @@ public: virtual bool addIn(const DataType& data) = 0; virtual bool addOut(const DataType& data) = 0; + virtual bool updateState() { return false; } virtual bool forwardData(const DataType& data) = 0; bool newerThan(const DataFlowAnalysisNode* block) const { return out_cnt > block->in_cnt; } diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h index 5e74e29..f45b2d7 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h @@ -27,6 +27,8 @@ template void DataFlowAnalysisNode::doStep() { int in_max_cnt = CNT_NOTINIT, out_max_cnt = CNT_NOTINIT; + + bool uniq_change = updateState(); for (auto next : prev_blocks) { if (in_cnt < next->out_cnt) @@ -49,7 +51,7 @@ void DataFlowAnalysisNode::doStep() } } - bool was_notinit = (out_cnt == CNT_NOTINIT); + uniq_change |= (out_cnt == CNT_NOTINIT); if (out_max_cnt != CNT_NOTINIT) out_cnt = out_max_cnt; @@ -58,7 +60,7 @@ void DataFlowAnalysisNode::doStep() in_cnt = in_max_cnt; // TODO: fix counter overflow - if (was_notinit) + if (uniq_change) { out_cnt++; in_cnt++; diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index f7493d2..089ca88 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -39,7 +39,9 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru { for (SAPFOR::Argument* r : res) { - if (use.find(r) != use.end() || r->getMemType() != SAPFOR::CFG_MEM_TYPE::LOCAL_) + if (use.find(r) != use.end() || + r->getMemType() != SAPFOR::CFG_MEM_TYPE::LOCAL_ || + r->getType() != SAPFOR::CFG_ARG_TYPE::VAR) { useful = true; break; @@ -88,7 +90,7 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru use.insert(e); def.erase(e); } - + insertIfVar(args.begin(), args.end(), usedByThisBlock); } @@ -207,11 +209,6 @@ public: bool addIn(const map>& data) { bool inserted = getBlock()->addLiveOut(data); - if (!useful_block) - inserted |= updateNextNotEmpty(); - - inserted |= updateJumpStatus(); - return inserted; } @@ -219,6 +216,21 @@ public: return getBlock()->addLiveIn(data); } + bool updateState() { + if(getBlock()->getInstructions()[0]->getInstruction()->getOperator()->lineNumber() == 58) + int b = 51; + + bool updated = false; + + if (!useful_block) + updated |= updateNextNotEmpty(); + + updated |= updateJumpStatus(); + updated |= this->forwardData({ }); + + return updated; + } + bool forwardData(const map>& data) { bool inserted = false; SAPFOR::BasicBlock* bb= getBlock(); @@ -298,13 +310,6 @@ public: { setBlock(block); useful.resize(block->getInstructions().size(), false); - set use, def; - set usedByThisBlock; - - buildUseDef(getBlock(), use, def, this->formal_parameters, useful, usedByThisBlock, funcByName); - - for (SAPFOR::Argument* arg : use) - getBlock()->addLiveIn({ { arg, { getBlock() } } }); } const vector& getResult() { return useful; } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index 0e07092..0f2e0fe 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -307,8 +307,8 @@ void InitPassesDependencies(map> &passDepsIn, set Pass(REMOVE_OMP_DIRS) <= Pass(REMOVE_OMP_DIRS_TRANSFORM); - Pass(CALL_GRAPH2) <= Pass(REMOVE_DEAD_CODE); - list({ REMOVE_DEAD_CODE, REVERT_SUBST_EXPR_RD, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(REMOVE_DEAD_CODE_AND_UNPARSE); + list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD }) <= Pass(REMOVE_DEAD_CODE); + list({ REMOVE_DEAD_CODE, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(REMOVE_DEAD_CODE_AND_UNPARSE); 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, From e2ac45f48db8a6b8c3a9b26c96151dcc545b9e60 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Thu, 4 Apr 2024 20:15:56 +0300 Subject: [PATCH 38/68] codestyle issues --- .../CFGraph/DataFlow/backward_data_flow.h | 3 +- .../_src/CFGraph/DataFlow/data_flow_impl.h | 3 +- .../_src/Transformations/dead_code.cpp | 34 +++++++++++-------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/backward_data_flow.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/backward_data_flow.h index 7f81751..556af90 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/backward_data_flow.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/backward_data_flow.h @@ -10,7 +10,8 @@ #include "../IR.h" template -class BackwardDataFlowAnalysis : public DataFlowAnalysis { +class BackwardDataFlowAnalysis : public DataFlowAnalysis +{ std::vector reorderSequence(const std::vector& blocks, const std::set back_edge_sources); public: diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h index f45b2d7..db33e73 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h @@ -70,7 +70,8 @@ void DataFlowAnalysisNode::doStep() /* definitions for DataFlowAnalysis class */ template -void DataFlowAnalysis::analyze() { +void DataFlowAnalysis::analyze() +{ auto curr = 0; auto stop = nodes.size(); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 089ca88..6f724b5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -135,7 +135,8 @@ static void buildUseDef(SAPFOR::BasicBlock* block, set& use, } -class DeadCodeAnalysisNode : public DataFlowAnalysisNode>> { +class DeadCodeAnalysisNode : public DataFlowAnalysisNode>> +{ private: vector useful; bool useful_block = false; @@ -198,28 +199,28 @@ public: return updated; } - map> getIn() { + map> getIn() + { return getBlock()->getLiveOut(); } - map> getOut() { + map> getOut() + { return getBlock()->getLiveIn(); } - bool addIn(const map>& data) { - bool inserted = getBlock()->addLiveOut(data); - - return inserted; + bool addIn(const map>& data) + { + return getBlock()->addLiveOut(data); } - bool addOut(const map>& data) { + bool addOut(const map>& data) + { return getBlock()->addLiveIn(data); } - bool updateState() { - if(getBlock()->getInstructions()[0]->getInstruction()->getOperator()->lineNumber() == 58) - int b = 51; - + bool updateState() + { bool updated = false; if (!useful_block) @@ -231,7 +232,8 @@ public: return updated; } - bool forwardData(const map>& data) { + bool forwardData(const map>& data) + { bool inserted = false; SAPFOR::BasicBlock* bb= getBlock(); @@ -315,12 +317,14 @@ public: const vector& getResult() { return useful; } }; -class DeadCodeAnalysis : public BackwardDataFlowAnalysis { +class DeadCodeAnalysis : public BackwardDataFlowAnalysis +{ protected: vector& formal_parameters; const map& funcByName; - DeadCodeAnalysisNode* createNode(SAPFOR::BasicBlock* block) override { + DeadCodeAnalysisNode* createNode(SAPFOR::BasicBlock* block) override + { return new DeadCodeAnalysisNode(block, formal_parameters, funcByName); } public: From af194134ba729a98e55122168fb88b7ca1261571 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Thu, 4 Apr 2024 20:37:34 +0300 Subject: [PATCH 39/68] dead_code: fix for recent changes --- sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 6f724b5..3535963 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -41,7 +41,7 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru { if (use.find(r) != use.end() || r->getMemType() != SAPFOR::CFG_MEM_TYPE::LOCAL_ || - r->getType() != SAPFOR::CFG_ARG_TYPE::VAR) + !(r->getType() == SAPFOR::CFG_ARG_TYPE::VAR || r->getType() == SAPFOR::CFG_ARG_TYPE::REG)) { useful = true; break; From 42f64531b881eff7cd3ce762d8631d5f55d06572 Mon Sep 17 00:00:00 2001 From: Grigorii Gusev Date: Wed, 20 Mar 2024 01:24:17 +0300 Subject: [PATCH 40/68] private_removing: some small fixes --- .../_src/Transformations/private_removing.cpp | 155 ++++++++++-------- 1 file changed, 88 insertions(+), 67 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index 6e97d06..37c64d2 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -44,7 +44,7 @@ static bool operator<(const RegularExpr& left, const RegularExpr& right) } // FixedSubscript represents subscript of array. Subscript is fixed if it is INT_VAL value -struct FixedSubscript { +struct ArraySubscript { bool isFixed; int value; @@ -52,7 +52,7 @@ struct FixedSubscript { RegularExpr regExprStart; RegularExpr regExprEnd; - FixedSubscript() { + ArraySubscript() { isFixed = false; value = 0; isRegIndex = false; @@ -240,6 +240,7 @@ static vector getShortFixedSubscriptsVector(SgArrayRefExp* arrayRef, const if (vars != varToRemove.arrayRefToIterationVarsMap.end()) iterationVars = vars->second; } + return getShortFixedSubscriptsVector(arrayRef, varToRemove.fixedDimensions, varToRemove.regime, iterationVars); } @@ -278,8 +279,12 @@ static bool isSymbolInExpression(SgSymbol* symbol, SgExpression* exp) if (exp == nullptr) return false; - if (exp->symbol() != nullptr && isEqSymbols(exp->symbol(), symbol)) + if (exp->symbol() != nullptr && + (exp->variant() == VAR_REF || exp->variant() == ARRAY_REF) && + isEqSymbols(exp->symbol(), symbol)) + { return true; + } return isSymbolInExpression(symbol, exp->lhs()) || isSymbolInExpression(symbol, exp->rhs()); @@ -312,6 +317,20 @@ static FuncInfo* getCurrectFunc(SgStatement* stmt, const map& vars) +{ + if (stmt == nullptr) + return; + + if (stmt->variant() == FOR_NODE) + vars.push_back(((SgForStmt*)stmt)->doName()); + + if (stmt->id() != outerLoopStmt->id()) + fillIterationVars(stmt->controlParent(), outerLoopStmt, vars); +} + /* ************************************** * * End of block of common used functions: * * ************************************** */ @@ -369,18 +388,19 @@ static void addMessageCannotFindRD(vector& messages, string varName, i messages.push_back(Messages(typeMessage::WARR, loopLineNum, messageR, messageE, 2021)); } -static void addMessageMoreThanOneRD(vector& messages, string varName, int loopLineNum) -{ - __spf_print(1, "WARR: cannot remove private var '%s' - more than one definition reaches the statement in line %d\n", - varName.c_str(), loopLineNum); - - wstring messageE, messageR; - __spf_printToLongBuf(messageE, L"Cannot remove private var '%s' - more than one definition reaches the statement", - to_wstring(varName).c_str()); - __spf_printToLongBuf(messageR, R193, to_wstring(varName).c_str()); - - messages.push_back(Messages(typeMessage::WARR, loopLineNum, messageR, messageE, 2020)); -} +// TODO: unused: +//static void addMessageMoreThanOneRD(vector& messages, string varName, int loopLineNum) +//{ +// __spf_print(1, "WARR: cannot remove private var '%s' - more than one definition reaches the statement in line %d\n", +// varName.c_str(), loopLineNum); +// +// wstring messageE, messageR; +// __spf_printToLongBuf(messageE, L"Cannot remove private var '%s' - more than one definition reaches the statement", +// to_wstring(varName).c_str()); +// __spf_printToLongBuf(messageR, R193, to_wstring(varName).c_str()); +// +// messages.push_back(Messages(typeMessage::WARR, loopLineNum, messageR, messageE, 2020)); +//} static void addMessageRecursiveDependency(vector& messages, string varName, int lineNum) { @@ -499,7 +519,7 @@ static string getDimensionVarName(SgSymbol* var, const vector& subscripts, } // getDimensionVarName returns var name in style A(1, 2, *) -static string getDimensionVarName(SgSymbol* var, const vector& fixedSubscripts) +static string getDimensionVarName(SgSymbol* var, const vector& fixedSubscripts) { string result = var->identifier(); @@ -607,14 +627,13 @@ static void fillReadShortFixedSubscripts(SgExpression* exp, const PrivateToRemov if (exp == nullptr) return; - if (exp->symbol() != nullptr) + if (exp->symbol() != nullptr && + (exp->symbol()->variant() == ARRAY_REF || exp->symbol()->variant() == VARIABLE_NAME) && + isEqSymbols(exp->symbol(), var.varSymbol)) { - if (isEqSymbols(exp->symbol(), var.varSymbol)) - { - auto subscripts = getShortFixedSubscriptsVector((SgArrayRefExp*)exp, var); - fixedSubscripts.insert(subscripts); - return; - } + auto subscripts = getShortFixedSubscriptsVector((SgArrayRefExp*)exp, var); + fixedSubscripts.insert(subscripts); + return; } fillReadShortFixedSubscripts(exp->lhs(), var, fixedSubscripts); @@ -718,10 +737,23 @@ static map getVarToExpMap(SgArrayRefExp* defRef, SgArr // removeArray removes array by substituting it in DEF-USE pairs. // Returns set of removed fixed subscripts -static set> removeArray(string filename, const PrivateToRemove& arrayToRemove) +static set> removeArray(string filename, PrivateToRemove& arrayToRemove) { set> 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 iterationVars; + fillIterationVars(st, loopStmt, iterationVars); + + vector 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) { @@ -934,19 +966,6 @@ static vector getShortFixedSubscriptsVector(Context* ctx, SgArrayRefExp* ar return getShortFixedSubscriptsVector(arrayRef, ctx->fixedDimensionsMask, ctx->regime, iterationVars); } -// fillIterationVariables fill vars set with iteration variables of all loops -// from stmt to outerLoopStmt -static void fillIterationVars(SgStatement* stmt, SgStatement* outerLoopStmt, vector& vars) -{ - if (stmt == nullptr) - return; - - if (stmt->variant() == FOR_NODE) - vars.push_back(((SgForStmt*)stmt)->doName()); - - if (stmt->id() != outerLoopStmt->id()) - fillIterationVars(stmt->controlParent(), outerLoopStmt, vars); -} // matchesFixedDimensionsMask checks if all array references have INT_VAL value in fixed dimension static bool checkFixedDimensionsMaskMatching(Context* ctx) @@ -1058,6 +1077,7 @@ static bool checkRegularIndexRefs(Context* ctx) return false; } + // 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))) @@ -1117,17 +1137,17 @@ static SgForStmt* getLoopStmtForVar(SgStatement* stmt, string loopVar) // getFixedSubscriptsVector returns vector of fixed INT_VAL subscripts of arrayRef // true - subscript is fixed, false - it isn't -static vector getFixedSubscriptsVector(SgArrayRefExp* arrayRef, int dimensionsNum = 0, +static vector getFixedSubscriptsVector(SgArrayRefExp* arrayRef, int dimensionsNum = 0, SgStatement* stmt = nullptr) { if (arrayRef->numberOfSubscripts() == 0) - return vector(dimensionsNum); + return vector(dimensionsNum); - vector subscriptsVector; + vector subscriptsVector; for (int i = 0; i < arrayRef->numberOfSubscripts(); ++i) { SgExpression* subscriptExpr = arrayRef->subscript(i); - FixedSubscript sub; + ArraySubscript sub; if (subscriptExpr->variant() == INT_VAL) { @@ -1173,7 +1193,7 @@ static vector getFixedSubscriptsVector(SgArrayRefExp* arrayRef, // checkImplicitDirectUsage returns masks of array implicit usage (as out argument) // in any function call in exp and writes message about each usage static void checkImplicitDirectUsage(Context* ctx, SgExpression* exp, int stmtLineNum, - vector>& fixedSubscripts) + vector>& fixedSubscripts) { if (exp == nullptr) return; @@ -1208,9 +1228,9 @@ static void checkImplicitDirectUsage(Context* ctx, SgExpression* exp, int stmtLi // checkImplicitDirectUsage returns masks of array implicit usage (as out argument) // and reference to whole array (like fcall(A, 1)) in any function call in loop // and writes message about each usage -static vector> checkImplicitDirectUsage(Context* ctx) +static vector> checkImplicitDirectUsage(Context* ctx) { - vector> fixedSubscripts; + vector> fixedSubscripts; for (SgStatement* st = ctx->loopStmt->lexNext(); st != ctx->loopStmt->lastNodeOfStmt(); st = st->lexNext()) { if (st->variant() != PROC_STAT) @@ -1276,7 +1296,7 @@ static vector getCommonBlockGroupedVar(FuncInfo* curFunc, SgSymbol* v // checkIndirectUsage returns masks of array indirect usage in function // (indirect usage is usage through common blocks) and writes messages about it static void checkIndirectUsage(Context* ctx, FuncInfo* curFunc, vector commonBlockGroupedVar, - set& visitedFuncs, vector>& indirectUsageMasks) + set& visitedFuncs, vector>& indirectUsageMasks) { if (visitedFuncs.find(curFunc->funcName) != visitedFuncs.end()) return; @@ -1307,9 +1327,9 @@ static void checkIndirectUsage(Context* ctx, FuncInfo* curFunc, vector> checkIndirectUsage(Context* ctx) +static vector> checkIndirectUsage(Context* ctx) { - vector> indirectUsageMasks; + vector> indirectUsageMasks; FuncInfo* currentFunc = getCurrectFunc(ctx->loopStmt, ctx->allFuncInfo); if (currentFunc == nullptr) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -1327,10 +1347,10 @@ static vector> checkIndirectUsage(Context* ctx) } // checkImplicitAndIndirectUsage returns masks of implicit or indirect array usage in loop -static vector> checkImplicitAndIndirectUsage(Context* ctx) +static vector> checkImplicitAndIndirectUsage(Context* ctx) { - vector> implicitMasks = checkImplicitDirectUsage(ctx); - vector> indirectMasks = checkIndirectUsage(ctx); + vector> implicitMasks = checkImplicitDirectUsage(ctx); + vector> indirectMasks = checkIndirectUsage(ctx); implicitMasks.insert(implicitMasks.end(), indirectMasks.begin(), indirectMasks.end()); return implicitMasks; @@ -1338,7 +1358,7 @@ static vector> checkImplicitAndIndirectUsage(Context* ctx // filterArrayRefs removes from arrayRefs all refs that are not different from fixedVectors static void filterArrayRefs(Context* ctx, vector& arrayRefs, - const vector>& masks) + const vector>& masks) { if (masks.empty()) return; @@ -1346,7 +1366,7 @@ static void filterArrayRefs(Context* ctx, vector& arrayRefs, vector filteredArrayRefs; for (auto arrayRef : arrayRefs) { - vector arrayRefVec = getFixedSubscriptsVector(arrayRef, ctx->dimensionsNum); + vector arrayRefVec = getFixedSubscriptsVector(arrayRef, ctx->dimensionsNum); bool isDifferent = false; for (auto& mask : masks) @@ -1609,17 +1629,18 @@ static vector buildDefUsePairs(Context* ctx, const CFG_Type& CF if (!defIsFound) { - // try to find definition not from RD_defArgs: + // try to find definition not from RD_defArgs, by search in the block instructions: string defVarName = useInsertedStmt.insertedStmt->expr(1)->symbol()->identifier(); - SgStatement* blockStart = useInsAndBlock.second->getInstructions().front()->getInstruction()->getOperator(); - SgStatement* blockEnd = useInsAndBlock.second->getInstructions().back()->getInstruction()->getOperator(); - for (SgStatement* st = blockStart; st != blockEnd; st = st->lexNext()) + const auto& blockInstructionsVector = useInsAndBlock.second->getInstructions(); + for (auto& instruction : blockInstructionsVector) { - if (st->variant() == ASSIGN_STAT && st->expr(0)->symbol()->identifier() == defVarName && - !isVarChangedBetween(defVarName, st, useInsertedStmt.insertedStmt)) + SgStatement* stmt = instruction->getInstruction()->getOperator(); + if (stmt->variant() == ASSIGN_STAT + && stmt->expr(0)->symbol()->identifier() == defVarName + && !isVarChangedBetween(defVarName, stmt, useInsertedStmt.insertedStmt)) { defIsFound = true; - defStmt = st; + defStmt = stmt; break; } } @@ -1735,7 +1756,7 @@ static LoopGraph* leastCommonAncestor(LoopGraph* a, LoopGraph* b, LoopGraph* par // fillFullFixedSubscriptsVectorsOfAllVars return vector of pairs (name of var, its fixed subscripts vector) // of all VAR_REF and ARRAY_REF vars in exp static void fillFixedSubscriptsVectorsOfAllVars(SgExpression* exp, - vector>>& vec, + vector>>& vec, SgStatement* stmt = nullptr) { if (exp == nullptr) @@ -1749,7 +1770,7 @@ static void fillFixedSubscriptsVectorsOfAllVars(SgExpression* exp, if (elem.first == exp->symbol()->identifier()) return; - vec.push_back(make_pair(exp->symbol()->identifier(), vector{})); + vec.push_back(make_pair(exp->symbol()->identifier(), vector{})); } else if (exp->variant() == ARRAY_REF) { @@ -1768,7 +1789,7 @@ static void fillFixedSubscriptsVectorsOfAllVars(SgExpression* exp, } // fixedSubscriptLess checks if left FixedSubscript is less than right -static bool fixedSubscriptLess(const FixedSubscript& left, const FixedSubscript& right) +static bool fixedSubscriptLess(const ArraySubscript& left, const ArraySubscript& right) { if (left.isFixed && right.isFixed && left.value < right.value) return true; @@ -1789,7 +1810,7 @@ static bool fixedSubscriptLess(const FixedSubscript& left, const FixedSubscript& // fixedSubscriptLess checks if left and right FixedSubscripts are different, // using empirical methods -static bool possibleDifferent(FixedSubscript left, FixedSubscript right) +static bool possibleDifferent(ArraySubscript left, ArraySubscript right) { // TODO: add warning? if (left.isFixed && right.isRegIndex && right.regExprStart == right.regExprEnd) { @@ -1801,7 +1822,7 @@ static bool possibleDifferent(FixedSubscript left, FixedSubscript right) // isDifferentRefs checks if exp (var reference) is different from var. Refs are different // if they has at least one different fixed subscript: arr(i, 1) is different from arr(j, 2) -static bool isDifferentRefs(SgExpression* exp, const pair>& var, SgStatement* stmt) +static bool isDifferentRefs(SgExpression* exp, const pair>& var, SgStatement* stmt) { if (exp->symbol()->identifier() != var.first) return true; @@ -1809,7 +1830,7 @@ static bool isDifferentRefs(SgExpression* exp, const pairvariant() == VAR_REF) return false; - vector leftVec = getFixedSubscriptsVector((SgArrayRefExp*)exp, 0, stmt); + vector leftVec = getFixedSubscriptsVector((SgArrayRefExp*)exp, 0, stmt); if (leftVec.size() != var.second.size()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -1852,7 +1873,7 @@ static bool checkDefUsePair(Context* ctx, const DefUseStmtsPair& defUse, const C string arrayName = ctx->arraySymbol->identifier(); - vector>> dependOnVars; + vector>> dependOnVars; SgArrayRefExp* defRef = (SgArrayRefExp*)defUse.first->expr(0); vector arrayUseRefs = getDirectArrayRefsFromSingleStmt(defUse.second, ctx->arraySymbol); for (auto useRef : arrayUseRefs) @@ -2121,7 +2142,7 @@ void removePrivatesAnalysis(string filename, continue; context.fixedDimensionsMask = getFixedDimensionsMask(&context); - + if (!context.fixedDimensionsMask.empty() && checkFixedDimensionsMaskMatching(&context) && checkDefStmtRefsMatchesMask(&context)) From 841eb0314d31964dcb1f912987063c52e22d2ef4 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 5 Apr 2024 12:37:59 +0300 Subject: [PATCH 41/68] replacing kernel and handler names to avoid conflicts with C language keywords and intrinsic function names --- dvm/fdvm/trunk/fdvm/acc.cpp | 46 ++++--- dvm/fdvm/trunk/fdvm/acc_across.cpp | 49 +++++--- dvm/fdvm/trunk/fdvm/acc_f2c.cpp | 186 ++++++++++++++++++++++++++++- dvm/fdvm/trunk/fdvm/calls.cpp | 1 + dvm/fdvm/trunk/include/dvm.h | 7 +- 5 files changed, 250 insertions(+), 39 deletions(-) diff --git a/dvm/fdvm/trunk/fdvm/acc.cpp b/dvm/fdvm/trunk/fdvm/acc.cpp index 44cef68..4e0fdc2 100644 --- a/dvm/fdvm/trunk/fdvm/acc.cpp +++ b/dvm/fdvm/trunk/fdvm/acc.cpp @@ -2561,7 +2561,7 @@ void ACC_ParallelLoopEnd(SgStatement *pardo) if (!WithAcrossClause()) Create_Host_Loop_Subroutine_Main(hostproc_symb); else - { + { Create_Host_Across_Loop_Subroutine(hostproc_symb); first_do_par->extractStmt(); } @@ -4572,6 +4572,15 @@ symb_list *isInSymbList(SgSymbol *s, symb_list *slist) return(NULL); } +symb_list *isInSymbListByChar(SgSymbol *s, symb_list *slist) +{ + symb_list *sl; + for (sl = slist; sl; sl = sl->next) + if (!strcmp(sl->symb->identifier(), s->identifier())) + return(sl); + return(NULL); +} + int ListElemNumber(SgExpression *list) { SgExpression *l; @@ -5208,7 +5217,6 @@ int Create_New_File(char *file_name, SgFile *file, char *fout_name) char *new_file_name, *dep_file_name; int ll; // old file - printf(" in 0 Create_New_File\n"); mod_gpu->extractStmt(); ll = strlen(file_name) + 1; dep_file_name = (char *)malloc((unsigned)ll); @@ -5219,13 +5227,10 @@ int Create_New_File(char *file_name, SgFile *file, char *fout_name) file->saveDepFile(dep_file_name); // new file - printf(" in 1 Create_New_File\n"); fcuf = new SgFile(0, "dvm_gpu"); fcuf->firstStatement()->insertStmtAfter(*mod_gpu); fcuf->saveDepFile("dvm_gpu.dep"); - printf(" in 2 Create_New_File\n"); - //fcuf->unparsestdout(); new_file_name = (char *)malloc((unsigned)(strlen(file_name) + 10)); sprintf(new_file_name, "dvm_gpu_%s", fout_name); @@ -5236,7 +5241,7 @@ int Create_New_File(char *file_name, SgFile *file, char *fout_name) } fcuf->unparse(fout); fclose(fout); - printf(" in 3 Create_New_File \n"); + return 0; } @@ -6106,7 +6111,7 @@ SgStatement *Create_Host_Loop_Subroutine(SgSymbol *sHostProc, int dependency) SgSymbol *loc_var; reduction_operation_list *rl; - red = TranslateReductionToOpenmp(red_list); /* OpenMP */ + red = TranslateReductionToOpenmp(&red_list->copy()); /* OpenMP */ if (red != NULL) parallellist->append(*red); /* OpenMP */ else addopenmp = 0; /* OpenMP */ for (rl = red_struct_list,nr = 1; rl; rl = rl->next, nr++) @@ -8090,7 +8095,6 @@ void CreateGPUModule() return; } - //--------------------------------------------------------------------------------- // create CUDA kernel SgStatement *CreateLoopKernel(SgSymbol *skernel, SgType *indexTypeInKernel) @@ -8212,7 +8216,8 @@ SgStatement *CreateLoopKernel(SgSymbol *skernel, SgType *indexTypeInKernel) // inserting IMPLICIT NONE if (!options.isOn(C_CUDA)) // Fortran-Cuda kernel_st->insertStmtAfter(*new SgStatement(IMPL_DECL), *kernel_st); - + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(kernel_st, skernel, 1); for_kernel = 0; return kernel_st; @@ -8600,6 +8605,9 @@ SgStatement *CreateLoopKernel(SgSymbol *skernel, AnalyzeReturnGpuO1 &infoGpuO1, if (!options.isOn(C_CUDA)) // Fortran-Cuda kernel_st->insertStmtAfter(*new SgStatement(IMPL_DECL), *kernel_st); + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(kernel_st, skernel, 1); + for_kernel = 0; return(kernel_st); @@ -8802,7 +8810,7 @@ SgStatement * CreateKernel_ForSequence(SgSymbol *kernel_symb, SgStatement *first if (options.isOn(C_CUDA)) { swapDimentionsInprivateList(); - std::vector < std::stack < SgStatement*> > zero = std::vector < std::stack < SgStatement*> >(0); + std::vector < std::stack < SgStatement*> > zero = std::vector < std::stack < SgStatement*> >(0); Translate_Fortran_To_C(kernel_st, kernel_st->lastNodeOfStmt(), zero, 0); } @@ -8823,7 +8831,8 @@ SgStatement * CreateKernel_ForSequence(SgSymbol *kernel_symb, SgStatement *first if (!options.isOn(C_CUDA)) // Fortran-Cuda // inserting IMPLICIT NONE kernel_st->insertStmtAfter(*new SgStatement(IMPL_DECL), *kernel_st); - + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(kernel_st, kernel_symb, 1); return(kernel_st); } @@ -13401,9 +13410,9 @@ SgStatement *Create_C_Adapter_Function(SgSymbol *sadapter) SgFunctionCallExp *sizeofLL = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); SgFunctionCallExp *sizeofI = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); - sizeofL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); - sizeofLL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); - sizeofI->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); + sizeofL->addArg(*new SgKeywordValExp("long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); + sizeofLL->addArg(*new SgKeywordValExp("long long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); + sizeofI->addArg(*new SgKeywordValExp("int")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); stmt = new SgIfStmt(SgEqOp(*new SgVarRefExp(s_idxTypeInKernel), *new SgVarRefExp(*new SgSymbol(VARIABLE_NAME, "rt_LONG"))) && @@ -13698,6 +13707,9 @@ SgStatement *Create_C_Adapter_Function(SgSymbol *sadapter) InsertFinishReductionCalls(st_end, s_loop_ref, s_red_num); } + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(st_hedr, s_loop_ref, 0); + return(st_hedr); } @@ -13887,9 +13899,9 @@ SgStatement *Create_C_Adapter_Function_For_Sequence(SgSymbol *sadapter, SgStatem SgFunctionCallExp *sizeofLL = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); SgFunctionCallExp *sizeofI = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); - sizeofL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); - sizeofLL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); - sizeofI->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); + sizeofL->addArg(*new SgKeywordValExp("long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); + sizeofLL->addArg(*new SgKeywordValExp("long long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); + sizeofI->addArg(*new SgKeywordValExp("int")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); stmt = new SgIfStmt(SgEqOp(*new SgVarRefExp(s_idxTypeInKernel), *new SgVarRefExp(*new SgSymbol(VARIABLE_NAME, "rt_LONG"))) && diff --git a/dvm/fdvm/trunk/fdvm/acc_across.cpp b/dvm/fdvm/trunk/fdvm/acc_across.cpp index 82aee5e..e30425f 100644 --- a/dvm/fdvm/trunk/fdvm/acc_across.cpp +++ b/dvm/fdvm/trunk/fdvm/acc_across.cpp @@ -637,7 +637,7 @@ ArgsForKernel *Create_C_Adapter_Function_Across(SgSymbol *sadapter) vector cuda_kernel; SgExpression *fe, *ae, *el, *arg_list; SgType *typ; - SgSymbol *s_loop_ref, *sarg, *s; + SgSymbol *s_loop_ref, *sarg, *s, *current_symbol; symb_list *sl; vector argsForVariantFunction; @@ -650,6 +650,7 @@ ArgsForKernel *Create_C_Adapter_Function_Across(SgSymbol *sadapter) mywarn(" end: getAllVars"); cuda_kernel.resize(countKernels); + current_symbol = SymbMapping(current_file->filept->cur_symb); //CUR_FILE_CUR_SYMB(); if (options.isOn(ONE_THREAD)) { @@ -1111,7 +1112,9 @@ ArgsForKernel *Create_C_Adapter_Function_Across(SgSymbol *sadapter) mywarn(" end: create IF BLOCK "); } - + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(st_hedr, s_loop_ref, 0); //(st_hedr, current_symbol->next(), 0); + return NULL; } @@ -1464,9 +1467,9 @@ vector Create_C_Adapter_Function_Across_OneThread(SgSymbol *sadap SgFunctionCallExp *sizeofLL = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); SgFunctionCallExp *sizeofI = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); - sizeofL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); - sizeofLL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); - sizeofI->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); + sizeofL->addArg(*new SgKeywordValExp("long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); + sizeofLL->addArg(*new SgKeywordValExp("long long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); + sizeofI->addArg(*new SgKeywordValExp("int")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); stmt = new SgIfStmt(SgEqOp(*new SgVarRefExp(idxTypeInKernel), *new SgVarRefExp(*new SgSymbol(VARIABLE_NAME, "rt_LONG"))) && @@ -1589,6 +1592,8 @@ vector Create_C_Adapter_Function_Across_OneThread(SgSymbol *sadap delete[]reduction_ptr; mywarn(" end Adapter Function"); + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(st_hedr, s_loop_ref, 0); return argsKernel; } @@ -1638,8 +1643,8 @@ static inline void insertReductionArgs(SgSymbol **reduction_ptr, SgSymbol **redu //TODO!! if (rsl->locvar) //MAXLOC,MINLOC { - for (int i = 0; i < rsl->number; ++i) - funcCallKernel->addArg(*new SgArrayRefExp(*s, *new SgValueExp(i))); + for (int k = 0; k < rsl->number; ++k) + funcCallKernel->addArg(*new SgArrayRefExp(*reduction_loc_symb[i], *new SgValueExp(k))); s = s->next(); e = new SgCastExp(*C_PointerType(options.isOn(C_CUDA) ? C_Type(rsl->locvar->type()) : new SgDescriptType(*SgTypeChar(), BIT_SIGNED)), *new SgVarRefExp(s)); funcCallKernel->addArg(*e); @@ -1943,6 +1948,7 @@ vector Create_C_Adapter_Function_Across_variants(SgSymbol *sadapt SYMB_SCOPE(s->thesymb) = st_hedr->thebif; stmt = makeSymbolDeclaration(s); st_hedr->insertStmtAfter(*stmt, *st_hedr); + reduction_loc_symb[ln] = s_loc_var; s = sgrid_loc = GridSymbolForRedInAdapter(s, st_hedr); stmt = makeSymbolDeclaration(s); @@ -2395,9 +2401,9 @@ vector Create_C_Adapter_Function_Across_variants(SgSymbol *sadapt SgFunctionCallExp *sizeofLL = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); SgFunctionCallExp *sizeofI = new SgFunctionCallExp(*createNewFunctionSymbol("sizeof")); - sizeofL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); - sizeofLL->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); - sizeofI->addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); + sizeofL->addArg(*new SgKeywordValExp("long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long"))); + sizeofLL->addArg(*new SgKeywordValExp("long long")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "long long"))); + sizeofI->addArg(*new SgKeywordValExp("int")); //addArg(*new SgVarRefExp(new SgSymbol(VARIABLE_NAME, "int"))); stmt = new SgIfStmt(SgEqOp(*new SgVarRefExp(idxTypeInKernel), *new SgVarRefExp(*new SgSymbol(VARIABLE_NAME, "rt_LONG"))) && @@ -3885,6 +3891,8 @@ vector Create_C_Adapter_Function_Across_variants(SgSymbol *sadapt delete[]reduction_symb; delete[]num_elems; mywarn(" end Adapter Function"); + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(st_hedr, s_loop_ref, 0); return argsKernel; } @@ -4197,7 +4205,7 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, S SgSymbol *redGrid = new SgSymbol(VARIABLE_NAME, tmp_list->red_grid->identifier()); redGrid->setType(*new SgArrayType(*tmp_list->red_grid->type())); - st = AssignStatement(*new SgArrayRefExp(*redGrid, *new SgValueExp(0)), *red_expr_ref); + st = AssignStatement(*new SgArrayRefExp(*redGrid, *new SgValueExp(0)), red_expr_ref->copy()); if_st->lastExecutable()->insertStmtAfter(*st); tmp_list = tmp_list->next; } @@ -4227,7 +4235,8 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, S #if debugMode mywarn(" end: CreateLoopKernelAcross"); #endif - + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(kernel_st, skernel, 1); ACROSS_MOD_IN_KERNEL = 0; return kernel_st; } @@ -5353,7 +5362,7 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, i //get info of arrays in private and locvar lists swapDimentionsInprivateList(); if (argsKer->symb.size() == 1 && options.isOn(GPU_O0)) - { + { Translate_Fortran_To_C(mainFor->lexPrev()->controlParent()); Translate_Fortran_To_C(mainFor, mainFor->lastNodeOfStmt(), copyOfBody, 0); //countOfCopies } @@ -5515,7 +5524,7 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, i if (tmp_list->redvar_size == 0) { funcCall->addArg(*new SgArrayRefExp(*redGrid, *new SgVarRefExp(*tid))); - funcCall->addArg(*red_expr_ref); + funcCall->addArg(*new SgVarRefExp(*red_expr_ref->symbol())); st = AssignStatement(*new SgArrayRefExp(*redGrid, *new SgVarRefExp(*tid)), *funcCall); } else if (tmp_list->redvar_size > 0 && options.isOn(C_CUDA)) //TODO for Fortran @@ -5541,7 +5550,7 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, i SgSymbol *emin = argsKer->sizeVars[6]; funcCall->addArg(*new SgArrayRefExp(*redGrid, *new SgVarRefExp(*tid) + *new SgVarRefExp(*tid1) * *new SgVarRefExp(*emin))); - funcCall->addArg(*red_expr_ref); + funcCall->addArg(*new SgVarRefExp(red_expr_ref->symbol())); st = AssignStatement(*new SgArrayRefExp(*redGrid, *new SgVarRefExp(*tid) + *new SgVarRefExp(*tid1) * *new SgVarRefExp(*emin)), *funcCall); } } @@ -5572,7 +5581,7 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, i SgExpression* red_ref = NULL; if (tmp_list->redvar_size == 0) - red_ref = red_expr_ref; + red_ref = &red_expr_ref->copy(); else // TODO red_ref = new SgArrayRefExp(*red_expr_ref->symbol(), *new SgVarRefExp(freeS)); @@ -5590,12 +5599,12 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, i e = &SgEqOp(*new SgArrayRefExp(*redGrid, *e1), *red_ref); else if (num == 9 || num == 10) { - st = AssignStatement(*new SgArrayRefExp(*redGrid, *e1), *red_expr_ref); - ifSt = new SgIfStmt(*red_expr_ref > *new SgArrayRefExp(*redGrid, *e1), *st); + st = AssignStatement(*new SgArrayRefExp(*redGrid, *e1), red_expr_ref->copy()); + ifSt = new SgIfStmt(red_expr_ref->copy() > *new SgArrayRefExp(*redGrid, *e1), *st); for (int i = loc_el_num - 1; i >= 0; i--) { SgSymbol *locGrid = new SgSymbol(VARIABLE_NAME, tmp_list->loc_grid->identifier()); - redGrid->setType(*new SgArrayType(*tmp_list->loc_grid->type())); + locGrid->setType(*new SgArrayType(*tmp_list->loc_grid->type())); if (options.isOn(C_CUDA)) st = AssignStatement(*new SgArrayRefExp(*locGrid, *new SgValueExp(i), *e1), *new SgArrayRefExp(*loc_var_ref->symbol(), *new SgValueExp(i))); @@ -5745,6 +5754,8 @@ SgStatement *CreateLoopKernelAcross(SgSymbol *skernel, ArgsForKernel* argsKer, i // inserting IMPLICIT NONE if (!options.isOn(C_CUDA)) // Fortran-Cuda kernel_st->insertStmtAfter(*new SgStatement(IMPL_DECL), *kernel_st); + if (options.isOn(C_CUDA)) + RenamingCudaFunctionVariables(kernel_st, skernel, 1); ACROSS_MOD_IN_KERNEL = 0; return kernel_st; diff --git a/dvm/fdvm/trunk/fdvm/acc_f2c.cpp b/dvm/fdvm/trunk/fdvm/acc_f2c.cpp index f4c58c2..1a7312e 100644 --- a/dvm/fdvm/trunk/fdvm/acc_f2c.cpp +++ b/dvm/fdvm/trunk/fdvm/acc_f2c.cpp @@ -172,7 +172,7 @@ static char* getNewCycleVar(const char *oldVar) { char *str = new char[strlen(oldVar) + 2]; str[0] = '\0'; - strcat(str, "_"); + strcat(str, "__"); strcat(str, oldVar); return str; } @@ -3179,7 +3179,7 @@ void initF2C_FunctionCalls() handlersOfFunction[string("sinh")] = FunctionParam("sinh", 1, &createNewFCall); handlersOfFunction[string("shifta")] = FunctionParam("shifta", 2, &createNewFCall); handlersOfFunction[string("shiftl")] = FunctionParam("lshft", 2, &createNewFCall); - handlersOfFunction[string("shiftr")] = FunctionParam("rshft", 2, &createNewFCall); + handlersOfFunction[string("shiftr")] = FunctionParam("shiftr", 2, &createNewFCall); handlersOfFunction[string("tan")] = FunctionParam("tan", 1, &createNewFCall); handlersOfFunction[string("tand")] = FunctionParam("tan", 0, &__sindcosdtand_handler); handlersOfFunction[string("tanh")] = FunctionParam("tanh", 1, &createNewFCall); @@ -3391,3 +3391,185 @@ void Translate_Fortran_To_C(SgStatement *firstStmt, SgStatement *lastStmt, vecto printf("END: CONVERTION OF BODY ON LINE %d\n", number_of_loop_line); #endif } + +void ChangeSymbolName(SgSymbol *symb) +{ + char *name = new char[strlen(symb->identifier())+2]; + sprintf(name, "_%s", symb->identifier()); + SYMB_IDENT(symb->thesymb) = name; +} + +void RenamingNewProcedureVariables(SgSymbol *proc_name) +{ + // replacing new procedure names to avoid conflicts with C language keywords and intrinsic function names + SgSymbol *sl; + for(sl = proc_name; sl; sl = sl->next()) + switch(sl->variant()) + { + case VARIABLE_NAME: + case CONST_NAME: + case FIELD_NAME: + case TYPE_NAME: + case LABEL_VAR: + case COMMON_NAME: + case NAMELIST_NAME: + ChangeSymbolName(sl); + break; + default: + break; + } +} + +SgSymbol *hasSameNameAsSource(SgSymbol *symb) +{ + symb_list *sl; + if (!symb) + return NULL; + if (sl=isInSymbListByChar(symb, acc_array_list)) + return sl->symb; + SgExpression *el; + if (newVars.size() != 0) + { + correctPrivateList(RESTORE); + newVars.clear(); + } + for (el = private_list; el; el = el->rhs()) + if (!strcmp(el->lhs()->symbol()->identifier(), symb->identifier())) + return el->lhs()->symbol(); + if (el=isInUsesListByChar(symb->identifier())) + return el->lhs()->symbol(); + for (el = dvm_parallel_dir->expr(2); el; el = el->rhs()) + if (!strcmp(el->lhs()->symbol()->identifier(), symb->identifier())) + return el->lhs()->symbol(); + reduction_operation_list *rl; + for (rl = red_struct_list; rl; rl = rl->next) + { + if(rl->redvar && !strcmp(rl->redvar->identifier(), symb->identifier())) + return rl->redvar; + if(rl->locvar && !strcmp(rl->locvar->identifier(), symb->identifier())) + return rl->locvar; + } + return NULL; +} +/* +void RenamingCudaFunctionVariables(SgStatement *first, SgStatement *last, SgSymbol *k_symb) +{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names + SgSymbol *sl; + for (sl=k_symb->next(); sl; sl=sl->next()) + { + SgSymbol *s_symb = hasSameNameAsSource(sl); + if (s_symb) + { + replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); + ChangeSymbolName(sl); + } + } +} + +void ReplacingVariablesInTranslatedCode(SgStatement *first, SgSymbol *k_symb) +{ // replacing source symbols by kernel symbols of the same name + SgSymbol *sl; + + for (sl=k_symb->next(); sl; sl=sl->next()) + { + if (sl->scope() != kernel_st || sl->variant() != VARIABLE_NAME) + continue; + SgSymbol *s_symb = hasSameNameAsSource(sl); + if (s_symb) + { //printf("::: %s id:%d variant:%d\n",sl->identifier(), sl->id(), sl->variant()); + //replaceSymbInStmtsSameName(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); + first->replaceSymbBySymbSameName(s_symb,sl); + } + } +} + +void RenamingCudaFunctionVariables(SgStatement *first, SgStatement *first_body, SgSymbol *k_symb, int replace_flag) +{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names + if (first_body) + ReplacingVariablesInTranslatedCode(first_body, k_symb); + for (sl=k_symb->next(); sl; sl=sl->next()) + { + if (sl->scope() != kernel_st || sl->variant() != VARIABLE_NAME) + continue; + + SgSymbol *s_symb = hasSameNameAsSource(sl); + if (s_symb) + { + if (replace_flag) + first->replaceSymbBySymb(s_symb,sl); + //replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); + ChangeSymbolName(sl); + } + } +} + +int isCudaVariable(SgSymbol *symb) +{ + if(!strcmp(symb->identifier(), "blocks")) return 1; + if(!strcmp(symb->identifier(), "threads")) return 1; + if(!strcmp(symb->identifier(), "threadIdx")) return 1; + if(!strcmp(symb->identifier(), "blockIdx")) return 1; + if(!strcmp(symb->identifier(), "blockDim")) return 1; + if(!strcmp(symb->identifier(), "gridDim")) return 1; + return 0; +} +*/ + +int sameVariableName(SgSymbol *symb1, SgSymbol *symb2) +{ + if (!symb1 || !symb2 || (symb1->variant() != VARIABLE_NAME && symb1->variant() != CONST_NAME) || symb2->variant() != VARIABLE_NAME && symb2->variant() != CONST_NAME) + return 0; + if (!strcmp (symb1->identifier(), symb2->identifier())) + return 1; + else + return 0; +} + +void replaceSymbolSameNameInExpr(SgExpression *expr, SgSymbol *symb, SgSymbol *s_new) +{ + //SgRecordRefExp *re; + if (!expr || !symb || !s_new) + return; + //if (isSgRecordRefExp(expr)) //&& isCudaVariable(re->recordName())) + // replaceSymbolSameNameInExpr(expr->lhs(), symb, s_new); + if (expr->symbol()) + if (sameVariableName(expr->symbol(), symb)) + expr->setSymbol(s_new); + replaceSymbolSameNameInExpr(expr->lhs(), symb, s_new); + replaceSymbolSameNameInExpr(expr->rhs(), symb, s_new); +} + +void replaceVariableSymbSameNameInStatements(SgStatement *first, SgStatement *last, SgSymbol *symb, SgSymbol *s_new, int replace_flag) +{ + SgStatement *stmt; + for (stmt=first; stmt; stmt = stmt->lexNext()) + { + if (sameVariableName (stmt->symbol(), symb)) + stmt->setSymbol(*s_new); + replaceSymbolSameNameInExpr(stmt->expr(0), symb, s_new); + replaceSymbolSameNameInExpr(stmt->expr(1), symb, s_new); + replaceSymbolSameNameInExpr(stmt->expr(2), symb, s_new); + if (last && stmt == last) + break; + } +} + +void RenamingCudaFunctionVariables(SgStatement *first, SgSymbol *k_symb, int replace_flag) +{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names + SgSymbol *sl; + for (sl=k_symb->next(); sl; sl=sl->next()) + { + if (sl->scope() != first || sl->variant() != VARIABLE_NAME) + continue; + + SgSymbol *s_symb = hasSameNameAsSource(sl); + if (s_symb) + { + if (replace_flag) + replaceVariableSymbSameNameInStatements(first,first->lastNodeOfStmt(), s_symb, sl, replace_flag); + // first->replaceSymbBySymb(s_symb,sl); + //replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); + ChangeSymbolName(sl); + } + } +} diff --git a/dvm/fdvm/trunk/fdvm/calls.cpp b/dvm/fdvm/trunk/fdvm/calls.cpp index a7abbab..5f2c311 100644 --- a/dvm/fdvm/trunk/fdvm/calls.cpp +++ b/dvm/fdvm/trunk/fdvm/calls.cpp @@ -357,6 +357,7 @@ SgStatement *InsertProcedureCopy(SgStatement *st_header, SgSymbol *sproc, int is if (options.isOn(C_CUDA)) { + RenamingNewProcedureVariables(new_sproc); // to avoid conflicts with C language keywords int flagHasDerivedTypeVariables = HasDerivedTypeVariables(new_header); end_st = new_header->lastNodeOfStmt(); diff --git a/dvm/fdvm/trunk/include/dvm.h b/dvm/fdvm/trunk/include/dvm.h index b43f09f..21be837 100644 --- a/dvm/fdvm/trunk/include/dvm.h +++ b/dvm/fdvm/trunk/include/dvm.h @@ -1219,6 +1219,7 @@ void AddRemoteAccessBufferList_ToArrayList(); SgExpression * ExpressionListsUnion(SgExpression *list, SgExpression *alist); SgExpression *isInExprList(SgExpression *e,SgExpression *list); symb_list *isInSymbList(SgSymbol *s, symb_list *slist); +symb_list *isInSymbListByChar(SgSymbol *s, symb_list *slist); symb_list *SymbolListsUnion(symb_list *slist1, symb_list *slist2); void UnregisterVariables(int begin_block); int isDestroyable(SgSymbol *s); @@ -2097,7 +2098,11 @@ void convertExpr(SgExpression*, SgExpression*&); void initSupportedVars(void); void initF2C_FunctionCalls(void); void initIntrinsicFunctionNames(); - +void ChangeSymbolName(SgSymbol *symb); +void RenamingNewProcedureVariables(SgSymbol *proc_name); +SgSymbol *hasSameNameAsSource(SgSymbol *symb); +void RenamingCudaFunctionVariables(SgStatement *first, SgSymbol *k_symb, int replace_flag); +void replaceVariableSymbSameNameInStatements(SgStatement *first, SgStatement *last, SgSymbol *symb, SgSymbol *s_new, int replace_flag); /* acc_across.cpp */ ArgsForKernel *Create_C_Adapter_Function_Across(SgSymbol *sadapter); SgStatement *CreateLoopKernelAcross(SgSymbol*, ArgsForKernel*, SgType*); From 5f4bb71dcfb60c032784a15751ee124cf9f9e488 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Fri, 5 Apr 2024 16:03:18 +0300 Subject: [PATCH 42/68] dead code: fix for variables from loop headers --- .../_src/Transformations/dead_code.cpp | 110 +++++++++++++----- 1 file changed, 80 insertions(+), 30 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 3535963..52f0458 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -14,6 +14,40 @@ using std::set; using std::remove_if; #define PRINT_USELESS_STATEMENTS 1 +#define DEBUG_IR 0 + +// detect wich registers are used at more than one block +// such registers should participate in live analysis to spread information about useful instructions +// such registers appears at loops +static void fillSharedRegs(const map>& cfg, set& shared_regs) +{ + map used_at; + + for (const auto& byFunc : cfg) + { + for (const auto& byBlock : byFunc.second) + { + for (const auto& byIrBlock : byBlock->getInstructions()) + { + auto instr = byIrBlock->getInstruction(); + + set used = { instr->getResult(), instr->getArg1(), instr->getArg2() }; + for (auto arg : used) + { + if(arg && arg->getType() == SAPFOR::CFG_ARG_TYPE::REG) + { + auto it = used_at.find(arg); + + if (it == used_at.end()) + used_at[arg] = byBlock; + else if(it->second != byBlock) + shared_regs.insert(arg); + } + } + } + } + } +} static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, @@ -91,7 +125,7 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru def.erase(e); } - insertIfVar(args.begin(), args.end(), usedByThisBlock); + usedByThisBlock.insert(args.begin(), args.end()); } if ((instr->getOperation() == SAPFOR::CFG_OP::F_CALL || instr->getOperation() == SAPFOR::CFG_OP::PARAM) && fName == "") @@ -130,8 +164,8 @@ static void buildUseDef(SAPFOR::BasicBlock* block, set& use, useful[i] = u; } - insertIfVar(use_with_regs.begin(), use_with_regs.end(), use); - insertIfVar(def_with_regs.begin(), def_with_regs.end(), def); + use.insert(use_with_regs.begin(), use_with_regs.end()); + def.insert(def_with_regs.begin(), def_with_regs.end()); } @@ -145,6 +179,7 @@ private: vector& formal_parameters; const map& funcByName; + const set& shared_regs; public: bool updateJumpStatus() { @@ -249,30 +284,34 @@ public: for (SAPFOR::Argument* arg : use) { - bool this_block = usedByThisBlock.find(arg) != usedByThisBlock.end(); - - if (!this_block) + if(arg && (arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR || + (arg->getType() == SAPFOR::CFG_ARG_TYPE::REG && shared_regs.find(arg) != shared_regs.end()))) { - auto data_it = data.find(arg); + bool this_block = usedByThisBlock.find(arg) != usedByThisBlock.end(); - if (data_it == data.end()) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - - inserted |= bb->addLiveIn({ *data_it }); - } - else - { - auto in_it = in.find(arg); - bool skip = false; - if (in_it != in.end()) + if (!this_block) { - if (in_it->second.size() == 1 && *(in_it->second.begin()) == bb) - skip = true; // nothing to do, inserted = false - else - bb->removeLiveIn(arg); + auto data_it = data.find(arg); + + if (data_it == data.end()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + inserted |= bb->addLiveIn({ *data_it }); + } + else + { + auto in_it = in.find(arg); + bool skip = false; + if (in_it != in.end()) + { + if (in_it->second.size() == 1 && *(in_it->second.begin()) == bb) + skip = true; // nothing to do, inserted = false + else + bb->removeLiveIn(arg); + } + if(!skip) + inserted |= bb->addLiveIn({ { arg, { bb } } }); } - if(!skip) - inserted |= bb->addLiveIn({ { arg, { bb } } }); } } @@ -305,10 +344,12 @@ public: DeadCodeAnalysisNode(SAPFOR::BasicBlock* block, vector& formal_parameters, - const map& funcByName) + const map& funcByName, + const set& shared_regs) : formal_parameters(formal_parameters), - funcByName(funcByName) + funcByName(funcByName), + shared_regs(shared_regs) { setBlock(block); useful.resize(block->getInstructions().size(), false); @@ -322,16 +363,20 @@ class DeadCodeAnalysis : public BackwardDataFlowAnalysis protected: vector& formal_parameters; const map& funcByName; + const set& shared_regs; DeadCodeAnalysisNode* createNode(SAPFOR::BasicBlock* block) override { - return new DeadCodeAnalysisNode(block, formal_parameters, funcByName); + return new DeadCodeAnalysisNode(block, formal_parameters, funcByName, shared_regs); } public: - DeadCodeAnalysis(vector& formal_parameters, const map& funcByName) + DeadCodeAnalysis(vector& formal_parameters, + const map& funcByName, + const set& shared_regs) : formal_parameters(formal_parameters), - funcByName(funcByName) + funcByName(funcByName), + shared_regs(shared_regs) { } }; @@ -403,8 +448,10 @@ void removeDeadCode(SgStatement* func, cfg_pair.second.erase(remove_unreachable_it, cfg_pair.second.end()); +#if DEBUG_IR + dumpCFG({ cfg_pair }, false); +#endif // detect useless code - vector func_parameters(cfg_pair.first->funcParams.countOfPars, NULL); map funcByName; @@ -412,8 +459,11 @@ void removeDeadCode(SgStatement* func, for (auto& byFile : allFuncs) for (auto byFunc : byFile.second) funcByName[byFunc->funcName] = byFunc; + + set shared_regs; + fillSharedRegs({ cfg_pair }, shared_regs); - DeadCodeAnalysis analysis_object(func_parameters, funcByName); + DeadCodeAnalysis analysis_object(func_parameters, funcByName, shared_regs); analysis_object.fit(cfg_pair.second); analysis_object.analyze(); From f5012508d12632791d96a5880e3ab5c06b019aea Mon Sep 17 00:00:00 2001 From: Alexander_KS Date: Fri, 5 Apr 2024 17:40:24 +0000 Subject: [PATCH 43/68] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20sapfor/experts/Sapfor=5F2017/=5Fsrc/Utils/versio?= =?UTF-8?q?n.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 454143e..1289c51 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2303" +#define VERSION_SPF "2304" From e5b4d6cc50a04885779051a2308e8e706ccc8dab Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sat, 6 Apr 2024 17:00:29 +0300 Subject: [PATCH 44/68] dead code: removing of if-else statement --- .../_src/Transformations/dead_code.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 52f0458..bf9511c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -527,20 +527,23 @@ void removeDeadCode(SgStatement* func, for (auto st = start; st != end; st = st->lexNext()) { const int var = st->variant(); - if ((var == FOR_NODE || var == WHILE_NODE || var == IF_NODE || var == SWITCH_NODE) && + if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && st->lexNext()->variant() == CONTROL_END) { remove.push_back(st); - continue; } - - if (var == IF_NODE) + else if (var == IF_NODE) { - SgStatement* ifS = st; - while (ifS->lexNext()->variant() == ELSEIF_NODE) + SgStatement* ifS = st->lexNext(); + while (ifS->variant() == ELSEIF_NODE) ifS = ifS->lexNext(); - if (ifS->lexNext()->variant() == CONTROL_END) + SgStatement* lastNode = st->lastNodeOfStmt(); + + while (ifS->variant() == CONTROL_END && ifS != lastNode) + ifS = ifS->lexNext(); + + if(ifS == lastNode) remove.push_back(st); } From 5f3da5d708dd1eafae8354f50799eb8179ba1952 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sat, 6 Apr 2024 17:52:18 +0300 Subject: [PATCH 45/68] dead code: fix for if-else statements --- .../experts/Sapfor_2017/_src/Transformations/dead_code.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index bf9511c..615c939 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -534,11 +534,12 @@ void removeDeadCode(SgStatement* func, } else if (var == IF_NODE) { - SgStatement* ifS = st->lexNext(); - while (ifS->variant() == ELSEIF_NODE) + SgStatement* ifS = st; + while (ifS->lexNext()->variant() == ELSEIF_NODE) ifS = ifS->lexNext(); - SgStatement* lastNode = st->lastNodeOfStmt(); + SgStatement* lastNode = ifS->lastNodeOfStmt(); + ifS = ifS->lexNext(); while (ifS->variant() == CONTROL_END && ifS != lastNode) ifS = ifS->lexNext(); From 92d4c54eaf06b36e0a7d30c6a59c249eeee1ba4a Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 6 Apr 2024 18:04:59 +0300 Subject: [PATCH 46/68] improved dead code --- .../_src/Transformations/dead_code.cpp | 63 ++++++++++--------- .../Sapfor_2017/_src/Utils/PassManager.h | 2 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 615c939..659eef7 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -521,42 +521,45 @@ void removeDeadCode(SgStatement* func, __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); rem->deleteStmt(); } - - remove.clear(); - //remove empty blocks - for (auto st = start; st != end; st = st->lexNext()) + + //remove empty blocks + do { - const int var = st->variant(); - if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && - st->lexNext()->variant() == CONTROL_END) + remove.clear(); + for (auto st = start; st != end; st = st->lexNext()) { - remove.push_back(st); - } - else if (var == IF_NODE) - { - SgStatement* ifS = st; - while (ifS->lexNext()->variant() == ELSEIF_NODE) - ifS = ifS->lexNext(); - - SgStatement* lastNode = ifS->lastNodeOfStmt(); - ifS = ifS->lexNext(); - - while (ifS->variant() == CONTROL_END && ifS != lastNode) - ifS = ifS->lexNext(); - - if(ifS == lastNode) + const int var = st->variant(); + if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && + st->lexNext()->variant() == CONTROL_END) + { remove.push_back(st); + } + else if (var == IF_NODE) + { + SgStatement* ifS = st; + while (ifS->lexNext()->variant() == ELSEIF_NODE) + ifS = ifS->lexNext(); + + SgStatement* lastNode = ifS->lastNodeOfStmt(); + ifS = ifS->lexNext(); + + while (ifS->variant() == CONTROL_END && ifS != lastNode) + ifS = ifS->lexNext(); + + if (ifS == lastNode) + remove.push_back(st); + } + + //TODO: SWITCH and other block statements } - //TODO: SWITCH and other block statements - } - - for (auto& rem : remove) - { - __spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); - rem->deleteStmt(); - } + for (auto& rem : remove) + { + __spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); + rem->deleteStmt(); + } + } while (remove.size()); deleteCFG(cfg); } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index 0f2e0fe..a5068c3 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -291,7 +291,7 @@ void InitPassesDependencies(map> &passDepsIn, set list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= list({ DUPLICATE_FUNCTIONS, REMOVE_UNUSED_FUNCTIONS }); - list({ CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= list({ LOOPS_SPLITTER, LOOPS_COMBINER, PRIVATE_ARRAYS_EXPANSION, PRIVATE_ARRAYS_SHRINKING, CREATE_PARALLEL_REGIONS, PURE_SAVE_TO_PARAMS, PURE_MODULE_TO_PARAMS, PURE_COMMON_TO_PARAMS, PURE_INTENT_INSERT }); + list({ CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= list({ LOOPS_SPLITTER, LOOPS_COMBINER, PRIVATE_ARRAYS_EXPANSION, PRIVATE_ARRAYS_SHRINKING, CREATE_PARALLEL_REGIONS, PURE_SAVE_TO_PARAMS, PURE_MODULE_TO_PARAMS, PURE_COMMON_TO_PARAMS, PURE_INTENT_INSERT, PRIVATE_REMOVING }); list({ GET_ALL_ARRAY_DECL, FILL_PARALLEL_REG_IR }) <= Pass(CONVERT_ASSIGN_TO_LOOP); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 1289c51..a50dfc5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2304" +#define VERSION_SPF "2305" From 02baed087ff32df0c12e020b7744f29ed5a8e229 Mon Sep 17 00:00:00 2001 From: Grigorii Gusev Date: Sun, 7 Apr 2024 12:05:39 +0300 Subject: [PATCH 47/68] private_removing: update interprocedure analysis --- .../_src/Transformations/private_removing.cpp | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index 37c64d2..ed08c73 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -290,20 +290,17 @@ static bool isSymbolInExpression(SgSymbol* symbol, SgExpression* exp) isSymbolInExpression(symbol, exp->rhs()); } -static FuncInfo* findFunc(string fileName, string funcName, const map>& allFuncInfo) +static FuncInfo* findFuncByName(string funcName, const map>& allFuncInfo) { - auto fileInfo = allFuncInfo.find(fileName); - if (fileInfo == allFuncInfo.end()) - return nullptr; - - for (auto funcInfo : fileInfo->second) - if (funcInfo->funcName == funcName) - return funcInfo; + for (const auto& fileFuncs : allFuncInfo) + for (auto funcInfo : fileFuncs.second) + if (funcInfo->funcName == funcName) + return funcInfo; return nullptr; } -static FuncInfo* getCurrectFunc(SgStatement* stmt, const map>& allFuncInfo) +static FuncInfo* getCurrentFunc(SgStatement* stmt, const map>& allFuncInfo) { auto fileInfo = allFuncInfo.find(stmt->fileName()); if (fileInfo == allFuncInfo.end()) @@ -855,7 +852,7 @@ void removePrivates(string filename, vector& messages, for (auto& dcLoopRem : removeDC) { auto loopStmt = dcLoopRem->loop->GetOriginal(); - FuncInfo* currFunc = getCurrectFunc(loopStmt, allFuncInfo); + FuncInfo* currFunc = getCurrentFunc(loopStmt, allFuncInfo); if (currFunc == nullptr) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -1140,7 +1137,7 @@ static SgForStmt* getLoopStmtForVar(SgStatement* stmt, string loopVar) static vector getFixedSubscriptsVector(SgArrayRefExp* arrayRef, int dimensionsNum = 0, SgStatement* stmt = nullptr) { - if (arrayRef->numberOfSubscripts() == 0) + if (arrayRef == nullptr || arrayRef->numberOfSubscripts() == 0) return vector(dimensionsNum); vector subscriptsVector; @@ -1202,7 +1199,7 @@ static void checkImplicitDirectUsage(Context* ctx, SgExpression* exp, int stmtLi { SgFunctionCallExp* funcCallExp = (SgFunctionCallExp*)exp; string funcName = funcCallExp->funName()->identifier(); - FuncInfo* funcInfo = findFunc(ctx->loopStmt->fileName(), funcName, ctx->allFuncInfo); + FuncInfo* funcInfo = findFuncByName(funcName, ctx->allFuncInfo); if (funcInfo != nullptr) { for (int i = 0; i < funcCallExp->numberOfArgs(); ++i) @@ -1244,8 +1241,8 @@ static vector> checkImplicitDirectUsage(Context* ctx) // st->variant() == PROC_STAT: SgCallStmt* callStmt = (SgCallStmt*)st; string procName = callStmt->name()->identifier(); - FuncInfo* funcInfo = findFunc(callStmt->fileName(), procName, ctx->allFuncInfo); - + FuncInfo* funcInfo = findFuncByName(procName, ctx->allFuncInfo); + for (int i = 0; i < callStmt->numberOfArgs(); ++i) { SgExpression* callArg = callStmt->arg(i); @@ -1295,34 +1292,37 @@ static vector getCommonBlockGroupedVar(FuncInfo* curFunc, SgSymbol* v // checkIndirectUsage returns masks of array indirect usage in function // (indirect usage is usage through common blocks) and writes messages about it -static void checkIndirectUsage(Context* ctx, FuncInfo* curFunc, vector commonBlockGroupedVar, +static void checkIndirectUsage(Context* ctx, FuncInfo* calledFunc, vector commonBlockGroupedVar, set& visitedFuncs, vector>& indirectUsageMasks) { - if (visitedFuncs.find(curFunc->funcName) != visitedFuncs.end()) + if (visitedFuncs.find(calledFunc->funcName) != visitedFuncs.end()) return; - visitedFuncs.insert(curFunc->funcName); + visitedFuncs.insert(calledFunc->funcName); for (Variable* commonBlockVar : commonBlockGroupedVar) { for (const CommonVariableUse& varUse : commonBlockVar->getAllUse()) { - if (varUse.getFileName() != curFunc->fileName || varUse.getFunctionName() != curFunc->funcName) + if (varUse.getFileName() != calledFunc->fileName || varUse.getFunctionName() != calledFunc->funcName) continue; - vector directArrayRefs = getDirectArrayRefs(varUse.getFunction(), varUse.getUseS()); + SgStatement* calledFuncStmt = varUse.getFunction(); + calledFuncStmt->switchToFile(); + vector directArrayRefs = getDirectArrayRefs(calledFuncStmt, varUse.getUseS()); for (auto arrayRef : directArrayRefs) { auto mask = getFixedSubscriptsVector(arrayRef, ctx->dimensionsNum); indirectUsageMasks.push_back(mask); addMessageUsageInFunctionCall(ctx->messages, getDimensionVarName(ctx->arraySymbol, mask), - curFunc->funcName, ctx->loop->lineNum, ctx->loop->lineNum); + calledFunc->funcName, ctx->loop->lineNum, ctx->loop->lineNum); } + ctx->loopStmt->switchToFile(); } } - for (FuncInfo* calledFunc : curFunc->callsFromV) - checkIndirectUsage(ctx, calledFunc, commonBlockGroupedVar, visitedFuncs, indirectUsageMasks); + for (FuncInfo* subCalledFunc : calledFunc->callsFromV) + checkIndirectUsage(ctx, subCalledFunc, commonBlockGroupedVar, visitedFuncs, indirectUsageMasks); } // checkIndirectUsage returns masks of array indirect usage in any function call in loop @@ -1330,7 +1330,7 @@ static void checkIndirectUsage(Context* ctx, FuncInfo* curFunc, vector> checkIndirectUsage(Context* ctx) { vector> indirectUsageMasks; - FuncInfo* currentFunc = getCurrectFunc(ctx->loopStmt, ctx->allFuncInfo); + FuncInfo* currentFunc = getCurrentFunc(ctx->loopStmt, ctx->allFuncInfo); if (currentFunc == nullptr) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -1338,10 +1338,17 @@ static vector> checkIndirectUsage(Context* ctx) if (commonBlockGroupedVar.empty()) return indirectUsageMasks; - set visitedFunctions = { currentFunc->funcName }; - for (FuncInfo* calledFunc : currentFunc->callsFromV) - checkIndirectUsage(ctx, calledFunc, commonBlockGroupedVar, visitedFunctions, indirectUsageMasks); + for (SgStatement* st = ctx->loopStmt->lexNext(); st != ctx->loopStmt->lastNodeOfStmt(); st = st->lexNext()) + { + if (st->variant() == PROC_STAT) + { + SgCallStmt* callStmt = (SgCallStmt*)st; + string procName = callStmt->name()->identifier(); + FuncInfo* calledFunc = findFuncByName(procName, ctx->allFuncInfo); + checkIndirectUsage(ctx, calledFunc, commonBlockGroupedVar, visitedFunctions, indirectUsageMasks); + } + } return indirectUsageMasks; } @@ -2136,8 +2143,8 @@ void removePrivatesAnalysis(string filename, auto filterMasks = checkImplicitAndIndirectUsage(&context); filterArrayRefs(&context, arrayRefs, filterMasks); - context.explicitArrayRefs.swap(arrayRefs); + context.explicitArrayRefs.swap(arrayRefs); if (context.explicitArrayRefs.empty()) continue; From e33fe45a2b9baf7bfe74d6abe8fad9605b52e55d Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sun, 7 Apr 2024 16:38:57 +0300 Subject: [PATCH 48/68] handle contains statement while removing dead code, fix getLive method --- .../_src/CFGraph/live_variable_analysis.cpp | 7 +++- .../_src/Transformations/dead_code.cpp | 33 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp index ad41626..05f6bfb 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using std::string; using std::pair; @@ -138,7 +139,11 @@ namespace SAPFOR for (auto& by_pair : by_source) { auto& dest = res[by_pair.first]; - dest.insert(dest.end(), by_pair.second.begin(), by_pair.second.end()); + auto dest_copy = dest; + + dest.resize(dest_copy.size() + by_pair.second.size()); + + set_union(dest_copy.begin(), dest_copy.end(), by_pair.second.begin(), by_pair.second.end(), dest.begin()); } } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 659eef7..0db25af 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -503,12 +503,29 @@ void removeDeadCode(SgStatement* func, READ_STAT }; + set skip = + { + PROG_HEDR, + PROC_HEDR, + FUNC_HEDR + }; + vector remove; SgStatement* start = intervalDelStart ? intervalDelStart : func; SgStatement* end = intervalDelEnd ? intervalDelEnd : func->lastNodeOfStmt(); - for (auto st = start; st != end; st = st->lexNext()) + auto st = start; + if (skip.find(st->variant()) != skip.end()) + st = st->lexNext(); + + for (; st != end; st = st->lexNext()) { + if (skip.find(st->variant()) != skip.end()) + { + st = st->lastNodeOfStmt(); + continue; + } + if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end()) { remove.push_back(st); @@ -526,9 +543,21 @@ void removeDeadCode(SgStatement* func, do { remove.clear(); - for (auto st = start; st != end; st = st->lexNext()) + + st = start; + if (skip.find(st->variant()) != skip.end()) + st = st->lexNext(); + + for (; st != end; st = st->lexNext()) { const int var = st->variant(); + + if (skip.find(var) != skip.end()) + { + st = st->lastNodeOfStmt(); + continue; + } + if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && st->lexNext()->variant() == CONTROL_END) { From 9bc4fa246cc5d2c9e4736e05196266e72b662e17 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sun, 7 Apr 2024 17:40:30 +0300 Subject: [PATCH 49/68] dead code: improve perfomance by removing unnecessary checks --- .../_src/Transformations/dead_code.cpp | 57 +++---------------- 1 file changed, 7 insertions(+), 50 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 0db25af..5befc48 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -16,39 +16,6 @@ using std::remove_if; #define PRINT_USELESS_STATEMENTS 1 #define DEBUG_IR 0 -// detect wich registers are used at more than one block -// such registers should participate in live analysis to spread information about useful instructions -// such registers appears at loops -static void fillSharedRegs(const map>& cfg, set& shared_regs) -{ - map used_at; - - for (const auto& byFunc : cfg) - { - for (const auto& byBlock : byFunc.second) - { - for (const auto& byIrBlock : byBlock->getInstructions()) - { - auto instr = byIrBlock->getInstruction(); - - set used = { instr->getResult(), instr->getArg1(), instr->getArg2() }; - for (auto arg : used) - { - if(arg && arg->getType() == SAPFOR::CFG_ARG_TYPE::REG) - { - auto it = used_at.find(arg); - - if (it == used_at.end()) - used_at[arg] = byBlock; - else if(it->second != byBlock) - shared_regs.insert(arg); - } - } - } - } - } -} - static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, vector& formal_parameters, @@ -179,7 +146,6 @@ private: vector& formal_parameters; const map& funcByName; - const set& shared_regs; public: bool updateJumpStatus() { @@ -284,8 +250,7 @@ public: for (SAPFOR::Argument* arg : use) { - if(arg && (arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR || - (arg->getType() == SAPFOR::CFG_ARG_TYPE::REG && shared_regs.find(arg) != shared_regs.end()))) + if(arg && (arg->getType() == SAPFOR::CFG_ARG_TYPE::VAR || arg->getType() == SAPFOR::CFG_ARG_TYPE::REG)) { bool this_block = usedByThisBlock.find(arg) != usedByThisBlock.end(); @@ -344,12 +309,10 @@ public: DeadCodeAnalysisNode(SAPFOR::BasicBlock* block, vector& formal_parameters, - const map& funcByName, - const set& shared_regs) + const map& funcByName) : formal_parameters(formal_parameters), - funcByName(funcByName), - shared_regs(shared_regs) + funcByName(funcByName) { setBlock(block); useful.resize(block->getInstructions().size(), false); @@ -363,20 +326,17 @@ class DeadCodeAnalysis : public BackwardDataFlowAnalysis protected: vector& formal_parameters; const map& funcByName; - const set& shared_regs; DeadCodeAnalysisNode* createNode(SAPFOR::BasicBlock* block) override { - return new DeadCodeAnalysisNode(block, formal_parameters, funcByName, shared_regs); + return new DeadCodeAnalysisNode(block, formal_parameters, funcByName); } public: DeadCodeAnalysis(vector& formal_parameters, - const map& funcByName, - const set& shared_regs) + const map& funcByName) : formal_parameters(formal_parameters), - funcByName(funcByName), - shared_regs(shared_regs) + funcByName(funcByName) { } }; @@ -459,11 +419,8 @@ void removeDeadCode(SgStatement* func, for (auto& byFile : allFuncs) for (auto byFunc : byFile.second) funcByName[byFunc->funcName] = byFunc; - - set shared_regs; - fillSharedRegs({ cfg_pair }, shared_regs); - DeadCodeAnalysis analysis_object(func_parameters, funcByName, shared_regs); + DeadCodeAnalysis analysis_object(func_parameters, funcByName); analysis_object.fit(cfg_pair.second); analysis_object.analyze(); From 494a70593002380145f768f24dfce6299f12654c Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sun, 7 Apr 2024 19:06:33 +0300 Subject: [PATCH 50/68] data flow: perfomance improvement --- .../_src/CFGraph/DataFlow/data_flow_impl.h | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h index db33e73..cb8ae41 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/DataFlow/data_flow_impl.h @@ -33,20 +33,18 @@ void DataFlowAnalysisNode::doStep() { if (in_cnt < next->out_cnt) { - for (const auto& byOut : next->getOut()) + const auto& byOut = next->getOut(); + bool inserted = addIn( byOut); + + if (inserted) { - bool inserted = addIn({ byOut }); + if (next->out_cnt > in_max_cnt) + in_max_cnt = next->out_cnt; - if (inserted) - { - if (next->out_cnt > in_max_cnt) - in_max_cnt = next->out_cnt; + inserted = forwardData(byOut); - inserted = forwardData({ byOut }); - - if (inserted && next->out_cnt > out_max_cnt) - out_max_cnt = next->out_cnt; - } + if (inserted && next->out_cnt > out_max_cnt) + out_max_cnt = next->out_cnt; } } } From 1e5ae1ef807a2895e604026bc61ab581afecf95c Mon Sep 17 00:00:00 2001 From: Grigorii Gusev Date: Mon, 8 Apr 2024 17:51:50 +0300 Subject: [PATCH 51/68] private_removing: fix bugreport_1712578151 --- .../Sapfor_2017/_src/Transformations/private_removing.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index ed08c73..0a59ed6 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -1642,6 +1642,9 @@ static vector buildDefUsePairs(Context* ctx, const CFG_Type& CF for (auto& instruction : blockInstructionsVector) { SgStatement* stmt = instruction->getInstruction()->getOperator(); + if (stmt == useInsertedStmt.insertedStmt) + break; + if (stmt->variant() == ASSIGN_STAT && stmt->expr(0)->symbol()->identifier() == defVarName && !isVarChangedBetween(defVarName, stmt, useInsertedStmt.insertedStmt)) From 492df9fe6c5baadcad703820595ba8fa5ee91880 Mon Sep 17 00:00:00 2001 From: Grigorii Gusev Date: Tue, 9 Apr 2024 00:37:44 +0300 Subject: [PATCH 52/68] private_removing: add indirect usage check for func_call expressions --- .../_src/Transformations/private_removing.cpp | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp index 0a59ed6..2bb2b7a 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_removing.cpp @@ -1205,9 +1205,10 @@ static void checkImplicitDirectUsage(Context* ctx, SgExpression* exp, int stmtLi for (int i = 0; i < funcCallExp->numberOfArgs(); ++i) { SgExpression* funcArg = funcCallExp->arg(i); - if (funcInfo->funcParams.isArgOut(i) - && funcArg->symbol() != nullptr - && isEqSymbols(funcArg->symbol(), ctx->arraySymbol)) + if (funcArg->symbol() == nullptr || !isEqSymbols(funcArg->symbol(), ctx->arraySymbol)) + continue; + + if (funcInfo->funcParams.isArgOut(i) || funcArg->lhs() == nullptr) { auto fixedVec = getFixedSubscriptsVector((SgArrayRefExp*)funcArg, ctx->dimensionsNum); fixedSubscripts.push_back(fixedVec); @@ -1295,6 +1296,9 @@ static vector getCommonBlockGroupedVar(FuncInfo* curFunc, SgSymbol* v static void checkIndirectUsage(Context* ctx, FuncInfo* calledFunc, vector commonBlockGroupedVar, set& visitedFuncs, vector>& indirectUsageMasks) { + if (calledFunc == nullptr) + return; + if (visitedFuncs.find(calledFunc->funcName) != visitedFuncs.end()) return; @@ -1325,6 +1329,27 @@ static void checkIndirectUsage(Context* ctx, FuncInfo* calledFunc, vector commonBlockGroupedVar, + set& visitedFuncs, vector>& indirectUsageMasks) +{ + if (exp == nullptr) + return; + + if (exp->variant() == FUNC_CALL) + { + SgFunctionCallExp* funcCallExp = (SgFunctionCallExp*)exp; + string funcName = funcCallExp->funName()->identifier(); + FuncInfo* funcInfo = findFuncByName(funcName, ctx->allFuncInfo); + if (funcInfo != nullptr) + checkIndirectUsage(ctx, funcInfo, commonBlockGroupedVar, visitedFuncs, indirectUsageMasks); + } + + checkIndirectUsage(ctx, exp->lhs(), commonBlockGroupedVar, visitedFuncs, indirectUsageMasks); + checkIndirectUsage(ctx, exp->rhs(), commonBlockGroupedVar, visitedFuncs, indirectUsageMasks); +} + // checkIndirectUsage returns masks of array indirect usage in any function call in loop // (indirect usage is usage through common blocks) and writes messages about it static vector> checkIndirectUsage(Context* ctx) @@ -1348,6 +1373,9 @@ static vector> checkIndirectUsage(Context* ctx) FuncInfo* calledFunc = findFuncByName(procName, ctx->allFuncInfo); checkIndirectUsage(ctx, calledFunc, commonBlockGroupedVar, visitedFunctions, indirectUsageMasks); } + + for (int i = 0; i < 3; ++i) + checkIndirectUsage(ctx, st->expr(i), commonBlockGroupedVar, visitedFunctions, indirectUsageMasks); } return indirectUsageMasks; From 82de4d6f031f077061b719ec4786e2b7bb0c9c5d Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 9 Apr 2024 10:36:46 +0300 Subject: [PATCH 53/68] added method for unparsing an expression in Fortran or C --- dvm/fdvm/trunk/Sage/lib/include/ext_low.h | 1 + dvm/fdvm/trunk/Sage/lib/include/extcxx_low.h | 3 +- dvm/fdvm/trunk/Sage/lib/include/libSage++.h | 6 ++ dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c | 23 +++++++ dvm/fdvm/trunk/fdvm/acc_f2c.cpp | 69 +------------------ dvm/fdvm/trunk/fdvm/dvm.cpp | 8 ++- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 7 files changed, 40 insertions(+), 72 deletions(-) diff --git a/dvm/fdvm/trunk/Sage/lib/include/ext_low.h b/dvm/fdvm/trunk/Sage/lib/include/ext_low.h index ec22029..73a474b 100644 --- a/dvm/fdvm/trunk/Sage/lib/include/ext_low.h +++ b/dvm/fdvm/trunk/Sage/lib/include/ext_low.h @@ -263,6 +263,7 @@ extern void updateTypeAndSymbolInStmts(); extern void updateTypesAndSymbolsInBodyOfRoutine(); extern PTR_SYMB duplicateSymbolOfRoutine(); extern char* UnparseBif_Char(); +char *UnparseLLnode_Char(); extern void UnparseProgram_ThroughAllocBuffer(); diff --git a/dvm/fdvm/trunk/Sage/lib/include/extcxx_low.h b/dvm/fdvm/trunk/Sage/lib/include/extcxx_low.h index 1e51a68..9750dca 100644 --- a/dvm/fdvm/trunk/Sage/lib/include/extcxx_low.h +++ b/dvm/fdvm/trunk/Sage/lib/include/extcxx_low.h @@ -266,6 +266,7 @@ extern "C" { void updateTypeAndSymbolInStmts(...); void updateTypesAndSymbolsInBodyOfRoutine(...); char* UnparseBif_Char(...); - char *UnparseLLND_Char(...); + char *UnparseLLND_Char(...); + char *UnparseLLnode_Char(...); void UnparseProgram_ThroughAllocBuffer(...); } diff --git a/dvm/fdvm/trunk/Sage/lib/include/libSage++.h b/dvm/fdvm/trunk/Sage/lib/include/libSage++.h index 97d6425..c2470f4 100644 --- a/dvm/fdvm/trunk/Sage/lib/include/libSage++.h +++ b/dvm/fdvm/trunk/Sage/lib/include/libSage++.h @@ -382,6 +382,7 @@ public: inline SgExpression ©(); inline SgExpression *copyPtr(); char *unparse(); + inline char *unparse(int lang); //0 - Fortran, 1 - C std::string sunparse(); inline void unparsestdout(); inline SgExpression *IsSymbolInExpression(SgSymbol &symbol); @@ -3819,6 +3820,11 @@ inline char* SgExpression::unparse() { return UnparseLLND_Char(thellnd); } +// podd 08.04.24 +inline char* SgExpression::unparse(int lang) //0 - Fortran, 1 - C +{ + return UnparseLLnode_Char(thellnd,lang); +} inline void SgExpression::unparsestdout() { diff --git a/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c b/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c index 02bf326..320bb45 100644 --- a/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c +++ b/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c @@ -1051,6 +1051,29 @@ char *UnparseBif_Char(bif,lang) return(s); } +/* podd 08.04.24 */ +char *UnparseLLnode_Char(llnd,lang) + PTR_LLND llnd; + int lang; /* ForSrc=0 - Fortran language, CSrc=1 - C language */ +{ + char *s; +/* PTR_BLOB b, bl; +*/ /* podd 15.03.99*/ + if (Check_Lang_Fortran(cur_proj) && lang != CSrc) /*podd 16.12.11*/ + { + Init_Unparser(); + s = filter(Tool_Unparse2_LLnode(llnd)); + } else + { if(lang == CSrc) + Set_Function_Language(CSrc); + Init_Unparser(); + s = Tool_Unparse2_LLnode(llnd); + if(lang == CSrc) + Unset_Function_Language(); + } + return(s); +} + /* Kataev N.A. 03.09.2013 base on UnparseBif_Char with change podd 16.12.11 Kataev N.A. 19.10.2013 fix */ diff --git a/dvm/fdvm/trunk/fdvm/acc_f2c.cpp b/dvm/fdvm/trunk/fdvm/acc_f2c.cpp index 1a7312e..140c86a 100644 --- a/dvm/fdvm/trunk/fdvm/acc_f2c.cpp +++ b/dvm/fdvm/trunk/fdvm/acc_f2c.cpp @@ -3438,7 +3438,7 @@ SgSymbol *hasSameNameAsSource(SgSymbol *symb) return el->lhs()->symbol(); if (el=isInUsesListByChar(symb->identifier())) return el->lhs()->symbol(); - for (el = dvm_parallel_dir->expr(2); el; el = el->rhs()) + for (el = dvm_parallel_dir ? dvm_parallel_dir->expr(2) : NULL; el; el = el->rhs()) if (!strcmp(el->lhs()->symbol()->identifier(), symb->identifier())) return el->lhs()->symbol(); reduction_operation_list *rl; @@ -3451,69 +3451,6 @@ SgSymbol *hasSameNameAsSource(SgSymbol *symb) } return NULL; } -/* -void RenamingCudaFunctionVariables(SgStatement *first, SgStatement *last, SgSymbol *k_symb) -{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names - SgSymbol *sl; - for (sl=k_symb->next(); sl; sl=sl->next()) - { - SgSymbol *s_symb = hasSameNameAsSource(sl); - if (s_symb) - { - replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); - ChangeSymbolName(sl); - } - } -} - -void ReplacingVariablesInTranslatedCode(SgStatement *first, SgSymbol *k_symb) -{ // replacing source symbols by kernel symbols of the same name - SgSymbol *sl; - - for (sl=k_symb->next(); sl; sl=sl->next()) - { - if (sl->scope() != kernel_st || sl->variant() != VARIABLE_NAME) - continue; - SgSymbol *s_symb = hasSameNameAsSource(sl); - if (s_symb) - { //printf("::: %s id:%d variant:%d\n",sl->identifier(), sl->id(), sl->variant()); - //replaceSymbInStmtsSameName(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); - first->replaceSymbBySymbSameName(s_symb,sl); - } - } -} - -void RenamingCudaFunctionVariables(SgStatement *first, SgStatement *first_body, SgSymbol *k_symb, int replace_flag) -{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names - if (first_body) - ReplacingVariablesInTranslatedCode(first_body, k_symb); - for (sl=k_symb->next(); sl; sl=sl->next()) - { - if (sl->scope() != kernel_st || sl->variant() != VARIABLE_NAME) - continue; - - SgSymbol *s_symb = hasSameNameAsSource(sl); - if (s_symb) - { - if (replace_flag) - first->replaceSymbBySymb(s_symb,sl); - //replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); - ChangeSymbolName(sl); - } - } -} - -int isCudaVariable(SgSymbol *symb) -{ - if(!strcmp(symb->identifier(), "blocks")) return 1; - if(!strcmp(symb->identifier(), "threads")) return 1; - if(!strcmp(symb->identifier(), "threadIdx")) return 1; - if(!strcmp(symb->identifier(), "blockIdx")) return 1; - if(!strcmp(symb->identifier(), "blockDim")) return 1; - if(!strcmp(symb->identifier(), "gridDim")) return 1; - return 0; -} -*/ int sameVariableName(SgSymbol *symb1, SgSymbol *symb2) { @@ -3530,8 +3467,6 @@ void replaceSymbolSameNameInExpr(SgExpression *expr, SgSymbol *symb, SgSymbol *s //SgRecordRefExp *re; if (!expr || !symb || !s_new) return; - //if (isSgRecordRefExp(expr)) //&& isCudaVariable(re->recordName())) - // replaceSymbolSameNameInExpr(expr->lhs(), symb, s_new); if (expr->symbol()) if (sameVariableName(expr->symbol(), symb)) expr->setSymbol(s_new); @@ -3567,8 +3502,6 @@ void RenamingCudaFunctionVariables(SgStatement *first, SgSymbol *k_symb, int rep { if (replace_flag) replaceVariableSymbSameNameInStatements(first,first->lastNodeOfStmt(), s_symb, sl, replace_flag); - // first->replaceSymbBySymb(s_symb,sl); - //replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb); ChangeSymbolName(sl); } } diff --git a/dvm/fdvm/trunk/fdvm/dvm.cpp b/dvm/fdvm/trunk/fdvm/dvm.cpp index 2244f69..8d58694 100644 --- a/dvm/fdvm/trunk/fdvm/dvm.cpp +++ b/dvm/fdvm/trunk/fdvm/dvm.cpp @@ -9162,11 +9162,13 @@ int TestType_RTS2(SgType *type) if(bind_ == 0) switch(type->variant()) { case T_BOOL: if (len == 4) return(rt_LOGICAL); - else if(len == 2) return(rt_USHORT); + else if(len == 2) return(rt_USHORT); + else if(len == 1) return(rt_CHAR); else return(rt_UNKNOWN); case T_INT: if (len == 4) return(rt_INT); else if(len == 2) return(rt_SHORT); + else if(len == 1) return(rt_CHAR); else return(rt_UNKNOWN); case T_FLOAT: if (len == 8) return(rt_DOUBLE); @@ -9193,11 +9195,13 @@ int TestType_RTS2(SgType *type) case T_BOOL: if (len == 8) return(rt_ULONG); else if(len == 4) return(rt_LOGICAL); - else if(len == 2) return(rt_USHORT); + else if(len == 2) return(rt_USHORT); + else if(len == 1) return(rt_CHAR); else return(rt_UNKNOWN); case T_INT: if (len == 8) return(rt_LONG); else if(len == 4) return(rt_INT); else if(len == 2) return(rt_SHORT); + else if(len == 1) return(rt_CHAR); else return(rt_UNKNOWN); case T_FLOAT: if (len == 8) return(rt_DOUBLE); else if(len == 4) return(rt_FLOAT); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index a50dfc5..a6f02c2 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2305" +#define VERSION_SPF "2307" From 1b4eb0c5c4eee630c70e0562893a3891bc17c4e5 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 9 Apr 2024 11:51:21 +0300 Subject: [PATCH 54/68] fixed CalculateInteger usage --- sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp | 2 +- sapfor/experts/Sapfor_2017/_src/Inliner/inliner.cpp | 6 +++--- .../Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp | 4 ++-- .../_src/ParallelizationRegions/ParRegions.cpp | 2 +- .../ParallelizationRegions/resolve_par_reg_conflicts.cpp | 2 +- .../Sapfor_2017/_src/Transformations/loops_combiner.cpp | 8 ++++---- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp b/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp index c26682a..74ddd52 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/graph_calls.cpp @@ -328,7 +328,7 @@ static void processActualParams(SgExpression *parList, const maplhs()); + SgExpression* result = CalculateInteger(ex->lhs()->copyPtr()); if (result != ex->lhs()) { currParams.parameters[num] = new int[1]; diff --git a/sapfor/experts/Sapfor_2017/_src/Inliner/inliner.cpp b/sapfor/experts/Sapfor_2017/_src/Inliner/inliner.cpp index 4e1c584..c97531c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Inliner/inliner.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Inliner/inliner.cpp @@ -2320,20 +2320,20 @@ static void createDeclarations(const map>& newSymbs if (t->selector()) { if (t->selector()->variant() == CONST_REF) - t->setSelector(CalculateInteger(t->selector())); + t->setSelector(CalculateInteger(t->selector()->copyPtr())); } if (t->length()) { if (t->length()->variant() == CONST_REF) { - auto result = CalculateInteger(t->length()); + auto result = CalculateInteger(t->length()->copyPtr()); if (result->variant() == INT_VAL) t->setLength(result); } } } - auto result = CalculateInteger(list->lhs()); + auto result = CalculateInteger(list->lhs()->copyPtr()); list->setLhs(result); } list = list->rhs(); diff --git a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp index 8807af9..fa4476d 100644 --- a/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp +++ b/sapfor/experts/Sapfor_2017/_src/LoopAnalyzer/loop_analyzer.cpp @@ -2559,9 +2559,9 @@ SgExpression* getTypeLengthExpr(SgType *t) if (!len && !selector) //the number of bytes is not specified in type declaration statement return (new SgValueExp(getIntrinsicTypeSize(t))); else if (len && !selector) //INTEGER*2,REAL*8,CHARACTER*(N+1) - return CalculateInteger(len); + return CalculateInteger(len->copyPtr()); else - return CalculateInteger(getLengthOfKindExpr(t, selector, len)); //specified kind or/and len + return CalculateInteger(getLengthOfKindExpr(t, selector, len)->copyPtr()); //specified kind or/and len } int getSizeOfType(SgType *t) diff --git a/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/ParRegions.cpp b/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/ParRegions.cpp index 5f6c522..d22d115 100644 --- a/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/ParRegions.cpp +++ b/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/ParRegions.cpp @@ -631,7 +631,7 @@ int printParalleRegions(const char *fileName, vector ®ions) static int getIntVal(SgExpression *ex) { - SgExpression* calc = CalculateInteger(ex); + SgExpression* calc = CalculateInteger(ex->copyPtr()); if (calc->variant() == INT_VAL) return calc->valueInteger(); else diff --git a/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/resolve_par_reg_conflicts.cpp b/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/resolve_par_reg_conflicts.cpp index d848895..4df11ec 100644 --- a/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/resolve_par_reg_conflicts.cpp +++ b/sapfor/experts/Sapfor_2017/_src/ParallelizationRegions/resolve_par_reg_conflicts.cpp @@ -114,7 +114,7 @@ static string getStringDeclaration(SgSymbol *symb) if (SgFile::switchToFile(symb->getFile()->filename()) != -1) { auto stat = symb->makeVarDeclStmt(); - auto res = CalculateInteger(stat->expr(0)); + auto res = CalculateInteger(stat->expr(0)->copyPtr()); stat->setExpression(0, res); decl = stat->unparse(); } diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/loops_combiner.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/loops_combiner.cpp index 87db942..ae5db2e 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/loops_combiner.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/loops_combiner.cpp @@ -131,13 +131,13 @@ static bool isEqExpressions(SgExpression* exp1, SgExpression* exp2) if (exp1 != NULL) { - exp1 = CalculateInteger(exp1); + exp1 = CalculateInteger(exp1->copyPtr()); str1 = exp1->unparse(); } if (exp2 != NULL) { - exp2 = CalculateInteger(exp2); + exp2 = CalculateInteger(exp2->copyPtr()); str2 = exp2->unparse(); } @@ -150,8 +150,8 @@ static bool isOppositeExpressions(SgExpression* exp1, SgExpression* exp2) if (exp1 == NULL || exp2 == NULL) return false; - exp1 = CalculateInteger(exp1); - exp2 = CalculateInteger(exp2); + exp1 = CalculateInteger(exp1->copyPtr()); + exp2 = CalculateInteger(exp2->copyPtr()); if (exp1->variant() == MINUS_OP) return isEqExpressions(exp1->lhs(), exp2); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index a6f02c2..0cfc91a 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2307" +#define VERSION_SPF "2308" From 2b48813783b1ee2750091d4d3c96eb780fc72b23 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 9 Apr 2024 16:41:48 +0300 Subject: [PATCH 55/68] added new directives --- dvm/fdvm/trunk/Sage/h/tag | 4 + dvm/fdvm/trunk/Sage/h/tag.h | 4 + dvm/fdvm/trunk/Sage/lib/include/bif_node.def | 3 + .../trunk/Sage/lib/include/unparseDVM.def | 6 + dvm/fdvm/trunk/parser/fspf.gram | 16 +- dvm/fdvm/trunk/parser/ftn.gram | 1 + dvm/fdvm/trunk/parser/gram1.tab.c | 7550 +++++++++-------- dvm/fdvm/trunk/parser/gram1.tab.h | 18 +- dvm/fdvm/trunk/parser/gram1.y | 20 +- dvm/fdvm/trunk/parser/lexfdvm.c | 4 +- dvm/fdvm/trunk/parser/tag | 4 + dvm/fdvm/trunk/parser/tag.h | 4 + dvm/fdvm/trunk/parser/tokdefs.h | 3 + dvm/fdvm/trunk/parser/tokens | 3 + .../DirectiveProcessing/directive_parser.cpp | 36 +- .../DirectiveProcessing/directive_parser.h | 4 +- .../spf_directive_preproc.cpp | 192 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 11 +- .../_src/Transformations/dead_code.cpp | 15 +- .../_src/Transformations/dead_code.h | 8 +- .../Sapfor_2017/_src/Utils/SgUtils.cpp | 2 +- .../_src/Utils/russian_errors_text.txt | 2 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 23 files changed, 4084 insertions(+), 3828 deletions(-) diff --git a/dvm/fdvm/trunk/Sage/h/tag b/dvm/fdvm/trunk/Sage/h/tag index 3ea61d6..77be3b4 100644 --- a/dvm/fdvm/trunk/Sage/h/tag +++ b/dvm/fdvm/trunk/Sage/h/tag @@ -619,3 +619,7 @@ #define SPF_PARAMETER_OP 969 /* SAPFOR */ #define SPF_CODE_COVERAGE_OP 970 /* SAPFOR */ #define SPF_UNROLL_OP 971 /* SAPFOR */ +#define SPF_COVER_OP 972 /* SAPFOR */ +#define SPF_MERGE_OP 973 /* SAPFOR */ +#define SPF_PROCESS_PRIVATE_OP 974 /* SAPFOR */ + diff --git a/dvm/fdvm/trunk/Sage/h/tag.h b/dvm/fdvm/trunk/Sage/h/tag.h index f09a6cf..38e9115 100644 --- a/dvm/fdvm/trunk/Sage/h/tag.h +++ b/dvm/fdvm/trunk/Sage/h/tag.h @@ -621,3 +621,7 @@ script using "tag". Run make tag.h to regenerate this file */ tag [ SPF_PARAMETER_OP ] = "SPF_PARAMETER_OP"; tag [ SPF_CODE_COVERAGE_OP ] = "SPF_CODE_COVERAGE_OP"; tag [ SPF_UNROLL_OP ] = "SPF_UNROLL_OP"; + tag [ SPF_COVER_OP ] = "SPF_COVER_OP"; + tag [ SPF_MERGE_OP ] = "SPF_MERGE_OP"; + tag [ SPF_PROCESS_PRIVATE_OP ] = "SPF_PROCESS_PRIVATE_OP"; + diff --git a/dvm/fdvm/trunk/Sage/lib/include/bif_node.def b/dvm/fdvm/trunk/Sage/lib/include/bif_node.def index 5b3293a..ee6f4e4 100644 --- a/dvm/fdvm/trunk/Sage/lib/include/bif_node.def +++ b/dvm/fdvm/trunk/Sage/lib/include/bif_node.def @@ -460,6 +460,9 @@ DEFNODECODE(SPF_FLEXIBLE_OP, "nodetext",'e',0,LLNODE, '_','_','_','_','_') DEFNODECODE(SPF_PARAMETER_OP, "nodetext",'e',1,LLNODE, '_','_','_','_','_') DEFNODECODE(SPF_CODE_COVERAGE_OP, "nodetext",'e',0,LLNODE, '_','_','_','_','_') DEFNODECODE(SPF_UNROLL_OP, "nodetext",'e',1,LLNODE, '_','_','_','_','_') +DEFNODECODE(SPF_COVER_OP, "nodetext",'e',1,LLNODE, '_','_','_','_','_') +DEFNODECODE(SPF_MERGE_OP, "nodetext",'e',0,LLNODE, '_','_','_','_','_') +DEFNODECODE(SPF_PROCESS_PRIVATE_OP, "nodetext",'e',1,LLNODE, '_','_','_','_','_') DEFNODECODE(SPF_ANALYSIS_DIR,"nodetext",'s',0,BIFNODE, '_','_','_','_','_') DEFNODECODE(SPF_PARALLEL_DIR,"nodetext",'s',0,BIFNODE, '_','_','_','_','_') diff --git a/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def b/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def index 3e54b9c..2dc62a0 100644 --- a/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def +++ b/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def @@ -432,5 +432,11 @@ DEFNODECODE(SPF_PARAMETER_OP, "PARAMETER (%LL1)", 'e',1,LLNODE) DEFNODECODE(SPF_UNROLL_OP, "UNROLL %IF(%LL1 != %NULL)(%LL1)%ENDIF", 'e',1,LLNODE) +DEFNODECODE(SPF_MERGE_OP, "MERGE", +'e',0,LLNODE) +DEFNODECODE(SPF_COVER_OP, "COVER (%LL1)", +'e',1,LLNODE) +DEFNODECODE(SPF_PROCESS_PRIVATE_OP, "PROCESS_PRIVATE_OP (%LL1)", +'e',1,LLNODE) diff --git a/dvm/fdvm/trunk/parser/fspf.gram b/dvm/fdvm/trunk/parser/fspf.gram index 4633090..a4da9b5 100644 --- a/dvm/fdvm/trunk/parser/fspf.gram +++ b/dvm/fdvm/trunk/parser/fspf.gram @@ -60,17 +60,27 @@ analysis_spec_list: analysis_spec analysis_spec: analysis_reduction_spec | analysis_private_spec - | analysis_parameter_spec + | analysis_process_private_spec + | analysis_parameter_spec + | analysis_cover_spec ; analysis_reduction_spec: needkeyword REDUCTION LEFTPAR reduction_list RIGHTPAR { $$ = make_llnd(fi,REDUCTION_OP,$4,LLNULL,SMNULL); } - ; + ; analysis_private_spec: needkeyword PRIVATE LEFTPAR variable_list RIGHTPAR { $$ = make_llnd(fi,ACC_PRIVATE_OP,$4,LLNULL,SMNULL);} ; +analysis_process_private_spec: needkeyword SPF_PROCESS_PRIVATE LEFTPAR variable_list RIGHTPAR + { $$ = make_llnd(fi,SPF_PROCESS_PRIVATE_OP,$4,LLNULL,SMNULL);} + ; + +analysis_cover_spec: needkeyword SPF_COVER LEFTPAR integer_constant RIGHTPAR + { $$ = make_llnd(fi,SPF_COVER_OP,$4,LLNULL,SMNULL);} + ; + analysis_parameter_spec: needkeyword PARAMETER LEFTPAR spf_parameter_list RIGHTPAR { $$ = make_llnd(fi,SPF_PARAMETER_OP,$4,LLNULL,SMNULL);} ; @@ -128,6 +138,8 @@ transform_spec: needkeyword SPF_NOINLINE { $$ = make_llnd(fi,SPF_UNROLL_OP,LLNULL,LLNULL,SMNULL);} | needkeyword SPF_UNROLL LEFTPAR unroll_list RIGHTPAR { $$ = make_llnd(fi,SPF_UNROLL_OP,$4,LLNULL,SMNULL);} + | needkeyword SPF_MERGE + { $$ = make_llnd(fi,SPF_MERGE_OP,LLNULL,LLNULL,SMNULL);} ; unroll_list: expr COMMA expr COMMA expr diff --git a/dvm/fdvm/trunk/parser/ftn.gram b/dvm/fdvm/trunk/parser/ftn.gram index 5f6ba06..ac40184 100644 --- a/dvm/fdvm/trunk/parser/ftn.gram +++ b/dvm/fdvm/trunk/parser/ftn.gram @@ -281,6 +281,7 @@ static int in_vec = NO; /* set if processing array constructor */ %type spf_directive spf_analysis spf_parallel spf_transform spf_parallel_reg spf_end_parallel_reg %type spf_checkpoint %type analysis_spec_list analysis_spec analysis_reduction_spec analysis_private_spec analysis_parameter_spec +%type analysis_cover_spec analysis_process_private_spec %type parallel_spec_list parallel_spec parallel_shadow_spec parallel_across_spec parallel_remote_access_spec %type transform_spec_list transform_spec array_element_list spf_parameter_list spf_parameter %type characteristic characteristic_list opt_clause_apply_region opt_clause_apply_fragment diff --git a/dvm/fdvm/trunk/parser/gram1.tab.c b/dvm/fdvm/trunk/parser/gram1.tab.c index 930d453..9d27b48 100644 --- a/dvm/fdvm/trunk/parser/gram1.tab.c +++ b/dvm/fdvm/trunk/parser/gram1.tab.c @@ -418,8 +418,11 @@ SPF_APPLY_FRAGMENT = 350, SPF_CODE_COVERAGE = 351, SPF_UNROLL = 352, - BINARY_OP = 355, - UNARY_OP = 356 + SPF_MERGE = 353, + SPF_COVER = 354, + SPF_PROCESS_PRIVATE = 355, + BINARY_OP = 358, + UNARY_OP = 359 }; #endif /* Tokens. */ @@ -775,14 +778,17 @@ #define SPF_APPLY_FRAGMENT 350 #define SPF_CODE_COVERAGE 351 #define SPF_UNROLL 352 -#define BINARY_OP 355 -#define UNARY_OP 356 +#define SPF_MERGE 353 +#define SPF_COVER 354 +#define SPF_PROCESS_PRIVATE 355 +#define BINARY_OP 358 +#define UNARY_OP 359 /* Copy the first part of user declarations. */ -#line 354 "gram1.y" +#line 357 "gram1.y" #include #include "inc.h" @@ -884,7 +890,7 @@ static int in_vec = NO; /* set if processing array constructor */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE -#line 435 "gram1.y" +#line 438 "gram1.y" { int token; char charv; @@ -897,7 +903,7 @@ typedef union YYSTYPE PTR_LABEL label; } /* Line 187 of yacc.c. */ -#line 901 "gram1.tab.c" +#line 907 "gram1.tab.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -907,7 +913,7 @@ typedef union YYSTYPE /* Copy the second part of user declarations. */ -#line 642 "gram1.y" +#line 646 "gram1.y" void add_scope_level(); void delete_beyond_scope_level(); @@ -1055,7 +1061,7 @@ PTR_BFND make_parallelworkshare();/*OMP*/ /* Line 216 of yacc.c. */ -#line 1059 "gram1.tab.c" +#line 1065 "gram1.tab.c" #ifdef short # undef short @@ -1270,20 +1276,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 5799 +#define YYLAST 5895 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 357 +#define YYNTOKENS 360 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 539 +#define YYNNTS 541 /* YYNRULES -- Number of rules. */ -#define YYNRULES 1297 +#define YYNRULES 1302 /* YYNRULES -- Number of states. */ -#define YYNSTATES 2585 +#define YYNSTATES 2596 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 356 +#define YYMAXUTOK 359 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -1326,7 +1332,7 @@ static const yytype_uint16 yytranslate[] = 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 1, 2, 355, 356 + 352, 353, 354, 355, 356, 357, 1, 2, 358, 359 }; #if YYDEBUG @@ -1459,592 +1465,596 @@ static const yytype_uint16 yyprhs[] = 4104, 4106, 4108, 4110, 4114, 4117, 4120, 4122, 4124, 4128, 4131, 4134, 4136, 4138, 4140, 4142, 4144, 4146, 4152, 4158, 4164, 4168, 4179, 4190, 4192, 4196, 4199, 4200, 4207, 4208, - 4215, 4218, 4220, 4224, 4226, 4228, 4230, 4236, 4242, 4248, - 4250, 4254, 4258, 4260, 4264, 4266, 4268, 4270, 4276, 4282, - 4288, 4290, 4294, 4297, 4303, 4306, 4312, 4318, 4321, 4327, - 4333, 4335, 4337, 4341, 4347, 4349, 4353, 4359, 4365, 4371, - 4377, 4385, 4387, 4391, 4394, 4397, 4400, 4403 + 4215, 4218, 4220, 4224, 4226, 4228, 4230, 4232, 4234, 4240, + 4246, 4252, 4258, 4264, 4266, 4270, 4274, 4276, 4280, 4282, + 4284, 4286, 4292, 4298, 4304, 4306, 4310, 4313, 4319, 4322, + 4328, 4334, 4337, 4343, 4346, 4352, 4354, 4356, 4360, 4366, + 4368, 4372, 4378, 4384, 4390, 4396, 4404, 4406, 4410, 4413, + 4416, 4419, 4422 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 358, 0, -1, -1, 358, 359, 116, -1, 360, 361, - 578, -1, 360, 378, 578, -1, 360, 523, 578, -1, - 360, 133, 374, -1, 360, 247, -1, 257, -1, 1, - -1, 150, -1, 193, 362, 369, -1, 57, 362, 370, - -1, 233, 362, 364, 371, -1, 363, 233, 362, 364, - 371, -1, 124, 362, 365, 371, 367, -1, 366, 371, - 367, -1, 114, 368, 371, 367, -1, 164, 362, 368, - -1, -1, 202, 375, -1, 195, 375, -1, 95, 375, - -1, 368, -1, 368, -1, 399, 124, 362, 368, -1, - 399, 363, 124, 362, 368, -1, 363, 124, 362, 368, - -1, 363, 399, 124, 362, 368, -1, 375, 376, -1, - 375, 213, 15, 368, 21, -1, 129, -1, -1, 368, - -1, -1, 368, -1, -1, 15, 21, -1, 15, 372, - 21, -1, 373, -1, 372, 8, 373, -1, 368, -1, - 5, -1, 64, -1, -1, -1, -1, 383, -1, 384, - -1, 385, -1, 415, -1, 411, -1, 579, -1, 420, - -1, 421, -1, 422, -1, 480, -1, 401, -1, 416, - -1, 426, -1, 216, 490, -1, 216, 490, 491, 457, - -1, 123, 489, -1, 183, 490, 15, 463, 21, -1, - 391, -1, 392, -1, 397, -1, 394, -1, 396, -1, - 412, -1, 413, -1, 414, -1, 379, -1, 467, -1, - 465, -1, 393, -1, 142, 490, -1, 142, 490, 368, - -1, 141, 490, 15, 381, 21, -1, 140, 490, 15, - 26, 21, -1, 107, 532, -1, 10, -1, 380, -1, - 382, -1, 17, -1, 16, -1, 5, -1, 9, -1, + 361, 0, -1, -1, 361, 362, 116, -1, 363, 364, + 581, -1, 363, 381, 581, -1, 363, 526, 581, -1, + 363, 133, 377, -1, 363, 247, -1, 257, -1, 1, + -1, 150, -1, 193, 365, 372, -1, 57, 365, 373, + -1, 233, 365, 367, 374, -1, 366, 233, 365, 367, + 374, -1, 124, 365, 368, 374, 370, -1, 369, 374, + 370, -1, 114, 371, 374, 370, -1, 164, 365, 371, + -1, -1, 202, 378, -1, 195, 378, -1, 95, 378, + -1, 371, -1, 371, -1, 402, 124, 365, 371, -1, + 402, 366, 124, 365, 371, -1, 366, 124, 365, 371, + -1, 366, 402, 124, 365, 371, -1, 378, 379, -1, + 378, 213, 15, 371, 21, -1, 129, -1, -1, 371, + -1, -1, 371, -1, -1, 15, 21, -1, 15, 375, + 21, -1, 376, -1, 375, 8, 376, -1, 371, -1, + 5, -1, 64, -1, -1, -1, -1, 386, -1, 387, + -1, 388, -1, 418, -1, 414, -1, 582, -1, 423, + -1, 424, -1, 425, -1, 483, -1, 404, -1, 419, + -1, 429, -1, 216, 493, -1, 216, 493, 494, 460, + -1, 123, 492, -1, 183, 493, 15, 466, 21, -1, + 394, -1, 395, -1, 400, -1, 397, -1, 399, -1, + 415, -1, 416, -1, 417, -1, 382, -1, 470, -1, + 468, -1, 396, -1, 142, 493, -1, 142, 493, 371, + -1, 141, 493, 15, 384, 21, -1, 140, 493, 15, + 26, 21, -1, 107, 535, -1, 10, -1, 383, -1, + 385, -1, 17, -1, 16, -1, 5, -1, 9, -1, 37, -1, 23, -1, 22, -1, 35, -1, 38, -1, 34, -1, 25, -1, 32, -1, 29, -1, 28, -1, - 31, -1, 30, -1, 33, -1, 24, -1, 245, 490, - 491, 368, -1, 245, 8, 490, 375, 390, 491, 368, - -1, 112, 490, -1, 112, 490, 368, -1, 399, 386, - 368, 490, 473, 405, 410, -1, 385, 8, 368, 473, - 405, 410, -1, -1, 7, 7, -1, 8, 375, 387, - 7, 7, -1, 388, -1, 387, 8, 375, 388, -1, - 183, -1, 390, -1, 44, -1, 87, 473, -1, 119, - -1, 145, 15, 389, 21, -1, 143, -1, 178, -1, - 187, -1, 216, -1, 230, -1, 236, -1, 375, 148, - -1, 375, 180, -1, 375, 147, -1, 194, -1, 191, - -1, 145, 490, 15, 389, 21, 491, 368, -1, 391, - 8, 368, -1, 178, 490, 491, 368, -1, 392, 8, - 368, -1, 230, 490, 491, 419, -1, 393, 8, 419, - -1, 191, 490, -1, 191, 490, 491, 395, 459, -1, - -1, 219, 490, -1, 194, 490, -1, 194, 490, 491, - 398, 459, -1, -1, 403, 400, 407, 400, -1, 244, - 15, 368, 21, 400, -1, -1, 402, 368, -1, 401, - 8, 368, -1, 13, -1, 6, -1, 404, -1, 144, + 31, -1, 30, -1, 33, -1, 24, -1, 245, 493, + 494, 371, -1, 245, 8, 493, 378, 393, 494, 371, + -1, 112, 493, -1, 112, 493, 371, -1, 402, 389, + 371, 493, 476, 408, 413, -1, 388, 8, 371, 476, + 408, 413, -1, -1, 7, 7, -1, 8, 378, 390, + 7, 7, -1, 391, -1, 390, 8, 378, 391, -1, + 183, -1, 393, -1, 44, -1, 87, 476, -1, 119, + -1, 145, 15, 392, 21, -1, 143, -1, 178, -1, + 187, -1, 216, -1, 230, -1, 236, -1, 378, 148, + -1, 378, 180, -1, 378, 147, -1, 194, -1, 191, + -1, 145, 493, 15, 392, 21, 494, 371, -1, 394, + 8, 371, -1, 178, 493, 494, 371, -1, 395, 8, + 371, -1, 230, 493, 494, 422, -1, 396, 8, 422, + -1, 191, 493, -1, 191, 493, 494, 398, 462, -1, + -1, 219, 493, -1, 194, 493, -1, 194, 493, 494, + 401, 462, -1, -1, 406, 403, 410, 403, -1, 244, + 15, 371, 21, 403, -1, -1, 405, 371, -1, 404, + 8, 371, -1, 13, -1, 6, -1, 407, -1, 144, -1, 200, -1, 68, -1, 90, -1, 91, -1, 154, - -1, 63, -1, -1, 406, -1, 5, 553, 510, 554, - 400, -1, 5, 553, 15, 554, 5, 21, -1, 5, - 553, 15, 554, 496, 21, -1, -1, 406, -1, 15, - 574, 408, 409, 21, -1, 15, 574, 408, 409, 8, - 574, 408, 409, 21, -1, 496, -1, 5, -1, 565, - 496, -1, 565, 5, -1, -1, -1, 26, 496, -1, - 18, 496, -1, 87, 491, 490, 368, 473, -1, 411, - 8, 368, 473, -1, 44, 490, 491, 419, -1, 412, - 8, 419, -1, 187, 490, 491, 419, -1, 413, 8, - 419, -1, 236, 490, 491, 419, -1, 414, 8, 419, - -1, 67, 490, 419, -1, 67, 490, 418, 419, -1, - 415, 547, 418, 547, 419, -1, 415, 8, 419, -1, - 167, 490, 417, 499, -1, 416, 547, 417, 547, 499, - -1, 416, 8, 499, -1, 37, 368, 37, -1, 23, - -1, 37, 368, 37, -1, 368, 473, -1, 119, 490, - 491, 368, -1, 420, 8, 368, -1, 143, 490, 491, - 368, -1, 421, 8, 368, -1, 117, 490, 423, -1, - 422, 8, 423, -1, 15, 424, 21, -1, 425, 8, - 425, -1, 424, 8, 425, -1, 368, -1, 368, 15, - 495, 21, -1, 504, -1, 427, -1, 80, 489, 428, - 430, -1, 427, 547, 430, -1, -1, -1, 431, 37, - 432, 37, -1, 433, -1, 431, 8, 433, -1, 444, - -1, 432, 8, 444, -1, 434, 436, -1, 434, 436, - 437, -1, 434, 436, 438, -1, 434, 436, 437, 438, - -1, 434, 441, -1, -1, 368, -1, 368, -1, 15, - 439, 21, -1, 15, 440, 7, 440, 21, -1, 453, - -1, 439, 8, 453, -1, -1, 453, -1, 15, 442, - 8, 435, 26, 439, 21, -1, 443, -1, 442, 8, - 443, -1, 436, 437, -1, 436, 438, -1, 436, 437, - 438, -1, 441, -1, 445, -1, 434, 435, 5, 445, - -1, 448, 5, 445, -1, 434, 435, -1, 447, -1, - 449, -1, 451, -1, 36, -1, 36, 246, 513, -1, - 27, -1, 27, 246, 513, -1, 64, -1, 446, -1, - 434, 499, 15, 574, 492, 21, -1, 59, -1, 448, - -1, 17, 448, -1, 16, 448, -1, 149, -1, 149, - 246, 513, -1, 450, -1, 17, 450, -1, 16, 450, - -1, 201, -1, 201, 246, 513, -1, 92, -1, 92, - 246, 513, -1, 15, 452, 8, 452, 21, -1, 449, - -1, 447, -1, 454, -1, 17, 454, -1, 16, 454, - -1, 453, 17, 454, -1, 453, 16, 454, -1, 455, - -1, 454, 5, 455, -1, 454, 37, 455, -1, 456, - -1, 456, 9, 455, -1, 149, -1, 435, -1, 15, - 453, 21, -1, 458, -1, 457, 8, 458, -1, 419, - -1, 418, -1, 460, 462, 461, -1, 459, 8, 460, - 462, 461, -1, -1, -1, 368, -1, 177, 15, 381, - 21, -1, 47, 15, 26, 21, -1, 464, -1, 463, - 8, 464, -1, 368, 26, 496, -1, 163, 466, -1, - 368, -1, 466, 8, 368, -1, 248, 490, 468, -1, - 248, 490, 468, 8, 377, 471, -1, 248, 490, 468, - 8, 377, 172, -1, 248, 490, 468, 8, 377, 172, - 469, -1, 368, -1, 470, -1, 469, 8, 470, -1, - 472, -1, 368, -1, 472, -1, 471, 8, 472, -1, - 368, 18, 368, -1, -1, 15, 474, 21, -1, -1, - 475, 476, -1, 474, 8, 476, -1, 477, -1, 7, - -1, 496, 7, -1, 496, 7, 477, -1, 5, -1, - 496, -1, 479, -1, 478, 8, 479, -1, 149, -1, - 130, 490, 481, -1, 131, -1, 482, -1, 481, 8, - 482, -1, 483, 15, 486, 21, -1, -1, 484, 485, - -1, 231, 404, -1, 399, -1, 487, -1, 486, 8, - 487, -1, 488, -1, 488, 16, 488, -1, 129, -1, - -1, -1, -1, 7, 7, -1, -1, 494, -1, 496, - -1, 514, -1, 565, 496, -1, 574, 493, -1, 494, - 8, 574, 493, -1, 496, -1, 495, 8, 496, -1, - 497, -1, 15, 496, 21, -1, 512, -1, 500, -1, - 508, -1, 515, -1, 496, 17, 496, -1, 496, 16, - 496, -1, 496, 5, 496, -1, 496, 37, 496, -1, - 496, 9, 496, -1, 380, 496, -1, 17, 496, -1, - 16, 496, -1, 496, 25, 496, -1, 496, 29, 496, - -1, 496, 31, 496, -1, 496, 28, 496, -1, 496, - 30, 496, -1, 496, 32, 496, -1, 496, 24, 496, - -1, 496, 33, 496, -1, 496, 38, 496, -1, 496, - 35, 496, -1, 496, 22, 496, -1, 34, 496, -1, - 496, 23, 496, -1, 496, 380, 496, -1, 17, -1, - 16, -1, 368, -1, 499, -1, 502, -1, 501, -1, - 499, 15, 574, 492, 21, -1, 499, 15, 574, 492, - 21, 506, -1, 502, 15, 492, 21, -1, 502, 15, - 492, 21, 506, -1, 500, 3, 129, -1, 499, -1, - 502, -1, 499, 15, 574, 492, 21, -1, 502, 15, - 492, 21, -1, 499, 506, -1, -1, 506, -1, 15, - 507, 7, 507, 21, -1, -1, 496, -1, 509, -1, - 509, 246, 513, -1, 510, -1, 510, 246, 513, -1, - 511, 505, -1, 36, -1, 27, -1, 201, -1, 92, - -1, 149, -1, 64, -1, 499, 246, 64, -1, 510, - 246, 64, -1, 15, 497, 8, 497, 21, -1, 499, - -1, 510, -1, 496, 7, 496, -1, 496, 7, -1, - 496, 7, 496, 7, 496, -1, 496, 7, 7, 496, - -1, 7, 496, 7, 496, -1, 7, 7, 496, -1, - 7, 496, -1, 7, -1, -1, -1, 14, 409, 516, - 571, 517, 20, -1, 499, -1, 502, -1, 503, -1, - 519, 8, 574, 503, -1, 519, 8, 574, 565, 499, - -1, 518, -1, 520, 8, 574, 518, -1, 520, 8, - 574, 565, 499, -1, -1, 499, -1, 522, 8, 499, - -1, 544, -1, 543, -1, 526, -1, 534, 526, -1, - 102, 552, 532, -1, 103, 552, 531, -1, 108, 532, - -1, 524, -1, 534, 524, -1, 535, 544, -1, 535, - 239, -1, 534, 535, 239, -1, 97, 552, 15, 496, - 21, 239, 531, -1, 96, 552, 531, -1, 106, 552, - 531, -1, 527, -1, 76, 552, -1, 536, 544, -1, - 536, -1, 534, 536, -1, 105, 552, 531, -1, 580, - -1, 844, -1, 862, -1, 89, 552, 15, 496, 21, - -1, 89, 552, 553, 542, 554, 614, 525, -1, -1, - 8, 375, 254, 15, 496, 21, -1, 254, 15, 496, - 21, -1, 185, 552, 553, 542, 554, 547, 540, 26, - 496, 8, 496, -1, 185, 552, 553, 542, 554, 547, - 540, 26, 496, 8, 496, 8, 496, -1, 62, 552, - 528, 531, -1, 84, 552, 531, -1, 110, 552, 531, - -1, 218, 552, 375, 62, 15, 496, 21, -1, 534, - 218, 552, 375, 62, 15, 496, 21, -1, 15, 530, - 21, -1, 496, -1, 496, 7, -1, 7, 496, -1, - 496, 7, 496, -1, 529, -1, 530, 8, 529, -1, - -1, 368, -1, -1, 368, -1, 75, -1, 533, 7, - -1, 155, 552, 15, 496, 21, -1, 122, 552, 15, - 537, 539, 21, -1, 538, -1, 537, 8, 538, -1, - 540, 26, 514, -1, -1, 8, 496, -1, 368, -1, - 540, 26, 496, 8, 496, -1, 540, 26, 496, 8, - 496, 8, 496, -1, -1, 149, -1, 113, 552, 531, - -1, 98, 552, 531, -1, 98, 552, 15, 496, 21, - 531, -1, 252, 552, 15, 496, 21, -1, 534, 252, - 552, 15, 496, 21, -1, 545, 496, 26, 496, -1, - 188, 552, 500, 18, 496, -1, 48, 552, 479, 240, - 368, -1, 77, 552, -1, 546, -1, 555, -1, 46, - 552, 15, 496, 21, 479, 8, 479, 8, 479, -1, - 548, -1, 548, 15, 21, -1, 548, 15, 549, 21, - -1, 214, 552, 507, -1, 551, 552, 507, -1, 79, - 552, 531, -1, 115, 552, 531, -1, 45, 552, 15, - 521, 519, 21, -1, 81, 552, 15, 521, 520, 21, - -1, 170, 552, 15, 522, 21, -1, 253, 552, 15, - 496, 21, 500, 26, 496, -1, 152, 429, -1, 186, - 552, 479, -1, 49, 552, 368, -1, 49, 552, 368, - 547, 15, 478, 21, -1, 69, 552, 15, 478, 21, - 547, 496, -1, -1, 8, -1, 61, 552, 368, 574, - -1, 574, 550, -1, 549, 8, 574, 550, -1, 496, - -1, 565, 496, -1, 5, 479, -1, 184, -1, 232, - -1, -1, -1, -1, 556, 562, -1, 556, 577, -1, - 556, 5, -1, 556, 9, -1, 558, 562, -1, 560, - -1, 566, 562, -1, 566, 561, -1, 566, 562, 569, - -1, 566, 561, 8, 569, -1, 567, 562, -1, 567, - 562, 571, -1, 568, -1, 568, 8, 571, -1, 557, - 552, 575, -1, 53, -1, 215, -1, 104, -1, 559, - 552, 575, -1, 176, -1, 66, -1, 139, 552, 575, - 562, -1, 139, 552, 575, 562, 571, -1, 577, -1, - 5, -1, 15, 576, 21, -1, 15, 563, 21, -1, - 564, -1, 563, 8, 574, 564, -1, 576, -1, 5, - -1, 9, -1, 565, 496, -1, 565, 5, -1, 565, - 9, -1, 166, -1, 197, 552, 575, -1, 256, 552, - 575, -1, 190, 552, 576, 575, -1, 190, 552, 5, - 575, -1, 570, -1, 569, 8, 570, -1, 500, -1, - 15, 569, 8, 541, 21, -1, 497, -1, 573, -1, - 572, -1, 497, 8, 497, -1, 497, 8, 573, -1, - 573, 8, 497, -1, 573, 8, 573, -1, 572, 8, - 497, -1, 572, 8, 573, -1, 512, -1, 15, 496, - 21, -1, 15, 497, 8, 541, 21, -1, 15, 573, - 8, 541, 21, -1, 15, 572, 8, 541, 21, -1, - -1, -1, 577, -1, 15, 576, 21, -1, 500, -1, - 508, -1, 576, 498, 576, -1, 576, 5, 576, -1, - 576, 37, 576, -1, 576, 9, 576, -1, 498, 576, - -1, 576, 23, 576, -1, 129, 26, 496, -1, -1, - 257, -1, 581, -1, 629, -1, 604, -1, 583, -1, - 594, -1, 589, -1, 641, -1, 644, -1, 722, -1, - 586, -1, 595, -1, 597, -1, 599, -1, 601, -1, - 649, -1, 655, -1, 652, -1, 781, -1, 779, -1, - 605, -1, 630, -1, 659, -1, 711, -1, 709, -1, - 710, -1, 712, -1, 713, -1, 714, -1, 715, -1, - 716, -1, 724, -1, 726, -1, 731, -1, 728, -1, - 730, -1, 734, -1, 732, -1, 733, -1, 745, -1, - 749, -1, 750, -1, 753, -1, 752, -1, 754, -1, - 755, -1, 756, -1, 757, -1, 658, -1, 739, -1, - 740, -1, 741, -1, 744, -1, 758, -1, 761, -1, - 766, -1, 771, -1, 773, -1, 774, -1, 775, -1, - 776, -1, 778, -1, 737, -1, 780, -1, 82, 490, - 582, -1, 581, 8, 582, -1, 368, 473, -1, 94, - 490, 584, -1, 585, -1, 584, 8, 585, -1, 368, - -1, 138, 490, 587, -1, 588, -1, 587, 8, 588, - -1, 368, -1, 228, 490, 593, 590, -1, 15, 591, - 21, -1, 592, -1, 591, 8, 592, -1, 496, -1, - 496, 7, 496, -1, 7, 15, 495, 21, -1, 368, - -1, 259, 490, 368, 473, -1, 303, 490, 368, 473, - -1, 594, 8, 368, 473, -1, 136, 490, 596, -1, - 595, 8, 596, -1, 368, -1, 211, 490, 598, -1, - 597, 8, 598, -1, 368, -1, 205, 490, 600, -1, - 599, 8, 600, -1, 368, -1, 70, 490, 602, -1, - 601, 8, 602, -1, 368, -1, 175, 368, 473, -1, - -1, 88, 490, 608, 611, 603, -1, 204, 552, 608, - 612, 614, 603, -1, 204, 552, 612, 614, 603, 7, - 7, 606, -1, 607, -1, 606, 8, 607, -1, 608, - -1, 609, -1, 368, -1, 368, 15, 495, 21, -1, - 368, -1, -1, 612, 614, -1, 15, 613, 21, -1, - 614, 615, -1, 613, 8, 614, 615, -1, -1, 58, - -1, 58, 15, 574, 628, 21, -1, 126, 15, 616, - 21, -1, 258, 15, 616, 8, 496, 21, -1, 165, - 15, 496, 21, -1, 5, -1, 137, 15, 616, 21, - -1, 86, 15, 617, 21, -1, 368, -1, 15, 618, - 21, 375, 255, 620, -1, 619, -1, 618, 8, 619, - -1, 496, -1, 496, 7, 496, -1, 621, -1, 621, - 15, 622, 21, -1, 368, -1, 623, -1, 622, 8, - 623, -1, 496, -1, 770, -1, 40, 624, 625, -1, - 368, -1, -1, 626, -1, 17, 627, -1, 625, 17, - 627, -1, 496, -1, 565, 496, -1, 565, 496, 8, - 565, 496, -1, 43, 490, 632, 634, -1, 199, 552, - 633, 634, -1, 199, 552, 634, 7, 7, 631, -1, - 633, -1, 631, 8, 633, -1, 368, -1, 499, -1, - 15, 639, 21, 375, 255, 635, -1, 638, 15, 636, - 21, -1, 637, -1, 636, 8, 637, -1, 496, -1, - 5, -1, 514, -1, 368, -1, 640, -1, 639, 8, - 640, -1, 368, -1, 5, -1, 7, -1, 642, 7, - 7, 490, 368, 473, -1, 641, 8, 368, 473, -1, - 643, -1, 642, 8, 375, 643, -1, 82, -1, 259, - -1, 303, -1, 94, -1, 87, 15, 474, 21, -1, - 228, 590, -1, 43, 15, 639, 21, 375, 255, 635, - -1, 43, -1, 88, 612, 614, 603, -1, 88, -1, - 67, -1, 399, 8, 375, 93, 490, 15, 645, 21, - 7, 7, 647, -1, -1, 646, 7, -1, 645, 8, - 7, -1, 648, -1, 647, 8, 648, -1, 368, -1, - 127, 490, 650, -1, 651, -1, 650, 8, 651, -1, - 368, -1, 74, 490, 653, -1, 654, -1, 653, 8, - 654, -1, 368, -1, 51, 490, 656, -1, 51, 490, - 8, 375, 67, 7, 7, 656, -1, 657, -1, 656, - 8, 657, -1, 368, 473, -1, 168, 552, -1, 182, - 552, 15, 660, 21, 661, 665, -1, 499, -1, 660, - 8, 499, -1, 614, 173, 662, -1, 614, -1, 499, - 15, 663, 21, -1, 664, -1, 663, 8, 664, -1, - 496, -1, 5, -1, -1, 666, -1, 667, -1, 666, - 667, -1, 671, -1, 694, -1, 702, -1, 668, -1, - 678, -1, 680, -1, 679, -1, 669, -1, 672, -1, - 673, -1, 676, -1, 8, 375, 209, 15, 717, 7, - 718, 21, -1, 8, 375, 209, 15, 718, 21, -1, - 8, 375, 71, 15, 670, 7, 718, 21, -1, 8, - 375, 71, 15, 718, 21, -1, 368, -1, 8, 375, - 169, 15, 675, 21, -1, 8, 375, 282, 15, 675, - 21, -1, 8, 375, 191, 15, 675, 21, -1, 8, - 375, 320, 15, 674, 21, -1, 496, -1, 496, 8, - 496, -1, 496, 8, 496, 8, 496, -1, 500, -1, - 675, 8, 500, -1, 8, 375, 322, 15, 677, 21, - -1, 662, -1, 677, 8, 662, -1, 8, 375, 135, - 15, 717, 7, 735, 21, -1, 8, 375, 135, 15, - 735, 21, -1, 8, 375, 229, 15, 496, 21, -1, - 8, 375, 41, 681, -1, 8, 375, 41, 681, 681, - -1, 15, 682, 683, 684, 21, -1, -1, 148, 7, - -1, 180, 7, -1, -1, 685, -1, 684, 8, 685, - -1, 707, -1, 707, 15, 686, 21, -1, 707, 15, - 686, 21, 15, 688, 21, -1, 687, -1, 686, 8, - 687, -1, 496, 7, 496, -1, 689, -1, 688, 8, - 689, -1, 690, 7, 691, 7, 692, -1, 690, 7, - 691, -1, 690, 7, 692, -1, 690, -1, 691, 7, - 692, -1, 691, -1, 692, -1, 375, 217, 693, -1, - 375, 157, 693, -1, 375, 128, 693, -1, 15, 494, - 21, -1, 8, 375, 208, 15, 695, 699, 696, 8, - 698, 21, -1, 8, 375, 208, 15, 695, 699, 696, - 21, -1, 8, 375, 208, 15, 695, 697, 696, 7, - 698, 21, -1, -1, -1, 368, -1, 375, 699, -1, - 698, 8, 375, 699, -1, 700, 15, 500, 21, -1, - 701, 15, 675, 8, 496, 21, -1, 234, -1, 192, + -1, 63, -1, -1, 409, -1, 5, 556, 513, 557, + 403, -1, 5, 556, 15, 557, 5, 21, -1, 5, + 556, 15, 557, 499, 21, -1, -1, 409, -1, 15, + 577, 411, 412, 21, -1, 15, 577, 411, 412, 8, + 577, 411, 412, 21, -1, 499, -1, 5, -1, 568, + 499, -1, 568, 5, -1, -1, -1, 26, 499, -1, + 18, 499, -1, 87, 494, 493, 371, 476, -1, 414, + 8, 371, 476, -1, 44, 493, 494, 422, -1, 415, + 8, 422, -1, 187, 493, 494, 422, -1, 416, 8, + 422, -1, 236, 493, 494, 422, -1, 417, 8, 422, + -1, 67, 493, 422, -1, 67, 493, 421, 422, -1, + 418, 550, 421, 550, 422, -1, 418, 8, 422, -1, + 167, 493, 420, 502, -1, 419, 550, 420, 550, 502, + -1, 419, 8, 502, -1, 37, 371, 37, -1, 23, + -1, 37, 371, 37, -1, 371, 476, -1, 119, 493, + 494, 371, -1, 423, 8, 371, -1, 143, 493, 494, + 371, -1, 424, 8, 371, -1, 117, 493, 426, -1, + 425, 8, 426, -1, 15, 427, 21, -1, 428, 8, + 428, -1, 427, 8, 428, -1, 371, -1, 371, 15, + 498, 21, -1, 507, -1, 430, -1, 80, 492, 431, + 433, -1, 430, 550, 433, -1, -1, -1, 434, 37, + 435, 37, -1, 436, -1, 434, 8, 436, -1, 447, + -1, 435, 8, 447, -1, 437, 439, -1, 437, 439, + 440, -1, 437, 439, 441, -1, 437, 439, 440, 441, + -1, 437, 444, -1, -1, 371, -1, 371, -1, 15, + 442, 21, -1, 15, 443, 7, 443, 21, -1, 456, + -1, 442, 8, 456, -1, -1, 456, -1, 15, 445, + 8, 438, 26, 442, 21, -1, 446, -1, 445, 8, + 446, -1, 439, 440, -1, 439, 441, -1, 439, 440, + 441, -1, 444, -1, 448, -1, 437, 438, 5, 448, + -1, 451, 5, 448, -1, 437, 438, -1, 450, -1, + 452, -1, 454, -1, 36, -1, 36, 246, 516, -1, + 27, -1, 27, 246, 516, -1, 64, -1, 449, -1, + 437, 502, 15, 577, 495, 21, -1, 59, -1, 451, + -1, 17, 451, -1, 16, 451, -1, 149, -1, 149, + 246, 516, -1, 453, -1, 17, 453, -1, 16, 453, + -1, 201, -1, 201, 246, 516, -1, 92, -1, 92, + 246, 516, -1, 15, 455, 8, 455, 21, -1, 452, + -1, 450, -1, 457, -1, 17, 457, -1, 16, 457, + -1, 456, 17, 457, -1, 456, 16, 457, -1, 458, + -1, 457, 5, 458, -1, 457, 37, 458, -1, 459, + -1, 459, 9, 458, -1, 149, -1, 438, -1, 15, + 456, 21, -1, 461, -1, 460, 8, 461, -1, 422, + -1, 421, -1, 463, 465, 464, -1, 462, 8, 463, + 465, 464, -1, -1, -1, 371, -1, 177, 15, 384, + 21, -1, 47, 15, 26, 21, -1, 467, -1, 466, + 8, 467, -1, 371, 26, 499, -1, 163, 469, -1, + 371, -1, 469, 8, 371, -1, 248, 493, 471, -1, + 248, 493, 471, 8, 380, 474, -1, 248, 493, 471, + 8, 380, 172, -1, 248, 493, 471, 8, 380, 172, + 472, -1, 371, -1, 473, -1, 472, 8, 473, -1, + 475, -1, 371, -1, 475, -1, 474, 8, 475, -1, + 371, 18, 371, -1, -1, 15, 477, 21, -1, -1, + 478, 479, -1, 477, 8, 479, -1, 480, -1, 7, + -1, 499, 7, -1, 499, 7, 480, -1, 5, -1, + 499, -1, 482, -1, 481, 8, 482, -1, 149, -1, + 130, 493, 484, -1, 131, -1, 485, -1, 484, 8, + 485, -1, 486, 15, 489, 21, -1, -1, 487, 488, + -1, 231, 407, -1, 402, -1, 490, -1, 489, 8, + 490, -1, 491, -1, 491, 16, 491, -1, 129, -1, + -1, -1, -1, 7, 7, -1, -1, 497, -1, 499, + -1, 517, -1, 568, 499, -1, 577, 496, -1, 497, + 8, 577, 496, -1, 499, -1, 498, 8, 499, -1, + 500, -1, 15, 499, 21, -1, 515, -1, 503, -1, + 511, -1, 518, -1, 499, 17, 499, -1, 499, 16, + 499, -1, 499, 5, 499, -1, 499, 37, 499, -1, + 499, 9, 499, -1, 383, 499, -1, 17, 499, -1, + 16, 499, -1, 499, 25, 499, -1, 499, 29, 499, + -1, 499, 31, 499, -1, 499, 28, 499, -1, 499, + 30, 499, -1, 499, 32, 499, -1, 499, 24, 499, + -1, 499, 33, 499, -1, 499, 38, 499, -1, 499, + 35, 499, -1, 499, 22, 499, -1, 34, 499, -1, + 499, 23, 499, -1, 499, 383, 499, -1, 17, -1, + 16, -1, 371, -1, 502, -1, 505, -1, 504, -1, + 502, 15, 577, 495, 21, -1, 502, 15, 577, 495, + 21, 509, -1, 505, 15, 495, 21, -1, 505, 15, + 495, 21, 509, -1, 503, 3, 129, -1, 502, -1, + 505, -1, 502, 15, 577, 495, 21, -1, 505, 15, + 495, 21, -1, 502, 509, -1, -1, 509, -1, 15, + 510, 7, 510, 21, -1, -1, 499, -1, 512, -1, + 512, 246, 516, -1, 513, -1, 513, 246, 516, -1, + 514, 508, -1, 36, -1, 27, -1, 201, -1, 92, + -1, 149, -1, 64, -1, 502, 246, 64, -1, 513, + 246, 64, -1, 15, 500, 8, 500, 21, -1, 502, + -1, 513, -1, 499, 7, 499, -1, 499, 7, -1, + 499, 7, 499, 7, 499, -1, 499, 7, 7, 499, + -1, 7, 499, 7, 499, -1, 7, 7, 499, -1, + 7, 499, -1, 7, -1, -1, -1, 14, 412, 519, + 574, 520, 20, -1, 502, -1, 505, -1, 506, -1, + 522, 8, 577, 506, -1, 522, 8, 577, 568, 502, + -1, 521, -1, 523, 8, 577, 521, -1, 523, 8, + 577, 568, 502, -1, -1, 502, -1, 525, 8, 502, + -1, 547, -1, 546, -1, 529, -1, 537, 529, -1, + 102, 555, 535, -1, 103, 555, 534, -1, 108, 535, + -1, 527, -1, 537, 527, -1, 538, 547, -1, 538, + 239, -1, 537, 538, 239, -1, 97, 555, 15, 499, + 21, 239, 534, -1, 96, 555, 534, -1, 106, 555, + 534, -1, 530, -1, 76, 555, -1, 539, 547, -1, + 539, -1, 537, 539, -1, 105, 555, 534, -1, 583, + -1, 847, -1, 865, -1, 89, 555, 15, 499, 21, + -1, 89, 555, 556, 545, 557, 617, 528, -1, -1, + 8, 378, 254, 15, 499, 21, -1, 254, 15, 499, + 21, -1, 185, 555, 556, 545, 557, 550, 543, 26, + 499, 8, 499, -1, 185, 555, 556, 545, 557, 550, + 543, 26, 499, 8, 499, 8, 499, -1, 62, 555, + 531, 534, -1, 84, 555, 534, -1, 110, 555, 534, + -1, 218, 555, 378, 62, 15, 499, 21, -1, 537, + 218, 555, 378, 62, 15, 499, 21, -1, 15, 533, + 21, -1, 499, -1, 499, 7, -1, 7, 499, -1, + 499, 7, 499, -1, 532, -1, 533, 8, 532, -1, + -1, 371, -1, -1, 371, -1, 75, -1, 536, 7, + -1, 155, 555, 15, 499, 21, -1, 122, 555, 15, + 540, 542, 21, -1, 541, -1, 540, 8, 541, -1, + 543, 26, 517, -1, -1, 8, 499, -1, 371, -1, + 543, 26, 499, 8, 499, -1, 543, 26, 499, 8, + 499, 8, 499, -1, -1, 149, -1, 113, 555, 534, + -1, 98, 555, 534, -1, 98, 555, 15, 499, 21, + 534, -1, 252, 555, 15, 499, 21, -1, 537, 252, + 555, 15, 499, 21, -1, 548, 499, 26, 499, -1, + 188, 555, 503, 18, 499, -1, 48, 555, 482, 240, + 371, -1, 77, 555, -1, 549, -1, 558, -1, 46, + 555, 15, 499, 21, 482, 8, 482, 8, 482, -1, + 551, -1, 551, 15, 21, -1, 551, 15, 552, 21, + -1, 214, 555, 510, -1, 554, 555, 510, -1, 79, + 555, 534, -1, 115, 555, 534, -1, 45, 555, 15, + 524, 522, 21, -1, 81, 555, 15, 524, 523, 21, + -1, 170, 555, 15, 525, 21, -1, 253, 555, 15, + 499, 21, 503, 26, 499, -1, 152, 432, -1, 186, + 555, 482, -1, 49, 555, 371, -1, 49, 555, 371, + 550, 15, 481, 21, -1, 69, 555, 15, 481, 21, + 550, 499, -1, -1, 8, -1, 61, 555, 371, 577, + -1, 577, 553, -1, 552, 8, 577, 553, -1, 499, + -1, 568, 499, -1, 5, 482, -1, 184, -1, 232, + -1, -1, -1, -1, 559, 565, -1, 559, 580, -1, + 559, 5, -1, 559, 9, -1, 561, 565, -1, 563, + -1, 569, 565, -1, 569, 564, -1, 569, 565, 572, + -1, 569, 564, 8, 572, -1, 570, 565, -1, 570, + 565, 574, -1, 571, -1, 571, 8, 574, -1, 560, + 555, 578, -1, 53, -1, 215, -1, 104, -1, 562, + 555, 578, -1, 176, -1, 66, -1, 139, 555, 578, + 565, -1, 139, 555, 578, 565, 574, -1, 580, -1, + 5, -1, 15, 579, 21, -1, 15, 566, 21, -1, + 567, -1, 566, 8, 577, 567, -1, 579, -1, 5, + -1, 9, -1, 568, 499, -1, 568, 5, -1, 568, + 9, -1, 166, -1, 197, 555, 578, -1, 256, 555, + 578, -1, 190, 555, 579, 578, -1, 190, 555, 5, + 578, -1, 573, -1, 572, 8, 573, -1, 503, -1, + 15, 572, 8, 544, 21, -1, 500, -1, 576, -1, + 575, -1, 500, 8, 500, -1, 500, 8, 576, -1, + 576, 8, 500, -1, 576, 8, 576, -1, 575, 8, + 500, -1, 575, 8, 576, -1, 515, -1, 15, 499, + 21, -1, 15, 500, 8, 544, 21, -1, 15, 576, + 8, 544, 21, -1, 15, 575, 8, 544, 21, -1, + -1, -1, 580, -1, 15, 579, 21, -1, 503, -1, + 511, -1, 579, 501, 579, -1, 579, 5, 579, -1, + 579, 37, 579, -1, 579, 9, 579, -1, 501, 579, + -1, 579, 23, 579, -1, 129, 26, 499, -1, -1, + 257, -1, 584, -1, 632, -1, 607, -1, 586, -1, + 597, -1, 592, -1, 644, -1, 647, -1, 725, -1, + 589, -1, 598, -1, 600, -1, 602, -1, 604, -1, + 652, -1, 658, -1, 655, -1, 784, -1, 782, -1, + 608, -1, 633, -1, 662, -1, 714, -1, 712, -1, + 713, -1, 715, -1, 716, -1, 717, -1, 718, -1, + 719, -1, 727, -1, 729, -1, 734, -1, 731, -1, + 733, -1, 737, -1, 735, -1, 736, -1, 748, -1, + 752, -1, 753, -1, 756, -1, 755, -1, 757, -1, + 758, -1, 759, -1, 760, -1, 661, -1, 742, -1, + 743, -1, 744, -1, 747, -1, 761, -1, 764, -1, + 769, -1, 774, -1, 776, -1, 777, -1, 778, -1, + 779, -1, 781, -1, 740, -1, 783, -1, 82, 493, + 585, -1, 584, 8, 585, -1, 371, 476, -1, 94, + 493, 587, -1, 588, -1, 587, 8, 588, -1, 371, + -1, 138, 493, 590, -1, 591, -1, 590, 8, 591, + -1, 371, -1, 228, 493, 596, 593, -1, 15, 594, + 21, -1, 595, -1, 594, 8, 595, -1, 499, -1, + 499, 7, 499, -1, 7, 15, 498, 21, -1, 371, + -1, 259, 493, 371, 476, -1, 303, 493, 371, 476, + -1, 597, 8, 371, 476, -1, 136, 493, 599, -1, + 598, 8, 599, -1, 371, -1, 211, 493, 601, -1, + 600, 8, 601, -1, 371, -1, 205, 493, 603, -1, + 602, 8, 603, -1, 371, -1, 70, 493, 605, -1, + 604, 8, 605, -1, 371, -1, 175, 371, 476, -1, + -1, 88, 493, 611, 614, 606, -1, 204, 555, 611, + 615, 617, 606, -1, 204, 555, 615, 617, 606, 7, + 7, 609, -1, 610, -1, 609, 8, 610, -1, 611, + -1, 612, -1, 371, -1, 371, 15, 498, 21, -1, + 371, -1, -1, 615, 617, -1, 15, 616, 21, -1, + 617, 618, -1, 616, 8, 617, 618, -1, -1, 58, + -1, 58, 15, 577, 631, 21, -1, 126, 15, 619, + 21, -1, 258, 15, 619, 8, 499, 21, -1, 165, + 15, 499, 21, -1, 5, -1, 137, 15, 619, 21, + -1, 86, 15, 620, 21, -1, 371, -1, 15, 621, + 21, 378, 255, 623, -1, 622, -1, 621, 8, 622, + -1, 499, -1, 499, 7, 499, -1, 624, -1, 624, + 15, 625, 21, -1, 371, -1, 626, -1, 625, 8, + 626, -1, 499, -1, 773, -1, 40, 627, 628, -1, + 371, -1, -1, 629, -1, 17, 630, -1, 628, 17, + 630, -1, 499, -1, 568, 499, -1, 568, 499, 8, + 568, 499, -1, 43, 493, 635, 637, -1, 199, 555, + 636, 637, -1, 199, 555, 637, 7, 7, 634, -1, + 636, -1, 634, 8, 636, -1, 371, -1, 502, -1, + 15, 642, 21, 378, 255, 638, -1, 641, 15, 639, + 21, -1, 640, -1, 639, 8, 640, -1, 499, -1, + 5, -1, 517, -1, 371, -1, 643, -1, 642, 8, + 643, -1, 371, -1, 5, -1, 7, -1, 645, 7, + 7, 493, 371, 476, -1, 644, 8, 371, 476, -1, + 646, -1, 645, 8, 378, 646, -1, 82, -1, 259, + -1, 303, -1, 94, -1, 87, 15, 477, 21, -1, + 228, 593, -1, 43, 15, 642, 21, 378, 255, 638, + -1, 43, -1, 88, 615, 617, 606, -1, 88, -1, + 67, -1, 402, 8, 378, 93, 493, 15, 648, 21, + 7, 7, 650, -1, -1, 649, 7, -1, 648, 8, + 7, -1, 651, -1, 650, 8, 651, -1, 371, -1, + 127, 493, 653, -1, 654, -1, 653, 8, 654, -1, + 371, -1, 74, 493, 656, -1, 657, -1, 656, 8, + 657, -1, 371, -1, 51, 493, 659, -1, 51, 493, + 8, 378, 67, 7, 7, 659, -1, 660, -1, 659, + 8, 660, -1, 371, 476, -1, 168, 555, -1, 182, + 555, 15, 663, 21, 664, 668, -1, 502, -1, 663, + 8, 502, -1, 617, 173, 665, -1, 617, -1, 502, + 15, 666, 21, -1, 667, -1, 666, 8, 667, -1, + 499, -1, 5, -1, -1, 669, -1, 670, -1, 669, + 670, -1, 674, -1, 697, -1, 705, -1, 671, -1, + 681, -1, 683, -1, 682, -1, 672, -1, 675, -1, + 676, -1, 679, -1, 8, 378, 209, 15, 720, 7, + 721, 21, -1, 8, 378, 209, 15, 721, 21, -1, + 8, 378, 71, 15, 673, 7, 721, 21, -1, 8, + 378, 71, 15, 721, 21, -1, 371, -1, 8, 378, + 169, 15, 678, 21, -1, 8, 378, 282, 15, 678, + 21, -1, 8, 378, 191, 15, 678, 21, -1, 8, + 378, 320, 15, 677, 21, -1, 499, -1, 499, 8, + 499, -1, 499, 8, 499, 8, 499, -1, 503, -1, + 678, 8, 503, -1, 8, 378, 322, 15, 680, 21, + -1, 665, -1, 680, 8, 665, -1, 8, 378, 135, + 15, 720, 7, 738, 21, -1, 8, 378, 135, 15, + 738, 21, -1, 8, 378, 229, 15, 499, 21, -1, + 8, 378, 41, 684, -1, 8, 378, 41, 684, 684, + -1, 15, 685, 686, 687, 21, -1, -1, 148, 7, + -1, 180, 7, -1, -1, 688, -1, 687, 8, 688, + -1, 710, -1, 710, 15, 689, 21, -1, 710, 15, + 689, 21, 15, 691, 21, -1, 690, -1, 689, 8, + 690, -1, 499, 7, 499, -1, 692, -1, 691, 8, + 692, -1, 693, 7, 694, 7, 695, -1, 693, 7, + 694, -1, 693, 7, 695, -1, 693, -1, 694, 7, + 695, -1, 694, -1, 695, -1, 378, 217, 696, -1, + 378, 157, 696, -1, 378, 128, 696, -1, 15, 497, + 21, -1, 8, 378, 208, 15, 698, 702, 699, 8, + 701, 21, -1, 8, 378, 208, 15, 698, 702, 699, + 21, -1, 8, 378, 208, 15, 698, 700, 699, 7, + 701, 21, -1, -1, -1, 371, -1, 378, 702, -1, + 701, 8, 378, 702, -1, 703, 15, 503, 21, -1, + 704, 15, 678, 8, 499, 21, -1, 234, -1, 192, -1, 162, -1, 159, -1, 35, -1, 22, -1, 24, -1, 33, -1, 247, -1, 158, -1, 161, -1, 8, - 375, 223, 15, 704, 21, -1, 8, 375, 224, 703, - -1, 8, 375, 226, 703, -1, 8, 375, 221, -1, - 8, 375, 221, 15, 707, 15, 591, 21, 21, -1, - 368, -1, 705, -1, 704, 8, 705, -1, 707, -1, - 707, 15, 706, 78, 21, -1, 707, 15, 706, 591, - 21, -1, 707, 15, 706, 591, 21, 15, 375, 78, - 21, -1, -1, 499, -1, 707, -1, 708, 8, 707, - -1, 225, 552, 703, -1, 224, 552, 703, -1, 227, - 552, 703, -1, 226, 552, 703, -1, 222, 552, 703, - 15, 704, 21, -1, 206, 552, 697, -1, 207, 552, - 697, -1, 72, 552, 670, -1, 73, 552, 670, -1, - 210, 552, 15, 717, 7, 718, 21, -1, 210, 552, - 15, 718, 21, -1, 368, -1, 719, -1, 718, 8, - 719, -1, 707, 15, 720, 21, -1, 707, -1, 721, - -1, 720, 8, 721, -1, 496, -1, 7, -1, 237, - 490, 723, -1, 722, 8, 723, -1, 368, 473, -1, - 238, 552, 725, -1, 238, 552, 725, 694, -1, 238, - 552, 725, 669, -1, 238, 552, 725, 694, 669, -1, - 238, 552, 725, 669, 694, -1, 368, -1, 111, 552, - -1, 725, 15, 496, 21, -1, 725, 15, 514, 21, - -1, 174, 552, 501, 729, -1, -1, 672, -1, 109, - 552, -1, 160, 552, 727, 375, 175, 610, 473, -1, - 160, 552, 727, 375, 323, 500, -1, 189, 552, 717, - -1, 212, 552, 717, -1, 135, 552, 15, 717, 7, - 735, 21, -1, 135, 552, 15, 735, 21, -1, 736, - -1, 735, 8, 736, -1, 707, -1, 707, 15, 495, - 21, -1, 134, 552, -1, 134, 552, 671, -1, 134, - 552, 738, -1, 134, 552, 671, 738, -1, 8, 375, - 208, 15, 675, 21, -1, 50, 552, 743, -1, 99, - 552, -1, 52, 552, 743, -1, 368, -1, 742, -1, - 742, 15, 495, 21, -1, 120, 552, 500, 26, 500, - -1, 83, 552, 748, -1, 83, 552, 748, 15, 746, - 21, -1, 574, 747, -1, 746, 8, 574, 747, -1, - 565, 496, -1, 149, -1, 100, 552, 748, -1, 146, - 552, 751, -1, -1, 496, -1, 332, 552, 495, -1, - 101, 552, -1, 241, 552, -1, 242, 552, -1, 56, - 552, -1, 65, 552, 574, 15, 549, 21, 409, 491, - 675, -1, 324, 552, 15, 759, 21, -1, 760, -1, - 759, 8, 760, -1, 375, 315, -1, 375, 318, -1, - 375, 182, -1, 220, 552, 15, 762, 26, 627, 21, - 614, 765, -1, 499, 15, 763, 21, -1, 764, -1, - 763, 8, 764, -1, 617, -1, 770, -1, 132, 708, - -1, -1, 153, 552, 15, 499, 18, 767, 21, -1, - 499, -1, 499, 15, 768, 21, -1, 769, -1, 768, - 8, 769, -1, 770, -1, 7, -1, 5, -1, 325, - 552, 496, 8, 375, 330, 15, 675, 21, 8, 375, - 329, 15, 495, 21, 772, -1, -1, 8, 375, 182, - -1, 8, 375, 318, -1, 326, 552, 496, -1, 327, - 552, 496, -1, 327, 552, 496, 8, 375, 315, -1, - 328, 552, 496, 8, 375, 331, 15, 499, 21, -1, - 333, 552, 15, 777, 21, -1, 503, -1, 777, 8, - 503, -1, 334, 552, 15, 660, 21, -1, 830, -1, - 783, -1, 782, -1, 800, -1, 803, -1, 804, -1, - 805, -1, 806, -1, 812, -1, 815, -1, 820, -1, - 821, -1, 822, -1, 825, -1, 826, -1, 827, -1, - 828, -1, 829, -1, 831, -1, 832, -1, 833, -1, - 834, -1, 835, -1, 836, -1, 837, -1, 838, -1, - 839, -1, 268, 552, -1, 275, 552, -1, 291, 552, - 614, 784, -1, 291, 552, 614, -1, 547, 614, 785, - 614, -1, 784, 547, 614, 785, 614, -1, 787, -1, - 796, -1, 791, -1, 792, -1, 788, -1, 789, -1, - 790, -1, 794, -1, 795, -1, 842, 15, 843, 841, - 21, -1, 191, 786, -1, 282, 786, -1, 285, 786, - -1, 265, 786, -1, 299, 786, -1, 84, 15, 375, - 793, 21, -1, 191, -1, 299, -1, 288, -1, 304, - 15, 496, 21, -1, 289, 15, 496, 21, -1, 208, - 15, 797, 21, -1, 614, 799, 7, 798, -1, 675, + 378, 223, 15, 707, 21, -1, 8, 378, 224, 706, + -1, 8, 378, 226, 706, -1, 8, 378, 221, -1, + 8, 378, 221, 15, 710, 15, 594, 21, 21, -1, + 371, -1, 708, -1, 707, 8, 708, -1, 710, -1, + 710, 15, 709, 78, 21, -1, 710, 15, 709, 594, + 21, -1, 710, 15, 709, 594, 21, 15, 378, 78, + 21, -1, -1, 502, -1, 710, -1, 711, 8, 710, + -1, 225, 555, 706, -1, 224, 555, 706, -1, 227, + 555, 706, -1, 226, 555, 706, -1, 222, 555, 706, + 15, 707, 21, -1, 206, 555, 700, -1, 207, 555, + 700, -1, 72, 555, 673, -1, 73, 555, 673, -1, + 210, 555, 15, 720, 7, 721, 21, -1, 210, 555, + 15, 721, 21, -1, 371, -1, 722, -1, 721, 8, + 722, -1, 710, 15, 723, 21, -1, 710, -1, 724, + -1, 723, 8, 724, -1, 499, -1, 7, -1, 237, + 493, 726, -1, 725, 8, 726, -1, 371, 476, -1, + 238, 555, 728, -1, 238, 555, 728, 697, -1, 238, + 555, 728, 672, -1, 238, 555, 728, 697, 672, -1, + 238, 555, 728, 672, 697, -1, 371, -1, 111, 555, + -1, 728, 15, 499, 21, -1, 728, 15, 517, 21, + -1, 174, 555, 504, 732, -1, -1, 675, -1, 109, + 555, -1, 160, 555, 730, 378, 175, 613, 476, -1, + 160, 555, 730, 378, 323, 503, -1, 189, 555, 720, + -1, 212, 555, 720, -1, 135, 555, 15, 720, 7, + 738, 21, -1, 135, 555, 15, 738, 21, -1, 739, + -1, 738, 8, 739, -1, 710, -1, 710, 15, 498, + 21, -1, 134, 555, -1, 134, 555, 674, -1, 134, + 555, 741, -1, 134, 555, 674, 741, -1, 8, 378, + 208, 15, 678, 21, -1, 50, 555, 746, -1, 99, + 555, -1, 52, 555, 746, -1, 371, -1, 745, -1, + 745, 15, 498, 21, -1, 120, 555, 503, 26, 503, + -1, 83, 555, 751, -1, 83, 555, 751, 15, 749, + 21, -1, 577, 750, -1, 749, 8, 577, 750, -1, + 568, 499, -1, 149, -1, 100, 555, 751, -1, 146, + 555, 754, -1, -1, 499, -1, 332, 555, 498, -1, + 101, 555, -1, 241, 555, -1, 242, 555, -1, 56, + 555, -1, 65, 555, 577, 15, 552, 21, 412, 494, + 678, -1, 324, 555, 15, 762, 21, -1, 763, -1, + 762, 8, 763, -1, 378, 315, -1, 378, 318, -1, + 378, 182, -1, 220, 555, 15, 765, 26, 630, 21, + 617, 768, -1, 502, 15, 766, 21, -1, 767, -1, + 766, 8, 767, -1, 620, -1, 773, -1, 132, 711, + -1, -1, 153, 555, 15, 502, 18, 770, 21, -1, + 502, -1, 502, 15, 771, 21, -1, 772, -1, 771, + 8, 772, -1, 773, -1, 7, -1, 5, -1, 325, + 555, 499, 8, 378, 330, 15, 678, 21, 8, 378, + 329, 15, 498, 21, 775, -1, -1, 8, 378, 182, + -1, 8, 378, 318, -1, 326, 555, 499, -1, 327, + 555, 499, -1, 327, 555, 499, 8, 378, 315, -1, + 328, 555, 499, 8, 378, 331, 15, 502, 21, -1, + 333, 555, 15, 780, 21, -1, 506, -1, 780, 8, + 506, -1, 334, 555, 15, 663, 21, -1, 833, -1, + 786, -1, 785, -1, 803, -1, 806, -1, 807, -1, + 808, -1, 809, -1, 815, -1, 818, -1, 823, -1, + 824, -1, 825, -1, 828, -1, 829, -1, 830, -1, + 831, -1, 832, -1, 834, -1, 835, -1, 836, -1, + 837, -1, 838, -1, 839, -1, 840, -1, 841, -1, + 842, -1, 268, 555, -1, 275, 555, -1, 291, 555, + 617, 787, -1, 291, 555, 617, -1, 550, 617, 788, + 617, -1, 787, 550, 617, 788, 617, -1, 790, -1, + 799, -1, 794, -1, 795, -1, 791, -1, 792, -1, + 793, -1, 797, -1, 798, -1, 845, 15, 846, 844, + 21, -1, 191, 789, -1, 282, 789, -1, 285, 789, + -1, 265, 789, -1, 299, 789, -1, 84, 15, 378, + 796, 21, -1, 191, -1, 299, -1, 288, -1, 304, + 15, 499, 21, -1, 289, 15, 499, 21, -1, 208, + 15, 800, 21, -1, 617, 802, 7, 801, -1, 678, -1, 17, -1, 16, -1, 5, -1, 37, -1, 162, -1, 159, -1, 35, -1, 22, -1, 24, -1, 33, -1, 305, -1, 306, -1, 307, -1, 247, -1, 297, - 552, 614, 801, -1, 297, 552, 614, -1, 547, 614, - 802, 614, -1, 801, 547, 614, 802, 614, -1, 787, - -1, 796, -1, 788, -1, 789, -1, 279, 552, 614, - 819, -1, 279, 552, 614, -1, 296, 552, -1, 269, - 552, 614, 807, -1, 269, 552, 614, -1, 272, 552, - 614, 819, -1, 272, 552, 614, -1, 547, 614, 808, - 614, -1, 807, 547, 614, 808, 614, -1, 787, -1, - 796, -1, 788, -1, 789, -1, 810, -1, 809, -1, - 290, -1, 298, 15, 375, 811, 8, 496, 21, -1, - 298, 15, 375, 811, 21, -1, 230, -1, 94, -1, - 284, -1, 295, -1, 300, 552, 614, 813, -1, 300, - 552, 614, -1, 547, 614, 814, 614, -1, 813, 547, - 614, 814, 614, -1, 787, -1, 788, -1, 280, 552, - 614, 816, -1, 280, 552, 614, -1, 547, 614, 817, - 614, -1, 816, 547, 614, 817, 614, -1, 819, -1, - 818, -1, 266, 786, -1, 287, -1, 302, 552, -1, - 281, 552, 614, 819, -1, 281, 552, 614, -1, 292, - 552, 614, 823, -1, 292, 552, 614, -1, 547, 614, - 824, 614, -1, 823, 547, 614, 824, 614, -1, 787, - -1, 796, -1, 791, -1, 792, -1, 788, -1, 789, - -1, 790, -1, 794, -1, 795, -1, 810, -1, 809, - -1, 276, 552, -1, 293, 552, 614, 784, -1, 293, - 552, 614, -1, 277, 552, -1, 294, 552, 614, 784, - -1, 294, 552, 614, -1, 278, 552, -1, 301, 490, - 786, -1, 286, 552, -1, 273, 552, -1, 290, 552, - -1, 274, 552, -1, 264, 552, -1, 263, 552, -1, - 283, 552, 786, -1, 283, 552, -1, 267, 552, 15, - 499, 21, -1, 267, 552, -1, 271, 552, 15, 499, - 21, -1, 271, 552, -1, 37, 368, 842, 37, 843, - -1, 840, -1, 499, -1, 841, 8, 840, -1, 841, - 8, 499, -1, -1, -1, 845, -1, 858, -1, 846, - -1, 859, -1, 847, -1, 848, -1, 860, -1, 308, - 552, 849, -1, 310, 552, -1, 312, 552, 15, 855, - 21, -1, 312, 552, 15, 21, -1, 312, 552, -1, - 313, 552, 15, 855, 21, -1, 313, 552, 15, 21, - -1, 313, 552, -1, 375, 376, -1, 850, -1, 851, - -1, 850, 8, 851, -1, 375, 852, -1, 375, 854, - -1, 375, 853, -1, 147, 15, 855, 21, -1, 148, - 15, 855, 21, -1, 180, 15, 855, 21, -1, 318, - 15, 855, 21, -1, 319, 15, 855, 21, -1, 314, - 15, 856, 21, -1, 315, -1, 675, -1, 857, -1, - 856, 8, 857, -1, 375, 316, -1, 375, 317, -1, - 309, -1, 311, -1, 321, 490, 861, -1, 375, 376, - -1, 375, 853, -1, 863, -1, 864, -1, 865, -1, - 866, -1, 871, -1, 889, -1, 335, 895, 15, 872, - 21, -1, 336, 895, 15, 879, 21, -1, 337, 895, - 15, 884, 21, -1, 339, 895, 887, -1, 339, 895, - 887, 8, 375, 351, 15, 867, 21, 869, -1, 339, - 895, 887, 8, 375, 352, 15, 867, 21, 870, -1, - 868, -1, 867, 8, 868, -1, 375, 353, -1, -1, - 8, 375, 352, 15, 867, 21, -1, -1, 8, 375, - 351, 15, 867, 21, -1, 340, 895, -1, 873, -1, - 872, 8, 873, -1, 874, -1, 875, -1, 876, -1, - 375, 208, 15, 698, 21, -1, 375, 191, 15, 675, - 21, -1, 375, 183, 15, 877, 21, -1, 878, -1, - 877, 8, 878, -1, 503, 26, 496, -1, 880, -1, - 879, 8, 880, -1, 881, -1, 882, -1, 883, -1, - 375, 228, 15, 704, 21, -1, 375, 41, 15, 704, - 21, -1, 375, 209, 15, 718, 21, -1, 885, -1, - 884, 8, 885, -1, 375, 338, -1, 375, 342, 15, - 660, 21, -1, 375, 341, -1, 375, 341, 15, 660, - 21, -1, 375, 343, 15, 888, 21, -1, 375, 354, - -1, 375, 354, 15, 886, 21, -1, 496, 8, 496, - 8, 496, -1, 368, -1, 503, -1, 888, 8, 503, - -1, 344, 895, 15, 890, 21, -1, 891, -1, 890, - 8, 891, -1, 375, 244, 15, 892, 21, -1, 375, - 330, 15, 660, 21, -1, 375, 345, 15, 660, 21, - -1, 375, 346, 15, 496, 21, -1, 375, 347, 15, - 894, 8, 496, 21, -1, 893, -1, 892, 8, 893, - -1, 375, 315, -1, 375, 350, -1, 375, 348, -1, - 375, 349, -1, -1 + 555, 617, 804, -1, 297, 555, 617, -1, 550, 617, + 805, 617, -1, 804, 550, 617, 805, 617, -1, 790, + -1, 799, -1, 791, -1, 792, -1, 279, 555, 617, + 822, -1, 279, 555, 617, -1, 296, 555, -1, 269, + 555, 617, 810, -1, 269, 555, 617, -1, 272, 555, + 617, 822, -1, 272, 555, 617, -1, 550, 617, 811, + 617, -1, 810, 550, 617, 811, 617, -1, 790, -1, + 799, -1, 791, -1, 792, -1, 813, -1, 812, -1, + 290, -1, 298, 15, 378, 814, 8, 499, 21, -1, + 298, 15, 378, 814, 21, -1, 230, -1, 94, -1, + 284, -1, 295, -1, 300, 555, 617, 816, -1, 300, + 555, 617, -1, 550, 617, 817, 617, -1, 816, 550, + 617, 817, 617, -1, 790, -1, 791, -1, 280, 555, + 617, 819, -1, 280, 555, 617, -1, 550, 617, 820, + 617, -1, 819, 550, 617, 820, 617, -1, 822, -1, + 821, -1, 266, 789, -1, 287, -1, 302, 555, -1, + 281, 555, 617, 822, -1, 281, 555, 617, -1, 292, + 555, 617, 826, -1, 292, 555, 617, -1, 550, 617, + 827, 617, -1, 826, 550, 617, 827, 617, -1, 790, + -1, 799, -1, 794, -1, 795, -1, 791, -1, 792, + -1, 793, -1, 797, -1, 798, -1, 813, -1, 812, + -1, 276, 555, -1, 293, 555, 617, 787, -1, 293, + 555, 617, -1, 277, 555, -1, 294, 555, 617, 787, + -1, 294, 555, 617, -1, 278, 555, -1, 301, 493, + 789, -1, 286, 555, -1, 273, 555, -1, 290, 555, + -1, 274, 555, -1, 264, 555, -1, 263, 555, -1, + 283, 555, 789, -1, 283, 555, -1, 267, 555, 15, + 502, 21, -1, 267, 555, -1, 271, 555, 15, 502, + 21, -1, 271, 555, -1, 37, 371, 845, 37, 846, + -1, 843, -1, 502, -1, 844, 8, 843, -1, 844, + 8, 502, -1, -1, -1, 848, -1, 861, -1, 849, + -1, 862, -1, 850, -1, 851, -1, 863, -1, 308, + 555, 852, -1, 310, 555, -1, 312, 555, 15, 858, + 21, -1, 312, 555, 15, 21, -1, 312, 555, -1, + 313, 555, 15, 858, 21, -1, 313, 555, 15, 21, + -1, 313, 555, -1, 378, 379, -1, 853, -1, 854, + -1, 853, 8, 854, -1, 378, 855, -1, 378, 857, + -1, 378, 856, -1, 147, 15, 858, 21, -1, 148, + 15, 858, 21, -1, 180, 15, 858, 21, -1, 318, + 15, 858, 21, -1, 319, 15, 858, 21, -1, 314, + 15, 859, 21, -1, 315, -1, 678, -1, 860, -1, + 859, 8, 860, -1, 378, 316, -1, 378, 317, -1, + 309, -1, 311, -1, 321, 493, 864, -1, 378, 379, + -1, 378, 856, -1, 866, -1, 867, -1, 868, -1, + 869, -1, 874, -1, 894, -1, 335, 900, 15, 875, + 21, -1, 336, 900, 15, 884, 21, -1, 337, 900, + 15, 889, 21, -1, 339, 900, 892, -1, 339, 900, + 892, 8, 378, 351, 15, 870, 21, 872, -1, 339, + 900, 892, 8, 378, 352, 15, 870, 21, 873, -1, + 871, -1, 870, 8, 871, -1, 378, 353, -1, -1, + 8, 378, 352, 15, 870, 21, -1, -1, 8, 378, + 351, 15, 870, 21, -1, 340, 900, -1, 876, -1, + 875, 8, 876, -1, 877, -1, 878, -1, 879, -1, + 881, -1, 880, -1, 378, 208, 15, 701, 21, -1, + 378, 191, 15, 678, 21, -1, 378, 357, 15, 678, + 21, -1, 378, 356, 15, 513, 21, -1, 378, 183, + 15, 882, 21, -1, 883, -1, 882, 8, 883, -1, + 506, 26, 499, -1, 885, -1, 884, 8, 885, -1, + 886, -1, 887, -1, 888, -1, 378, 228, 15, 707, + 21, -1, 378, 41, 15, 707, 21, -1, 378, 209, + 15, 721, 21, -1, 890, -1, 889, 8, 890, -1, + 378, 338, -1, 378, 342, 15, 663, 21, -1, 378, + 341, -1, 378, 341, 15, 663, 21, -1, 378, 343, + 15, 893, 21, -1, 378, 354, -1, 378, 354, 15, + 891, 21, -1, 378, 355, -1, 499, 8, 499, 8, + 499, -1, 371, -1, 506, -1, 893, 8, 506, -1, + 344, 900, 15, 895, 21, -1, 896, -1, 895, 8, + 896, -1, 378, 244, 15, 897, 21, -1, 378, 330, + 15, 663, 21, -1, 378, 345, 15, 663, 21, -1, + 378, 346, 15, 499, 21, -1, 378, 347, 15, 899, + 8, 499, 21, -1, 898, -1, 897, 8, 898, -1, + 378, 315, -1, 378, 350, -1, 378, 348, -1, 378, + 349, -1, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 789, 789, 790, 794, 796, 810, 841, 850, 856, - 876, 885, 901, 913, 923, 930, 936, 941, 946, 970, - 997, 1011, 1013, 1015, 1019, 1036, 1050, 1074, 1090, 1104, - 1122, 1124, 1131, 1135, 1136, 1143, 1144, 1152, 1153, 1155, - 1159, 1160, 1164, 1168, 1174, 1184, 1188, 1193, 1200, 1201, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, - 1212, 1213, 1218, 1223, 1230, 1232, 1233, 1234, 1235, 1236, - 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1246, 1250, 1258, - 1266, 1275, 1283, 1287, 1289, 1293, 1295, 1297, 1299, 1301, - 1303, 1305, 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, - 1323, 1325, 1327, 1332, 1341, 1351, 1359, 1369, 1390, 1410, - 1411, 1413, 1417, 1419, 1423, 1427, 1429, 1433, 1439, 1443, - 1445, 1449, 1453, 1457, 1461, 1465, 1471, 1475, 1479, 1485, - 1490, 1497, 1508, 1521, 1532, 1545, 1555, 1568, 1573, 1580, - 1583, 1588, 1593, 1600, 1603, 1613, 1627, 1630, 1649, 1676, - 1678, 1690, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1709, - 1710, 1714, 1716, 1723, 1728, 1729, 1731, 1733, 1746, 1752, - 1758, 1767, 1776, 1789, 1790, 1793, 1797, 1812, 1827, 1845, - 1866, 1886, 1908, 1925, 1943, 1950, 1957, 1964, 1977, 1984, - 1991, 2002, 2006, 2008, 2013, 2031, 2042, 2054, 2066, 2080, - 2086, 2093, 2099, 2105, 2113, 2120, 2136, 2139, 2148, 2150, - 2154, 2158, 2178, 2182, 2184, 2188, 2189, 2192, 2194, 2196, - 2198, 2200, 2203, 2206, 2210, 2216, 2220, 2224, 2226, 2231, - 2232, 2236, 2240, 2242, 2246, 2248, 2250, 2255, 2259, 2261, - 2263, 2266, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, - 2278, 2279, 2285, 2288, 2289, 2291, 2295, 2296, 2299, 2300, - 2302, 2306, 2307, 2308, 2309, 2311, 2314, 2315, 2324, 2326, - 2333, 2340, 2347, 2356, 2358, 2360, 2364, 2366, 2370, 2379, - 2386, 2393, 2395, 2399, 2403, 2409, 2411, 2416, 2420, 2424, - 2431, 2438, 2448, 2450, 2454, 2466, 2469, 2478, 2491, 2497, - 2503, 2509, 2517, 2527, 2529, 2533, 2535, 2568, 2570, 2574, - 2613, 2614, 2618, 2618, 2623, 2627, 2635, 2644, 2653, 2663, - 2669, 2672, 2674, 2678, 2686, 2701, 2708, 2710, 2714, 2730, - 2730, 2734, 2736, 2748, 2750, 2754, 2760, 2772, 2784, 2801, - 2830, 2831, 2839, 2840, 2844, 2846, 2848, 2859, 2863, 2869, - 2871, 2875, 2877, 2879, 2883, 2885, 2889, 2891, 2893, 2895, - 2897, 2899, 2901, 2903, 2905, 2907, 2909, 2911, 2913, 2915, - 2917, 2919, 2921, 2923, 2925, 2927, 2929, 2931, 2933, 2937, - 2938, 2949, 3023, 3035, 3037, 3041, 3172, 3222, 3266, 3308, - 3366, 3368, 3370, 3409, 3452, 3463, 3464, 3468, 3473, 3474, - 3478, 3480, 3486, 3488, 3494, 3507, 3513, 3520, 3526, 3534, - 3542, 3558, 3568, 3581, 3588, 3590, 3613, 3615, 3617, 3619, - 3621, 3623, 3625, 3627, 3631, 3631, 3631, 3645, 3647, 3670, - 3672, 3674, 3690, 3692, 3694, 3708, 3711, 3713, 3721, 3723, - 3725, 3727, 3781, 3801, 3816, 3825, 3828, 3878, 3884, 3889, - 3907, 3909, 3911, 3913, 3915, 3918, 3924, 3926, 3928, 3931, - 3933, 3935, 3962, 3971, 3980, 3981, 3983, 3988, 3995, 4003, - 4005, 4009, 4012, 4014, 4018, 4024, 4026, 4028, 4030, 4034, - 4036, 4045, 4046, 4053, 4054, 4058, 4062, 4083, 4086, 4090, - 4092, 4099, 4104, 4105, 4116, 4128, 4151, 4176, 4177, 4184, - 4186, 4188, 4190, 4192, 4196, 4273, 4285, 4292, 4294, 4295, - 4297, 4306, 4313, 4320, 4328, 4333, 4338, 4341, 4344, 4347, - 4350, 4353, 4357, 4375, 4380, 4399, 4418, 4422, 4423, 4426, - 4430, 4435, 4442, 4444, 4446, 4450, 4451, 4462, 4477, 4481, - 4488, 4491, 4501, 4514, 4527, 4530, 4532, 4535, 4538, 4542, - 4551, 4554, 4558, 4560, 4566, 4570, 4572, 4574, 4581, 4585, - 4587, 4591, 4593, 4597, 4616, 4632, 4641, 4650, 4652, 4656, - 4682, 4697, 4712, 4729, 4737, 4746, 4754, 4759, 4764, 4786, - 4802, 4804, 4808, 4810, 4817, 4819, 4821, 4825, 4827, 4829, - 4831, 4833, 4835, 4839, 4842, 4845, 4851, 4857, 4866, 4870, - 4877, 4879, 4883, 4885, 4887, 4892, 4897, 4902, 4907, 4916, - 4921, 4927, 4928, 4943, 4944, 4945, 4946, 4947, 4948, 4949, - 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, - 4960, 4961, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, - 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, - 4982, 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, - 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999, 5000, 5001, - 5002, 5003, 5004, 5005, 5006, 5007, 5011, 5013, 5024, 5045, - 5049, 5051, 5055, 5068, 5072, 5074, 5078, 5089, 5100, 5104, - 5106, 5110, 5112, 5114, 5129, 5141, 5161, 5181, 5203, 5209, - 5218, 5226, 5232, 5240, 5247, 5253, 5262, 5266, 5272, 5280, - 5294, 5308, 5313, 5329, 5344, 5372, 5374, 5378, 5380, 5384, - 5413, 5436, 5457, 5458, 5462, 5483, 5485, 5489, 5497, 5501, - 5506, 5508, 5510, 5512, 5518, 5520, 5524, 5534, 5538, 5540, - 5545, 5547, 5551, 5555, 5561, 5571, 5573, 5577, 5579, 5581, - 5588, 5606, 5607, 5611, 5613, 5617, 5624, 5634, 5663, 5678, - 5685, 5703, 5705, 5709, 5723, 5749, 5762, 5778, 5780, 5783, - 5785, 5791, 5795, 5823, 5825, 5829, 5837, 5843, 5846, 5904, - 5968, 5970, 5973, 5977, 5981, 5985, 6002, 6014, 6018, 6022, - 6032, 6037, 6042, 6049, 6058, 6058, 6069, 6080, 6082, 6086, - 6097, 6101, 6103, 6107, 6118, 6122, 6124, 6128, 6140, 6142, - 6149, 6151, 6155, 6171, 6179, 6190, 6192, 6196, 6199, 6204, - 6214, 6216, 6220, 6222, 6231, 6232, 6236, 6238, 6243, 6244, - 6245, 6246, 6247, 6248, 6249, 6250, 6251, 6252, 6253, 6256, - 6261, 6265, 6269, 6273, 6286, 6290, 6294, 6298, 6301, 6303, - 6305, 6309, 6311, 6315, 6319, 6321, 6325, 6330, 6334, 6338, - 6340, 6344, 6353, 6356, 6362, 6369, 6372, 6374, 6378, 6380, - 6384, 6396, 6398, 6402, 6406, 6408, 6412, 6414, 6416, 6418, - 6420, 6422, 6424, 6428, 6432, 6436, 6440, 6444, 6451, 6457, - 6462, 6465, 6468, 6481, 6483, 6487, 6489, 6494, 6500, 6506, - 6512, 6518, 6524, 6530, 6536, 6542, 6551, 6557, 6574, 6576, - 6584, 6592, 6594, 6598, 6602, 6604, 6608, 6610, 6618, 6622, - 6634, 6637, 6655, 6657, 6661, 6663, 6667, 6669, 6673, 6677, - 6681, 6690, 6694, 6698, 6703, 6707, 6719, 6721, 6725, 6730, - 6734, 6736, 6740, 6742, 6746, 6751, 6758, 6781, 6783, 6785, - 6787, 6789, 6793, 6804, 6808, 6823, 6830, 6837, 6838, 6842, - 6846, 6854, 6858, 6862, 6870, 6875, 6889, 6891, 6895, 6897, - 6906, 6908, 6910, 6912, 6948, 6952, 6956, 6960, 6964, 6976, - 6978, 6982, 6985, 6987, 6991, 6996, 7003, 7006, 7014, 7018, - 7023, 7025, 7032, 7037, 7041, 7045, 7049, 7053, 7057, 7060, - 7062, 7066, 7068, 7070, 7074, 7078, 7090, 7092, 7096, 7098, - 7102, 7105, 7108, 7112, 7118, 7130, 7132, 7136, 7138, 7142, - 7150, 7162, 7163, 7165, 7169, 7173, 7175, 7183, 7187, 7190, - 7192, 7196, 7200, 7202, 7203, 7204, 7205, 7206, 7207, 7208, - 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, - 7219, 7220, 7221, 7222, 7223, 7224, 7225, 7226, 7227, 7230, - 7236, 7242, 7248, 7254, 7258, 7264, 7265, 7266, 7267, 7268, - 7269, 7270, 7271, 7272, 7275, 7280, 7285, 7291, 7297, 7303, - 7308, 7314, 7320, 7326, 7333, 7339, 7345, 7352, 7356, 7358, - 7364, 7371, 7377, 7383, 7389, 7395, 7401, 7407, 7413, 7419, - 7425, 7431, 7437, 7447, 7452, 7458, 7462, 7468, 7469, 7470, - 7471, 7474, 7482, 7488, 7494, 7499, 7505, 7512, 7518, 7522, - 7528, 7529, 7530, 7531, 7532, 7533, 7536, 7545, 7549, 7555, - 7562, 7569, 7576, 7585, 7591, 7597, 7601, 7607, 7608, 7611, - 7617, 7623, 7627, 7634, 7635, 7638, 7644, 7650, 7655, 7663, - 7669, 7674, 7681, 7685, 7691, 7692, 7693, 7694, 7695, 7696, - 7697, 7698, 7699, 7700, 7701, 7705, 7710, 7715, 7722, 7727, - 7733, 7739, 7744, 7749, 7754, 7758, 7763, 7768, 7772, 7777, - 7781, 7787, 7792, 7798, 7803, 7809, 7819, 7823, 7827, 7831, - 7837, 7840, 7844, 7845, 7846, 7847, 7848, 7849, 7850, 7853, - 7857, 7861, 7863, 7865, 7869, 7871, 7873, 7877, 7879, 7883, - 7885, 7889, 7892, 7895, 7900, 7902, 7904, 7906, 7908, 7912, - 7916, 7921, 7925, 7927, 7931, 7933, 7937, 7941, 7945, 7949, - 7951, 7955, 7956, 7957, 7958, 7959, 7960, 7963, 7967, 7971, - 7975, 7977, 7979, 7983, 7985, 7989, 7994, 7995, 8000, 8001, - 8005, 8009, 8011, 8015, 8016, 8017, 8020, 8024, 8028, 8031, - 8033, 8037, 8041, 8043, 8047, 8048, 8049, 8052, 8056, 8060, - 8064, 8066, 8070, 8072, 8074, 8076, 8079, 8081, 8083, 8087, - 8094, 8098, 8100, 8104, 8108, 8110, 8114, 8116, 8118, 8120, - 8122, 8126, 8128, 8132, 8134, 8138, 8140, 8145 + 0, 793, 793, 794, 798, 800, 814, 845, 854, 860, + 880, 889, 905, 917, 927, 934, 940, 945, 950, 974, + 1001, 1015, 1017, 1019, 1023, 1040, 1054, 1078, 1094, 1108, + 1126, 1128, 1135, 1139, 1140, 1147, 1148, 1156, 1157, 1159, + 1163, 1164, 1168, 1172, 1178, 1188, 1192, 1197, 1204, 1205, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, + 1216, 1217, 1222, 1227, 1234, 1236, 1237, 1238, 1239, 1240, + 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1250, 1254, 1262, + 1270, 1279, 1287, 1291, 1293, 1297, 1299, 1301, 1303, 1305, + 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, 1323, 1325, + 1327, 1329, 1331, 1336, 1345, 1355, 1363, 1373, 1394, 1414, + 1415, 1417, 1421, 1423, 1427, 1431, 1433, 1437, 1443, 1447, + 1449, 1453, 1457, 1461, 1465, 1469, 1475, 1479, 1483, 1489, + 1494, 1501, 1512, 1525, 1536, 1549, 1559, 1572, 1577, 1584, + 1587, 1592, 1597, 1604, 1607, 1617, 1631, 1634, 1653, 1680, + 1682, 1694, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1713, + 1714, 1718, 1720, 1727, 1732, 1733, 1735, 1737, 1750, 1756, + 1762, 1771, 1780, 1793, 1794, 1797, 1801, 1816, 1831, 1849, + 1870, 1890, 1912, 1929, 1947, 1954, 1961, 1968, 1981, 1988, + 1995, 2006, 2010, 2012, 2017, 2035, 2046, 2058, 2070, 2084, + 2090, 2097, 2103, 2109, 2117, 2124, 2140, 2143, 2152, 2154, + 2158, 2162, 2182, 2186, 2188, 2192, 2193, 2196, 2198, 2200, + 2202, 2204, 2207, 2210, 2214, 2220, 2224, 2228, 2230, 2235, + 2236, 2240, 2244, 2246, 2250, 2252, 2254, 2259, 2263, 2265, + 2267, 2270, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, + 2282, 2283, 2289, 2292, 2293, 2295, 2299, 2300, 2303, 2304, + 2306, 2310, 2311, 2312, 2313, 2315, 2318, 2319, 2328, 2330, + 2337, 2344, 2351, 2360, 2362, 2364, 2368, 2370, 2374, 2383, + 2390, 2397, 2399, 2403, 2407, 2413, 2415, 2420, 2424, 2428, + 2435, 2442, 2452, 2454, 2458, 2470, 2473, 2482, 2495, 2501, + 2507, 2513, 2521, 2531, 2533, 2537, 2539, 2572, 2574, 2578, + 2617, 2618, 2622, 2622, 2627, 2631, 2639, 2648, 2657, 2667, + 2673, 2676, 2678, 2682, 2690, 2705, 2712, 2714, 2718, 2734, + 2734, 2738, 2740, 2752, 2754, 2758, 2764, 2776, 2788, 2805, + 2834, 2835, 2843, 2844, 2848, 2850, 2852, 2863, 2867, 2873, + 2875, 2879, 2881, 2883, 2887, 2889, 2893, 2895, 2897, 2899, + 2901, 2903, 2905, 2907, 2909, 2911, 2913, 2915, 2917, 2919, + 2921, 2923, 2925, 2927, 2929, 2931, 2933, 2935, 2937, 2941, + 2942, 2953, 3027, 3039, 3041, 3045, 3176, 3226, 3270, 3312, + 3370, 3372, 3374, 3413, 3456, 3467, 3468, 3472, 3477, 3478, + 3482, 3484, 3490, 3492, 3498, 3511, 3517, 3524, 3530, 3538, + 3546, 3562, 3572, 3585, 3592, 3594, 3617, 3619, 3621, 3623, + 3625, 3627, 3629, 3631, 3635, 3635, 3635, 3649, 3651, 3674, + 3676, 3678, 3694, 3696, 3698, 3712, 3715, 3717, 3725, 3727, + 3729, 3731, 3785, 3805, 3820, 3829, 3832, 3882, 3888, 3893, + 3911, 3913, 3915, 3917, 3919, 3922, 3928, 3930, 3932, 3935, + 3937, 3939, 3966, 3975, 3984, 3985, 3987, 3992, 3999, 4007, + 4009, 4013, 4016, 4018, 4022, 4028, 4030, 4032, 4034, 4038, + 4040, 4049, 4050, 4057, 4058, 4062, 4066, 4087, 4090, 4094, + 4096, 4103, 4108, 4109, 4120, 4132, 4155, 4180, 4181, 4188, + 4190, 4192, 4194, 4196, 4200, 4277, 4289, 4296, 4298, 4299, + 4301, 4310, 4317, 4324, 4332, 4337, 4342, 4345, 4348, 4351, + 4354, 4357, 4361, 4379, 4384, 4403, 4422, 4426, 4427, 4430, + 4434, 4439, 4446, 4448, 4450, 4454, 4455, 4466, 4481, 4485, + 4492, 4495, 4505, 4518, 4531, 4534, 4536, 4539, 4542, 4546, + 4555, 4558, 4562, 4564, 4570, 4574, 4576, 4578, 4585, 4589, + 4591, 4595, 4597, 4601, 4620, 4636, 4645, 4654, 4656, 4660, + 4686, 4701, 4716, 4733, 4741, 4750, 4758, 4763, 4768, 4790, + 4806, 4808, 4812, 4814, 4821, 4823, 4825, 4829, 4831, 4833, + 4835, 4837, 4839, 4843, 4846, 4849, 4855, 4861, 4870, 4874, + 4881, 4883, 4887, 4889, 4891, 4896, 4901, 4906, 4911, 4920, + 4925, 4931, 4932, 4947, 4948, 4949, 4950, 4951, 4952, 4953, + 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, + 4964, 4965, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, + 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985, + 4986, 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, 4995, + 4996, 4997, 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, + 5006, 5007, 5008, 5009, 5010, 5011, 5015, 5017, 5028, 5049, + 5053, 5055, 5059, 5072, 5076, 5078, 5082, 5093, 5104, 5108, + 5110, 5114, 5116, 5118, 5133, 5145, 5165, 5185, 5207, 5213, + 5222, 5230, 5236, 5244, 5251, 5257, 5266, 5270, 5276, 5284, + 5298, 5312, 5317, 5333, 5348, 5376, 5378, 5382, 5384, 5388, + 5417, 5440, 5461, 5462, 5466, 5487, 5489, 5493, 5501, 5505, + 5510, 5512, 5514, 5516, 5522, 5524, 5528, 5538, 5542, 5544, + 5549, 5551, 5555, 5559, 5565, 5575, 5577, 5581, 5583, 5585, + 5592, 5610, 5611, 5615, 5617, 5621, 5628, 5638, 5667, 5682, + 5689, 5707, 5709, 5713, 5727, 5753, 5766, 5782, 5784, 5787, + 5789, 5795, 5799, 5827, 5829, 5833, 5841, 5847, 5850, 5908, + 5972, 5974, 5977, 5981, 5985, 5989, 6006, 6018, 6022, 6026, + 6036, 6041, 6046, 6053, 6062, 6062, 6073, 6084, 6086, 6090, + 6101, 6105, 6107, 6111, 6122, 6126, 6128, 6132, 6144, 6146, + 6153, 6155, 6159, 6175, 6183, 6194, 6196, 6200, 6203, 6208, + 6218, 6220, 6224, 6226, 6235, 6236, 6240, 6242, 6247, 6248, + 6249, 6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, 6260, + 6265, 6269, 6273, 6277, 6290, 6294, 6298, 6302, 6305, 6307, + 6309, 6313, 6315, 6319, 6323, 6325, 6329, 6334, 6338, 6342, + 6344, 6348, 6357, 6360, 6366, 6373, 6376, 6378, 6382, 6384, + 6388, 6400, 6402, 6406, 6410, 6412, 6416, 6418, 6420, 6422, + 6424, 6426, 6428, 6432, 6436, 6440, 6444, 6448, 6455, 6461, + 6466, 6469, 6472, 6485, 6487, 6491, 6493, 6498, 6504, 6510, + 6516, 6522, 6528, 6534, 6540, 6546, 6555, 6561, 6578, 6580, + 6588, 6596, 6598, 6602, 6606, 6608, 6612, 6614, 6622, 6626, + 6638, 6641, 6659, 6661, 6665, 6667, 6671, 6673, 6677, 6681, + 6685, 6694, 6698, 6702, 6707, 6711, 6723, 6725, 6729, 6734, + 6738, 6740, 6744, 6746, 6750, 6755, 6762, 6785, 6787, 6789, + 6791, 6793, 6797, 6808, 6812, 6827, 6834, 6841, 6842, 6846, + 6850, 6858, 6862, 6866, 6874, 6879, 6893, 6895, 6899, 6901, + 6910, 6912, 6914, 6916, 6952, 6956, 6960, 6964, 6968, 6980, + 6982, 6986, 6989, 6991, 6995, 7000, 7007, 7010, 7018, 7022, + 7027, 7029, 7036, 7041, 7045, 7049, 7053, 7057, 7061, 7064, + 7066, 7070, 7072, 7074, 7078, 7082, 7094, 7096, 7100, 7102, + 7106, 7109, 7112, 7116, 7122, 7134, 7136, 7140, 7142, 7146, + 7154, 7166, 7167, 7169, 7173, 7177, 7179, 7187, 7191, 7194, + 7196, 7200, 7204, 7206, 7207, 7208, 7209, 7210, 7211, 7212, + 7213, 7214, 7215, 7216, 7217, 7218, 7219, 7220, 7221, 7222, + 7223, 7224, 7225, 7226, 7227, 7228, 7229, 7230, 7231, 7234, + 7240, 7246, 7252, 7258, 7262, 7268, 7269, 7270, 7271, 7272, + 7273, 7274, 7275, 7276, 7279, 7284, 7289, 7295, 7301, 7307, + 7312, 7318, 7324, 7330, 7337, 7343, 7349, 7356, 7360, 7362, + 7368, 7375, 7381, 7387, 7393, 7399, 7405, 7411, 7417, 7423, + 7429, 7435, 7441, 7451, 7456, 7462, 7466, 7472, 7473, 7474, + 7475, 7478, 7486, 7492, 7498, 7503, 7509, 7516, 7522, 7526, + 7532, 7533, 7534, 7535, 7536, 7537, 7540, 7549, 7553, 7559, + 7566, 7573, 7580, 7589, 7595, 7601, 7605, 7611, 7612, 7615, + 7621, 7627, 7631, 7638, 7639, 7642, 7648, 7654, 7659, 7667, + 7673, 7678, 7685, 7689, 7695, 7696, 7697, 7698, 7699, 7700, + 7701, 7702, 7703, 7704, 7705, 7709, 7714, 7719, 7726, 7731, + 7737, 7743, 7748, 7753, 7758, 7762, 7767, 7772, 7776, 7781, + 7785, 7791, 7796, 7802, 7807, 7813, 7823, 7827, 7831, 7835, + 7841, 7844, 7848, 7849, 7850, 7851, 7852, 7853, 7854, 7857, + 7861, 7865, 7867, 7869, 7873, 7875, 7877, 7881, 7883, 7887, + 7889, 7893, 7896, 7899, 7904, 7906, 7908, 7910, 7912, 7916, + 7920, 7925, 7929, 7931, 7935, 7937, 7941, 7945, 7949, 7953, + 7955, 7959, 7960, 7961, 7962, 7963, 7964, 7967, 7971, 7975, + 7979, 7981, 7983, 7987, 7989, 7993, 7998, 7999, 8004, 8005, + 8009, 8013, 8015, 8019, 8020, 8021, 8022, 8023, 8026, 8030, + 8034, 8038, 8042, 8045, 8047, 8051, 8055, 8057, 8061, 8062, + 8063, 8066, 8070, 8074, 8078, 8080, 8084, 8086, 8088, 8090, + 8093, 8095, 8097, 8099, 8103, 8110, 8114, 8116, 8120, 8124, + 8126, 8130, 8132, 8134, 8136, 8138, 8142, 8144, 8148, 8150, + 8154, 8156, 8161 }; #endif @@ -2122,34 +2132,35 @@ static const char *const yytname[] = "SPF_FISSION", "SPF_SHRINK", "SPF_CHECKPOINT", "SPF_EXCEPT", "SPF_FILES_COUNT", "SPF_INTERVAL", "SPF_TIME", "SPF_ITER", "SPF_FLEXIBLE", "SPF_APPLY_REGION", "SPF_APPLY_FRAGMENT", - "SPF_CODE_COVERAGE", "SPF_UNROLL", "BINARY_OP", "UNARY_OP", "$accept", - "program", "stat", "thislabel", "entry", "new_prog", "proc_attr", - "procname", "funcname", "typedfunc", "opt_result_clause", "name", - "progname", "blokname", "arglist", "args", "arg", "filename", - "needkeyword", "keywordoff", "keyword_if_colon_follow", "spec", - "interface", "defined_op", "operator", "intrinsic_op", "type_dcl", - "end_type", "dcl", "options", "attr_spec_list", "attr_spec", - "intent_spec", "access_spec", "intent", "optional", "static", "private", - "private_attr", "sequence", "public", "public_attr", "type", - "opt_key_hedr", "attrib", "att_type", "typespec", "typename", "lengspec", - "proper_lengspec", "selector", "clause", "end_ioctl", "initial_value", - "dimension", "allocatable", "pointer", "target", "common", "namelist", - "namelist_group", "comblock", "var", "external", "intrinsic", - "equivalence", "equivset", "equivlist", "equi_object", "data", "data1", - "data_in", "in_data", "datapair", "datalvals", "datarvals", "datalval", - "data_null", "d_name", "dataname", "datasubs", "datarange", - "iconexprlist", "opticonexpr", "dataimplieddo", "dlist", "dataelt", - "datarval", "datavalue", "BOZ_const", "int_const", "unsignedint", - "real_const", "unsignedreal", "complex_const_data", "complex_part", - "iconexpr", "iconterm", "iconfactor", "iconprimary", "savelist", - "saveitem", "use_name_list", "use_key_word", "no_use_key_word", - "use_name", "paramlist", "paramitem", "module_proc_stmt", - "proc_name_list", "use_stat", "module_name", "only_list", "only_name", - "rename_list", "rename_name", "dims", "dimlist", "@1", "dim", "ubound", - "labellist", "label", "implicit", "implist", "impitem", "imptype", "@2", - "type_implicit", "letgroups", "letgroup", "letter", "inside", "in_dcl", - "opt_double_colon", "funarglist", "funarg", "funargs", "subscript_list", - "expr", "uexpr", "addop", "ident", "lhs", "array_ele_substring_func_ref", + "SPF_CODE_COVERAGE", "SPF_UNROLL", "SPF_MERGE", "SPF_COVER", + "SPF_PROCESS_PRIVATE", "BINARY_OP", "UNARY_OP", "$accept", "program", + "stat", "thislabel", "entry", "new_prog", "proc_attr", "procname", + "funcname", "typedfunc", "opt_result_clause", "name", "progname", + "blokname", "arglist", "args", "arg", "filename", "needkeyword", + "keywordoff", "keyword_if_colon_follow", "spec", "interface", + "defined_op", "operator", "intrinsic_op", "type_dcl", "end_type", "dcl", + "options", "attr_spec_list", "attr_spec", "intent_spec", "access_spec", + "intent", "optional", "static", "private", "private_attr", "sequence", + "public", "public_attr", "type", "opt_key_hedr", "attrib", "att_type", + "typespec", "typename", "lengspec", "proper_lengspec", "selector", + "clause", "end_ioctl", "initial_value", "dimension", "allocatable", + "pointer", "target", "common", "namelist", "namelist_group", "comblock", + "var", "external", "intrinsic", "equivalence", "equivset", "equivlist", + "equi_object", "data", "data1", "data_in", "in_data", "datapair", + "datalvals", "datarvals", "datalval", "data_null", "d_name", "dataname", + "datasubs", "datarange", "iconexprlist", "opticonexpr", "dataimplieddo", + "dlist", "dataelt", "datarval", "datavalue", "BOZ_const", "int_const", + "unsignedint", "real_const", "unsignedreal", "complex_const_data", + "complex_part", "iconexpr", "iconterm", "iconfactor", "iconprimary", + "savelist", "saveitem", "use_name_list", "use_key_word", + "no_use_key_word", "use_name", "paramlist", "paramitem", + "module_proc_stmt", "proc_name_list", "use_stat", "module_name", + "only_list", "only_name", "rename_list", "rename_name", "dims", + "dimlist", "@1", "dim", "ubound", "labellist", "label", "implicit", + "implist", "impitem", "imptype", "@2", "type_implicit", "letgroups", + "letgroup", "letter", "inside", "in_dcl", "opt_double_colon", + "funarglist", "funarg", "funargs", "subscript_list", "expr", "uexpr", + "addop", "ident", "lhs", "array_ele_substring_func_ref", "structure_component", "array_element", "asubstring", "opt_substring", "substring", "opt_expr", "simple_const", "numeric_bool_const", "integer_constant", "string_constant", "complex_const", "kind", @@ -2254,6 +2265,7 @@ static const char *const yytname[] = "characteristic_list", "characteristic", "opt_clause_apply_fragment", "opt_clause_apply_region", "spf_end_parallel_reg", "analysis_spec_list", "analysis_spec", "analysis_reduction_spec", "analysis_private_spec", + "analysis_process_private_spec", "analysis_cover_spec", "analysis_parameter_spec", "spf_parameter_list", "spf_parameter", "parallel_spec_list", "parallel_spec", "parallel_shadow_spec", "parallel_across_spec", "parallel_remote_access_spec", @@ -2269,7 +2281,7 @@ static const char *const yytname[] = token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { - 0, 353, 354, 1, 2, 3, 4, 5, 6, 7, + 0, 356, 357, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, @@ -2304,143 +2316,144 @@ static const yytype_uint16 yytoknum[] = 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 355, 356 + 348, 349, 350, 351, 352, 353, 354, 355, 358, 359 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 357, 358, 358, 359, 359, 359, 359, 359, 359, - 359, 360, 361, 361, 361, 361, 361, 361, 361, 361, - 362, 363, 363, 363, 364, 365, 366, 366, 366, 366, - 367, 367, 368, 369, 369, 370, 370, 371, 371, 371, - 372, 372, 373, 373, 374, 375, 376, 377, 378, 378, - 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, - 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, - 378, 378, 378, 378, 378, 378, 378, 379, 379, 379, - 379, 379, 380, 381, 381, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 383, 383, 384, 384, 385, 385, 386, - 386, 386, 387, 387, 388, 388, 388, 388, 388, 388, - 388, 388, 388, 388, 388, 388, 389, 389, 389, 390, - 390, 391, 391, 392, 392, 393, 393, 394, 394, 395, - 396, 397, 397, 398, 399, 399, 400, 401, 401, 402, - 402, 403, 404, 404, 404, 404, 404, 404, 404, 405, - 405, 406, 406, 406, 407, 407, 407, 407, 408, 408, - 408, 408, 409, 410, 410, 410, 411, 411, 412, 412, - 413, 413, 414, 414, 415, 415, 415, 415, 416, 416, - 416, 417, 418, 418, 419, 420, 420, 421, 421, 422, - 422, 423, 424, 424, 425, 425, 425, 426, 427, 427, - 428, 429, 430, 431, 431, 432, 432, 433, 433, 433, - 433, 433, 434, 435, 436, 437, 438, 439, 439, 440, - 440, 441, 442, 442, 443, 443, 443, 443, 444, 444, - 444, 445, 445, 445, 445, 445, 445, 445, 445, 445, - 445, 445, 446, 447, 447, 447, 448, 448, 449, 449, - 449, 450, 450, 450, 450, 451, 452, 452, 453, 453, - 453, 453, 453, 454, 454, 454, 455, 455, 456, 456, - 456, 457, 457, 458, 458, 459, 459, 460, 461, 462, - 462, 462, 463, 463, 464, 465, 466, 466, 467, 467, - 467, 467, 468, 469, 469, 470, 470, 471, 471, 472, - 473, 473, 475, 474, 474, 476, 476, 476, 476, 477, - 477, 478, 478, 479, 480, 480, 481, 481, 482, 484, - 483, 485, 485, 486, 486, 487, 487, 488, 489, 490, - 491, 491, 492, 492, 493, 493, 493, 494, 494, 495, - 495, 496, 496, 496, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, - 498, 499, 500, 500, 500, 501, 501, 501, 501, 502, - 503, 503, 503, 503, 504, 505, 505, 506, 507, 507, - 508, 508, 508, 508, 508, 509, 509, 509, 509, 510, - 511, 511, 511, 512, 513, 513, 514, 514, 514, 514, - 514, 514, 514, 514, 516, 517, 515, 518, 518, 519, - 519, 519, 520, 520, 520, 521, 522, 522, 523, 523, - 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, - 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, - 523, 523, 524, 524, 525, 525, 525, 526, 526, 527, - 527, 527, 527, 527, 528, 529, 529, 529, 529, 530, - 530, 531, 531, 532, 532, 533, 534, 535, 536, 537, - 537, 538, 539, 539, 540, 541, 541, 542, 542, 543, - 543, 543, 543, 543, 544, 544, 544, 544, 544, 544, - 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, - 544, 544, 545, 546, 546, 546, 546, 547, 547, 548, - 549, 549, 550, 550, 550, 551, 551, 552, 553, 554, - 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 555, 556, 557, 557, 557, 558, 559, - 559, 560, 560, 561, 561, 562, 562, 563, 563, 564, - 564, 564, 564, 564, 564, 565, 566, 567, 568, 568, - 569, 569, 570, 570, 571, 571, 571, 572, 572, 572, - 572, 572, 572, 573, 573, 573, 573, 573, 574, 575, - 576, 576, 577, 577, 577, 577, 577, 577, 577, 577, - 577, 578, 578, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, + 0, 360, 361, 361, 362, 362, 362, 362, 362, 362, + 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, + 365, 366, 366, 366, 367, 368, 369, 369, 369, 369, + 370, 370, 371, 372, 372, 373, 373, 374, 374, 374, + 375, 375, 376, 376, 377, 378, 379, 380, 381, 381, + 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, + 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, + 381, 381, 381, 381, 381, 381, 381, 382, 382, 382, + 382, 382, 383, 384, 384, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 386, 386, 387, 387, 388, 388, 389, + 389, 389, 390, 390, 391, 391, 391, 391, 391, 391, + 391, 391, 391, 391, 391, 391, 392, 392, 392, 393, + 393, 394, 394, 395, 395, 396, 396, 397, 397, 398, + 399, 400, 400, 401, 402, 402, 403, 404, 404, 405, + 405, 406, 407, 407, 407, 407, 407, 407, 407, 408, + 408, 409, 409, 409, 410, 410, 410, 410, 411, 411, + 411, 411, 412, 413, 413, 413, 414, 414, 415, 415, + 416, 416, 417, 417, 418, 418, 418, 418, 419, 419, + 419, 420, 421, 421, 422, 423, 423, 424, 424, 425, + 425, 426, 427, 427, 428, 428, 428, 429, 430, 430, + 431, 432, 433, 434, 434, 435, 435, 436, 436, 436, + 436, 436, 437, 438, 439, 440, 441, 442, 442, 443, + 443, 444, 445, 445, 446, 446, 446, 446, 447, 447, + 447, 448, 448, 448, 448, 448, 448, 448, 448, 448, + 448, 448, 449, 450, 450, 450, 451, 451, 452, 452, + 452, 453, 453, 453, 453, 454, 455, 455, 456, 456, + 456, 456, 456, 457, 457, 457, 458, 458, 459, 459, + 459, 460, 460, 461, 461, 462, 462, 463, 464, 465, + 465, 465, 466, 466, 467, 468, 469, 469, 470, 470, + 470, 470, 471, 472, 472, 473, 473, 474, 474, 475, + 476, 476, 478, 477, 477, 479, 479, 479, 479, 480, + 480, 481, 481, 482, 483, 483, 484, 484, 485, 487, + 486, 488, 488, 489, 489, 490, 490, 491, 492, 493, + 494, 494, 495, 495, 496, 496, 496, 497, 497, 498, + 498, 499, 499, 499, 500, 500, 500, 500, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 501, + 501, 502, 503, 503, 503, 504, 504, 504, 504, 505, + 506, 506, 506, 506, 507, 508, 508, 509, 510, 510, + 511, 511, 511, 511, 511, 512, 512, 512, 512, 513, + 514, 514, 514, 515, 516, 516, 517, 517, 517, 517, + 517, 517, 517, 517, 519, 520, 518, 521, 521, 522, + 522, 522, 523, 523, 523, 524, 525, 525, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 527, 527, 528, 528, 528, 529, 529, 530, + 530, 530, 530, 530, 531, 532, 532, 532, 532, 533, + 533, 534, 534, 535, 535, 536, 537, 538, 539, 540, + 540, 541, 542, 542, 543, 544, 544, 545, 545, 546, + 546, 546, 546, 546, 547, 547, 547, 547, 547, 547, + 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, + 547, 547, 548, 549, 549, 549, 549, 550, 550, 551, + 552, 552, 553, 553, 553, 554, 554, 555, 556, 557, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 559, 560, 560, 560, 561, 562, + 562, 563, 563, 564, 564, 565, 565, 566, 566, 567, + 567, 567, 567, 567, 567, 568, 569, 570, 571, 571, + 572, 572, 573, 573, 574, 574, 574, 575, 575, 575, + 575, 575, 575, 576, 576, 576, 576, 576, 577, 578, 579, 579, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 581, 581, 582, 583, - 584, 584, 585, 586, 587, 587, 588, 589, 590, 591, - 591, 592, 592, 592, 593, 594, 594, 594, 595, 595, - 596, 597, 597, 598, 599, 599, 600, 601, 601, 602, - 603, 603, 604, 605, 605, 606, 606, 607, 607, 608, - 609, 610, 611, 611, 612, 613, 613, 614, 615, 615, - 615, 615, 615, 615, 615, 615, 616, 617, 618, 618, - 619, 619, 620, 620, 621, 622, 622, 623, 623, 623, - 624, 625, 625, 626, 626, 627, 628, 628, 629, 630, - 630, 631, 631, 632, 633, 634, 635, 636, 636, 637, - 637, 637, 638, 639, 639, 640, 640, 640, 641, 641, - 642, 642, 643, 643, 643, 643, 643, 643, 643, 643, - 643, 643, 643, 644, 646, 645, 645, 647, 647, 648, - 649, 650, 650, 651, 652, 653, 653, 654, 655, 655, - 656, 656, 657, 658, 659, 660, 660, 661, 661, 662, - 663, 663, 664, 664, 665, 665, 666, 666, 667, 667, - 667, 667, 667, 667, 667, 667, 667, 667, 667, 668, - 668, 669, 669, 670, 671, 671, 672, 673, 674, 674, - 674, 675, 675, 676, 677, 677, 678, 678, 679, 680, - 680, 681, 682, 683, 683, 683, 684, 684, 685, 685, - 685, 686, 686, 687, 688, 688, 689, 689, 689, 689, - 689, 689, 689, 690, 691, 692, 693, 694, 694, 694, - 695, 696, 697, 698, 698, 699, 699, 700, 700, 700, - 700, 700, 700, 700, 700, 700, 701, 701, 702, 702, - 702, 702, 702, 703, 704, 704, 705, 705, 705, 705, - 706, 707, 708, 708, 709, 709, 710, 710, 711, 712, - 713, 714, 715, 716, 716, 717, 718, 718, 719, 719, - 720, 720, 721, 721, 722, 722, 723, 724, 724, 724, - 724, 724, 725, 726, 727, 727, 728, 729, 729, 730, - 731, 731, 732, 733, 734, 734, 735, 735, 736, 736, - 737, 737, 737, 737, 738, 739, 740, 741, 742, 743, - 743, 744, 745, 745, 746, 746, 747, 748, 749, 750, - 751, 751, 752, 753, 754, 755, 756, 757, 758, 759, - 759, 760, 760, 760, 761, 762, 763, 763, 764, 764, - 765, 765, 766, 767, 767, 768, 768, 769, 769, 770, - 771, 772, 772, 772, 773, 774, 774, 775, 776, 777, - 777, 778, 779, 780, 780, 780, 780, 780, 780, 780, - 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, - 780, 780, 780, 780, 780, 780, 780, 780, 780, 781, - 782, 783, 783, 784, 784, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 786, 787, 788, 789, 790, 791, - 792, 793, 793, 793, 794, 795, 796, 797, 798, 799, - 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, - 799, 799, 799, 800, 800, 801, 801, 802, 802, 802, - 802, 803, 803, 804, 805, 805, 806, 806, 807, 807, - 808, 808, 808, 808, 808, 808, 809, 810, 810, 811, - 811, 811, 811, 812, 812, 813, 813, 814, 814, 815, - 815, 816, 816, 817, 817, 818, 819, 820, 821, 821, - 822, 822, 823, 823, 824, 824, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 825, 826, 826, 827, 828, - 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, - 837, 838, 838, 839, 839, 840, 841, 841, 841, 841, - 842, 843, 844, 844, 844, 844, 844, 844, 844, 845, - 846, 847, 847, 847, 848, 848, 848, 849, 849, 850, - 850, 851, 851, 851, 852, 852, 852, 852, 852, 853, - 854, 855, 856, 856, 857, 857, 858, 859, 860, 861, - 861, 862, 862, 862, 862, 862, 862, 863, 864, 865, - 866, 866, 866, 867, 867, 868, 869, 869, 870, 870, - 871, 872, 872, 873, 873, 873, 874, 875, 876, 877, - 877, 878, 879, 879, 880, 880, 880, 881, 882, 883, - 884, 884, 885, 885, 885, 885, 885, 885, 885, 886, - 887, 888, 888, 889, 890, 890, 891, 891, 891, 891, - 891, 892, 892, 893, 893, 894, 894, 895 + 580, 581, 581, 582, 582, 582, 582, 582, 582, 582, + 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, + 582, 582, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, + 583, 583, 583, 583, 583, 583, 584, 584, 585, 586, + 587, 587, 588, 589, 590, 590, 591, 592, 593, 594, + 594, 595, 595, 595, 596, 597, 597, 597, 598, 598, + 599, 600, 600, 601, 602, 602, 603, 604, 604, 605, + 606, 606, 607, 608, 608, 609, 609, 610, 610, 611, + 612, 613, 614, 614, 615, 616, 616, 617, 618, 618, + 618, 618, 618, 618, 618, 618, 619, 620, 621, 621, + 622, 622, 623, 623, 624, 625, 625, 626, 626, 626, + 627, 628, 628, 629, 629, 630, 631, 631, 632, 633, + 633, 634, 634, 635, 636, 637, 638, 639, 639, 640, + 640, 640, 641, 642, 642, 643, 643, 643, 644, 644, + 645, 645, 646, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 647, 649, 648, 648, 650, 650, 651, + 652, 653, 653, 654, 655, 656, 656, 657, 658, 658, + 659, 659, 660, 661, 662, 663, 663, 664, 664, 665, + 666, 666, 667, 667, 668, 668, 669, 669, 670, 670, + 670, 670, 670, 670, 670, 670, 670, 670, 670, 671, + 671, 672, 672, 673, 674, 674, 675, 676, 677, 677, + 677, 678, 678, 679, 680, 680, 681, 681, 682, 683, + 683, 684, 685, 686, 686, 686, 687, 687, 688, 688, + 688, 689, 689, 690, 691, 691, 692, 692, 692, 692, + 692, 692, 692, 693, 694, 695, 696, 697, 697, 697, + 698, 699, 700, 701, 701, 702, 702, 703, 703, 703, + 703, 703, 703, 703, 703, 703, 704, 704, 705, 705, + 705, 705, 705, 706, 707, 707, 708, 708, 708, 708, + 709, 710, 711, 711, 712, 712, 713, 713, 714, 715, + 716, 717, 718, 719, 719, 720, 721, 721, 722, 722, + 723, 723, 724, 724, 725, 725, 726, 727, 727, 727, + 727, 727, 728, 729, 730, 730, 731, 732, 732, 733, + 734, 734, 735, 736, 737, 737, 738, 738, 739, 739, + 740, 740, 740, 740, 741, 742, 743, 744, 745, 746, + 746, 747, 748, 748, 749, 749, 750, 751, 752, 753, + 754, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 762, 763, 763, 763, 764, 765, 766, 766, 767, 767, + 768, 768, 769, 770, 770, 771, 771, 772, 772, 773, + 774, 775, 775, 775, 776, 777, 777, 778, 779, 780, + 780, 781, 782, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, 783, 784, + 785, 786, 786, 787, 787, 788, 788, 788, 788, 788, + 788, 788, 788, 788, 789, 790, 791, 792, 793, 794, + 795, 796, 796, 796, 797, 798, 799, 800, 801, 802, + 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, + 802, 802, 802, 803, 803, 804, 804, 805, 805, 805, + 805, 806, 806, 807, 808, 808, 809, 809, 810, 810, + 811, 811, 811, 811, 811, 811, 812, 813, 813, 814, + 814, 814, 814, 815, 815, 816, 816, 817, 817, 818, + 818, 819, 819, 820, 820, 821, 822, 823, 824, 824, + 825, 825, 826, 826, 827, 827, 827, 827, 827, 827, + 827, 827, 827, 827, 827, 828, 829, 829, 830, 831, + 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, + 840, 841, 841, 842, 842, 843, 844, 844, 844, 844, + 845, 846, 847, 847, 847, 847, 847, 847, 847, 848, + 849, 850, 850, 850, 851, 851, 851, 852, 852, 853, + 853, 854, 854, 854, 855, 855, 855, 855, 855, 856, + 857, 858, 859, 859, 860, 860, 861, 862, 863, 864, + 864, 865, 865, 865, 865, 865, 865, 866, 867, 868, + 869, 869, 869, 870, 870, 871, 872, 872, 873, 873, + 874, 875, 875, 876, 876, 876, 876, 876, 877, 878, + 879, 880, 881, 882, 882, 883, 884, 884, 885, 885, + 885, 886, 887, 888, 889, 889, 890, 890, 890, 890, + 890, 890, 890, 890, 891, 892, 893, 893, 894, 895, + 895, 896, 896, 896, 896, 896, 897, 897, 898, 898, + 899, 899, 900 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -2571,11 +2584,12 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 3, 2, 2, 1, 1, 3, 2, 2, 1, 1, 1, 1, 1, 1, 5, 5, 5, 3, 10, 10, 1, 3, 2, 0, 6, 0, 6, - 2, 1, 3, 1, 1, 1, 5, 5, 5, 1, - 3, 3, 1, 3, 1, 1, 1, 5, 5, 5, - 1, 3, 2, 5, 2, 5, 5, 2, 5, 5, - 1, 1, 3, 5, 1, 3, 5, 5, 5, 5, - 7, 1, 3, 2, 2, 2, 2, 0 + 2, 1, 3, 1, 1, 1, 1, 1, 5, 5, + 5, 5, 5, 1, 3, 3, 1, 3, 1, 1, + 1, 5, 5, 5, 1, 3, 2, 5, 2, 5, + 5, 2, 5, 2, 5, 1, 1, 3, 5, 1, + 3, 5, 5, 5, 5, 7, 1, 3, 2, 2, + 2, 2, 0 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -2603,7 +2617,7 @@ static const yytype_uint16 yydefact[] = 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 339, 537, 784, 537, 1226, 537, 1227, 537, 537, 339, 537, 537, 537, 537, 537, 537, - 537, 537, 1297, 1297, 1297, 1297, 1297, 1297, 611, 0, + 537, 537, 1302, 1302, 1302, 1302, 1302, 1302, 611, 0, 37, 611, 73, 48, 49, 50, 65, 66, 76, 68, 69, 67, 109, 58, 0, 146, 151, 52, 70, 71, 72, 51, 59, 54, 55, 56, 60, 207, 75, 74, @@ -2672,7 +2686,7 @@ static const yytype_uint16 yydefact[] = 527, 1149, 1179, 0, 527, 527, 527, 527, 527, 527, 1172, 310, 46, 1199, 1208, 1209, 0, 0, 46, 1228, 45, 0, 1024, 1025, 0, 992, 349, 0, 0, 45, - 45, 45, 1280, 1240, 45, 0, 0, 20, 43, 38, + 45, 45, 1285, 1240, 45, 0, 0, 20, 43, 38, 42, 0, 40, 17, 46, 310, 132, 134, 136, 110, 0, 0, 20, 339, 148, 538, 598, 165, 146, 310, 179, 181, 183, 187, 527, 190, 527, 196, 198, 200, @@ -2708,524 +2722,528 @@ static const yytype_uint16 yydefact[] = 1207, 1211, 1213, 1212, 45, 1202, 851, 1221, 0, 1205, 0, 1229, 1230, 0, 0, 999, 45, 45, 45, 0, 390, 391, 1029, 0, 0, 0, 0, 1251, 1253, 1254, - 1255, 0, 0, 1262, 1264, 1265, 1266, 0, 0, 1270, - 45, 0, 0, 1284, 28, 37, 0, 0, 39, 0, - 30, 159, 116, 310, 339, 118, 120, 0, 121, 114, - 122, 130, 129, 123, 124, 125, 0, 112, 115, 26, - 0, 310, 0, 0, 144, 177, 0, 0, 222, 222, - 0, 224, 217, 221, 0, 0, 0, 352, 0, 359, - 361, 358, 357, 375, 377, 371, 365, 504, 368, 366, - 369, 367, 370, 372, 374, 360, 373, 378, 598, 411, - 389, 0, 343, 0, 414, 415, 401, 412, 403, 0, - 598, 513, 0, 532, 530, 0, 598, 566, 573, 574, - 572, 601, 610, 605, 607, 609, 606, 604, 565, 549, - 0, 0, 0, 351, 0, 0, 0, 0, 0, 697, - 779, 0, 789, 792, 782, 0, 791, 785, 0, 783, - 784, 781, 774, 0, 429, 0, 0, 506, 0, 0, - 0, 0, 811, 477, 476, 0, 474, 0, 193, 0, - 527, 806, 427, 428, 432, 0, 0, 0, 314, 317, - 176, 0, 598, 0, 0, 0, 0, 0, 712, 723, - 310, 462, 727, 681, 0, 481, 0, 0, 201, 0, - 394, 981, 0, 0, 0, 16, 802, 327, 337, 0, - 333, 335, 331, 0, 0, 0, 0, 0, 0, 0, - 965, 685, 562, 80, 79, 128, 126, 127, 340, 0, - 487, 423, 0, 0, 0, 0, 191, 0, 520, 0, - 0, 727, 0, 0, 64, 527, 505, 601, 138, 0, - 142, 45, 0, 711, 0, 0, 0, 0, 934, 0, - 0, 0, 0, 0, 914, 916, 0, 692, 690, 0, - 45, 951, 45, 950, 145, 340, 0, 502, 0, 1181, - 0, 727, 1183, 0, 727, 0, 0, 727, 0, 727, - 0, 727, 0, 727, 0, 0, 0, 45, 0, 0, - 0, 1210, 0, 1201, 1204, 1003, 1001, 1002, 45, 998, - 0, 0, 0, 350, 598, 598, 0, 1028, 1031, 0, - 0, 0, 45, 1237, 0, 0, 0, 45, 1238, 1272, - 1274, 0, 0, 1277, 45, 1239, 0, 0, 0, 0, - 0, 0, 45, 1283, 15, 29, 41, 0, 173, 160, - 117, 0, 45, 0, 45, 27, 159, 539, 539, 169, - 172, 168, 0, 186, 189, 214, 0, 0, 0, 247, - 245, 252, 249, 263, 256, 261, 0, 0, 215, 238, - 250, 242, 253, 243, 258, 244, 0, 237, 0, 232, - 229, 218, 219, 0, 0, 425, 351, 0, 387, 598, - 347, 344, 345, 0, 398, 0, 534, 533, 0, 0, - 581, 352, 0, 0, 0, 351, 588, 351, 592, 351, - 590, 310, 0, 598, 518, 0, 0, 980, 0, 311, - 478, 480, 172, 322, 0, 598, 519, 0, 984, 598, - 983, 318, 320, 726, 0, 0, 0, 736, 0, 0, - 0, 0, 710, 464, 481, 501, 0, 203, 202, 381, - 493, 490, 488, 0, 491, 0, 328, 0, 0, 0, - 0, 0, 0, 967, 0, 1013, 0, 0, 422, 417, - 954, 955, 721, 310, 961, 437, 0, 816, 818, 824, - 294, 293, 0, 287, 0, 0, 289, 288, 0, 760, - 761, 713, 0, 943, 942, 0, 940, 0, 937, 282, - 0, 1019, 1008, 0, 1006, 1009, 755, 0, 0, 928, - 920, 693, 0, 0, 0, 0, 0, 300, 0, 299, - 307, 0, 1190, 0, 1190, 1190, 1126, 0, 1120, 1122, - 1123, 1121, 727, 1125, 1124, 0, 1190, 727, 1144, 1143, - 0, 0, 1187, 1186, 0, 0, 1190, 0, 1190, 0, - 727, 1065, 1069, 1070, 1071, 1067, 1068, 1072, 1073, 1066, - 0, 1154, 1158, 1159, 1160, 1156, 1157, 1161, 1162, 1155, - 1164, 1163, 727, 0, 1107, 1109, 1110, 1108, 727, 0, - 1137, 1138, 727, 0, 0, 0, 0, 0, 0, 1222, - 0, 0, 852, 1000, 0, 1026, 0, 598, 0, 1030, - 0, 0, 45, 1252, 0, 0, 0, 1263, 0, 0, - 0, 0, 1271, 0, 0, 45, 0, 0, 0, 45, - 1285, 0, 0, 0, 108, 794, 0, 111, 0, 173, - 0, 146, 0, 171, 170, 267, 253, 266, 0, 255, - 260, 254, 259, 0, 0, 0, 0, 0, 222, 212, - 223, 241, 0, 222, 234, 235, 0, 0, 0, 0, - 278, 223, 279, 0, 0, 227, 268, 273, 276, 229, - 220, 0, 503, 0, 413, 385, 388, 0, 346, 0, - 531, 568, 569, 0, 0, 351, 0, 0, 0, 778, - 772, 788, 0, 0, 0, 525, 0, 340, 526, 0, - 986, 0, 0, 0, 740, 0, 738, 735, 730, 734, - 732, 0, 45, 0, 463, 450, 205, 334, 336, 0, - 0, 0, 969, 964, 131, 0, 1012, 421, 0, 0, - 416, 960, 0, 0, 45, 814, 825, 826, 831, 835, - 828, 836, 837, 838, 832, 834, 833, 829, 830, 0, - 0, 0, 0, 285, 0, 0, 0, 0, 938, 933, - 472, 0, 1005, 727, 915, 0, 0, 890, 104, 306, - 301, 303, 305, 0, 0, 0, 1075, 727, 1076, 1077, - 45, 1118, 727, 1145, 1141, 727, 1190, 0, 1074, 45, - 1078, 0, 1079, 0, 1063, 727, 1152, 727, 1105, 727, - 1135, 727, 1214, 1215, 1216, 1224, 1225, 45, 1219, 1217, - 1218, 0, 0, 0, 393, 0, 0, 1259, 0, 0, - 0, 0, 0, 0, 0, 0, 1281, 0, 0, 0, - 45, 45, 0, 0, 1291, 0, 0, 0, 0, 0, - 31, 175, 174, 0, 0, 119, 113, 107, 0, 0, - 161, 598, 166, 0, 248, 246, 264, 257, 262, 216, - 222, 598, 0, 240, 236, 223, 0, 233, 0, 270, - 269, 0, 225, 229, 0, 0, 0, 0, 0, 230, - 0, 426, 386, 348, 397, 0, 583, 595, 597, 596, - 0, 430, 0, 0, 809, 0, 433, 0, 985, 756, - 729, 0, 0, 45, 0, 0, 0, 844, 974, 845, - 1018, 0, 1015, 1017, 420, 419, 0, 0, 0, 817, - 0, 827, 0, 288, 0, 0, 765, 762, 719, 714, - 715, 717, 718, 941, 1007, 1011, 0, 0, 381, 0, - 0, 0, 0, 309, 308, 521, 0, 0, 0, 1119, - 1142, 0, 1189, 1188, 0, 0, 0, 1064, 1153, 1106, - 1136, 1223, 0, 0, 392, 0, 0, 1258, 1257, 902, - 903, 904, 901, 906, 900, 907, 899, 898, 897, 905, - 893, 0, 0, 45, 1256, 1268, 1269, 1267, 1275, 1273, - 0, 1276, 0, 1278, 0, 0, 1243, 0, 1293, 1294, - 45, 1286, 1287, 1288, 1289, 1295, 1296, 0, 0, 0, - 795, 162, 163, 0, 0, 239, 598, 241, 0, 280, - 228, 0, 272, 271, 274, 275, 277, 473, 0, 770, - 769, 771, 0, 767, 431, 0, 997, 434, 0, 741, - 739, 0, 731, 0, 0, 0, 1014, 418, 846, 0, - 0, 0, 0, 911, 0, 0, 0, 0, 0, 0, - 0, 286, 291, 290, 0, 0, 0, 1004, 917, 918, - 0, 842, 891, 891, 304, 1091, 1090, 1089, 1096, 1097, - 1098, 1095, 1092, 1094, 1093, 1102, 1099, 1100, 1101, 0, - 1086, 1130, 1129, 1131, 1132, 0, 1191, 1081, 1083, 1082, - 0, 1085, 1084, 0, 1027, 1261, 1260, 0, 0, 0, - 1282, 0, 1245, 45, 1246, 1248, 1292, 0, 796, 0, - 172, 265, 0, 0, 227, 226, 0, 0, 766, 510, - 0, 0, 0, 466, 1016, 823, 822, 0, 820, 862, - 859, 0, 0, 0, 0, 909, 910, 0, 0, 0, - 0, 0, 716, 922, 1010, 45, 0, 0, 0, 0, - 0, 1128, 1185, 1080, 45, 0, 0, 894, 0, 1244, - 45, 1241, 45, 1242, 1290, 0, 0, 251, 231, 495, - 768, 757, 744, 737, 742, 0, 0, 819, 865, 860, - 0, 0, 0, 0, 0, 0, 0, 848, 0, 854, - 0, 467, 720, 0, 0, 841, 45, 45, 888, 1088, - 1087, 0, 0, 895, 0, 1279, 0, 0, 799, 793, - 797, 167, 0, 0, 465, 821, 0, 0, 0, 0, - 857, 0, 840, 0, 908, 858, 0, 847, 0, 853, - 0, 923, 0, 0, 0, 1127, 0, 0, 354, 0, - 0, 0, 496, 0, 747, 0, 745, 748, 863, 864, - 0, 866, 868, 0, 0, 0, 849, 855, 468, 919, - 889, 887, 0, 896, 45, 45, 798, 750, 751, 0, - 743, 0, 861, 0, 856, 839, 0, 0, 0, 0, - 0, 0, 749, 752, 746, 867, 0, 0, 871, 912, - 850, 1021, 1247, 1249, 753, 0, 0, 0, 869, 45, - 1020, 754, 873, 872, 45, 0, 0, 0, 874, 879, - 881, 882, 1022, 1023, 0, 0, 0, 45, 870, 45, - 45, 598, 885, 884, 883, 875, 0, 877, 878, 0, - 880, 0, 45, 886, 876 + 1255, 1257, 1256, 0, 0, 1266, 1268, 1269, 1270, 0, + 0, 1274, 45, 0, 0, 1289, 28, 37, 0, 0, + 39, 0, 30, 159, 116, 310, 339, 118, 120, 0, + 121, 114, 122, 130, 129, 123, 124, 125, 0, 112, + 115, 26, 0, 310, 0, 0, 144, 177, 0, 0, + 222, 222, 0, 224, 217, 221, 0, 0, 0, 352, + 0, 359, 361, 358, 357, 375, 377, 371, 365, 504, + 368, 366, 369, 367, 370, 372, 374, 360, 373, 378, + 598, 411, 389, 0, 343, 0, 414, 415, 401, 412, + 403, 0, 598, 513, 0, 532, 530, 0, 598, 566, + 573, 574, 572, 601, 610, 605, 607, 609, 606, 604, + 565, 549, 0, 0, 0, 351, 0, 0, 0, 0, + 0, 697, 779, 0, 789, 792, 782, 0, 791, 785, + 0, 783, 784, 781, 774, 0, 429, 0, 0, 506, + 0, 0, 0, 0, 811, 477, 476, 0, 474, 0, + 193, 0, 527, 806, 427, 428, 432, 0, 0, 0, + 314, 317, 176, 0, 598, 0, 0, 0, 0, 0, + 712, 723, 310, 462, 727, 681, 0, 481, 0, 0, + 201, 0, 394, 981, 0, 0, 0, 16, 802, 327, + 337, 0, 333, 335, 331, 0, 0, 0, 0, 0, + 0, 0, 965, 685, 562, 80, 79, 128, 126, 127, + 340, 0, 487, 423, 0, 0, 0, 0, 191, 0, + 520, 0, 0, 727, 0, 0, 64, 527, 505, 601, + 138, 0, 142, 45, 0, 711, 0, 0, 0, 0, + 934, 0, 0, 0, 0, 0, 914, 916, 0, 692, + 690, 0, 45, 951, 45, 950, 145, 340, 0, 502, + 0, 1181, 0, 727, 1183, 0, 727, 0, 0, 727, + 0, 727, 0, 727, 0, 727, 0, 0, 0, 45, + 0, 0, 0, 1210, 0, 1201, 1204, 1003, 1001, 1002, + 45, 998, 0, 0, 0, 350, 598, 598, 0, 1028, + 1031, 0, 0, 0, 0, 0, 45, 1237, 0, 0, + 0, 45, 1238, 1276, 1278, 0, 0, 1281, 1283, 45, + 1239, 0, 0, 0, 0, 0, 0, 45, 1288, 15, + 29, 41, 0, 173, 160, 117, 0, 45, 0, 45, + 27, 159, 539, 539, 169, 172, 168, 0, 186, 189, + 214, 0, 0, 0, 247, 245, 252, 249, 263, 256, + 261, 0, 0, 215, 238, 250, 242, 253, 243, 258, + 244, 0, 237, 0, 232, 229, 218, 219, 0, 0, + 425, 351, 0, 387, 598, 347, 344, 345, 0, 398, + 0, 534, 533, 0, 0, 581, 352, 0, 0, 0, + 351, 588, 351, 592, 351, 590, 310, 0, 598, 518, + 0, 0, 980, 0, 311, 478, 480, 172, 322, 0, + 598, 519, 0, 984, 598, 983, 318, 320, 726, 0, + 0, 0, 736, 0, 0, 0, 0, 710, 464, 481, + 501, 0, 203, 202, 381, 493, 490, 488, 0, 491, + 0, 328, 0, 0, 0, 0, 0, 0, 967, 0, + 1013, 0, 0, 422, 417, 954, 955, 721, 310, 961, + 437, 0, 816, 818, 824, 294, 293, 0, 287, 0, + 0, 289, 288, 0, 760, 761, 713, 0, 943, 942, + 0, 940, 0, 937, 282, 0, 1019, 1008, 0, 1006, + 1009, 755, 0, 0, 928, 920, 693, 0, 0, 0, + 0, 0, 300, 0, 299, 307, 0, 1190, 0, 1190, + 1190, 1126, 0, 1120, 1122, 1123, 1121, 727, 1125, 1124, + 0, 1190, 727, 1144, 1143, 0, 0, 1187, 1186, 0, + 0, 1190, 0, 1190, 0, 727, 1065, 1069, 1070, 1071, + 1067, 1068, 1072, 1073, 1066, 0, 1154, 1158, 1159, 1160, + 1156, 1157, 1161, 1162, 1155, 1164, 1163, 727, 0, 1107, + 1109, 1110, 1108, 727, 0, 1137, 1138, 727, 0, 0, + 0, 0, 0, 0, 1222, 0, 0, 852, 1000, 0, + 1026, 0, 598, 0, 1030, 0, 0, 45, 0, 0, + 1252, 0, 0, 0, 1267, 0, 0, 0, 0, 1275, + 0, 0, 45, 0, 0, 0, 45, 1290, 0, 0, + 0, 108, 794, 0, 111, 0, 173, 0, 146, 0, + 171, 170, 267, 253, 266, 0, 255, 260, 254, 259, + 0, 0, 0, 0, 0, 222, 212, 223, 241, 0, + 222, 234, 235, 0, 0, 0, 0, 278, 223, 279, + 0, 0, 227, 268, 273, 276, 229, 220, 0, 503, + 0, 413, 385, 388, 0, 346, 0, 531, 568, 569, + 0, 0, 351, 0, 0, 0, 778, 772, 788, 0, + 0, 0, 525, 0, 340, 526, 0, 986, 0, 0, + 0, 740, 0, 738, 735, 730, 734, 732, 0, 45, + 0, 463, 450, 205, 334, 336, 0, 0, 0, 969, + 964, 131, 0, 1012, 421, 0, 0, 416, 960, 0, + 0, 45, 814, 825, 826, 831, 835, 828, 836, 837, + 838, 832, 834, 833, 829, 830, 0, 0, 0, 0, + 285, 0, 0, 0, 0, 938, 933, 472, 0, 1005, + 727, 915, 0, 0, 890, 104, 306, 301, 303, 305, + 0, 0, 0, 1075, 727, 1076, 1077, 45, 1118, 727, + 1145, 1141, 727, 1190, 0, 1074, 45, 1078, 0, 1079, + 0, 1063, 727, 1152, 727, 1105, 727, 1135, 727, 1214, + 1215, 1216, 1224, 1225, 45, 1219, 1217, 1218, 0, 0, + 0, 393, 0, 0, 1263, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1286, 0, 0, 0, 45, + 45, 0, 0, 1296, 0, 0, 0, 0, 0, 31, + 175, 174, 0, 0, 119, 113, 107, 0, 0, 161, + 598, 166, 0, 248, 246, 264, 257, 262, 216, 222, + 598, 0, 240, 236, 223, 0, 233, 0, 270, 269, + 0, 225, 229, 0, 0, 0, 0, 0, 230, 0, + 426, 386, 348, 397, 0, 583, 595, 597, 596, 0, + 430, 0, 0, 809, 0, 433, 0, 985, 756, 729, + 0, 0, 45, 0, 0, 0, 844, 974, 845, 1018, + 0, 1015, 1017, 420, 419, 0, 0, 0, 817, 0, + 827, 0, 288, 0, 0, 765, 762, 719, 714, 715, + 717, 718, 941, 1007, 1011, 0, 0, 381, 0, 0, + 0, 0, 309, 308, 521, 0, 0, 0, 1119, 1142, + 0, 1189, 1188, 0, 0, 0, 1064, 1153, 1106, 1136, + 1223, 0, 0, 392, 0, 0, 1262, 1259, 902, 903, + 904, 901, 906, 900, 907, 899, 898, 897, 905, 893, + 0, 0, 45, 1258, 1261, 1260, 1272, 1273, 1271, 1279, + 1277, 0, 1280, 0, 1282, 0, 0, 1243, 0, 1298, + 1299, 45, 1291, 1292, 1293, 1294, 1300, 1301, 0, 0, + 0, 795, 162, 163, 0, 0, 239, 598, 241, 0, + 280, 228, 0, 272, 271, 274, 275, 277, 473, 0, + 770, 769, 771, 0, 767, 431, 0, 997, 434, 0, + 741, 739, 0, 731, 0, 0, 0, 1014, 418, 846, + 0, 0, 0, 0, 911, 0, 0, 0, 0, 0, + 0, 0, 286, 291, 290, 0, 0, 0, 1004, 917, + 918, 0, 842, 891, 891, 304, 1091, 1090, 1089, 1096, + 1097, 1098, 1095, 1092, 1094, 1093, 1102, 1099, 1100, 1101, + 0, 1086, 1130, 1129, 1131, 1132, 0, 1191, 1081, 1083, + 1082, 0, 1085, 1084, 0, 1027, 1265, 1264, 0, 0, + 0, 1287, 0, 1245, 45, 1246, 1248, 1297, 0, 796, + 0, 172, 265, 0, 0, 227, 226, 0, 0, 766, + 510, 0, 0, 0, 466, 1016, 823, 822, 0, 820, + 862, 859, 0, 0, 0, 0, 909, 910, 0, 0, + 0, 0, 0, 716, 922, 1010, 45, 0, 0, 0, + 0, 0, 1128, 1185, 1080, 45, 0, 0, 894, 0, + 1244, 45, 1241, 45, 1242, 1295, 0, 0, 251, 231, + 495, 768, 757, 744, 737, 742, 0, 0, 819, 865, + 860, 0, 0, 0, 0, 0, 0, 0, 848, 0, + 854, 0, 467, 720, 0, 0, 841, 45, 45, 888, + 1088, 1087, 0, 0, 895, 0, 1284, 0, 0, 799, + 793, 797, 167, 0, 0, 465, 821, 0, 0, 0, + 0, 857, 0, 840, 0, 908, 858, 0, 847, 0, + 853, 0, 923, 0, 0, 0, 1127, 0, 0, 354, + 0, 0, 0, 496, 0, 747, 0, 745, 748, 863, + 864, 0, 866, 868, 0, 0, 0, 849, 855, 468, + 919, 889, 887, 0, 896, 45, 45, 798, 750, 751, + 0, 743, 0, 861, 0, 856, 839, 0, 0, 0, + 0, 0, 0, 749, 752, 746, 867, 0, 0, 871, + 912, 850, 1021, 1247, 1249, 753, 0, 0, 0, 869, + 45, 1020, 754, 873, 872, 45, 0, 0, 0, 874, + 879, 881, 882, 1022, 1023, 0, 0, 0, 45, 870, + 45, 45, 598, 885, 884, 883, 875, 0, 877, 878, + 0, 880, 0, 45, 886, 876 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 6, 7, 208, 384, 209, 840, 751, 210, - 903, 619, 804, 689, 569, 901, 902, 441, 2234, 1220, - 1506, 211, 212, 620, 1124, 1125, 213, 214, 215, 579, - 1286, 1287, 1128, 1288, 216, 217, 218, 219, 1153, 220, - 221, 1154, 222, 582, 223, 224, 225, 226, 1578, 1579, - 918, 1590, 937, 1864, 227, 228, 229, 230, 231, 232, + 903, 619, 804, 689, 569, 901, 902, 441, 2245, 1220, + 1508, 211, 212, 620, 1124, 1125, 213, 214, 215, 579, + 1288, 1289, 1128, 1290, 216, 217, 218, 219, 1153, 220, + 221, 1154, 222, 582, 223, 224, 225, 226, 1583, 1584, + 918, 1595, 937, 1871, 227, 228, 229, 230, 231, 232, 785, 1164, 1165, 233, 234, 235, 746, 1076, 1077, 236, - 237, 710, 453, 930, 931, 1606, 932, 933, 1902, 1616, - 1621, 1622, 1903, 1904, 1617, 1618, 1619, 1608, 1609, 1610, - 1611, 1876, 1613, 1614, 1615, 1878, 2119, 1906, 1907, 1908, - 1166, 1167, 1478, 1479, 1993, 1727, 1145, 1146, 238, 458, - 239, 850, 2010, 2011, 1759, 2012, 1027, 718, 719, 1050, - 1051, 1039, 1040, 240, 756, 757, 758, 759, 1092, 1439, - 1440, 1441, 397, 374, 404, 1331, 1630, 1332, 885, 999, - 622, 641, 623, 624, 625, 626, 2055, 1079, 970, 1916, - 823, 627, 628, 629, 630, 631, 1336, 1632, 632, 1306, - 1913, 1404, 1385, 1405, 1020, 1137, 241, 242, 1954, 243, + 237, 710, 453, 930, 931, 1611, 932, 933, 1909, 1621, + 1626, 1627, 1910, 1911, 1622, 1623, 1624, 1613, 1614, 1615, + 1616, 1883, 1618, 1619, 1620, 1885, 2128, 1913, 1914, 1915, + 1166, 1167, 1480, 1481, 2000, 1732, 1145, 1146, 238, 458, + 239, 850, 2017, 2018, 1764, 2019, 1027, 718, 719, 1050, + 1051, 1039, 1040, 240, 756, 757, 758, 759, 1092, 1441, + 1442, 1443, 397, 374, 404, 1333, 1635, 1334, 885, 999, + 622, 641, 623, 624, 625, 626, 2062, 1079, 970, 1923, + 823, 627, 628, 629, 630, 631, 1338, 1637, 632, 1308, + 1920, 1406, 1387, 1407, 1020, 1137, 241, 242, 1961, 243, 244, 692, 1032, 1033, 709, 423, 245, 246, 247, 248, - 1083, 1084, 1433, 1923, 1924, 1070, 249, 250, 251, 252, - 1202, 253, 973, 1344, 254, 376, 727, 1422, 255, 256, + 1083, 1084, 1435, 1930, 1931, 1070, 249, 250, 251, 252, + 1202, 253, 973, 1346, 254, 376, 727, 1424, 255, 256, 257, 258, 259, 260, 652, 644, 979, 980, 981, 261, - 262, 263, 996, 997, 1002, 1003, 1004, 1333, 769, 645, + 262, 263, 996, 997, 1002, 1003, 1004, 1335, 769, 645, 801, 564, 264, 265, 266, 713, 267, 729, 730, 268, 767, 768, 269, 499, 835, 836, 838, 270, 271, 765, - 272, 820, 273, 814, 274, 701, 1067, 275, 276, 2169, - 2170, 2171, 2172, 1713, 1064, 407, 721, 722, 1063, 1678, - 1742, 1945, 1946, 2423, 2424, 2495, 2496, 2518, 2532, 2533, - 1747, 1943, 277, 278, 1729, 673, 809, 810, 1931, 2272, - 2273, 1932, 670, 671, 279, 280, 281, 282, 2083, 2084, - 2459, 2460, 283, 754, 755, 284, 706, 707, 285, 685, - 686, 286, 287, 1143, 1719, 2159, 2377, 2378, 1975, 1976, - 1977, 1978, 1979, 703, 1980, 1981, 1982, 2438, 1227, 1983, - 2440, 1984, 1985, 1986, 2380, 2428, 2468, 2500, 2501, 2537, - 2538, 2557, 2558, 2559, 2560, 2561, 2572, 1987, 2181, 2397, - 816, 2060, 2220, 2221, 2222, 1988, 828, 1493, 1494, 2005, - 1160, 2394, 288, 289, 290, 291, 292, 293, 294, 295, - 797, 1162, 1163, 1735, 1736, 296, 844, 297, 780, 298, + 272, 820, 273, 814, 274, 701, 1067, 275, 276, 2178, + 2179, 2180, 2181, 1718, 1064, 407, 721, 722, 1063, 1683, + 1747, 1952, 1953, 2434, 2435, 2506, 2507, 2529, 2543, 2544, + 1752, 1950, 277, 278, 1734, 673, 809, 810, 1938, 2283, + 2284, 1939, 670, 671, 279, 280, 281, 282, 2092, 2093, + 2470, 2471, 283, 754, 755, 284, 706, 707, 285, 685, + 686, 286, 287, 1143, 1724, 2168, 2388, 2389, 1982, 1983, + 1984, 1985, 1986, 703, 1987, 1988, 1989, 2449, 1227, 1990, + 2451, 1991, 1992, 1993, 2391, 2439, 2479, 2511, 2512, 2548, + 2549, 2568, 2569, 2570, 2571, 2572, 2583, 1994, 2190, 2408, + 816, 2067, 2229, 2230, 2231, 1995, 828, 1495, 1496, 2012, + 1160, 2405, 288, 289, 290, 291, 292, 293, 294, 295, + 797, 1162, 1163, 1740, 1741, 296, 844, 297, 780, 298, 781, 299, 1140, 300, 301, 302, 303, 304, 1100, 1101, - 305, 762, 306, 307, 308, 681, 682, 309, 310, 1407, - 1668, 715, 311, 312, 776, 313, 314, 315, 316, 317, - 318, 319, 1234, 1235, 320, 1170, 1743, 1744, 2307, 321, - 1706, 2151, 2152, 1745, 322, 2550, 323, 324, 325, 326, - 1243, 327, 328, 329, 330, 331, 332, 1203, 1790, 862, - 1768, 1769, 1770, 1794, 1795, 1796, 2340, 1797, 1798, 1771, - 2187, 2450, 2329, 333, 1209, 1818, 334, 335, 336, 337, - 1193, 1772, 1773, 1774, 2335, 338, 1211, 1822, 339, 1199, - 1777, 1778, 1779, 340, 341, 342, 1205, 1812, 343, 344, + 305, 762, 306, 307, 308, 681, 682, 309, 310, 1409, + 1673, 715, 311, 312, 776, 313, 314, 315, 316, 317, + 318, 319, 1234, 1235, 320, 1170, 1748, 1749, 2318, 321, + 1711, 2160, 2161, 1750, 322, 2561, 323, 324, 325, 326, + 1243, 327, 328, 329, 330, 331, 332, 1203, 1795, 862, + 1773, 1774, 1775, 1799, 1800, 1801, 2351, 1802, 1803, 1776, + 2196, 2461, 2340, 333, 1209, 1823, 334, 335, 336, 337, + 1193, 1777, 1778, 1779, 2346, 338, 1211, 1827, 339, 1199, + 1782, 1783, 1784, 340, 341, 342, 1205, 1817, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 1783, 1784, 863, 1515, 358, 359, 360, - 361, 362, 873, 874, 875, 1221, 1222, 1223, 1228, 1828, - 1829, 363, 364, 365, 879, 366, 367, 368, 369, 370, - 2235, 2236, 2411, 2413, 371, 1246, 1247, 1248, 1249, 1250, - 2056, 2057, 1252, 1253, 1254, 1255, 1256, 1258, 1259, 2069, - 893, 2067, 372, 1262, 1263, 2073, 2074, 2079, 557 + 355, 356, 357, 1788, 1789, 863, 1517, 358, 359, 360, + 361, 362, 873, 874, 875, 1221, 1222, 1223, 1228, 1833, + 1834, 363, 364, 365, 879, 366, 367, 368, 369, 370, + 2246, 2247, 2422, 2424, 371, 1246, 1247, 1248, 1249, 1250, + 1251, 1252, 2063, 2064, 1254, 1255, 1256, 1257, 1258, 1260, + 1261, 2078, 893, 2076, 372, 1264, 1265, 2082, 2083, 2088, + 557 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -2208 +#define YYPACT_NINF -2238 static const yytype_int16 yypact[] = { - -2208, 77, -2208, -2208, -2208, -2208, 35, 4734, -2208, -2208, - -2208, 146, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 792, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, 40, -2208, -2208, 810, 148, -2208, -2208, -2208, 40, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, 44, 44, -2208, -2208, -2208, -2208, -2208, 44, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - 242, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 44, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, 460, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - 509, 560, -2208, -2208, -2208, -2208, -2208, 40, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, 40, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 354, 1632, - 623, 354, -2208, -2208, -2208, 654, 709, 758, 788, -2208, - -2208, -2208, 513, 808, 44, -2208, -2208, 814, 847, 880, - 882, 154, 572, 905, 911, 920, -2208, 258, -2208, -2208, - -2208, 354, -2208, -2208, -2208, 946, -5, 1977, 2354, -2208, - -2208, 1787, -2208, 866, -2208, -2208, 2654, -2208, 960, -2208, - -2208, 1562, 960, 951, -2208, -2208, 987, -2208, -2208, -2208, - 989, 993, 1039, 1049, 1067, -2208, -2208, -2208, -2208, 1069, - 889, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, 1083, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, 135, 44, 1091, 1087, 1103, 961, 44, - 44, 125, 44, -2208, 44, 44, 1115, -2208, 175, 1120, - 44, 44, 44, 44, -2208, -2208, 44, -2208, 1124, 44, - 997, 44, 1142, -2208, -2208, -2208, 44, -2208, 1140, 44, - -2208, 44, 1156, 178, -2208, 997, -2208, 44, 44, 44, - 44, -2208, -2208, -2208, -2208, -2208, 44, -2208, 44, 44, - 623, 44, 1158, 1091, 44, 1160, -2208, 44, 44, -2208, - -2208, -2208, 1184, 1181, 44, 44, -2208, 1183, 1185, 44, - 1091, 1203, 1787, -2208, 1205, 1219, 44, -2208, 1234, 44, - 1212, -2208, 1236, 44, 1091, 1248, 1250, -2208, 961, 1091, - 44, 44, 2638, 69, 44, 107, -2208, -2208, 199, -2208, - 301, 44, 44, 44, 1277, 44, 44, 1787, 109, -2208, - -2208, 1279, 44, 44, 44, 44, 44, 2870, 44, -2208, - 1091, 44, 1091, 44, 44, -2208, -2208, 44, -2208, 1091, - 44, 1322, 1325, -2208, 44, -2208, -2208, 1336, -2208, -2208, - 1343, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, 1348, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, 44, -2208, -2208, 1351, 1359, -2208, 1375, - 1787, 1787, 1787, 1787, 1787, 1382, 1385, 1405, 1407, 1417, - 44, -2208, 1424, -2208, -2208, -2208, -2208, 1136, 174, -2208, - -2208, 44, 44, 44, 44, 1408, -2208, -2208, 1310, 44, - 44, -2208, 637, 44, 44, 44, 44, 44, 500, 44, - 1212, 44, 44, 1158, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, 1220, -2208, -2208, -2208, -2208, -2208, -2208, 1787, - 1787, 1787, -2208, 1787, -2208, -2208, -2208, -2208, -2208, -2208, - 1787, 877, -2208, 124, 1466, -2208, 1429, -2208, 1224, 1230, - 1463, -2208, -2208, 1458, 1787, -2208, -2208, 2630, -2208, -2208, - 1454, 2068, 1466, -2208, -2208, 833, 3, -2208, 2630, -2208, - -2208, -2208, 1474, 305, 181, 3422, 3422, 44, 44, 44, - 44, 44, 44, 44, 1478, -2208, 44, -2208, -2208, -2208, - 627, -2208, -2208, 1475, 44, -2208, 1787, -2208, 1251, 703, - -2208, 1477, -2208, -2208, 1482, 1493, -2208, -2208, -2208, -2208, - -2208, 2930, 44, 1488, -2208, 44, 1482, 44, -2208, 961, - -2208, -2208, -2208, -2208, -2208, -2208, 1496, -2208, -2208, -2208, - -2208, -2208, 1482, -2208, -2208, 1494, -2208, -2208, 668, 1479, - 44, 698, 116, -2208, 1495, 1341, 1787, 1368, -2208, 1513, - -2208, -2208, 1787, 1787, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, 44, -2208, 44, 1508, 629, - 44, 623, -2208, -2208, 1517, -2208, 1530, -2208, 1526, 1595, - -2208, 1536, -2208, 44, -2208, -2208, -2208, 1537, -2208, 960, - 1485, 3488, -2208, 44, -2208, 5761, -2208, 44, 1787, -2208, - 1535, -2208, 44, -2208, 44, 44, 44, 1466, 167, 44, - 44, 44, 1368, -2208, 44, 312, -2208, -2208, -2208, 2068, - 833, -2208, -2208, -2208, -2208, -2208, -2208, 135, -2208, 1475, - 1544, 1495, -2208, -2208, -2208, -2208, -2208, -2208, 44, -2208, - -2208, -2208, 5761, -2208, 175, 1491, 44, -2208, 1539, -2208, - -2208, -2208, -2208, 1540, 3567, 706, -2208, -2208, 460, 44, - 623, -2208, 44, 1482, -2208, 1548, 1542, -2208, 44, -2208, - 1549, 1787, 1787, -2208, 1482, 44, 184, 44, 1273, 1273, - 189, 1273, -2208, 1546, 222, 224, 232, 233, 261, 310, - -2208, 1482, 449, -2208, 1556, -2208, 120, 173, 1258, -2208, - -2208, 3609, 5761, 3648, 3723, 1566, 5761, 44, 44, -2208, - -2208, -2208, -2208, 1567, -2208, 44, 44, -2208, -2208, -2208, - -2208, 708, -2208, -2208, 1363, 1482, -2208, -2208, -2208, -2208, - 3026, 44, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 1482, - -2208, -2208, -2208, -2208, 1572, -2208, 1572, -2208, -2208, -2208, - -2208, 575, -2208, 455, -2208, 1568, -2208, -2208, 3764, 1573, - 1575, 1575, 2712, -2208, 1787, 1787, 1787, 1787, 1787, 1787, - 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, - 1787, 1787, 1787, -2208, 1522, 1459, 1569, 514, 364, 1787, - -2208, -2208, -2208, 712, 1532, -2208, -2208, -2208, -2208, 729, - -2208, 1633, 1080, 1787, 1585, 2068, 2068, 2068, 2068, 2068, - -2208, 1437, -2208, 305, 305, 1466, 1587, -2208, 3422, 5761, - 100, 140, -2208, 1589, 1591, -2208, -2208, 1482, -2208, -2208, - -2208, -2208, 1482, -2208, 661, -2208, 135, -2208, -2208, -2208, - 44, 3795, 44, 1588, 1787, 1533, -2208, -2208, 44, -2208, - 1787, 3831, -2208, 731, -2208, -2208, 1565, -2208, -2208, 733, - -2208, 44, -2208, 44, -2208, -2208, 1479, -2208, -2208, -2208, - -2208, -2208, 3865, 1482, -2208, -2208, -2208, 1592, 1594, 1596, - 1597, 1598, 1600, -2208, 1341, -2208, 44, -2208, 3896, -2208, - -2208, 44, 3956, 4036, -2208, 1601, 754, 1602, 1463, -2208, - -2208, 44, -2208, 1609, -2208, 1599, -2208, 44, -2208, 1489, - 588, -2208, -2208, -32, -2208, -2208, 1613, -2208, 1606, 1625, - 762, -2208, 44, 3422, 1612, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, 1614, -2208, -2208, 302, 1615, 1616, - 4071, 3230, -62, -2208, 1604, -2208, -2208, 763, -2208, -2208, - -2208, -2208, -2208, 768, 1611, 785, -2208, -2208, -2208, 1787, - -2208, 1503, -2208, -2208, -2208, 800, -2208, 1637, -2208, 1341, - 1624, 1638, 839, -2208, -2208, -2208, 1644, -2208, 1640, 1641, - 1627, 44, 1787, 1787, 2870, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, 1649, 1654, -2208, 85, -2208, -2208, 4105, 4166, - -2208, 1643, -2208, 316, 1647, -2208, -2208, -2208, -2208, 319, - -2208, -2208, -2208, 337, -2208, 343, 423, 444, -2208, 479, - -2208, 483, -2208, 1650, 1655, 1657, 1658, -2208, 1659, 1660, - -2208, -2208, -2208, -2208, -2208, -2208, 1466, 1668, 1656, -2208, - 1661, -2208, -2208, -67, 840, -2208, -2208, -2208, -2208, 1787, - 681, 770, -2208, 843, 844, 475, 851, -2208, -2208, -2208, - -2208, 65, 883, -2208, -2208, -2208, -2208, 477, 903, -2208, - -2208, 300, 908, -2208, -2208, 623, 44, 129, -2208, 1663, - -2208, 1674, -2208, 1482, -2208, -2208, -2208, 1672, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, 1076, -2208, -2208, -2208, - 44, 1482, 108, 1814, -2208, -2208, 44, 44, -2208, 1369, - 455, -2208, 1673, -2208, 1621, 1787, 3422, -2208, 1787, 1575, - 1575, 159, 159, 2712, 644, 1131, 2831, 5761, 2831, 2831, - 2831, 2831, 2831, 1131, 1858, 1575, 1858, 3446, 1569, -2208, - -2208, 1669, 1684, 2759, -2208, -2208, -2208, -2208, -2208, 1686, - -2208, -2208, 961, 5761, -2208, 1787, -2208, -2208, -2208, -2208, - 5761, 166, 5761, 1585, 1585, 945, 1585, 495, -2208, 1587, - 1688, 305, 4207, 1691, 1694, 1695, 3422, 3422, 3422, -2208, - -2208, 44, 1679, -2208, -2208, 1689, 1495, -2208, 460, -2208, - -2208, -2208, -2208, 1450, -2208, 913, 961, -2208, 961, 919, - 1699, 944, -2208, 5761, 1787, 2930, -2208, 947, -2208, 961, - 1572, -2208, 799, 955, -2208, 948, 1541, 971, -2208, 2121, - -2208, 116, -2208, 1693, 44, 44, 1787, 44, -2208, -2208, - 1482, -2208, -2208, -2208, 1470, 44, 1787, 44, -2208, 44, - -2208, 1466, 1787, 1692, 3230, -2208, -2208, -2208, -2208, 978, - -2208, 1696, -2208, 1701, 1702, 1709, 1502, 1787, 44, 44, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 1091, 44, - -2208, 3266, 1916, 1705, 44, 44, -2208, 44, -2208, 1538, - 44, -2208, 1787, 44, -2208, 1572, 5761, -2208, 1719, 88, - 1719, -2208, 44, 1341, 1721, 3301, 44, 44, -2208, 175, - 1787, 672, 1787, 983, -2208, 1715, 988, 5761, -2208, 51, - -2208, -2208, -2208, -2208, -2208, 1091, 43, -2208, 44, -2208, - 497, -2208, -2208, -42, -2208, 194, 1110, -2208, 942, -2208, - 321, -2208, -47, -2208, 44, 44, 44, -2208, 44, 44, - 449, -2208, 44, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - 1401, 1421, 1406, 5761, -2208, 1569, 44, -2208, -2208, 1717, - 1723, 1725, -2208, -2208, 1726, 1730, 1731, -2208, -2208, -2208, - 1732, 1733, 1735, 1736, -2208, -2208, 776, 1738, 1739, 1740, - 1742, 1744, -2208, -2208, -2208, -2208, -2208, 44, 299, -2208, - -2208, 1746, -2208, 1727, -2208, -2208, 1674, -2208, -2208, -2208, - -2208, 5761, 2276, -2208, -2208, -2208, 573, 425, 425, 1518, - 1519, -2208, -2208, 1520, 1523, 1524, 579, 44, -2208, -2208, - -2208, -2208, 1763, -2208, -2208, -2208, 1673, -2208, 1764, -2208, - 469, 1756, -2208, 1759, 4238, -2208, 1754, 1758, 1463, -2208, - -2208, 4303, -2208, 1787, 1787, 1532, -2208, 5761, 2630, 305, - -2208, 147, 3422, 3422, 3422, 151, -2208, 170, -2208, 180, - -2208, 1482, 44, -2208, -2208, 1769, 990, -2208, 1773, -2208, - 5761, -2208, -2208, -2208, 1787, -2208, -2208, 1787, -2208, -2208, - -2208, -2208, 5761, -2208, 1541, 1787, 1760, -2208, 1762, 1768, - 4334, 1777, -2208, 75, 44, -2208, 992, -2208, -2208, 1765, - 5761, -2208, -2208, 4303, -2208, 1489, -2208, 1489, 44, 44, - 44, 998, 999, -2208, 44, 1778, 1779, 1787, 4379, 3360, - -2208, -2208, -2208, 1482, 1466, -2208, 1784, -2208, 1635, 1802, - 5761, -2208, 44, -2208, 1797, 1798, -2208, -2208, 1560, 1809, - -2208, -2208, 1813, -2208, 5761, 1008, -2208, 1013, -2208, -2208, - 4410, -2208, -2208, 1014, -2208, -2208, 5761, 1801, 44, -2208, - -2208, -2208, 1810, 1812, 1628, 1766, 44, 44, 1822, 1838, - -2208, 638, -2208, 1832, -2208, -2208, -2208, 1834, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, 497, -2208, -2208, -2208, -2208, - -42, 44, -2208, -2208, 1017, 1837, -2208, 1839, -2208, 1841, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - 1110, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, 942, -2208, -2208, -2208, -2208, -2208, 321, - -2208, -2208, -2208, -47, 1836, 1845, 1847, 865, 1032, -2208, - 1848, 1849, 1466, -2208, 1857, -2208, 1862, 1569, 1852, -2208, - 44, 44, -2208, -2208, 44, 44, 44, -2208, 44, 44, - 44, 1787, -2208, 1867, 1869, -2208, 44, 44, 1787, -2208, - -2208, 1864, 1787, 1787, -2208, -2208, 1870, -2208, 1177, 299, - 2449, -2208, 1033, -2208, 5761, -2208, -2208, -2208, 1885, -2208, - -2208, -2208, -2208, 514, 514, 514, 514, 514, 1369, -2208, - 1879, 1895, 1886, 1369, 1756, -2208, 455, 469, 172, 172, - -2208, -2208, -2208, 1034, 1846, 931, 294, -2208, 1896, 469, - -2208, 1787, -2208, 1884, -2208, 1463, -2208, 2759, 5761, 1887, - -2208, -2208, 833, 1881, 1889, 1040, 1890, 1891, 1892, -2208, - -2208, -2208, 1899, 17, 961, -2208, 44, 1091, 5761, 17, - 5761, 1541, 1787, 1894, 4467, 1042, -2208, -2208, -2208, -2208, - -2208, 1787, -2208, 1902, -2208, -2208, -2208, -2208, -2208, 1057, - 1066, 1074, -2208, -2208, -2208, 716, -2208, 5761, 1787, 1787, - 4732, -2208, 44, 44, -2208, -2208, 1802, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 1901, - 88, 1903, 3488, -2208, 44, 44, 44, 3301, -2208, -2208, - -2208, 672, -2208, -2208, -2208, 2801, 44, -2208, -2208, 1822, - 1914, -2208, -2208, 44, 44, 1787, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, 194, -2208, -2208, - -2208, 1787, -2208, 1787, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, 44, 44, 1907, 1028, 1904, 1078, -2208, 1085, 1169, - 1092, 1111, 1116, 1130, 1144, 1149, -2208, 1159, 5067, 1910, - -2208, -2208, 290, 1164, -2208, 1168, 1193, 5107, 874, 1926, - -2208, 5761, 5761, 1195, 1928, -2208, -2208, -2208, 1921, 5138, - -2208, -2208, -2208, 573, -2208, -2208, -2208, -2208, -2208, -2208, - 1369, -2208, 44, -2208, -2208, 1935, 1929, -2208, 901, 294, - 294, 469, -2208, 469, 172, 172, 172, 172, 172, 1228, - 5169, -2208, -2208, -2208, -2208, 1787, -2208, -2208, -2208, -2208, - 1828, -2208, 44, 1954, 1493, 44, -2208, 44, -2208, 5200, - -2208, 1787, 1787, -2208, 5231, 1710, 1787, -2208, -2208, -2208, - -2208, 1198, -2208, -2208, 5761, 5761, 1787, 1217, 1950, -2208, - 603, -2208, 1787, -2208, 1945, 1946, -2208, -2208, 1956, 1961, - -2208, -2208, -2208, -2208, -2208, 1840, 1952, 1218, 1967, 1971, - 1229, 950, 44, -2208, -2208, 5761, 1286, 1960, -1, -2208, - -2208, 1947, -2208, -2208, -60, 5262, 5293, -2208, -2208, -2208, - -2208, -2208, 1235, 1962, 1036, 1787, 44, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, 1970, 1972, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - 44, -2208, 1787, -2208, 1629, 1240, -2208, 1245, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, 1787, 1979, 1982, - -2208, -2208, -2208, 1814, 1973, -2208, 1569, -2208, 469, -2208, - 1228, 1975, 294, 294, -2208, -2208, -2208, -2208, 5324, -2208, - 4303, -2208, 1246, -2208, -2208, 961, 1668, -2208, 1541, 5761, - -2208, 1737, -2208, 1976, 5355, 716, -2208, 5761, -2208, 2560, - 1983, 1984, 1985, 1987, 1988, 44, 44, 1989, 1990, 1991, - 5386, -2208, -2208, -2208, 1787, 44, 44, -2208, -2208, 1994, - 44, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, 2003, - -2208, -2208, -2208, -2208, -2208, 1285, -2208, -2208, -2208, -2208, - 1992, -2208, -2208, 2004, -2208, 5761, -2208, 44, 44, 1169, - -2208, 5417, -2208, -2208, 2006, 2008, -2208, 5448, -2208, 2010, - -2208, -2208, 1997, 1291, 1228, -2208, 1787, 1828, -2208, -2208, - 1787, 44, 1787, -2208, -2208, -2208, 5761, 1296, -2208, -2208, - 1983, 44, 44, 44, 44, -2208, -2208, 1787, 1787, 44, - 1787, 1305, -2208, -2208, 2011, -2208, 1317, 2013, 1324, 44, - 1787, -2208, -2208, -2208, -2208, 665, 2019, -2208, 1787, -2208, - -2208, -2208, -2208, -2208, -2208, 44, 2000, -2208, -2208, 5479, - -2208, 5761, -2208, -2208, 1996, 5510, 2560, -2208, 427, -2208, - 2021, 1326, 2025, 1327, 2022, 1328, 5541, 5572, 2015, -2208, - 1331, 5603, -2208, 44, 1963, -2208, -2208, -2208, -2208, 1668, - -2208, 5634, 1711, -2208, 1787, 5761, 1682, 1697, -2208, 2034, - -2208, -2208, 1787, 2188, -2208, -2208, 2037, 2038, 44, 44, - -2208, 44, -2208, 2870, -2208, -2208, 1787, -2208, 44, -2208, - 1787, -2208, 2026, 1338, 1346, -2208, 2036, 5665, 1073, 2040, - 2044, 44, 5761, 44, 5761, 1357, -2208, -2208, -2208, -2208, - 1362, -2208, 2045, 1380, 1396, 1400, 5696, -2208, 5761, -2208, - -2208, -2208, 1787, -2208, -2208, -2208, -2208, -2208, 2032, 2188, - -2208, 44, -2208, 1787, -2208, -2208, 2031, 1787, 1403, 1404, - 1415, 1787, 2046, -2208, -2208, -2208, 5730, 1419, -2208, -2208, - 5761, 2053, -2208, -2208, -2208, 1787, 1787, 1787, 2047, -2208, - -2208, -2208, 5761, -2208, -2208, -56, 453, 1422, -2208, 2058, - 2062, -2208, -2208, -2208, 2057, 2057, 2057, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, 182, 2075, -2208, 1925, - -2208, 1441, -2208, -2208, -2208 + -2238, 121, -2238, -2238, -2238, -2238, 108, 5149, -2238, -2238, + -2238, 124, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 904, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, 130, -2238, -2238, 516, 126, -2238, -2238, -2238, 130, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, 199, 199, -2238, -2238, -2238, -2238, -2238, 199, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + 186, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 199, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, 279, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + 316, 390, -2238, -2238, -2238, -2238, -2238, 130, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, 130, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 189, 991, + 438, 189, -2238, -2238, -2238, 462, 563, 569, 610, -2238, + -2238, -2238, 521, 665, 199, -2238, -2238, 695, 711, 725, + 732, 638, 188, 735, 771, 792, -2238, 568, -2238, -2238, + -2238, 189, -2238, -2238, -2238, 631, 744, 2244, 2336, -2238, + -2238, 2957, -2238, 811, -2238, -2238, 1868, -2238, 847, -2238, + -2238, 1643, 847, 863, -2238, -2238, 897, -2238, -2238, -2238, + 912, 919, 937, 955, 964, -2238, -2238, -2238, -2238, 1011, + 1079, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, 1023, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, 173, 199, 1002, 1028, 1046, 934, 199, + 199, 117, 199, -2238, 199, 199, 1053, -2238, 621, 1064, + 199, 199, 199, 199, -2238, -2238, 199, -2238, 1080, 199, + 948, 199, 1137, -2238, -2238, -2238, 199, -2238, 1101, 199, + -2238, 199, 1103, 140, -2238, 948, -2238, 199, 199, 199, + 199, -2238, -2238, -2238, -2238, -2238, 199, -2238, 199, 199, + 438, 199, 1154, 1002, 199, 1156, -2238, 199, 199, -2238, + -2238, -2238, 1147, 1178, 199, 199, -2238, 1187, 1222, 199, + 1002, 1227, 2957, -2238, 1232, 1238, 199, -2238, 1203, 199, + 1246, -2238, 1244, 199, 1002, 1262, 1270, -2238, 934, 1002, + 199, 199, 1931, 66, 199, 110, -2238, -2238, 166, -2238, + 168, 199, 199, 199, 1276, 199, 199, 2957, 119, -2238, + -2238, 1282, 199, 199, 199, 199, 199, 2702, 199, -2238, + 1002, 199, 1002, 199, 199, -2238, -2238, 199, -2238, 1002, + 199, 1297, 1299, -2238, 199, -2238, -2238, 1315, -2238, -2238, + 1325, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, 1334, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, 199, -2238, -2238, 1365, 1368, -2238, 1383, + 2957, 2957, 2957, 2957, 2957, 1387, 1389, 1394, 1398, 1420, + 199, -2238, 1426, -2238, -2238, -2238, -2238, 1194, 193, -2238, + -2238, 199, 199, 199, 199, 1431, -2238, -2238, 1326, 199, + 199, -2238, 243, 199, 199, 199, 199, 199, 559, 199, + 1246, 199, 199, 1154, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, 1230, -2238, -2238, -2238, -2238, -2238, -2238, 2957, + 2957, 2957, -2238, 2957, -2238, -2238, -2238, -2238, -2238, -2238, + 2957, 1328, -2238, 221, 1285, -2238, 1430, -2238, 1220, 1239, + 1446, -2238, -2238, 1452, 2957, -2238, -2238, 1580, -2238, -2238, + 1466, 1472, 1285, -2238, -2238, 812, -3, -2238, 1580, -2238, + -2238, -2238, 1496, 228, 144, 2988, 2988, 199, 199, 199, + 199, 199, 199, 199, 1503, -2238, 199, -2238, -2238, -2238, + 643, -2238, -2238, 1492, 199, -2238, 2957, -2238, 1272, 179, + -2238, 1506, -2238, -2238, 1519, 1510, -2238, -2238, -2238, -2238, + -2238, 2753, 199, 1523, -2238, 199, 1519, 199, -2238, 934, + -2238, -2238, -2238, -2238, -2238, -2238, 1537, -2238, -2238, -2238, + -2238, -2238, 1519, -2238, -2238, 1531, -2238, -2238, 740, 1441, + 199, 749, 154, -2238, 1532, 1377, 2957, 1402, -2238, 1541, + -2238, -2238, 2957, 2957, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, 199, -2238, 199, 1538, 165, + 199, 438, -2238, -2238, 1547, -2238, 1548, -2238, 1542, 826, + -2238, 1550, -2238, 199, -2238, -2238, -2238, 1552, -2238, 847, + 1535, 3122, -2238, 199, -2238, 5826, -2238, 199, 2957, -2238, + 1551, -2238, 199, -2238, 199, 199, 199, 1285, 714, 199, + 199, 199, 1402, -2238, 199, 718, -2238, -2238, -2238, 1472, + 812, -2238, -2238, -2238, -2238, -2238, -2238, 173, -2238, 1492, + 1555, 1532, -2238, -2238, -2238, -2238, -2238, -2238, 199, -2238, + -2238, -2238, 5826, -2238, 621, 1501, 199, -2238, 1554, -2238, + -2238, -2238, -2238, 1556, 3194, 763, -2238, -2238, 279, 199, + 438, -2238, 199, 1519, -2238, 1559, 1558, -2238, 199, -2238, + 1565, 2957, 2957, -2238, 1519, 199, 177, 199, 1288, 1288, + 184, 1288, -2238, 1561, 202, 222, 229, 348, 352, 386, + -2238, 1519, 582, -2238, 1569, -2238, 156, 196, 1267, -2238, + -2238, 3225, 5826, 3260, 3304, 1574, 5826, 199, 199, -2238, + -2238, -2238, -2238, 1575, -2238, 199, 199, -2238, -2238, -2238, + -2238, 790, -2238, -2238, 1371, 1519, -2238, -2238, -2238, -2238, + 2845, 199, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 1519, + -2238, -2238, -2238, -2238, 1583, -2238, 1583, -2238, -2238, -2238, + -2238, 481, -2238, 437, -2238, 1573, -2238, -2238, 3456, 1584, + 1589, 1589, 1897, -2238, 2957, 2957, 2957, 2957, 2957, 2957, + 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, + 2957, 2957, 2957, -2238, 1529, 1470, 1581, 388, 98, 2957, + -2238, -2238, -2238, 795, 1486, -2238, -2238, -2238, -2238, 798, + -2238, 1825, 865, 2957, 1594, 1472, 1472, 1472, 1472, 1472, + -2238, 909, -2238, 228, 228, 1285, 1597, -2238, 2988, 5826, + 115, 152, -2238, 1600, 1605, -2238, -2238, 1519, -2238, -2238, + -2238, -2238, 1519, -2238, 604, -2238, 173, -2238, -2238, -2238, + 199, 3579, 199, 1599, 2957, 1553, -2238, -2238, 199, -2238, + 2957, 3714, -2238, 806, -2238, -2238, 1585, -2238, -2238, 829, + -2238, 199, -2238, 199, -2238, -2238, 1441, -2238, -2238, -2238, + -2238, -2238, 3808, 1519, -2238, -2238, -2238, 1602, 1603, 1608, + 1611, 1612, 1614, -2238, 1377, -2238, 199, -2238, 3842, -2238, + -2238, 199, 3876, 3910, -2238, 1616, 835, 1624, 1446, -2238, + -2238, 199, -2238, 1625, -2238, 1623, -2238, 199, -2238, 1505, + 669, -2238, -2238, 21, -2238, -2238, 1646, -2238, 1635, 1647, + 840, -2238, 199, 2988, 1634, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, 1641, -2238, -2238, 454, 1642, 1638, + 3986, 2799, -57, -2238, 1627, -2238, -2238, 864, -2238, -2238, + -2238, -2238, -2238, 885, 1639, 900, -2238, -2238, -2238, 2957, + -2238, 1001, -2238, -2238, -2238, 901, -2238, 1659, -2238, 1377, + 1652, 1661, 902, -2238, -2238, -2238, 1667, -2238, 1654, 1662, + 1650, 199, 2957, 2957, 2702, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, 1672, 1673, -2238, -37, -2238, -2238, 4021, 4056, + -2238, 1663, -2238, 423, 1674, -2238, -2238, -2238, -2238, 463, + -2238, -2238, -2238, 484, -2238, 488, 492, 552, -2238, 602, + -2238, 618, -2238, 1668, 1675, 1678, 1681, -2238, 1687, 1688, + -2238, -2238, -2238, -2238, -2238, -2238, 1285, 1680, 1695, -2238, + 1696, -2238, -2238, -29, 907, -2238, -2238, -2238, -2238, 2957, + 517, 723, -2238, 926, 928, 93, 930, -2238, -2238, -2238, + -2238, -2238, -2238, 120, 945, -2238, -2238, -2238, -2238, 549, + 952, -2238, -2238, 508, 953, -2238, -2238, 438, 199, 145, + -2238, 1693, -2238, 1677, -2238, 1519, -2238, -2238, -2238, 1703, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 1369, -2238, + -2238, -2238, 199, 1519, 116, 1974, -2238, -2238, 199, 199, + -2238, 1998, 437, -2238, 1705, -2238, 1660, 2957, 2988, -2238, + 2957, 1589, 1589, 630, 630, 1897, 1075, 3364, 2634, 5826, + 2634, 2634, 2634, 2634, 2634, 3364, 1669, 1589, 1669, 5857, + 1581, -2238, -2238, 1700, 1718, 2409, -2238, -2238, -2238, -2238, + -2238, 1720, -2238, -2238, 934, 5826, -2238, 2957, -2238, -2238, + -2238, -2238, 5826, 73, 5826, 1594, 1594, 1161, 1594, 644, + -2238, 1597, 1724, 228, 4091, 1725, 1729, 1730, 2988, 2988, + 2988, -2238, -2238, 199, 1713, -2238, -2238, 1726, 1532, -2238, + 279, -2238, -2238, -2238, -2238, 1484, -2238, 984, 934, -2238, + 934, 987, 1733, 990, -2238, 5826, 2957, 2753, -2238, 999, + -2238, 934, 1583, -2238, 793, 916, -2238, 1006, 1576, 1008, + -2238, 2202, -2238, 154, -2238, 1732, 199, 199, 2957, 199, + -2238, -2238, 1519, -2238, -2238, -2238, 1511, 199, 2957, 199, + -2238, 199, -2238, 1285, 2957, 1731, 2799, -2238, -2238, -2238, + -2238, 1031, -2238, 1735, -2238, 1739, 1748, 1749, 1557, 2957, + 199, 199, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + 1002, 199, -2238, 2832, 3091, 1745, 199, 199, -2238, 199, + -2238, 1577, 199, -2238, 2957, 199, -2238, 1583, 5826, -2238, + 1737, 87, 1737, -2238, 199, 1377, 1760, 2863, 199, 199, + -2238, 621, 2957, 657, 2957, 1037, -2238, 1759, 1039, 5826, + -2238, 49, -2238, -2238, -2238, -2238, -2238, 1002, 143, -2238, + 199, -2238, 457, -2238, -2238, 325, -2238, 103, 1135, -2238, + 1182, -2238, 520, -2238, -48, -2238, 199, 199, 199, -2238, + 199, 199, 582, -2238, 199, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, 1445, 1461, 1447, 5826, -2238, 1581, 199, -2238, + -2238, 1762, 1764, 1767, 1769, 1770, -2238, -2238, 1771, 1773, + 1774, -2238, -2238, -2238, 1775, 1776, 1778, 1781, -2238, -2238, + -2238, 1143, 1783, 1784, 1787, 1788, 1790, -2238, -2238, -2238, + -2238, -2238, 199, 850, -2238, -2238, 1792, -2238, 1803, -2238, + -2238, 1677, -2238, -2238, -2238, -2238, 5826, 2238, -2238, -2238, + -2238, 614, 389, 389, 1567, 1568, -2238, -2238, 1578, 1582, + 1586, 633, 199, -2238, -2238, -2238, -2238, 1810, -2238, -2238, + -2238, 1705, -2238, 1812, -2238, 159, 1807, -2238, 1811, 4131, + -2238, 1806, 1808, 1446, -2238, -2238, 4165, -2238, 2957, 2957, + 1486, -2238, 5826, 1580, 228, -2238, 357, 2988, 2988, 2988, + 470, -2238, 501, -2238, 579, -2238, 1519, 199, -2238, -2238, + 1823, 1054, -2238, 1831, -2238, 5826, -2238, -2238, -2238, 2957, + -2238, -2238, 2957, -2238, -2238, -2238, -2238, 5826, -2238, 1576, + 2957, 1822, -2238, 1824, 1827, 4218, 1838, -2238, 207, 199, + -2238, 1057, -2238, -2238, 1828, 5826, -2238, -2238, 4165, -2238, + 1505, -2238, 1505, 199, 199, 199, 1077, 1093, -2238, 199, + 1834, 1829, 2957, 4255, 2878, -2238, -2238, -2238, 1519, 1285, + -2238, 1840, -2238, 1683, 1849, 5826, -2238, 199, -2238, 1843, + 1845, -2238, -2238, 1607, 1855, -2238, -2238, 1857, -2238, 5826, + 1109, -2238, 1111, -2238, -2238, 4392, -2238, -2238, 1113, -2238, + -2238, 5826, 1848, 199, -2238, -2238, -2238, 1856, 1859, 1664, + 1799, 199, 199, 1858, 1867, -2238, 624, -2238, 1865, -2238, + -2238, -2238, 1866, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + 457, -2238, -2238, -2238, -2238, 325, 199, -2238, -2238, 1115, + 1872, -2238, 1873, -2238, 1875, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, 1135, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 1182, -2238, + -2238, -2238, -2238, -2238, 520, -2238, -2238, -2238, -48, 1861, + 1870, 1876, 1181, 1120, -2238, 1877, 1878, 1285, -2238, 1879, + -2238, 1881, 1581, 1880, -2238, 199, 199, -2238, 1751, 199, + -2238, 199, 199, 199, -2238, 199, 199, 199, 2957, -2238, + 1888, 1896, -2238, 199, 199, 2957, -2238, -2238, 1891, 2957, + 2957, -2238, -2238, 1894, -2238, 1617, 850, 2455, -2238, 1130, + -2238, 5826, -2238, -2238, -2238, 1908, -2238, -2238, -2238, -2238, + 388, 388, 388, 388, 388, 1998, -2238, 1903, 1914, 1906, + 1998, 1807, -2238, 437, 159, 133, 133, -2238, -2238, -2238, + 1132, 1917, 1183, 506, -2238, 1921, 159, -2238, 2957, -2238, + 1913, -2238, 1446, -2238, 2409, 5826, 1918, -2238, -2238, 812, + 1911, 1919, 1139, 1920, 1922, 1923, -2238, -2238, -2238, 1927, + 13, 934, -2238, 199, 1002, 5826, 13, 5826, 1576, 2957, + 1924, 4427, 1140, -2238, -2238, -2238, -2238, -2238, 2957, -2238, + 1934, -2238, -2238, -2238, -2238, -2238, 1144, 1164, 1168, -2238, + -2238, -2238, 689, -2238, 5826, 2957, 2957, 4461, -2238, 199, + 199, -2238, -2238, 1849, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, 1925, 87, 1929, 3122, + -2238, 199, 199, 199, 2863, -2238, -2238, -2238, 657, -2238, + -2238, -2238, 2604, 199, -2238, -2238, 1858, 1942, -2238, -2238, + 199, 199, 2957, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, 103, -2238, -2238, -2238, 2957, -2238, + 2957, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 199, 199, + 1932, 949, 1930, 1173, -2238, 1174, 915, 1175, 1936, 1184, + 1189, 1195, 1196, 1199, 1201, -2238, 1206, 4711, 1940, -2238, + -2238, -127, 1213, -2238, 1215, 1217, 4742, 1166, 1954, -2238, + 5826, 5826, 1218, 1957, -2238, -2238, -2238, 1945, 4785, -2238, + -2238, -2238, 614, -2238, -2238, -2238, -2238, -2238, -2238, 1998, + -2238, 199, -2238, -2238, 1953, 1943, -2238, 1235, 506, 506, + 159, -2238, 159, 133, 133, 133, 133, 133, 1500, 4826, + -2238, -2238, -2238, -2238, 2957, -2238, -2238, -2238, -2238, 2034, + -2238, 199, 1962, 1510, 199, -2238, 199, -2238, 4857, -2238, + 2957, 2957, -2238, 4924, 1717, 2957, -2238, -2238, -2238, -2238, + 1224, -2238, -2238, 5826, 5826, 2957, 1240, 1958, -2238, 1049, + -2238, 2957, -2238, 1951, 1955, -2238, -2238, 1963, 1972, -2238, + -2238, -2238, -2238, -2238, 1853, 1960, 1241, 1980, 1985, 1255, + 1301, 199, -2238, -2238, 5826, 79, 1975, 368, -2238, -2238, + 1956, -2238, -2238, 304, 4955, 5000, -2238, -2238, -2238, -2238, + -2238, 1263, 1977, 985, 2957, 199, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + 1984, 1987, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, 199, -2238, 2957, -2238, 1653, 1266, -2238, 1273, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, 2957, 1993, + 1996, -2238, -2238, -2238, 1974, 1986, -2238, 1581, -2238, 159, + -2238, 1500, 1988, 506, 506, -2238, -2238, -2238, -2238, 5031, + -2238, 4165, -2238, 1278, -2238, -2238, 934, 1680, -2238, 1576, + 5826, -2238, 1750, -2238, 2001, 5088, 689, -2238, 5826, -2238, + 2549, 2003, 2004, 2006, 2007, 2009, 199, 199, 2013, 2014, + 2015, 5144, -2238, -2238, -2238, 2957, 199, 199, -2238, -2238, + 2016, 199, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + 2025, -2238, -2238, -2238, -2238, -2238, 1295, -2238, -2238, -2238, + -2238, 2012, -2238, -2238, 2028, -2238, 5826, -2238, 199, 199, + 915, -2238, 5482, -2238, -2238, 2029, 2032, -2238, 5513, -2238, + 2035, -2238, -2238, 2022, 1303, 1500, -2238, 2957, 2034, -2238, + -2238, 2957, 199, 2957, -2238, -2238, -2238, 5826, 1307, -2238, + -2238, 2003, 199, 199, 199, 199, -2238, -2238, 2957, 2957, + 199, 2957, 1311, -2238, -2238, 2037, -2238, 1321, 2039, 1347, + 199, 2957, -2238, -2238, -2238, -2238, 687, 2044, -2238, 2957, + -2238, -2238, -2238, -2238, -2238, -2238, 199, 2026, -2238, -2238, + 5544, -2238, 5826, -2238, -2238, 2038, 5575, 2549, -2238, 413, + -2238, 2047, 1364, 2048, 1366, 2041, 1367, 5606, 5637, 2042, + -2238, 1374, 5668, -2238, 199, 1981, -2238, -2238, -2238, -2238, + 1680, -2238, 5699, 1736, -2238, 2957, 5826, 1706, 1716, -2238, + 2056, -2238, -2238, 2957, 2134, -2238, -2238, 2064, 2065, 199, + 199, -2238, 199, -2238, 2702, -2238, -2238, 2957, -2238, 199, + -2238, 2957, -2238, 2053, 1376, 1378, -2238, 2060, 5730, 1043, + 2061, 2062, 199, 5826, 199, 5826, 1384, -2238, -2238, -2238, + -2238, 1386, -2238, 2063, 1393, 1395, 1400, 5761, -2238, 5826, + -2238, -2238, -2238, 2957, -2238, -2238, -2238, -2238, -2238, 2066, + 2134, -2238, 199, -2238, 2957, -2238, -2238, 2058, 2957, 1404, + 1419, 1421, 2957, 2074, -2238, -2238, -2238, 5795, 1423, -2238, + -2238, 5826, 2073, -2238, -2238, -2238, 2957, 2957, 2957, 2077, + -2238, -2238, -2238, 5826, -2238, -2238, -31, 483, 1428, -2238, + 2086, 2087, -2238, -2238, -2238, 2080, 2080, 2080, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, 548, 2089, -2238, + 1969, -2238, 1457, -2238, -2238, -2238 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -2208, -2208, -2208, -2208, -2208, -14, 1865, 1190, -2208, -2208, - -684, -38, -2208, -2208, -373, -2208, 822, -2208, -50, -720, - -2208, -2208, -2208, 2030, 98, -2208, -2208, -2208, -2208, -2208, - -2208, 223, 512, 914, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -173, -900, -2208, -2208, -2208, 1006, 515, 1516, - -2208, -151, -1555, 237, -2208, -2208, -2208, -2208, -2208, -2208, - 1521, -290, -365, -2208, -2208, -2208, 1515, -2208, -682, -2208, - -2208, -2208, -2208, 1402, -2208, -2208, 812, -1254, -1559, 1180, - 498, -1527, -143, 4, 1186, -2208, 225, 230, -1781, -2208, - -1553, -1238, -1523, -329, -2208, 27, -1583, -1803, -802, -2208, - -2208, 633, 969, 401, -36, 138, -2208, 652, -2208, -2208, - -2208, -2208, -2208, -52, -2208, -1448, -340, 1107, -2208, 1088, - 730, 752, -376, -2208, -2208, 1053, -2208, -2208, -2208, -2208, - 447, 448, 2071, 3050, -364, -1299, 234, -422, -1007, 326, - -499, -520, 1561, 542, 1703, -877, -873, -2208, -2208, -617, - -607, -228, -2208, -814, -2208, -576, -942, -1112, -2208, -2208, - -2208, 213, -2208, -2208, 1443, -2208, -2208, 1912, -2208, 1913, - -2208, -2208, 761, -2208, -379, -7, -2208, -2208, 1918, 1922, - -2208, 737, -2208, -735, -262, 1370, -2208, 1095, -2208, -2208, - 6, -2208, 1135, 536, -2208, 4535, -423, -1072, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -191, -2208, 534, -909, -2208, - -2208, -2208, 296, -1274, -635, 1178, -952, -182, -395, -430, - 873, 284, -2208, -2208, -2208, 1525, -2208, -2208, 1104, -2208, - -2208, 1077, -2208, 1340, -1967, 1009, -2208, -2208, -2208, 1527, - -2208, 1534, -2208, 1545, -2208, 1550, -1010, -2208, -2208, -2208, - -118, -254, -2208, -2208, -2208, -416, -2208, 586, 784, -572, - 786, -2208, 58, -2208, -2208, -2208, -318, -2208, -2208, -2208, - -1918, -2208, -2208, -2208, -2208, -2208, -1433, -541, 214, -2208, - -160, -2208, 1411, 1194, -2208, -2208, 1197, -2208, -2208, -2208, - -2208, -272, -2208, -2208, 1134, -2208, -2208, 1182, -2208, 289, - 1199, -2208, -2208, -868, -2208, -2207, -2208, -200, -2208, -2208, - 253, -2208, -771, -384, 1789, 1444, -2208, -2208, -1571, -2208, - -2208, -2208, -2208, -2208, -146, -2208, -2208, -2208, -286, -2208, - -311, -2208, -328, -2208, -331, -1968, -1128, -757, -2208, -69, - -480, -991, -2077, -2208, -2208, -2208, -489, -1791, 499, -2208, - -754, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -485, -1456, 759, -2208, 248, -2208, 1582, -2208, 1745, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -1432, 802, - -2208, 1492, -2208, -2208, -2208, -2208, 1872, -2208, -2208, -2208, - 314, 1844, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, 718, -2208, -2208, -2208, 259, -2208, -2208, - -2208, -2208, -24, -1902, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, 606, 462, -529, - -1312, -1231, -1317, -1437, -1428, -1427, -2208, -1421, -1419, -1228, - -2208, -2208, -2208, -2208, -2208, 445, -2208, -2208, -2208, -2208, - -2208, 488, -1417, -1415, -2208, -2208, -2208, 442, -2208, -2208, - 486, -2208, -625, -2208, -2208, -2208, -2208, 458, -2208, -2208, - -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2208, -2208, -2208, 245, -2208, 247, -61, -2208, -2208, -2208, - -2208, -2208, -2208, -2208, 1050, -2208, 1398, -2208, -826, -2208, - 231, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, -2208, - -2005, -74, -2208, -2208, -2208, -2208, 732, -2208, -2208, -2208, - -2208, 76, -2208, 726, -2208, -2208, -2208, -2208, 721, -2208, - -2208, -2208, -2208, -2208, 715, -2208, 48, -2208, 1260 + -2238, -2238, -2238, -2238, -2238, -14, 1902, 1204, -2238, -2238, + -663, -38, -2238, -2238, -400, -2238, 830, -2238, -50, -731, + -2238, -2238, -2238, 2640, 102, -2238, -2238, -2238, -2238, -2238, + -2238, 250, 540, 943, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -165, -901, -2238, -2238, -2238, 1040, 542, 1549, + -2238, -129, -1559, 260, -2238, -2238, -2238, -2238, -2238, -2238, + 1564, -278, -365, -2238, -2238, -2238, 1562, -2238, -440, -2238, + -2238, -2238, -2238, 1432, -2238, -2238, 845, -1258, -1537, 1223, + 525, -1527, -112, 37, 1229, -2238, 257, 269, -1810, -2238, + -1538, -1263, -1535, -79, -2238, 63, -1555, -1299, -805, -2238, + -2238, 675, 1013, 441, -1, 175, -2238, 698, -2238, -2238, + -2238, -2238, -2238, -15, -2238, -1452, -615, 1151, -2238, 1133, + 767, 791, -376, -2238, -2238, 1092, -2238, -2238, -2238, -2238, + 485, 486, 2111, 1022, -364, -1302, 263, -391, -1014, 1160, + -490, -567, 1916, -221, 1734, -874, -871, -2238, -2238, -627, + -607, -211, -2238, -935, -2238, -523, -950, -1109, -2238, -2238, + -2238, 246, -2238, -2238, 1482, -2238, -2238, 1948, -2238, 1949, + -2238, -2238, 799, -2238, -372, 11, -2238, -2238, 1959, 1964, + -2238, 766, -2238, -730, -301, 1410, -2238, 1281, -2238, -2238, + 550, -2238, 1169, 571, -2238, 4496, -409, -1080, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -197, -2238, 560, -925, -2238, + -2238, -2238, 532, -1280, -619, 1210, -854, -366, -313, -430, + 972, -74, -2238, -2238, -2238, 1563, -2238, -2238, 1138, -2238, + -2238, 1112, -2238, 1375, -1957, 1041, -2238, -2238, -2238, 1566, + -2238, 1570, -2238, 1560, -2238, 1571, -988, -2238, -2238, -2238, + -94, -236, -2238, -2238, -2238, -403, -2238, -223, 810, -382, + 809, -2238, 76, -2238, -2238, -2238, -302, -2238, -2238, -2238, + -1843, -2238, -2238, -2238, -2238, -2238, -1432, -517, 231, -2238, + -144, -2238, 1433, 1221, -2238, -2238, 1225, -2238, -2238, -2238, + -2238, -261, -2238, -2238, 1155, -2238, -2238, 1205, -2238, 302, + 1219, -2238, -2238, -862, -2238, -2237, -2238, -188, -2238, -2238, + 267, -2238, -758, -383, 1809, 1468, -2238, -2238, -1576, -2238, + -2238, -2238, -2238, -2238, -134, -2238, -2238, -2238, -274, -2238, + -299, -2238, -318, -2238, -319, -1716, -1045, -763, -2238, -62, + -475, -917, -2097, -2238, -2238, -2238, -489, -1800, 511, -2238, + -749, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -485, -1469, 778, -2238, 266, -2238, 1609, -2238, 1772, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -1438, 820, + -2238, 1512, -2238, -2238, -2238, -2238, 1895, -2238, -2238, -2238, + 331, 1869, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, 741, -2238, -2238, -2238, 272, -2238, -2238, + -2238, -2238, -11, -1901, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, 676, 477, -526, + -1325, -1243, -1317, -1431, -1429, -1422, -2238, -1416, -1414, -1314, + -2238, -2238, -2238, -2238, -2238, 464, -2238, -2238, -2238, -2238, + -2238, 507, -1413, -1405, -2238, -2238, -2238, 458, -2238, -2238, + 510, -2238, 421, -2238, -2238, -2238, -2238, 478, -2238, -2238, + -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2238, -2238, -2238, 265, -2238, 268, -47, -2238, -2238, -2238, + -2238, -2238, -2238, -2238, 1082, -2238, 1425, -2238, -843, -2238, + 253, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, -2238, + -2001, -60, -2238, -2238, -2238, -2238, 752, -2238, -2238, -2238, + -2238, -2238, -2238, 96, -2238, 751, -2238, -2238, -2238, -2238, + 745, -2238, -2238, -2238, -2238, -2238, 738, -2238, 65, -2238, + 1434 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -3235,1119 +3253,1151 @@ static const yytype_int16 yypgoto[] = #define YYTABLE_NINF -1191 static const yytype_int16 yytable[] = { - 410, 821, 678, 817, 829, 830, 831, 832, 704, 1098, - 1241, 674, 870, 971, 1242, 1085, 1702, 1389, 1294, 1463, - 1244, 1005, 716, 698, 422, 422, 1338, 975, 643, 1627, - 1737, 430, 731, 643, 734, 1872, 567, 1905, 2177, 737, - 738, 739, 800, 1875, 792, 1607, 1365, 740, 1891, 1730, - 742, 1230, 744, 2061, 1418, 2063, 424, 743, 1760, 1074, - 457, 1612, 437, 2153, 812, 1345, 2237, 649, 476, 747, - 653, 655, 479, 1877, 1182, 1475, 402, 2, 3, 1001, - 1001, 1804, 806, 1952, 46, 459, 773, 1640, 1183, 1895, - 1805, 1806, 793, 2331, 1910, 2109, 2110, 1807, 697, 1808, - 789, 1810, 474, 1811, 2313, 794, 1554, 1937, 1366, 802, - 939, 805, 2103, 1464, 402, 1535, 402, 74, 853, -541, - -584, 1056, 1752, 1587, 824, 989, 2562, 1959, 1960, 1961, - 501, 2337, 1018, 683, 898, 1724, 839, 1443, 842, 963, - 667, 1225, 668, 1241, 1762, 848, 421, 1384, -593, 1484, - 96, 8, 724, 1335, 1335, -594, 1000, 1000, 1231, -587, - -593, 373, 587, 405, 944, 1496, 1403, -594, 945, -339, - -384, -587, 421, 421, 1057, 1138, 1444, -527, -591, 898, - 109, -565, 2439, 978, 1270, -137, 581, 1897, -589, -563, - -591, -527, 594, 733, 1229, 899, 960, 594, 694, 1793, - -589, 1803, 1058, 1816, 1791, 693, 1801, 982, 1814, 908, - 1820, 984, 695, 598, 807, 1757, -584, 421, 991, 920, - 921, 922, 923, -141, 1776, -61, 811, 4, 2338, 2332, - 594, 1781, 594, 1196, 1197, 1764, 1200, 588, 590, 2339, - 594, 594, 1059, 595, 643, 1195, 1838, 599, 1536, 421, - 1445, 1537, 990, 1060, 421, 992, -593, 617, 421, 1753, - -541, 1465, 2563, -594, 421, 1725, 594, -587, 1156, 594, - 2058, 2507, 2407, -527, 1555, -339, 1281, -339, 1099, 1282, - 989, 1061, -565, 2333, 1504, 1792, -591, 1802, 1799, 1815, - 1809, 1821, 1817, 1556, 2334, -565, -589, -563, 924, 2116, - -1115, 421, 421, 421, 421, -1140, 440, 421, 1065, 1019, - 2564, 2262, 2263, 1034, 2108, 965, 405, 1862, 594, 2255, - 994, 1900, 1694, 421, 594, 1863, -137, 594, 421, 1953, - 1149, 2117, 1038, 1161, 5, 669, 672, 2106, -1062, 2565, - -1151, 679, 680, 684, 680, 594, 688, 690, -1167, -1170, - 696, 594, 700, 702, 702, 705, 1037, -584, 708, 1879, - 1881, 712, 1339, 708, -141, 1640, -61, 2104, 723, 1151, - 964, 728, 1044, 708, 1062, 708, 1804, -1104, 1086, 422, - 708, 708, 708, 2153, 1592, 1805, 1806, -527, 708, 2062, - 741, 708, 1807, 708, 1808, 1158, 1810, -593, 1811, 752, - 753, 2157, 1435, 1150, -594, 1152, 764, 766, -587, 643, - 736, 772, 1503, 643, 1646, 1648, 1650, 1495, 779, 1686, - 643, 783, 1001, -565, 1633, 1501, -1134, -591, 1337, 1148, - 421, 594, -1114, 796, 421, -1139, 803, -589, -563, 825, - 1701, -1115, 723, 813, 815, 815, -1140, 819, 796, 1455, - 1456, 974, 594, -1061, 827, 827, 827, 827, 827, -1150, - 837, 1430, 989, 841, 989, 843, 779, 1178, 1452, 846, - 1300, 989, 849, 1731, 1177, 497, 854, 1179, 1588, -1062, - 2202, -1151, 1457, 1793, 1897, 1898, 1899, 594, 1791, -1167, - -1170, 594, 1292, 421, 872, 570, 1803, 1667, 878, 1363, - 985, 1801, 1816, 1180, 986, 871, 2505, 1814, 1029, 2529, - 2530, 1820, 1762, 617, 1190, 1870, 1871, 1603, -1104, 904, - 575, 576, 892, 694, 507, 596, 910, 1001, 2260, 1763, - 900, 1212, 988, 905, 906, 907, 696, 695, 2053, -1166, - 1875, 913, 914, 2257, 1567, 919, 696, 696, 696, 696, - 2180, 895, 896, 927, 928, 1353, 1354, 1355, 1356, 1357, - -1169, 2497, 2167, 911, 2276, 1271, 2184, -1134, 508, 1792, - 1877, 643, 1799, -1114, 1604, 2466, -1139, 621, 1103, 1295, - 589, 2564, 1802, 1298, 421, 1809, 1091, 1888, 1815, 1597, - 1598, 1817, 1821, 2435, -1061, -1103, 1213, 1214, 421, -1133, - -1150, 2578, 2580, 1764, 1000, 2238, 1765, 2467, 50, -527, - 2565, 563, 1299, 2544, 2584, 1014, 1889, 2497, 1900, 712, - 1007, 764, 819, 813, 700, 1012, 1605, 2551, 843, 1215, - 1568, 989, 965, 1025, 1607, 1016, 696, 577, 568, 2102, - 2239, 965, 915, 421, 2290, 1569, 1570, 1571, 1017, 944, - 1612, 25, 916, 945, 708, 1081, 29, 1036, 1549, 696, - 946, 947, 571, 617, 2015, 1603, 1550, 1369, 965, 1241, - 2566, 1625, 1370, 1839, 1752, 2364, 1046, 1741, 47, 48, - -1166, 960, 1053, 1551, -382, 1023, 2453, 1675, 1762, 1047, - 1646, 1648, 1650, 904, 1098, 1098, 1544, 1085, 1824, 1825, - 1826, -1169, 1830, 1831, 1372, 1763, 1054, 1075, 118, 1080, - 1093, 594, 1082, 1410, 1174, 122, 1267, 572, -527, 1055, - 1340, 1741, 1604, 2150, 1127, 1096, 1345, 1175, 1373, 1268, - 1001, 1132, 90, 1341, 1293, 1126, -1103, 1346, 2291, 1395, - -1133, 1399, 95, 1374, 1133, 1687, 1134, 1688, 1375, 1376, - 1347, 1141, 1396, 1144, 1400, 1377, 696, 643, 643, 643, - 643, 643, 1427, 1216, 1217, 1942, 573, 1218, 1219, 669, - 1449, 1467, 1443, -383, 1605, 1428, 1470, 2406, 775, 1764, - 1096, 1328, 1765, 1450, 1468, 1545, 696, 1766, 121, 1471, - 1001, 1001, 1001, 1473, 1716, 1767, 574, 1185, 642, -792, - -792, 696, -382, 642, 696, 2416, 1474, 1000, 1016, 1626, - 1186, 1753, 2292, 822, 963, 1559, 580, 402, 1560, 1561, - 1562, 1481, 583, 834, 2293, 403, 2294, 2295, 2449, 2296, - 1233, 1563, 2297, 989, 989, 989, 989, 989, 985, 1245, - 1251, 1257, 986, 1679, 1261, 1681, 2102, 1487, 1538, 638, - 639, 1546, 1470, 974, 2396, 584, 987, 1264, 841, 1552, - 1488, 1539, 1192, 1406, 1547, 1548, 1198, 1645, 1647, 1649, - 988, 1204, 1553, 1289, 1208, 1210, 881, 882, 883, 884, - 886, 633, 944, 1266, 1304, 1445, 945, 607, 585, 1378, - 586, 1557, 1574, 946, 947, 1301, 664, 665, 1290, 948, - 949, 950, 951, 952, 1558, 953, 954, 955, 956, 957, - 958, 1564, 959, 591, 960, 961, 1572, 2114, 2115, 592, - 1379, 1653, 2259, 2298, 1565, 2299, 2433, 1239, 593, 1573, - 1296, 1593, 1297, 1580, 1654, 938, 940, 941, -230, 942, - 1657, 2094, 2095, 2096, 2097, 2098, 943, 2114, 2115, 2431, - 985, 1586, 1046, 597, 986, 1340, 1665, 2362, -383, 656, - 822, 638, 639, 1241, 1380, 1659, 1636, 1383, 1662, 1666, - 966, 2090, 2209, 1241, 2210, 648, 749, 2066, 669, 1669, - 2064, 2065, 988, 2211, 1387, 2212, 1695, 1989, 2075, 2076, - 684, 1748, 1670, 725, 1495, 657, 1239, 658, 1399, 1696, - 1239, 659, 1021, 705, 1749, 787, 1239, 1449, 1633, 1751, - 1655, 1935, 795, 1956, 642, 2504, 1997, 1031, 2271, 1962, - 1963, 1487, 2001, 1663, 2132, 2027, 1785, 1919, 1420, 1998, - 2137, -387, 1667, 728, 1999, 2002, 904, 2503, 2028, -385, - 2047, 2091, 2111, 969, 1446, 1052, 1685, 660, -587, 753, - 2142, 969, 1068, 2048, 2092, 2112, 1241, 661, 1072, 1073, - 2131, 1914, 1403, 2143, 766, 1532, 1001, 1001, 1001, 1335, - 1335, 1335, 1335, 1335, 1532, 662, 965, 663, 2147, 421, - 1682, -852, 1532, 1583, 1584, 985, 2206, 2148, 1469, 986, - 1495, 666, 1495, 1532, 1704, 2149, 638, 639, 402, 2207, - 2223, 1351, 675, 987, 1130, 856, 2208, 858, 2213, 2214, - 677, 2215, 2216, 2224, 859, 860, 861, 988, 676, 1748, - 864, 865, 866, 867, 1487, 868, 869, 1853, 1854, 646, - 691, 1499, 2225, 1762, 654, 699, 944, 2226, 1748, 711, - 945, 1756, 2217, 1925, 1647, 1649, 714, 946, 947, 717, - 1763, 2227, 1470, 948, 949, 726, 951, 1470, 1635, 953, - 954, 955, 956, 957, 1638, 2228, 959, 2230, 960, 961, - 2229, 732, 2240, 745, 1530, 750, 1470, 1188, 1189, 642, - 2231, 2045, 2046, 642, 2218, 2241, 1540, 1541, 1542, 2242, - 642, 2209, 760, 2210, 1785, 995, 763, 2219, 770, 1511, - 771, 1470, 2211, 2248, 2212, 1514, 2285, 1786, 1922, 1517, - 1566, 1519, 1517, 1517, 2243, 1521, 2249, 1523, 774, 2286, - 777, 1272, 2245, 2246, 1764, 1532, 1174, 1765, 1575, 900, - 1674, 1787, 1766, 2016, 778, 2018, 2019, 1487, 2288, 2309, - 1767, 1788, 782, 1532, 2114, 2115, 1789, 2023, 2353, 784, - 2311, 786, 1585, 2353, 2367, 2271, 2343, 2030, 696, 2032, - 897, 2354, 1301, 790, 1273, 791, 2355, 2368, 1880, 1882, - 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, - 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1359, - 1360, 2315, 818, 2400, 826, 822, 1275, 2391, 2122, 2111, - 1343, 1762, 2316, 2317, 2426, 1955, 2401, 1350, 2318, 1352, - 2319, 1929, 2418, 1239, 2264, 2265, 2266, 2427, 1763, 2320, - 1276, 2321, 1277, 2322, 1362, 1487, 2442, 2213, 2214, 1241, - 2215, 2216, 2447, 1651, 1449, 1487, 1748, 851, 2445, 2478, - 852, 642, 605, 606, 1592, 2448, 2223, 2470, 2472, 2474, - 886, 855, 2479, 1241, 2223, 1278, 1393, 2350, 857, 2510, - 1279, 2217, 1837, -1190, 1280, 2519, 876, 2511, 1281, 2370, - 2521, 1282, 1052, 1971, 877, 1786, 1677, 1677, 2520, 1677, - 1926, 1927, 1928, 2522, 1596, 1597, 1598, 708, 1449, 1075, - 880, 1075, 1764, 1283, 1689, 1765, 1599, 887, 1159, 1787, - 888, 2524, 989, 2218, 1487, 1600, 1664, 1284, 1174, 1788, - 643, 1239, 2353, 1285, 1789, 909, 2219, 2525, 1226, 1226, - 889, 2526, 890, 2353, 2541, 2542, 1712, 2547, 1601, 787, - 2567, 1728, 891, 1602, 912, 1144, 2543, 2573, 2574, 894, - 2548, 1726, 985, 2568, 966, 2323, 986, 1917, 2324, 1629, - 1754, 696, 1755, 638, 639, 2483, 2484, 1462, 1358, 936, - 987, 1603, 2583, 558, 559, 560, 561, 562, 1758, 965, - 967, 1933, 1206, 1207, 988, 1476, 968, 1827, 969, 972, - 983, 1722, 993, 1939, 1048, 1013, 1049, 1941, 1233, 607, - 807, 1022, 1024, 608, 609, 610, 611, 1026, 886, 1497, - 834, 1028, 1245, 1035, 1041, 2528, 612, 1251, 985, 1045, - 405, 1104, 986, 613, 1257, 614, 1066, 1069, 1604, 638, - 639, 1071, 1261, 963, 1477, 1087, 987, 642, 642, 642, - 642, 642, 1127, 2325, 1868, 995, 995, 1342, 1088, 1861, - 988, 1089, 607, 615, 1094, 1102, 608, 609, 610, 611, - 1131, 1157, 2393, 1168, 1171, 1172, 1181, 1187, 2133, 612, - 1195, 1201, 787, 1184, 1224, 1543, 613, 651, 614, 1890, - 1605, 616, 1216, 2135, 1239, 1260, 1269, 637, 638, 639, - 594, 1308, 1901, 1305, 945, 787, 1329, 2122, 1330, 612, - -342, 2326, 2327, 2328, 986, 1361, 615, 1367, 614, 1368, - 1390, 1689, 1398, 1388, 1689, 1689, 1689, 1412, 421, 1413, - 1429, 1414, 1415, 1416, 1930, 1417, 1426, 1432, 1438, 1591, - -935, 1447, 2179, 1431, 616, 1434, 615, 1098, 617, 2434, - 1495, 1624, 1448, 1453, 1459, 1454, 1458, 1472, 1348, 1485, - 1411, 1466, 1349, 607, 1482, 1486, 708, 608, 609, 610, - 611, 1419, 1489, 1492, 616, 1490, 1491, 1500, 25, 1631, - 612, 421, 1502, 29, 1509, 1524, 1964, 613, 1512, 614, - 1525, 1637, 1526, 1527, 1528, 1529, 1532, 1533, 1577, 915, - 618, 617, 1534, 1623, 1082, 47, 48, 1582, 1620, 2481, - 1628, 640, 1629, 1634, 373, 25, 1639, 615, 978, 1642, - 29, 2312, 1643, 1644, 403, 1652, 1658, 978, 1675, 1684, - 1444, 617, 1697, 1692, 2502, 1098, 1698, 1699, 2008, 2009, - 1660, 1031, 47, 48, 1700, 616, 1711, 1723, 1732, 1716, - 1750, 1834, 1840, 618, 1867, 1672, 1835, 1836, 1841, 90, - 1842, 1844, 1680, 2026, 1483, 1845, 1846, 1848, 1849, 95, - 1850, 1851, 886, 1855, 1856, 1857, 565, 1858, 1690, 1859, - 1693, 1865, 421, 618, 1883, 1884, 1885, 2502, 1893, 1886, - 1887, 1909, 1896, 886, 1911, 1914, 90, 1934, 1510, 1915, - 1936, 1947, 617, 1948, 1513, 1951, 95, 1708, 1516, 1949, - 1518, -494, 2059, 1965, 1520, 121, 1522, 607, 1720, 1972, - 1966, 608, 609, 610, 611, 2072, 2385, 2386, 1973, 2078, - 1974, 1734, 1991, 1992, 612, 1994, 1740, 1995, 1746, 1589, - 1996, 613, 2003, 614, 607, 2006, 1090, 2007, 608, 609, - 610, 611, 121, 2269, 618, 1461, 1753, 1752, 607, 150, - 2013, 612, 608, 609, 610, 611, 2014, 2017, 613, 2020, - 614, 615, 2029, 2113, 2031, 612, 2033, 2042, 2105, 1901, - 1901, 1901, 613, 944, 614, 566, 2043, 945, 2044, 2049, - 2050, 1901, 2051, 2054, 946, 947, 150, 2052, 615, 616, - 948, 949, 2070, 951, 2071, 2080, 953, 954, 955, 956, - 957, 2085, 615, 2093, -381, 960, 2430, 2432, 684, 2369, - 2100, 2101, 2145, 995, 2121, 2118, 616, 2125, 2124, 2253, - 2126, 2127, 2128, 2129, 2130, 2140, 421, 2146, 1874, 2256, - 616, 944, 2182, 1709, 2160, 945, 607, 2162, 2204, 2164, - 2205, 2233, 946, 947, 2247, 2250, 617, 1710, 948, 949, - 950, 951, 2251, 421, 953, 954, 955, 956, 957, 958, - -224, 959, 1726, 960, 961, 2258, 1930, 421, 2168, 1918, - 822, 1343, 2275, 617, 2283, 2289, 2302, 2303, 2178, 2305, - 2188, 2304, 2306, 2308, -843, 2183, 1758, 617, 2310, 2194, - 978, 2330, 2352, 2344, 2336, 2347, 2358, 2348, 618, 2359, - 1938, 2372, 2371, 1940, 2361, 748, 2365, 1827, 2379, 2381, - 2382, 1944, 2383, 2384, 2387, 2388, 2389, 1714, 1683, 2395, - 2399, 2463, 2404, 2403, 2410, 618, 2412, 2415, 2417, 2443, - 2446, 2461, 13, 14, 748, 15, 16, 2454, 2469, 618, - 20, 748, 2471, 1967, 2489, 1970, 2477, 2473, 23, 808, - 2486, 2482, 2491, 27, 2498, 2499, 30, 2509, 2490, 2531, - 1761, 2512, 2539, 2564, 37, 2514, 38, 1718, 40, 2515, - 2523, 2549, 2554, 2545, 1890, 2569, 1226, 1226, 1226, 2570, - 1226, 1226, 2571, 1901, 1832, 1901, 1901, 1901, 1901, 1901, - 1901, 59, 2582, 799, 638, 639, 1265, 578, 787, 1576, - 2165, 2086, 70, 2281, 1866, 612, 1442, 1775, 917, 1505, - 1780, 1869, 2360, 1800, 614, 1813, 2087, 1819, 929, 1823, - 1595, 926, 1042, 1302, 1894, 2363, 85, 2261, 2099, 1303, - 2254, 2107, 1739, 1480, 1990, 1721, 1048, 2301, 2163, 93, - 2314, 607, 615, 1391, 1408, 608, 609, 610, 611, 1671, - 1656, 1437, 1957, 815, 2009, 1958, 436, 102, 612, 2581, - 925, 2123, 2136, 104, 1043, 613, 1661, 614, 600, 601, - 616, 108, 1147, 110, 602, 112, 788, 114, 603, 1691, - 1397, 1920, 1921, 2349, 119, 1423, 1364, 2068, 1176, 1451, - 642, 995, 1006, 1498, 2077, 615, 1008, 2392, 2081, 2082, - 2072, 130, 131, 1741, 1009, 1673, 2089, 640, 607, 1676, - 2280, 2534, 608, 609, 610, 611, 1010, 2420, 2166, 143, - 1382, 1381, 1011, 616, 748, 612, 604, 617, 1155, 2516, - 1901, 1436, 613, 1401, 614, 2134, 2465, 1392, 2493, 2161, - 155, 761, 1139, 156, 2429, 2535, 2553, 2120, 2577, 2575, - 1226, 1226, 1226, 1631, 2398, 2173, 1738, 2004, 1015, 845, - 421, 1703, 615, 1095, 687, 2138, 1833, 827, 827, 735, - 2174, 2374, 2035, 2022, 2039, 2041, 2025, 2168, 2139, 618, - 617, 2037, 2193, 2191, 1531, 2402, 1232, 2144, 2201, 2409, - 616, 1873, 2346, 1847, 1843, 1852, 607, 1860, 2356, 0, - 608, 609, 610, 611, 2154, 2155, 0, 0, 0, 0, - 0, 0, 0, 612, 0, 0, 1078, 0, 0, 0, - 613, 0, 614, 0, 0, 0, 0, 421, 0, 0, - 0, 0, 618, 1734, 1097, 0, 0, 0, 0, 0, - 0, 834, 0, 2422, 0, 0, 0, 617, 1129, 0, - 615, 2185, 0, 1096, 1096, 2444, 1135, 1136, 0, 0, - 0, 1142, 0, 0, 2452, 0, 0, 2195, 2021, 2196, - 2456, 0, 2457, 2024, 0, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 2034, 2458, 0, 1097, - 0, 0, 787, 1226, 0, 0, 0, 1169, 0, 618, - 0, 0, 787, 0, 0, 0, 2059, 2059, 2036, 13, - 14, 0, 15, 16, 2038, 421, 0, 20, 2040, 0, - 0, 0, 0, 0, 0, 23, 1191, 0, 1194, 0, - 27, 0, 0, 30, 0, 617, 0, 0, 0, 0, - 0, 37, 0, 38, 0, 40, 0, 748, 748, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1240, 1142, - 0, 2268, 0, 2458, 2088, 2517, 2270, 0, 59, 607, - 0, 0, 0, 608, 609, 610, 611, 2279, 1944, 70, - 0, 0, 2284, 0, 0, 787, 612, 618, 0, 0, - 0, 787, 2287, 613, 0, 614, 0, 0, 2300, 0, - 0, 0, 0, 85, 0, 0, 0, 0, 0, 2555, - 0, 0, 0, 0, 2556, 0, 93, 0, 0, 0, - 0, 0, 0, 615, 1226, 0, 0, 2556, 0, 2576, - 2579, 0, 0, 0, 102, 0, 0, 0, 1334, 1334, - 104, 2345, 2579, 0, 0, 0, 0, 0, 108, 0, - 110, 616, 112, 0, 114, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 748, 748, 0, 0, 2351, 0, - 0, 0, 0, 0, 0, 2375, 0, 0, 130, 131, - 607, 0, 0, 2357, 608, 609, 610, 611, 421, 1591, - 0, 1240, 0, 0, 0, 0, 143, 612, 0, 2175, - 0, 0, 0, 1226, 613, 0, 614, 0, 617, 0, - 0, 0, 0, 2186, 1402, 0, 0, 155, 2189, 0, - 156, 2190, 0, 0, 0, 2376, 0, 0, 0, 0, - 0, 2197, 0, 2198, 615, 2199, 0, 2200, 0, 0, - 886, 0, 0, 0, 0, 976, 0, 0, 0, 977, - 0, 0, 748, 798, 0, 799, 638, 639, 0, 0, - 618, 962, 616, 799, 638, 639, 0, 612, 0, 635, - 0, 0, 0, 636, 0, 612, 614, 0, 0, 637, - 638, 639, 0, 0, 614, 0, 0, 1226, 0, 0, - 0, 612, 0, 0, 0, 0, 0, 0, 0, 421, - 614, 0, 2419, 2270, 615, 0, 2421, 0, 2425, 0, - 0, 0, 615, 0, 0, 0, 0, 0, 0, 617, - 0, 0, 0, 2436, 2437, 0, 2441, 944, 615, 0, - 0, 945, 616, 0, 0, 0, 2451, 0, 946, 947, - 616, 0, 1097, 0, 2455, 949, 0, 951, 0, 0, - 953, 954, 955, 956, 957, 0, 616, 0, 787, 960, - 0, 0, 2376, 0, 0, 0, 0, 0, 0, 640, - 0, 618, 0, 0, 0, 0, 1461, 640, 0, 607, - 0, 0, 787, 608, 609, 610, 611, 0, 0, 617, - 2487, 0, 0, 640, 0, 0, 612, 617, 2492, 2494, - 0, 0, 0, 613, 0, 614, 978, 0, 0, 834, - 0, 1123, 2506, 617, 0, 962, 2508, 0, 833, 0, - 0, 607, 0, 0, 0, 608, 609, 610, 611, 0, - 0, 0, 0, 615, 0, 0, 0, 0, 612, 0, - 0, 618, 0, 0, 0, 613, 944, 614, 886, 618, - 945, 0, 0, 0, 0, 2494, 0, 946, 947, 2536, - 0, 616, 962, 2540, 949, 618, -1191, 1746, 1594, -1191, - -1191, -1191, -1191, -1191, 962, 615, 0, 0, 960, 0, - 0, 1746, 2552, 2536, 0, 0, 0, 833, 0, 2176, - 607, 0, 0, 0, 608, 609, 610, 611, 421, 2405, - 1226, 0, 0, 616, 0, 0, 0, 612, 0, 0, - 0, 0, 0, 0, 613, 0, 614, 0, 617, 0, - 0, 962, 962, 962, 962, 0, 962, 0, 0, 0, - 0, 0, 748, 0, 0, 978, 0, 0, 0, 0, - 421, 0, 0, 0, 615, 0, 0, 1030, 0, 0, - 607, 1226, 0, 0, 608, 609, 610, 611, 0, 0, - 617, 0, 0, 0, 0, 0, 0, 612, 0, 0, - 618, 0, 616, 0, 613, 0, 614, 0, 962, 0, - 962, 962, 962, 962, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1078, 0, - 1078, 0, 0, 0, 615, 0, 2488, 0, 0, 421, - 0, 0, 618, 0, 0, 0, 0, 0, 0, 1097, - 1097, 0, 0, 0, 0, 0, 0, 0, 0, 617, - 1705, 0, 616, 0, 0, 0, 748, 0, 1715, 962, - 0, 1717, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 808, 0, 0, 0, 1097, 1097, 0, - 0, 962, 0, 0, 0, 0, 0, 0, 0, 421, - 0, 962, 375, 0, 0, 0, 0, 0, 381, 748, - 1272, 618, 0, 0, 0, 0, 1782, 0, 388, 617, - 0, 390, 962, 0, 393, 748, 748, 748, 0, 748, - 748, 399, 0, 748, 0, 406, 0, 0, 962, 409, - 0, 0, 962, 962, 0, 0, 0, 1240, 0, 0, - 0, 0, 0, 1273, 0, 0, 0, 428, 0, 1274, - 0, 432, 433, 0, 0, 0, 0, 438, 439, 0, - 0, 618, 0, 444, 445, 0, 447, 448, 449, 450, - 0, 451, 0, 0, 0, 1275, 0, 0, 0, 0, - 460, 0, 0, 0, 0, 464, 0, 466, 0, 0, - 962, 469, 0, 0, 0, 473, 0, 475, 1892, 1276, - 0, 1277, 0, 0, 481, 0, 0, 0, 485, 0, - 0, 0, 488, 0, 490, 0, 0, 0, 0, 0, - 0, 498, 500, 0, 0, 502, 503, 0, 0, 0, - 748, 509, 0, 510, 1278, 0, 0, 514, 0, 1279, - 0, 0, 0, 1280, 0, 0, 0, 1281, 962, 962, - 1282, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 541, 0, 543, 1461, 0, 0, - 607, 0, 1283, 548, 608, 609, 610, 611, 0, 0, - 0, 0, 0, 0, 0, 0, 1284, 612, 0, 748, - 748, 748, 1285, 0, 613, 0, 614, 0, 0, 0, - 0, 0, 0, 1707, 0, 0, 607, 0, 0, 0, - 608, 609, 610, 611, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 612, 615, 0, 0, 0, 0, 0, - 613, 0, 614, 0, 0, 0, 0, 0, 1733, 1097, - 0, 607, 0, 0, 0, 608, 609, 610, 611, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 612, 0, - 615, 0, 0, 0, 0, 613, 0, 614, 0, 962, - 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, - 962, 962, 962, 962, 962, 962, 962, 962, 616, 421, - 0, 0, 0, 0, 0, 615, 0, 1969, 0, 0, - 607, 0, 0, 962, 608, 609, 610, 611, 0, 617, - 962, 0, 962, 0, 0, 0, 0, 612, 0, 0, - 0, 0, 962, 616, 613, 421, 614, 0, 0, 0, - 0, 1240, 748, 0, 0, 1097, 1097, 1097, 0, 1142, - 1142, 1240, 0, 0, 0, 617, 0, 1142, 1142, 0, - 0, 0, 0, 962, 615, 0, 0, 0, 0, 0, - 421, 618, 607, 0, 0, 0, 608, 998, 610, 611, - 0, 0, 0, 0, 1334, 1334, 1334, 1334, 1334, 612, - 617, 944, 616, 0, 720, 945, 613, 0, 614, 0, - 0, 0, 946, 947, 0, 0, 0, 618, 948, 949, - 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, - 0, 959, 0, 960, 961, 0, 615, 0, 0, 421, - 0, 0, 962, 1105, 1240, 0, 0, 1106, 607, 0, - 1402, 0, 618, 0, 1107, 1108, 962, 0, 0, 617, - 1109, 1110, 1111, 1112, 616, 0, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1120, 0, 1121, 1122, 962, 0, 0, - 0, 0, 0, 748, 2158, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 421, 0, 0, 0, 0, 808, 0, 847, 0, - 0, 618, 0, 0, 0, 0, 0, 1097, 0, 0, - 0, 617, 944, 962, 1173, 0, 945, 607, 0, 0, - 0, 0, 0, 946, 947, 0, 0, 0, 2192, 948, - 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, - 958, 0, 959, 0, 960, 961, 0, 0, 0, 0, - 0, 0, 748, 2203, 944, 0, 0, 1236, 945, 607, - 0, 962, 0, 618, 0, 946, 947, 0, 0, 0, - 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, - 956, 957, 958, 0, 959, 0, 960, 961, 0, 0, - 0, 0, 0, 944, 962, 0, 1237, 945, 607, 0, - 0, 962, 0, 1892, 946, 947, 0, 962, 0, 0, - 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, - 957, 958, 0, 959, 0, 960, 961, 0, 0, 0, - 962, 0, 0, 2274, 0, 0, 748, 0, 2277, 0, - 0, 0, 962, 0, 0, 0, 0, 0, 0, 0, - 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 962, 0, 0, 962, 0, 0, 0, 0, 944, 0, - 0, 1238, 945, 607, 0, 0, 0, 0, 962, 946, - 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, - 962, 953, 954, 955, 956, 957, 958, 0, 959, 0, - 960, 961, 0, 0, 962, 0, 0, 1240, 0, 944, - 962, 0, 0, 945, 607, 0, 962, 0, 0, 0, - 946, 947, 0, 0, 0, 1307, 948, 949, 950, 951, - 0, 1240, 953, 954, 955, 956, 957, 958, 0, 959, - 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, - 0, 946, 947, 0, 0, 0, 1386, 948, 949, 950, - 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, - 959, 0, 960, 961, 0, 0, 944, 0, 1394, 0, - 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, - 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, - 954, 955, 956, 957, 958, 0, 959, 1097, 960, 961, - 944, 1097, 1409, 0, 945, 607, 0, 0, 0, 0, + 410, 821, 678, 971, 829, 830, 831, 832, 817, 704, + 1391, 674, 1707, 1241, 1098, 870, 1242, 1296, 1340, 1742, + 1085, 693, 1465, 698, 422, 422, 1244, 975, 1632, 716, + 743, 430, 1337, 1337, 1230, 642, 1879, 1005, 1617, 731, + 642, 734, 800, 1612, 567, 643, 737, 738, 739, 1347, + 643, 2070, 1735, 2072, 740, 2186, 1765, 742, 792, 744, + 457, 649, 437, 1882, 653, 655, 1884, 1477, 476, 747, + 1912, 2162, 479, 402, 424, 1898, 1420, 812, 989, 2248, + 1074, 1037, 1183, 1645, 2326, 459, 773, 1182, -565, 1809, + 2112, 1810, 793, 2324, 1902, 2327, 2328, 1044, 1811, 1917, + 789, 2329, 474, 2330, 1812, 794, 1813, 1815, 1944, 802, + 697, 805, 2331, -541, 2332, 1816, 2333, 402, 1466, 939, + 1757, 2, 3, 1368, 824, 683, 402, 1966, 1967, 1968, + 501, 1592, 1001, 1001, 1729, -584, 839, 570, 842, 373, + 1786, 405, 421, 1767, 1367, 848, 1241, 1231, 1904, 1386, + 898, 2573, -563, 1537, 1283, 733, 1018, 1284, 1498, 1056, + -593, 1558, 1339, 2450, 806, 1000, 1000, 596, 965, 1405, + 724, 1486, -593, 1272, 1904, 1905, 1906, 1225, 667, 978, + 668, 807, -137, 405, 725, 594, 581, 594, 2249, -565, + 1445, 1081, 594, 1796, -527, 1806, 589, 1819, 898, 1825, + 853, 1798, -565, 1808, 1804, 1821, 1814, 982, 1822, 908, + 594, 984, 1057, 749, 899, 1959, 421, 1229, 991, 920, + 921, 922, 923, 2250, 8, -527, -141, 421, 1180, 1446, + 594, -584, 421, 989, 1769, -61, 963, 594, 2334, 1190, + 1058, 2335, 787, 994, 811, 1843, 421, 617, 915, 795, + 440, 642, 2518, -339, -541, -339, 1212, 1758, 916, -339, + -563, 643, 421, 2418, 1730, 617, 1467, 974, -593, 421, + 2065, 4, 421, 2069, 421, 1797, 1551, 1807, 1099, 1820, + 1059, 1826, 1907, 1506, 1552, 421, 1538, 2574, 421, 1539, + 1273, 1060, 1156, -1115, 497, 421, 856, 421, 858, 2266, + -1140, 1553, 421, 1447, 1297, 859, 860, 861, 1907, 1019, + 924, 864, 865, 866, 867, 1762, 868, 869, -1062, 1061, + 1034, 1065, 421, -137, 1029, 421, 2336, 1699, 421, 1559, + -565, 507, 1038, 1161, 990, 669, 672, 992, -1151, 1886, + 1888, 679, 680, 684, 680, -1167, 688, 690, 1560, 2117, + 696, 1086, 700, 702, 702, 705, 594, 421, 708, 1593, + 594, 712, 1341, 708, 1645, -594, 2115, -141, 723, 1151, + 1597, 728, -584, 708, 2113, 708, -61, -594, 5, 422, + 708, 708, 708, 2071, 2337, 2338, 2339, 1809, 708, 1810, + 741, 708, 1371, 708, 594, 2162, 1811, 1372, 508, 752, + 753, -563, 1812, 2166, 1813, 1815, 764, 766, 1158, -593, + 1638, 772, 1062, 1816, 1691, 989, 642, 989, 779, 1503, + 642, 783, 1497, 1437, 989, 1505, 643, 642, 736, 1148, + 643, 594, 995, 796, -1115, 1706, 803, 643, 1412, 825, + 1178, -1140, 723, 813, 815, 815, 563, 819, 796, 1554, + 1555, 1432, 1302, 568, 827, 827, 827, 827, 827, -1062, + 837, 1960, 2342, 841, -1170, 843, 779, 964, -1104, 846, + 571, 594, 849, -594, 1177, 1001, 854, 1179, -587, -1151, + 1796, 1608, 2211, 1672, 1454, 1150, -1167, 1152, 1798, 1300, + -587, 1804, 594, 1806, 872, 2348, 594, 1736, 878, 1819, + 594, 1808, -1134, 1825, 1814, 871, 1294, 1821, 1365, -591, + 1822, 2125, 1877, 1878, 1651, 1653, 1655, 421, 1301, 904, + -382, -591, 892, 402, 2540, 2541, 910, 2516, 575, 576, + 900, 403, 1546, 905, 906, 907, 696, 617, 1609, -1114, + 2060, 913, 914, 2126, 2189, 919, 696, 696, 696, 696, + 1295, 895, 896, 927, 928, 1355, 1356, 1357, 1358, 1359, + 594, 2477, 1797, 911, 1882, 2271, 421, 1884, 2287, 2193, + 2176, 572, 1103, 2508, 2268, 1807, 594, 573, 642, -1139, + 1001, 1820, 694, -527, 989, 1826, -587, -589, 643, 1159, + 1610, 1781, 2349, 2478, 1091, 2446, 695, 1330, 2343, -589, + -1061, 1457, 1458, 2350, -1150, -1170, 2118, 2119, -1166, -1104, + 594, 2575, 1195, 1000, -594, 1014, 50, -591, 574, 712, + 1007, 764, 819, 813, 700, 1012, 594, 965, 843, 2508, + 1602, 1603, 1617, 1025, 1459, 944, 696, 1612, 597, 945, + 2576, 1895, 2111, -1134, 694, 577, 587, 1374, 1767, 985, + 2022, 1016, 2344, 986, 708, 1226, 1226, 1036, 695, 696, + 1585, -527, 1746, 2345, 1017, 1768, 787, 960, -1169, 974, + 1896, 1375, 1680, 580, 1241, -527, 2575, 1844, 1591, 1408, + -1114, 988, 1053, 1829, 1830, 1831, 1376, 1835, 1836, 1630, + 965, 1377, 1378, 904, 1746, -589, 2159, -527, 1379, 2555, + 2577, 1098, 1098, 583, 1085, 2576, 1608, 1075, 2464, 1080, + 1093, 1767, 1082, 2562, 2375, 1347, 118, -384, -1103, 584, + -1139, 965, 1138, 122, 1127, 1096, -383, -587, 1768, 1213, + 1214, 1132, 25, 585, -1133, 1126, 1149, 29, 1547, 1769, + 586, -1061, 1770, 591, 1133, -1150, 1134, 1771, 1046, -1166, + 421, 1141, 1572, 1144, 1949, 1772, 696, 1054, -591, 47, + 48, 1047, 1215, 1609, 642, 642, 642, 642, 642, 669, + 1055, 1174, 995, 995, 643, 643, 643, 643, 643, 592, + 1096, 588, 590, 2417, 1175, 1001, 696, 595, 989, 989, + 989, 989, 989, 1651, 1653, 1655, -382, 1185, 1269, 787, + 593, 696, 1769, 1342, 696, 1770, 1348, 1687, 963, -1169, + 1186, 1270, 2427, 90, 1397, 1610, 1343, 985, 1000, 1349, + 1631, 986, 787, 95, 2273, 2274, 633, 1398, 638, 639, + 1233, 1413, 1380, 46, 2460, 987, -589, 1401, 1573, 1245, + 1253, 1259, 1421, 1429, 1263, 1001, 1001, 1001, 1451, 988, + 1402, 2111, 2407, 1574, 1575, 1576, 1430, 1266, 841, -1103, + 1433, 1452, 648, 1381, 2589, 2591, 74, 1579, 1869, 121, + 985, 656, 1469, 1291, 986, -1133, 1870, 2595, 1650, 1652, + 1654, 638, 639, 1268, 1306, 1470, 1353, 1563, 987, 25, + 1564, 1565, 1566, 1472, 29, 1303, 1216, 1217, 1292, 96, + 1218, 1219, 988, 1567, 1568, 657, 1473, 1382, 1475, 1016, + 1489, -792, -792, 2068, 985, 1540, 47, 48, 986, -383, + 658, 1476, 1483, 1490, 2444, 638, 639, 659, 1541, 109, + 1360, 966, 987, 1598, 1548, 1485, 1472, 2218, 1556, 2219, + 2103, 2104, 2105, 2106, 2107, 660, 988, 1549, 2220, 1550, + 2221, 1557, -387, 1561, 2442, 1337, 1337, 1337, 1337, 1337, + 1569, 1577, 598, 661, 969, 2373, 1562, 1385, 1641, 1512, + 90, 1241, 662, 1570, 1578, 1515, 1640, 2099, 669, 1518, + 95, 1520, 1643, 1241, 1389, 1522, 2075, 1524, -385, 1692, + 684, 1693, 1658, 2073, 2074, 1239, 599, 1996, 1046, 1638, + 969, 2084, 2085, 705, 1497, 1659, 985, 1342, 1662, 402, + 986, 1664, 1660, 2515, 1670, 2141, 1674, 638, 639, 663, + 1667, 2146, 1479, 1672, 987, 1668, 121, 1671, 1422, 1675, + 2282, 666, 1926, 728, 375, 1684, 904, 1686, 988, 1700, + 381, 1936, 2514, 675, 1448, 1753, 965, 1239, 1679, 753, + 388, -852, 1701, 390, 25, 1690, 393, 1090, 1754, 29, + 1756, 676, 1401, 399, 766, 1239, 1241, 406, 691, 2140, + 150, 409, 1405, 2222, 2223, 1942, 2224, 2225, 1963, 699, + 944, 47, 48, 677, 945, 1239, 664, 665, 1471, 428, + 2301, 946, 947, 432, 433, 711, 1709, 714, 1969, 438, + 439, 1451, 1497, 1978, 1497, 444, 445, 2226, 447, 448, + 449, 450, 960, 451, 1970, 565, 726, 2004, 732, 1489, + 1757, 2008, 460, 2034, 1001, 1001, 1001, 464, 2054, 466, + 2005, 1501, 2006, 469, 2009, 90, 2035, 473, 2100, 475, + 2120, 2055, 995, 1761, 717, 95, 481, -587, 2151, 2227, + 485, 2101, 1534, 2121, 488, 760, 490, 1932, 1652, 1654, + 1921, 2152, 2228, 498, 500, 2156, 985, 502, 503, 745, + 986, 750, 1534, 509, 1532, 510, 1534, 638, 639, 514, + 1842, 2215, 1534, 2232, 2302, 2157, 1542, 1543, 1544, 2158, + -230, 121, 1534, 763, 2216, 2217, 2233, 1753, 988, 2123, + 2124, 1688, 770, 1489, 1753, 2235, 541, 1472, 543, 1472, + 2236, 782, 1571, 1929, 2241, 548, 2237, 2238, 1445, 1790, + 2239, 2251, 2240, 1472, 566, 1472, 2259, 2242, 646, 1023, + 1580, 900, 2296, 654, 2252, 150, 2253, 771, 2254, 2260, + 1721, 2023, 774, 2025, 2026, 2297, 1719, 777, 1534, 1174, + 1723, 2123, 2124, 778, 1590, 2030, 2270, 1758, 2303, 786, + 696, 2299, 2320, 1489, 1303, 2037, 1790, 2039, 1924, 2282, + 2304, 1534, 2305, 2306, 2364, 2307, 2322, 790, 2308, 1196, + 1197, 2364, 1200, 784, 2354, 791, 2378, 2365, 965, 1766, + 1780, 818, 1940, 1785, 2366, 2131, 1805, 826, 1818, 2379, + 1824, 2402, 1828, 2411, 1946, 1226, 1226, 1226, 1948, 1226, + 1226, 2120, 851, 1837, 852, 2437, 2412, 1962, 897, 1239, + 2275, 2276, 2277, 2218, 2429, 2219, 1767, 787, 2438, 1489, + 855, 1447, 2453, 944, 2220, 1656, 2221, 945, 607, 1597, + 857, 1241, 2456, 1768, 946, 947, 1933, 1934, 1935, -1190, + 948, 949, 950, 951, 952, 2458, 953, 954, 955, 956, + 957, 958, 989, 959, 2381, 960, 961, 1241, 2459, 2309, + 2361, 2310, 1451, 1767, 1489, 1753, 1588, 1589, 1682, 1682, + 876, 1682, 2489, 877, 2232, 2481, 2232, 2483, 2485, 708, + 1768, 1075, 2530, 1075, 2532, 2490, 1694, 2521, 880, 2522, + 1791, 1451, 887, 1489, 888, 2531, 1192, 2533, 1174, 889, + 1198, 621, 1239, 890, 2535, 1204, 2536, 1769, 1208, 1210, + 1770, 2537, 642, 995, 1792, 2552, 720, 2364, 1717, 2364, + 421, 2558, 643, 1733, 1793, 891, 2578, 1144, 909, 1794, + 2553, 894, 2554, 1731, 2559, 966, 1048, 1791, 1049, 2579, + 912, 607, 1759, 696, 1760, 608, 609, 610, 611, 2222, + 2223, 969, 2224, 2225, 1769, 1634, 967, 1770, 612, 936, + 1763, 1792, 1771, 972, 1298, 613, 1299, 614, 2594, 1832, + 1772, 1793, 1226, 1226, 1226, 968, 1794, 799, 638, 639, + 1233, 1344, 983, 2226, 1860, 1861, 607, 2052, 2053, 612, + 608, 609, 610, 611, 993, 615, 1245, 807, 614, 2539, + 1013, 1253, 1022, 612, 2256, 2257, 2123, 2124, 1028, 1259, + 613, 1024, 614, 1887, 1889, 1361, 1362, 1263, 605, 606, + 847, 2584, 2585, 616, 1026, 2227, 615, 1127, 1035, 1875, + 2494, 2495, 1206, 1207, 1868, 1041, 1045, 405, 2228, 1071, + 615, 1069, 1066, 963, 2028, 1087, 1088, 1089, 1094, 2031, + 1102, 1104, 1157, 1168, 616, 2142, 1131, 1181, 2404, 1171, + 421, 1172, 2041, 1187, 1897, 1195, 1201, 1224, 616, 1184, + 2144, 1216, 1239, 1262, 1271, 976, 2131, 1908, 1307, 977, + 617, 594, 1310, 1331, 2043, 799, 638, 639, 945, 1332, + 2045, 640, -342, 986, 2047, 1363, 1694, 612, 1369, 1694, + 1694, 1694, 775, 1370, 1390, 421, 614, 1414, 1415, 1937, + 1392, 617, 1400, 1416, 787, 1226, 1417, 1418, 1226, 1419, + 2188, 1428, 1431, 1434, 1440, 617, 787, 558, 559, 560, + 561, 562, 618, 1098, 615, 2445, 1497, 822, 651, 1436, + 1449, 708, 978, -935, 1450, 1455, 1461, 834, 637, 638, + 639, 1274, 1456, 1460, 1468, 1474, 1484, 1487, 1488, 1492, + 612, 1971, 616, 618, 944, 1491, 1494, 1493, 945, 614, + 1502, 1504, 915, 1526, 1511, 946, 947, 618, 1534, 1082, + 1527, 948, 949, 1528, 951, 1514, 1529, 953, 954, 955, + 956, 957, 1530, 1531, 1275, 2492, 960, 615, 1582, 640, + 881, 882, 883, 884, 886, 2323, 1535, 1536, 1587, 787, + 1625, 1633, 1628, 2015, 2016, 787, 1634, 1639, 373, 617, + 2513, 1098, 1644, 1647, 2264, 616, 1277, 1648, 1649, 1657, + 1663, 403, 978, 1513, 2267, 1728, 978, 1680, 2033, 1516, + 1689, 1702, 1697, 1519, 1703, 1521, 1519, 1519, 1226, 1523, + 1278, 1525, 1279, 1704, 1705, 1446, 1716, 1737, 1721, 938, + 940, 941, 640, 942, 1755, 1839, 1840, 1845, 1841, 1846, + 943, 618, 1847, 2513, 1848, 1849, 1851, 2184, 1852, 1853, + 1855, 1856, 617, 1857, 822, 1280, 1858, 2066, 1862, 1863, + 1281, 2195, 1864, 1865, 1282, 1866, 2198, 1872, 1283, 2199, + 1874, 1284, 2081, 1890, 1891, 1900, 2087, 2396, 2397, 2206, + 1903, 2207, 1916, 2208, 1892, 2209, 1918, 1921, 1893, 1922, + 1350, 1941, 1894, 1285, 1351, 607, 1021, 1226, 1943, 608, + 609, 610, 611, 1954, 618, 1955, 1958, 1286, 1956, 1972, + 1973, 1031, 612, 1287, -494, 1979, 1980, 1981, 1998, 613, + 1999, 614, 2001, 2002, 2003, 2114, 1908, 1908, 1908, 2010, + 1757, 2013, 1758, 635, 2014, 2021, 2020, 636, 1908, 1052, + 2024, 2027, 2049, 637, 638, 639, 1068, 2036, 2038, 615, + 2040, 2050, 1072, 1073, 2058, 612, 2059, 2051, 2056, 2057, + 617, 2061, 944, 2079, 614, 684, 945, 2441, 2443, 2154, + 2380, 2080, 2089, 946, 947, 2094, 2102, 616, -381, 2109, + 949, 2110, 951, 1226, 2122, 953, 954, 955, 956, 957, + 2127, 2169, 615, 2130, 960, 1293, 798, 2134, 1130, 2133, + 2135, 2136, 2139, 2137, 2138, 2149, 799, 638, 639, 2155, + 2191, 2171, 1669, 2213, 421, 2173, 2214, 2234, 612, 1731, + 616, 2244, 2258, 1937, 2261, 2177, 2262, 614, -224, 2269, + 2286, 2294, 2313, 2300, 617, 2187, 2314, 2197, 2315, 1594, + 2316, 2319, 2192, 1763, 607, 2317, 2203, -843, 608, 609, + 610, 611, 2321, 2347, 787, 615, 2341, 640, 2355, 2358, + 2369, 612, 2359, 2370, 1832, 2382, 2363, 2372, 613, 2376, + 614, 1188, 1189, 1601, 1602, 1603, 2383, 617, 2390, 2392, + 787, 2393, 2394, 616, 2395, 1604, 618, 1727, 2398, 2399, + 2400, 2406, 2410, 2414, 1605, 1373, 2415, 2421, 615, 2280, + 2423, 1463, 2426, 2428, 607, 2454, 2457, 2472, 608, 609, + 610, 611, 2465, 2474, 2480, 2482, 2484, 1606, 2500, 2493, + 640, 612, 1607, 2488, 2502, 2497, 616, 2501, 613, 618, + 614, 2509, 2510, 1897, 2520, 2523, 2525, 2526, 2534, 2550, + 617, 2560, 1908, 2542, 1908, 1908, 1908, 1908, 1908, 1908, + 1608, 2556, 2565, 2580, 2581, 2582, 2593, 2575, 615, 1581, + 1267, 2174, 2292, 421, 1311, 1312, 1313, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, + 1327, 1328, 1329, 617, 578, 2095, 616, 1873, 1507, 822, + 1444, 917, 618, 1876, 1345, 2371, 2096, 2416, 1226, 1746, + 978, 1352, 1042, 1354, 607, 1600, 1901, 1609, 608, 609, + 610, 611, 815, 2016, 926, 929, 1304, 2374, 1364, 2272, + 2116, 612, 1305, 421, 2108, 2265, 1744, 1482, 613, 1997, + 614, 2312, 2172, 1726, 2504, 618, 2325, 1393, 1676, 1410, + 1439, 1661, 2360, 617, 886, 1964, 436, 2132, 1965, 1226, + 1395, 2592, 2145, 1043, 600, 601, 1666, 788, 615, 1610, + 1696, 2081, 1147, 1928, 1399, 602, 1052, 1048, 1366, 1425, + 603, 1927, 607, 1176, 1453, 1500, 608, 609, 610, 611, + 1006, 1010, 2403, 1678, 1681, 1008, 616, 2291, 2545, 612, + 1009, 1908, 2175, 1011, 2431, 618, 613, 1384, 614, 1383, + 1155, 2527, 1438, 1880, 2499, 2143, 1403, 1394, 607, 2476, + 2170, 761, 608, 609, 610, 611, 1139, 2440, 2546, 2564, + 2586, 2588, 2409, 421, 2011, 612, 615, 1743, 827, 827, + 2182, 1708, 613, 1095, 614, 1015, 845, 687, 2177, 2147, + 2183, 1838, 2042, 617, 735, 2385, 2048, 2029, 2046, 13, + 14, 1464, 15, 16, 616, 2032, 2044, 20, 1586, 2202, + 2413, 2200, 615, 1232, 2420, 23, 1533, 2210, 1850, 1478, + 27, 2357, 1854, 30, 1859, 1867, 2367, 0, 0, 0, + 0, 37, 0, 38, 0, 40, 0, 0, 0, 0, + 616, 421, 886, 1499, 834, 618, 0, 0, 0, 0, + 0, 0, 0, 0, 2433, 0, 0, 0, 59, 0, + 748, 617, 0, 0, 1096, 1096, 2455, 0, 0, 70, + 0, 0, 0, 0, 0, 2463, 0, 421, 0, 0, + 0, 2467, 0, 2468, 0, 0, 0, 0, 0, 748, + 0, 13, 14, 85, 15, 16, 748, 617, 2469, 20, + 0, 0, 0, 0, 808, 0, 93, 23, 0, 1545, + 0, 0, 27, 618, 0, 30, 0, 2066, 2066, 0, + 0, 0, 0, 37, 102, 38, 1463, 40, 0, 607, + 104, 0, 0, 608, 609, 610, 611, 0, 108, 0, + 110, 0, 112, 0, 114, 0, 612, 0, 0, 618, + 59, 119, 0, 613, 0, 614, 0, 0, 0, 0, + 0, 70, 0, 0, 0, 1596, 0, 0, 130, 131, + 2097, 0, 0, 0, 2469, 607, 2528, 1629, 0, 608, + 609, 610, 611, 615, 0, 85, 143, 0, 0, 0, + 0, 0, 612, 604, 0, 0, 0, 0, 93, 613, + 0, 614, 0, 0, 0, 1636, 0, 155, 0, 0, + 156, 616, 0, 0, 0, 925, 102, 1642, 0, 0, + 2566, 0, 104, 0, 0, 2567, 0, 0, 0, 615, + 108, 0, 110, 0, 112, 0, 114, 0, 2567, 0, + 2587, 2590, 0, 119, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 2590, 0, 0, 0, 616, 0, 0, + 130, 131, 0, 0, 2386, 0, 1665, 1031, 617, 607, + 0, 0, 0, 608, 609, 610, 611, 0, 143, 748, + 0, 1677, 0, 0, 0, 978, 612, 0, 1685, 0, + 0, 0, 0, 613, 421, 614, 0, 0, 886, 155, + 0, 0, 156, 0, 1695, 0, 1698, 0, 0, 0, + 0, 0, 0, 0, 617, 0, 0, 0, 0, 886, + 618, 833, 0, 615, 607, 0, 0, 0, 608, 609, + 610, 611, 0, 1713, 0, 0, 0, 0, 0, 0, + 0, 612, 0, 0, 1725, 0, 0, 0, 613, 944, + 614, 616, 0, 945, 0, 0, 0, 1739, 0, 0, + 946, 947, 1745, 0, 1751, 0, 618, 949, 0, -1191, + 0, 1078, -1191, -1191, -1191, -1191, -1191, 0, 615, 0, + 0, 960, 0, 0, 0, 0, 0, 0, 421, 1097, + 0, 0, 2185, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1129, 0, 0, 616, 0, 617, 0, + 0, 1135, 1136, 0, 0, 0, 1142, 0, 0, 833, + 0, 0, 607, 0, 0, 0, 608, 609, 610, 611, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, + 0, 0, 0, 421, 1097, 0, 613, 0, 614, 0, + 0, 0, 1169, 0, 0, 0, 0, 0, 0, 0, + 618, 0, 0, 617, 0, 0, 0, 1881, 0, 0, + 1030, 0, 0, 607, 0, 0, 615, 608, 609, 610, + 611, 1191, 0, 1194, 0, 0, 0, 0, 0, 0, + 612, 0, 0, 0, 0, 0, 0, 613, 0, 614, + 0, 0, 748, 748, 616, 0, 0, 0, 1925, 822, + 1345, 0, 0, 1240, 1142, 618, 1463, 0, 0, 607, + 0, 0, 0, 608, 609, 610, 611, 615, 0, 0, + 0, 0, 0, 0, 0, 0, 612, 0, 0, 1945, + 0, 421, 1947, 613, 0, 614, 0, 0, 0, 1712, + 1951, 0, 607, 0, 0, 616, 608, 609, 610, 611, + 0, 617, 0, 0, 0, 0, 0, 0, 0, 612, + 0, 0, 0, 615, 0, 0, 613, 0, 614, 0, + 1738, 0, 1974, 607, 1977, 0, 0, 608, 609, 610, + 611, 0, 421, 1336, 1336, 1976, 0, 0, 607, 1274, + 612, 616, 608, 609, 610, 611, 615, 613, 0, 614, + 0, 0, 617, 618, 0, 612, 0, 0, 0, 748, + 748, 0, 613, 0, 614, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 616, 0, 0, 615, 421, 0, + 0, 0, 1275, 0, 0, 0, 1240, 0, 1276, 0, + 0, 0, 615, 0, 0, 0, 0, 0, 617, 0, + 0, 0, 0, 0, 618, 616, 0, 0, 0, 1404, + 0, 421, 0, 0, 1277, 0, 0, 607, 0, 0, + 616, 608, 609, 610, 611, 0, 0, 0, 0, 0, + 0, 617, 0, 0, 612, 0, 0, 0, 1278, 0, + 1279, 613, 421, 614, 0, 0, 0, 748, 607, 0, + 618, 0, 608, 998, 610, 611, 0, 421, 0, 0, + 0, 0, 617, 0, 0, 612, 0, 0, 2077, 0, + 0, 615, 613, 1280, 614, 2086, 0, 617, 1281, 2090, + 2091, 0, 1282, 618, 0, 0, 1283, 2098, 0, 1284, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, + 0, 0, 615, 0, 0, 0, 0, 0, 0, 0, + 0, 1285, 0, 0, 618, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1286, 0, 0, 2129, 618, + 616, 1287, 0, 0, 1636, 0, 421, 1097, 0, 0, + 0, 0, 0, 0, 0, 0, 944, 0, 1714, 0, + 945, 607, 0, 0, 0, 0, 617, 946, 947, 2148, + 0, 0, 1715, 948, 949, 950, 951, 421, 2153, 953, + 954, 955, 956, 957, 958, 0, 959, 1105, 960, 961, + 0, 1106, 607, 0, 0, 2163, 2164, 617, 1107, 1108, + 0, 0, 0, 0, 1109, 1110, 1111, 1112, 0, 0, + 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 618, 1121, + 1122, 0, 0, 0, 1739, 0, 0, 0, 0, 0, + 0, 0, 834, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2194, 0, 0, 0, 0, 0, 0, 618, + 0, 0, 0, 0, 0, 0, 0, 0, 2204, 944, + 2205, 1173, 0, 945, 607, 0, 0, 0, 0, 0, + 946, 947, 0, 0, 0, 1599, 948, 949, 950, 951, + 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, + 944, 960, 961, 1236, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, - 959, 944, 960, 961, 962, 945, 607, 0, 748, 748, - 0, 0, 946, 947, 0, 0, 0, 1421, 948, 949, + 959, 962, 960, 961, 0, 944, 0, 0, 1237, 945, + 607, 0, 0, 0, 0, 0, 946, 947, 0, 748, + 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, + 955, 956, 957, 958, 2279, 959, 0, 960, 961, 2281, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 944, + 2290, 1951, 1238, 945, 607, 2295, 0, 0, 0, 0, + 946, 947, 0, 0, 0, 2298, 948, 949, 950, 951, + 0, 2311, 953, 954, 955, 956, 957, 958, 0, 959, + 0, 960, 961, 0, 0, 1078, 0, 1078, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1097, 1097, 0, 944, + 0, 0, 0, 945, 2356, 0, 0, 1710, 0, 0, + 946, 947, 0, 748, 0, 1720, 948, 949, 1722, 951, + 0, 0, 953, 954, 955, 956, 957, 0, 0, 959, + 808, 960, 961, 2362, 1097, 1097, 0, 0, 0, 0, + 0, 1123, 0, 0, 0, 962, 0, 0, 2368, 0, + 0, 0, 0, 0, 1596, 0, 748, 0, 0, 0, + 0, 0, 0, 1787, 0, 0, 0, 0, 0, 0, + 0, 0, 748, 748, 748, 0, 748, 748, 0, 0, + 748, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2387, 944, 962, 0, 1240, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 962, 886, 0, 1309, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, 0, 0, 0, 0, 0, - 0, 0, 1097, 1097, 1097, 1097, 0, 0, 962, 0, - 2158, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 748, 944, 0, 1291, 0, 945, 607, 0, 962, 0, - 962, 0, 946, 947, 962, 0, 0, 1424, 948, 949, - 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, - 0, 959, 0, 960, 961, 0, 0, 962, 0, 0, - 962, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1123, 0, 0, 0, 0, 0, 0, 1097, - 1097, 0, 1097, 0, 0, 0, 0, 0, 0, 2158, - 0, 944, 0, 0, 0, 945, 607, 0, 0, 0, - 0, 0, 946, 947, 0, 0, 0, 1425, 948, 949, - 950, 951, 0, 1371, 953, 954, 955, 956, 957, 958, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 962, 962, 962, 962, 0, 962, 0, 1899, 0, + 0, 0, 0, 0, 0, 0, 0, 2430, 2281, 0, + 0, 2432, 0, 2436, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2447, 2448, + 748, 2452, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2462, 0, 0, 0, 0, 0, 0, 962, 2466, + 962, 962, 962, 962, 944, 0, 0, 0, 945, 607, + 0, 0, 0, 0, 0, 946, 947, 2387, 0, 0, + 1388, 948, 949, 950, 951, 0, 0, 953, 954, 955, + 956, 957, 958, 0, 959, 0, 960, 961, 0, 748, + 748, 748, 0, 0, 0, 2498, 0, 0, 0, 0, + 0, 0, 0, 2503, 2505, 0, 0, 0, 0, 962, + 0, 0, 0, 0, 834, 0, 0, 2517, 0, 0, + 0, 2519, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 962, 0, 0, 0, 0, 0, 0, 0, 1097, + 0, 962, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 886, 0, 0, 0, 0, 0, 0, + 2505, 0, 962, 0, 2547, 0, 0, 0, 2551, 0, + 0, 0, 1751, 0, 0, 0, 0, 0, 962, 0, + 0, 0, 962, 962, 0, 0, 1751, 2563, 2547, 944, + 0, 1396, 0, 945, 607, 0, 0, 0, 0, 0, + 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, + 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, + 0, 960, 961, 0, 0, 0, 0, 0, 0, 0, + 0, 1240, 748, 0, 0, 748, 0, 1097, 1097, 1097, + 962, 1142, 1142, 1240, 0, 0, 0, 0, 0, 1142, + 1142, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1336, 1336, 1336, 1336, + 1336, 0, 0, 944, 0, 1411, 0, 945, 607, 0, + 0, 0, 0, 0, 946, 947, 0, 0, 962, 962, + 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, + 957, 958, 0, 959, 0, 960, 961, 944, 0, 0, + 0, 945, 607, 0, 0, 0, 1240, 0, 946, 947, + 0, 0, 1404, 1423, 948, 949, 950, 951, 0, 0, + 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, + 961, 944, 0, 0, 0, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 0, 748, 2167, 1426, 948, 949, + 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, + 0, 959, 0, 960, 961, 944, 0, 0, 808, 945, + 607, 0, 0, 0, 0, 0, 946, 947, 0, 1097, + 0, 1427, 948, 949, 950, 951, 0, 0, 953, 954, + 955, 956, 957, 958, 0, 959, 0, 960, 961, 0, + 2201, 962, 962, 962, 962, 962, 962, 962, 962, 962, + 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, + 0, 0, 0, 0, 748, 2212, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 962, 0, 0, 0, 0, + 0, 944, 962, 0, 962, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 962, 0, 0, 1462, 948, 949, + 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, + 0, 959, 0, 960, 961, 0, 944, 1899, 0, 0, + 945, 607, 0, 0, 0, 962, 0, 946, 947, 0, + 0, 0, 1509, 948, 949, 950, 951, 0, 0, 953, + 954, 955, 956, 957, 958, 0, 959, 2285, 960, 961, + 748, 944, 2288, 0, 0, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 0, 0, 0, 1510, 948, 949, + 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, 0, 944, 0, 0, 0, - 945, 607, 1097, 0, 0, 0, 0, 946, 947, 0, - 0, 0, 1460, 948, 949, 950, 951, 0, 962, 953, - 954, 955, 956, 957, 958, 0, 959, 962, 960, 961, - 944, 962, 962, 0, 945, 607, 0, 0, 0, 962, - 0, 946, 947, 0, 0, 0, 1507, 948, 949, 950, + 945, 607, 0, 0, 962, 0, 0, 946, 947, 0, + 0, 0, 1646, 948, 949, 950, 951, 0, 962, 953, + 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, + 0, 1240, 0, 0, 0, 0, 944, 0, 0, 962, + 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, + 0, 0, 1919, 948, 949, 950, 951, 1240, 0, 953, + 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, + 944, 0, 1714, 0, 945, 607, 0, 0, 0, 0, + 0, 946, 947, 0, 0, 962, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, 0, 0, 0, 0, 0, 0, - 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 962, - 0, 944, 0, 0, 962, 945, 607, 0, 0, 0, - 0, 0, 946, 947, 962, 962, 0, 1508, 948, 949, - 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, - 0, 959, 0, 960, 961, 0, 0, 0, 0, 0, - 0, 0, 944, 0, 0, 962, 945, 607, 0, 0, - 0, 0, 0, 946, 947, 962, 962, 0, 1641, 948, - 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, - 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, - 0, 0, 0, 0, 946, 947, 0, 0, 0, 1912, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 944, 0, 0, 0, 945, 607, 0, + 0, 0, 0, 1097, 946, 947, 962, 1097, 0, 1957, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, 0, 0, 0, + 944, 0, 1975, 0, 945, 607, 0, 0, 0, 962, + 0, 946, 947, 0, 748, 748, 962, 948, 949, 950, + 951, 0, 962, 953, 954, 955, 956, 957, 958, 0, + 959, 0, 960, 961, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 962, 0, 0, 1097, 1097, + 1097, 1097, 0, 0, 0, 0, 2167, 962, 0, 0, + 0, 0, 0, 0, 0, 962, 748, 0, 0, 0, + 0, 0, 0, 0, 0, 962, 0, 0, 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 962, 0, - 962, 0, 0, 0, 0, 0, 0, 0, 944, 962, - 1709, 0, 945, 607, 962, 0, 0, 962, 0, 946, - 947, 0, 0, 0, 1581, 948, 949, 950, 951, 0, - 962, 953, 954, 955, 956, 957, 958, 0, 959, 944, - 960, 961, 0, 945, 607, 0, 0, 0, 0, 0, - 946, 947, 0, 0, 0, 1950, 948, 949, 950, 951, - 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, - 0, 960, 961, 0, 0, 962, 0, 0, 0, 0, - 0, 962, 0, 0, 944, 0, 1968, 962, 945, 607, - 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, - 0, 948, 949, 950, 951, 0, 962, 953, 954, 955, - 956, 957, 958, 0, 959, 944, 960, 961, 0, 945, - 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, - 0, 2000, 948, 949, 950, 951, 0, 0, 953, 954, - 955, 956, 957, 958, 0, 959, 0, 960, 961, 962, - 0, 962, 0, 0, 0, 962, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 962, 962, 0, 0, - 0, 962, 944, 0, 2141, 0, 945, 607, 0, 0, - 0, 962, 0, 946, 947, 962, 0, 0, 0, 948, - 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, - 958, 0, 959, 0, 960, 961, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 962, 0, 0, - 0, 0, 962, 0, 962, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 962, 0, 962, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, - 378, 379, 380, 0, 382, 0, 383, 0, 385, 386, - 0, 387, 0, 0, 0, 389, 962, 391, 392, 0, - 962, 394, 395, 396, 0, 398, 0, 400, 401, 0, - 0, 408, 962, 0, 0, 0, 411, 412, 413, 414, - 415, 416, 417, 418, 0, 419, 420, 0, 0, 425, - 426, 427, 0, 429, 0, 431, 0, 0, 434, 435, - 0, 0, 0, 0, 0, 0, 442, 443, 0, 0, - 446, 0, 0, 0, 0, 0, 0, 452, 0, 454, - 0, 455, 456, 0, 0, 0, 461, 462, 463, 0, - 0, 465, 0, 0, 467, 468, 0, 470, 471, 472, - 0, 0, 0, 0, 477, 478, 0, 0, 480, 0, - 482, 483, 484, 0, 486, 487, 0, 0, 489, 0, - 491, 492, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 0, 504, 505, 506, 0, 0, 0, 0, 511, - 512, 513, 0, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, - 532, 533, 534, 535, 536, 537, 538, 539, 540, 0, - 542, 0, 544, 0, 545, 0, 546, 547, 0, 549, - 550, 551, 552, 553, 554, 555, 556, 944, 0, 2156, - 9, 945, 607, 0, 0, 0, 0, 10, 946, 947, - 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, + 0, 0, 0, 962, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 962, 0, 0, 0, 0, + 1097, 0, 0, 0, 0, 0, 0, 0, 0, 962, + 0, 0, 0, 0, 0, 962, 0, 0, 0, 0, + 0, 962, 0, 0, 0, 1097, 1097, 944, 1097, 0, + 0, 945, 607, 0, 0, 2167, 0, 0, 946, 947, + 0, 0, 0, 2007, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, - 961, 0, 0, 0, 0, 0, 0, 11, 12, 13, - 14, 0, 15, 16, 17, 18, 19, 20, 0, 634, - 21, 22, 647, 0, 650, 23, 24, 25, 0, 26, - 27, 28, 29, 30, 31, 0, 32, 33, 34, 35, - 36, 37, 0, 38, 39, 40, 41, 42, 43, 0, - 0, 44, 45, 46, 47, 48, 0, 0, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 0, 71, 0, 72, 73, 0, 74, 75, 76, 0, - 0, 77, 0, 0, 78, 79, 0, 80, 81, 82, - 83, 0, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 0, 0, 0, 0, 0, 93, 94, 95, 96, - 0, 0, 0, 0, 97, 0, 0, 98, 99, 0, - 0, 100, 101, 0, 102, 0, 0, 0, 103, 0, - 104, 0, 105, 0, 0, 0, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 0, 116, 117, 118, - 0, 119, 0, 120, 121, 0, 122, 0, 123, 124, - 125, 126, 0, 0, 127, 128, 129, 0, 130, 131, - 132, 0, 133, 134, 135, 0, 136, 0, 137, 138, - 139, 140, 141, 0, 142, 0, 143, 144, 0, 0, - 145, 146, 147, 0, 0, 148, 149, 0, 150, 151, - 0, 152, 153, 0, 0, 0, 154, 155, 0, 0, - 156, 0, 0, 157, 0, 0, 0, 158, 159, 0, - 0, 160, 161, 162, 0, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 0, 174, 0, 0, - 175, 0, 0, 0, 176, 177, 178, 179, 180, 0, - 181, 182, 0, 0, 183, 184, 185, 186, 0, 0, - 0, 0, 187, 188, 189, 190, 191, 192, 0, 0, - 0, 0, 0, 0, 0, 193, 0, 0, 194, 195, - 196, 197, 198, 0, 0, 0, 199, 200, 201, 202, - 203, 204, 944, 205, 206, 2232, 945, 607, 207, 0, + 961, 0, 944, 0, 2150, 0, 945, 607, 0, 0, + 0, 0, 0, 946, 947, 0, 0, 0, 1097, 948, + 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, + 958, 0, 959, 0, 960, 961, 944, 0, 2165, 0, + 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, + 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, + 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 377, 378, 379, 380, 0, 382, 0, 383, 0, 385, + 386, 962, 387, 0, 0, 0, 389, 0, 391, 392, + 0, 0, 394, 395, 396, 0, 398, 0, 400, 401, + 0, 0, 408, 0, 0, 0, 0, 411, 412, 413, + 414, 415, 416, 417, 418, 0, 419, 420, 0, 0, + 425, 426, 427, 0, 429, 962, 431, 0, 0, 434, + 435, 0, 0, 0, 0, 0, 0, 442, 443, 0, + 0, 446, 0, 0, 0, 962, 0, 962, 452, 0, + 454, 962, 455, 456, 0, 0, 0, 461, 462, 463, + 0, 0, 465, 0, 0, 467, 468, 0, 470, 471, + 472, 0, 0, 0, 962, 477, 478, 962, 0, 480, + 0, 482, 483, 484, 0, 486, 487, 0, 0, 489, + 0, 491, 492, 493, 494, 495, 496, 0, 0, 1123, + 0, 0, 0, 504, 505, 506, 0, 0, 0, 0, + 511, 512, 513, 0, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 0, 542, 0, 544, 0, 545, 0, 546, 547, 0, + 549, 550, 551, 552, 553, 554, 555, 556, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 944, 962, 0, 2243, + 945, 607, 0, 0, 0, 0, 962, 946, 947, 0, + 962, 962, 0, 948, 949, 950, 951, 0, 962, 953, + 954, 955, 956, 957, 958, 0, 959, 944, 960, 961, + 634, 945, 607, 647, 0, 650, 0, 0, 946, 947, + 0, 0, 0, 2255, 948, 949, 950, 951, 0, 962, + 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, + 961, 0, 0, 0, 0, 0, 0, 0, 962, 0, + 944, 0, 0, 962, 945, 607, 0, 0, 0, 0, + 0, 946, 947, 962, 962, 0, 2263, 948, 949, 950, + 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, + 959, 0, 960, 961, 0, 0, 0, 0, 0, 0, + 0, 944, 0, 0, 962, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 962, 962, 0, 2278, 948, 949, + 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, + 0, 959, 944, 960, 961, 2289, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, 0, 0, 0, 0, - 0, 0, 944, 0, 0, 0, 945, 607, 0, 0, - 0, 0, 0, 946, 947, 0, 0, 0, 2244, 948, - 949, 950, 951, 934, 935, 953, 954, 955, 956, 957, - 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, - 0, 0, 0, 0, 946, 947, 0, 0, 0, 2252, - 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, - 957, 958, 0, 959, 944, 960, 961, 0, 945, 607, - 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, - 2267, 948, 949, 950, 951, 0, 0, 953, 954, 955, - 956, 957, 958, 0, 959, 944, 960, 961, 2278, 945, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 962, + 0, 962, 0, 0, 0, 0, 0, 0, 0, 944, + 962, 0, 0, 945, 607, 962, 0, 0, 962, 0, + 946, 947, 0, 0, 0, 2293, 948, 949, 950, 951, + 0, 962, 953, 954, 955, 956, 957, 958, 0, 959, + 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, + 0, 946, 947, 0, 0, 0, 2352, 948, 949, 950, + 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, + 959, 0, 960, 961, 0, 0, 962, 0, 0, 0, + 0, 0, 962, 0, 0, 944, 0, 0, 962, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, - 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, - 955, 956, 957, 958, 0, 959, 944, 960, 961, 0, + 0, 2353, 948, 949, 950, 951, 0, 962, 953, 954, + 955, 956, 957, 958, 0, 959, 944, 960, 961, 2377, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, - 0, 0, 2282, 948, 949, 950, 951, 0, 0, 953, - 954, 955, 956, 957, 958, 0, 959, 944, 960, 961, - 0, 945, 607, 0, 0, 0, 0, 0, 946, 947, - 0, 0, 0, 2341, 948, 949, 950, 951, 0, 0, + 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, + 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, + 962, 0, 962, 0, 0, 0, 962, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 962, 962, 0, + 0, 0, 962, 944, 934, 935, 0, 945, 607, 0, + 0, 0, 962, 0, 946, 947, 962, 0, 0, 2384, + 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, + 957, 958, 0, 959, 0, 960, 961, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 962, 0, + 0, 0, 0, 962, 0, 962, 0, 0, 0, 944, + 0, 0, 2401, 945, 607, 9, 0, 962, 0, 962, + 946, 947, 10, 0, 0, 0, 948, 949, 950, 951, + 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, + 0, 960, 961, 0, 0, 0, 0, 962, 0, 0, + 0, 962, 11, 12, 13, 14, 0, 15, 16, 17, + 18, 19, 20, 962, 0, 21, 22, 0, 0, 0, + 23, 24, 25, 0, 26, 27, 28, 29, 30, 31, + 0, 32, 33, 34, 35, 36, 37, 0, 38, 39, + 40, 41, 42, 43, 0, 0, 44, 45, 46, 47, + 48, 0, 0, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 0, 71, 0, 72, 73, + 0, 74, 75, 76, 0, 0, 77, 0, 0, 78, + 79, 0, 80, 81, 82, 83, 0, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 0, 0, 0, 0, + 0, 93, 94, 95, 96, 0, 0, 0, 0, 97, + 0, 0, 98, 99, 0, 0, 100, 101, 0, 102, + 0, 0, 0, 103, 0, 104, 0, 105, 0, 0, + 0, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 0, 116, 117, 118, 0, 119, 0, 120, 121, + 0, 122, 0, 123, 124, 125, 126, 0, 0, 127, + 128, 129, 0, 130, 131, 132, 0, 133, 134, 135, + 0, 136, 0, 137, 138, 139, 140, 141, 0, 142, + 0, 143, 144, 0, 0, 145, 146, 147, 0, 0, + 148, 149, 0, 150, 151, 0, 152, 153, 0, 0, + 0, 154, 155, 0, 0, 156, 0, 0, 157, 0, + 0, 0, 158, 159, 0, 0, 160, 161, 162, 0, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 0, 174, 0, 0, 175, 0, 0, 0, 176, + 177, 178, 179, 180, 0, 181, 182, 0, 0, 183, + 184, 185, 186, 0, 0, 0, 0, 187, 188, 189, + 190, 191, 192, 0, 0, 0, 0, 0, 0, 0, + 193, 0, 0, 194, 195, 196, 197, 198, 0, 0, + 0, 199, 200, 201, 202, 203, 204, 944, 205, 206, + 2419, 945, 607, 207, 0, 0, 0, 0, 946, 947, + 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, 0, 946, - 947, 0, 0, 0, 2342, 948, 949, 950, 951, 0, + 947, 0, 0, 0, 2425, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 944, - 960, 961, 2366, 945, 607, 0, 0, 0, 0, 0, + 960, 961, 2473, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, - 0, 946, 947, 0, 0, 0, 2373, 948, 949, 950, + 0, 946, 947, 0, 0, 0, 2475, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, - 959, 944, 960, 961, 2390, 945, 607, 0, 0, 0, - 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, + 959, 944, 960, 961, 0, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 0, 0, 0, 2486, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, - 0, 959, 944, 960, 961, 2408, 945, 607, 0, 0, + 0, 959, 944, 960, 961, 2487, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, - 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, - 0, 0, 0, 0, 946, 947, 0, 0, 0, 2414, + 958, 0, 959, 944, 960, 961, 2491, 945, 607, 0, + 0, 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, - 957, 958, 0, 959, 944, 960, 961, 2462, 945, 607, + 957, 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, - 0, 948, 949, 950, 951, 0, 0, 953, 954, 955, + 2496, 948, 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, - 0, 2464, 948, 949, 950, 951, 0, 0, 953, 954, - 955, 956, 957, 958, 0, 959, 944, 960, 961, 0, - 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, - 0, 0, 2475, 948, 949, 950, 951, 0, 0, 953, - 954, 955, 956, 957, 958, 0, 959, 944, 960, 961, - 2476, 945, 607, 0, 0, 0, 0, 0, 946, 947, - 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, - 953, 954, 955, 956, 957, 958, 0, 959, 944, 960, - 961, 2480, 945, 607, 0, 0, 0, 0, 0, 946, - 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, - 0, 953, 954, 955, 956, 957, 958, 0, 959, 944, - 960, 961, 0, 945, 607, 0, 0, 0, 0, 0, - 946, 947, 0, 0, 0, 2485, 948, 949, 950, 951, - 0, 0, 953, 954, 955, 956, 957, 958, 0, 959, - 944, 960, 961, 0, 945, 607, 0, 0, 0, 0, - 0, 946, 947, 0, 0, 0, 2513, 948, 949, 950, - 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, - 959, 944, 960, 961, 2527, 945, 607, 0, 0, 0, - 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, - 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, - 0, 959, 0, 960, 961, 944, 0, 2546, 0, 945, - 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, - 0, 0, 948, 949, 950, 951, 0, 0, 953, 954, - 955, 956, 957, 958, 0, 959, 944, 960, 961, 0, + 0, 2524, 948, 949, 950, 951, 0, 0, 953, 954, + 955, 956, 957, 958, 0, 959, 944, 960, 961, 2538, 945, 607, 0, 0, 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, 951, 0, 0, 953, - 954, 955, 956, 957, 958, 0, 959, 0, 960, 961 + 954, 955, 956, 957, 958, 0, 959, 0, 960, 961, + 944, 0, 2557, 0, 945, 607, 0, 0, 0, 0, + 0, 946, 947, 0, 0, 0, 0, 948, 949, 950, + 951, 0, 0, 953, 954, 955, 956, 957, 958, 0, + 959, 944, 960, 961, 0, 945, 607, 0, 0, 0, + 0, 0, 946, 947, 0, 0, 0, 0, 948, 949, + 950, 951, 0, 0, 953, 954, 955, 956, 957, 958, + 0, 959, 944, 960, 961, 0, 945, 0, 0, 0, + 0, 0, 0, 946, 947, 0, 0, 0, 0, 948, + 949, 950, 951, 0, 0, 953, 954, 955, 956, 957, + 958, 0, 959, 0, 960, 961 }; static const yytype_int16 yycheck[] = { - 50, 486, 378, 483, 493, 494, 495, 496, 392, 763, - 887, 375, 541, 630, 887, 750, 1448, 1024, 918, 1131, - 888, 656, 401, 388, 62, 63, 968, 634, 256, 1328, - 1486, 69, 411, 261, 413, 1590, 209, 1620, 2005, 418, - 419, 420, 472, 1596, 467, 1299, 998, 426, 1607, 1482, - 429, 877, 431, 1844, 1064, 1846, 63, 430, 1506, 743, - 98, 1299, 76, 1965, 480, 974, 2071, 258, 118, 433, - 261, 262, 122, 1596, 845, 1147, 7, 0, 1, 655, - 656, 1518, 477, 8, 89, 99, 450, 1361, 845, 1616, - 1518, 1518, 468, 94, 1621, 1898, 1899, 1518, 388, 1518, - 464, 1518, 116, 1518, 2181, 469, 41, 1662, 8, 473, - 609, 475, 1893, 175, 7, 182, 7, 122, 513, 116, - 20, 5, 71, 15, 488, 645, 182, 1698, 1699, 1700, - 144, 191, 673, 8, 5, 47, 500, 169, 502, 15, - 5, 21, 7, 1020, 191, 509, 129, 1020, 8, 1159, - 155, 116, 406, 967, 968, 8, 655, 656, 878, 8, - 20, 15, 8, 15, 5, 1172, 1043, 20, 9, 129, - 3, 20, 129, 129, 58, 8, 208, 23, 8, 5, - 185, 15, 2389, 166, 904, 116, 224, 15, 8, 8, - 20, 37, 8, 15, 21, 21, 37, 8, 23, 1516, - 20, 1518, 86, 1520, 1516, 387, 1518, 637, 1520, 574, - 1522, 641, 37, 218, 15, 172, 116, 129, 648, 584, - 585, 586, 587, 116, 266, 116, 480, 150, 288, 230, - 8, 37, 8, 858, 859, 282, 861, 231, 232, 299, - 8, 8, 126, 237, 472, 287, 1545, 252, 315, 129, - 282, 318, 647, 137, 129, 650, 116, 149, 129, 208, - 257, 323, 318, 116, 129, 177, 8, 116, 809, 8, - 1841, 2478, 2349, 15, 209, 129, 191, 129, 763, 194, - 800, 165, 116, 284, 1184, 1516, 116, 1518, 1516, 1520, - 1518, 1522, 1520, 228, 295, 129, 116, 116, 588, 5, - 116, 129, 129, 129, 129, 116, 64, 129, 724, 674, - 128, 2114, 2115, 692, 1897, 3, 15, 18, 8, 2100, - 15, 149, 1434, 129, 8, 26, 257, 8, 129, 254, - 18, 37, 697, 818, 257, 373, 374, 1896, 116, 157, - 116, 379, 380, 381, 382, 8, 384, 385, 116, 116, - 388, 8, 390, 391, 392, 393, 696, 257, 396, 1597, - 1598, 399, 969, 401, 257, 1639, 257, 1894, 406, 799, - 246, 409, 712, 411, 258, 413, 1813, 116, 751, 417, - 418, 419, 420, 2285, 1293, 1813, 1813, 129, 426, 1845, - 428, 429, 1813, 431, 1813, 811, 1813, 257, 1813, 437, - 438, 1972, 1086, 798, 257, 800, 444, 445, 257, 637, - 417, 449, 1183, 641, 1366, 1367, 1368, 1171, 456, 1426, - 648, 459, 998, 257, 1333, 1182, 116, 257, 64, 794, - 129, 8, 116, 471, 129, 116, 474, 257, 257, 489, - 1447, 257, 480, 481, 482, 483, 257, 485, 486, 147, - 148, 633, 8, 116, 492, 493, 494, 495, 496, 116, - 498, 1078, 982, 501, 984, 503, 504, 840, 1103, 507, - 15, 991, 510, 1483, 839, 15, 514, 842, 1292, 257, - 2051, 257, 180, 1800, 15, 16, 17, 8, 1800, 257, - 257, 8, 915, 129, 544, 211, 1813, 1406, 548, 998, - 5, 1813, 1819, 843, 9, 543, 2473, 1819, 690, 2514, - 2515, 1823, 191, 149, 854, 1587, 1588, 92, 257, 569, - 7, 8, 560, 23, 15, 241, 576, 1103, 2111, 208, - 568, 871, 37, 571, 572, 573, 574, 37, 1837, 116, - 2093, 579, 580, 2102, 244, 583, 584, 585, 586, 587, - 2006, 565, 566, 591, 592, 985, 986, 987, 988, 989, - 116, 2463, 1995, 577, 2135, 905, 2014, 257, 8, 1800, - 2093, 799, 1800, 257, 149, 148, 257, 251, 769, 919, - 8, 128, 1813, 8, 129, 1813, 759, 8, 1819, 16, - 17, 1819, 1823, 2384, 257, 116, 147, 148, 129, 116, - 257, 2569, 2570, 282, 1103, 315, 285, 180, 95, 37, - 157, 257, 37, 2531, 2582, 665, 37, 2519, 149, 657, - 658, 659, 660, 661, 662, 663, 201, 2545, 666, 180, - 330, 1151, 3, 683, 1888, 8, 674, 124, 15, 1893, - 350, 3, 5, 129, 41, 345, 346, 347, 21, 5, - 1888, 63, 15, 9, 692, 26, 68, 695, 183, 697, - 16, 17, 8, 149, 26, 92, 191, 1007, 3, 1546, - 217, 1306, 1012, 1546, 71, 2258, 8, 5, 90, 91, - 257, 37, 720, 208, 3, 679, 21, 15, 191, 21, - 1642, 1643, 1644, 743, 1448, 1449, 15, 1432, 1524, 1525, - 1526, 257, 1528, 1529, 43, 208, 8, 745, 195, 747, - 760, 8, 750, 1053, 8, 202, 8, 8, 15, 21, - 8, 5, 149, 7, 774, 763, 1635, 21, 67, 21, - 1306, 781, 144, 21, 916, 773, 257, 8, 135, 8, - 257, 8, 154, 82, 782, 1427, 784, 1429, 87, 88, - 21, 789, 21, 791, 21, 94, 794, 985, 986, 987, - 988, 989, 8, 314, 315, 1674, 8, 318, 319, 807, - 8, 8, 169, 3, 201, 21, 8, 2348, 452, 282, - 818, 963, 285, 21, 21, 15, 824, 290, 200, 21, - 1366, 1367, 1368, 8, 191, 298, 8, 847, 256, 7, - 8, 839, 3, 261, 842, 2360, 21, 1306, 8, 1308, - 848, 208, 209, 487, 15, 338, 8, 7, 341, 342, - 343, 21, 8, 497, 221, 15, 223, 224, 2399, 226, - 880, 354, 229, 1353, 1354, 1355, 1356, 1357, 5, 889, - 890, 891, 9, 1415, 894, 1417, 2100, 8, 8, 16, - 17, 8, 8, 1035, 2310, 8, 23, 895, 896, 8, - 21, 21, 856, 1045, 21, 21, 860, 1366, 1367, 1368, - 37, 865, 21, 911, 868, 869, 550, 551, 552, 553, - 554, 15, 5, 897, 934, 282, 9, 10, 8, 228, - 8, 8, 1265, 16, 17, 933, 7, 8, 912, 22, - 23, 24, 25, 26, 21, 28, 29, 30, 31, 32, - 33, 8, 35, 8, 37, 38, 8, 16, 17, 8, - 259, 8, 21, 320, 21, 322, 2382, 8, 8, 21, - 924, 1296, 926, 1273, 21, 609, 610, 611, 7, 613, - 21, 1883, 1884, 1885, 1886, 1887, 620, 16, 17, 2381, - 5, 1291, 8, 7, 9, 8, 8, 2256, 3, 8, - 634, 16, 17, 1840, 303, 21, 1342, 1017, 21, 21, - 15, 1871, 22, 1850, 24, 15, 434, 1850, 1016, 8, - 1848, 1849, 37, 33, 1022, 35, 8, 1722, 1856, 1857, - 1028, 8, 21, 407, 1748, 8, 8, 8, 8, 21, - 8, 8, 676, 1041, 21, 463, 8, 8, 1917, 21, - 1386, 21, 470, 21, 472, 2471, 8, 691, 2130, 21, - 21, 8, 8, 1399, 1933, 8, 84, 1634, 1066, 21, - 1939, 3, 1941, 1071, 21, 21, 1086, 2469, 21, 3, - 8, 8, 8, 15, 1094, 719, 1425, 8, 8, 1087, - 8, 15, 726, 21, 21, 21, 1933, 8, 732, 733, - 1933, 21, 1939, 21, 1102, 8, 1642, 1643, 1644, 1883, - 1884, 1885, 1886, 1887, 8, 8, 3, 8, 21, 129, - 1420, 8, 8, 7, 8, 5, 8, 21, 1138, 9, - 1844, 8, 1846, 8, 1458, 21, 16, 17, 7, 21, - 8, 21, 15, 23, 778, 519, 21, 521, 158, 159, - 149, 161, 162, 21, 528, 529, 530, 37, 15, 8, - 534, 535, 536, 537, 8, 539, 540, 351, 352, 256, - 15, 1181, 21, 191, 261, 15, 5, 21, 8, 15, - 9, 1505, 192, 1642, 1643, 1644, 149, 16, 17, 7, - 208, 21, 8, 22, 23, 15, 25, 8, 1340, 28, - 29, 30, 31, 32, 1346, 21, 35, 8, 37, 38, - 21, 15, 8, 15, 1224, 15, 8, 851, 852, 637, - 21, 316, 317, 641, 234, 21, 1236, 1237, 1238, 21, - 648, 22, 8, 24, 84, 653, 15, 247, 15, 1193, - 15, 8, 33, 8, 35, 1199, 8, 265, 1638, 1203, - 1260, 1205, 1206, 1207, 21, 1209, 21, 1211, 15, 21, - 15, 44, 348, 349, 282, 8, 8, 285, 1266, 1267, - 1412, 289, 290, 1762, 15, 1764, 1765, 8, 21, 21, - 298, 299, 8, 8, 16, 17, 304, 1776, 8, 37, - 21, 15, 1290, 8, 8, 2367, 21, 1786, 1296, 1788, - 124, 21, 1300, 15, 87, 15, 21, 21, 1597, 1598, - 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, - 954, 955, 956, 957, 958, 959, 960, 961, 962, 993, - 994, 5, 15, 8, 15, 969, 119, 2304, 1915, 8, - 974, 191, 16, 17, 8, 1684, 21, 981, 22, 983, - 24, 1651, 21, 8, 2116, 2117, 2118, 21, 208, 33, - 143, 35, 145, 37, 998, 8, 21, 158, 159, 2206, - 161, 162, 8, 1371, 8, 8, 8, 15, 21, 8, - 15, 799, 247, 248, 2253, 21, 8, 21, 21, 21, - 1024, 15, 21, 2230, 8, 178, 1030, 2230, 15, 21, - 183, 192, 1544, 15, 187, 8, 15, 21, 191, 2278, - 8, 194, 1046, 1713, 15, 265, 1414, 1415, 21, 1417, - 1642, 1643, 1644, 21, 15, 16, 17, 1425, 8, 1427, - 15, 1429, 282, 216, 1432, 285, 27, 15, 812, 289, - 15, 21, 1922, 234, 8, 36, 1400, 230, 8, 299, - 1638, 8, 8, 236, 304, 7, 247, 21, 876, 877, - 15, 21, 15, 8, 21, 21, 1464, 8, 59, 887, - 8, 1481, 15, 64, 124, 1473, 21, 2565, 2566, 15, - 21, 1479, 5, 21, 15, 159, 9, 1629, 162, 8, - 1500, 1489, 1502, 16, 17, 2446, 2447, 1131, 21, 239, - 23, 92, 21, 203, 204, 205, 206, 207, 1506, 3, - 246, 1653, 866, 867, 37, 1149, 246, 1527, 15, 21, - 26, 1475, 8, 1665, 5, 7, 7, 1669, 1538, 10, - 15, 240, 15, 14, 15, 16, 17, 15, 1172, 1173, - 1174, 8, 1552, 15, 8, 2512, 27, 1557, 5, 15, - 15, 26, 9, 34, 1564, 36, 175, 149, 149, 16, - 17, 8, 1572, 15, 21, 8, 23, 985, 986, 987, - 988, 989, 1582, 247, 1584, 993, 994, 5, 8, 1577, - 37, 15, 10, 64, 8, 8, 14, 15, 16, 17, - 15, 7, 2306, 62, 15, 15, 8, 8, 1934, 27, - 287, 15, 1020, 21, 8, 1239, 34, 5, 36, 1607, - 201, 92, 314, 1937, 8, 8, 213, 15, 16, 17, - 8, 8, 1620, 15, 9, 1043, 64, 2204, 129, 27, - 21, 305, 306, 307, 9, 8, 64, 8, 36, 8, - 67, 1639, 37, 15, 1642, 1643, 1644, 15, 129, 15, - 8, 15, 15, 15, 1652, 15, 15, 8, 129, 1293, - 7, 15, 2006, 1081, 92, 26, 64, 2381, 149, 2383, - 2384, 1305, 7, 21, 18, 21, 21, 26, 5, 15, - 1054, 37, 9, 10, 7, 7, 1684, 14, 15, 16, - 17, 1065, 8, 26, 92, 15, 15, 8, 63, 1333, - 27, 129, 8, 68, 21, 15, 1704, 34, 21, 36, - 15, 1345, 15, 15, 15, 15, 8, 21, 15, 5, - 201, 149, 21, 62, 1722, 90, 91, 15, 15, 2443, - 21, 129, 8, 7, 15, 63, 8, 64, 166, 8, - 68, 2181, 8, 8, 15, 255, 7, 166, 15, 239, - 208, 149, 16, 21, 2468, 2469, 15, 15, 1756, 1757, - 1394, 1395, 90, 91, 15, 92, 21, 8, 7, 191, - 15, 330, 15, 201, 7, 1409, 315, 331, 15, 144, - 15, 15, 1416, 1781, 1158, 15, 15, 15, 15, 154, - 15, 15, 1426, 15, 15, 15, 124, 15, 1432, 15, - 1434, 15, 129, 201, 246, 246, 246, 2521, 5, 246, - 246, 15, 8, 1447, 15, 21, 144, 8, 1192, 21, - 7, 21, 149, 21, 1198, 8, 154, 1461, 1202, 21, - 1204, 26, 1842, 15, 1208, 200, 1210, 10, 1472, 15, - 21, 14, 15, 16, 17, 1855, 2295, 2296, 173, 1859, - 8, 1485, 15, 15, 27, 255, 1490, 8, 1492, 5, - 7, 34, 21, 36, 10, 15, 231, 15, 14, 15, - 16, 17, 200, 5, 201, 7, 208, 71, 10, 244, - 18, 27, 14, 15, 16, 17, 8, 15, 34, 15, - 36, 64, 15, 7, 15, 27, 15, 21, 1896, 1897, - 1898, 1899, 34, 5, 36, 233, 21, 9, 21, 21, - 21, 1909, 15, 21, 16, 17, 244, 15, 64, 92, - 22, 23, 15, 25, 15, 21, 28, 29, 30, 31, - 32, 21, 64, 8, 15, 37, 2381, 2382, 1936, 2275, - 5, 15, 1952, 1361, 20, 9, 92, 26, 21, 2091, - 21, 21, 21, 21, 15, 21, 129, 15, 1592, 2101, - 92, 5, 8, 7, 1974, 9, 10, 26, 21, 26, - 26, 21, 16, 17, 8, 7, 149, 21, 22, 23, - 24, 25, 21, 129, 28, 29, 30, 31, 32, 33, - 15, 35, 1990, 37, 38, 26, 1994, 129, 1996, 1633, - 1634, 1635, 8, 149, 254, 15, 21, 21, 2006, 8, - 2020, 15, 132, 21, 7, 2013, 2014, 149, 7, 2029, - 166, 21, 353, 21, 37, 15, 7, 15, 201, 7, - 1664, 15, 255, 1667, 21, 434, 21, 2047, 15, 15, - 15, 1675, 15, 15, 15, 15, 15, 1465, 1422, 15, - 7, 15, 8, 21, 8, 201, 8, 7, 21, 8, - 7, 21, 45, 46, 463, 48, 49, 8, 7, 201, - 53, 470, 7, 1707, 352, 1709, 21, 15, 61, 478, - 329, 78, 8, 66, 7, 7, 69, 21, 351, 17, - 1508, 15, 21, 128, 77, 15, 79, 1471, 81, 15, - 15, 8, 15, 17, 2102, 7, 1524, 1525, 1526, 7, - 1528, 1529, 15, 2111, 1532, 2113, 2114, 2115, 2116, 2117, - 2118, 104, 7, 15, 16, 17, 896, 222, 1546, 1267, - 1992, 1868, 115, 2143, 1582, 27, 1090, 1511, 582, 1185, - 1514, 1586, 2253, 1517, 36, 1519, 1869, 1521, 593, 1523, - 1298, 590, 710, 933, 1616, 2258, 139, 2113, 1888, 933, - 2093, 1896, 1489, 1154, 1723, 1473, 5, 2163, 1990, 152, - 2182, 10, 64, 1026, 1046, 14, 15, 16, 17, 1409, - 1388, 1088, 1695, 2181, 2182, 1697, 75, 170, 27, 2571, - 589, 1917, 1939, 176, 711, 34, 1395, 36, 246, 246, - 92, 184, 792, 186, 246, 188, 463, 190, 246, 1432, - 1035, 1635, 1638, 2223, 197, 1071, 998, 1851, 838, 1102, - 1638, 1639, 657, 1174, 1858, 64, 659, 2305, 1862, 1863, - 2240, 214, 215, 5, 660, 1411, 1870, 129, 10, 1413, - 2142, 2519, 14, 15, 16, 17, 661, 2367, 1994, 232, - 1016, 1014, 662, 92, 653, 27, 239, 149, 807, 2491, - 2258, 1087, 34, 1041, 36, 1936, 2426, 1028, 40, 1976, - 253, 442, 788, 256, 2380, 2521, 2547, 1911, 2569, 2567, - 1698, 1699, 1700, 1917, 2313, 1997, 1487, 1748, 666, 504, - 129, 1449, 64, 761, 382, 1941, 1538, 2295, 2296, 415, - 2001, 2285, 1800, 1775, 1819, 1823, 1780, 2305, 1942, 201, - 149, 1813, 2027, 2026, 1224, 2336, 878, 1951, 2047, 2353, - 92, 5, 2206, 1557, 1552, 1564, 10, 1572, 2240, -1, - 14, 15, 16, 17, 1968, 1969, -1, -1, -1, -1, - -1, -1, -1, 27, -1, -1, 745, -1, -1, -1, - 34, -1, 36, -1, -1, -1, -1, 129, -1, -1, - -1, -1, 201, 1997, 763, -1, -1, -1, -1, -1, - -1, 2005, -1, 2371, -1, -1, -1, 149, 777, -1, - 64, 2015, -1, 2381, 2382, 2395, 785, 786, -1, -1, - -1, 790, -1, -1, 2404, -1, -1, 2031, 1772, 2033, - 2410, -1, 2412, 1777, -1, -1, -1, -1, 92, -1, - -1, -1, -1, -1, -1, -1, 1790, 2415, -1, 818, - -1, -1, 1840, 1841, -1, -1, -1, 826, -1, 201, - -1, -1, 1850, -1, -1, -1, 2446, 2447, 1812, 45, - 46, -1, 48, 49, 1818, 129, -1, 53, 1822, -1, - -1, -1, -1, -1, -1, 61, 855, -1, 857, -1, - 66, -1, -1, 69, -1, 149, -1, -1, -1, -1, - -1, 77, -1, 79, -1, 81, -1, 876, 877, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 887, 888, - -1, 2125, -1, 2491, 5, 2493, 2130, -1, 104, 10, - -1, -1, -1, 14, 15, 16, 17, 2141, 2142, 115, - -1, -1, 2146, -1, -1, 1933, 27, 201, -1, -1, - -1, 1939, 2156, 34, -1, 36, -1, -1, 2162, -1, - -1, -1, -1, 139, -1, -1, -1, -1, -1, 2549, - -1, -1, -1, -1, 2554, -1, 152, -1, -1, -1, - -1, -1, -1, 64, 1972, -1, -1, 2567, -1, 2569, - 2570, -1, -1, -1, 170, -1, -1, -1, 967, 968, - 176, 2205, 2582, -1, -1, -1, -1, -1, 184, -1, - 186, 92, 188, -1, 190, -1, -1, -1, -1, -1, - -1, 197, -1, -1, 993, 994, -1, -1, 2232, -1, - -1, -1, -1, -1, -1, 5, -1, -1, 214, 215, - 10, -1, -1, 2247, 14, 15, 16, 17, 129, 2253, - -1, 1020, -1, -1, -1, -1, 232, 27, -1, 2003, - -1, -1, -1, 2051, 34, -1, 36, -1, 149, -1, - -1, -1, -1, 2017, 1043, -1, -1, 253, 2022, -1, - 256, 2025, -1, -1, -1, 2289, -1, -1, -1, -1, - -1, 2035, -1, 2037, 64, 2039, -1, 2041, -1, -1, - 2304, -1, -1, -1, -1, 5, -1, -1, -1, 9, - -1, -1, 1081, 5, -1, 15, 16, 17, -1, -1, - 201, 621, 92, 15, 16, 17, -1, 27, -1, 5, - -1, -1, -1, 9, -1, 27, 36, -1, -1, 15, - 16, 17, -1, -1, 36, -1, -1, 2135, -1, -1, - -1, 27, -1, -1, -1, -1, -1, -1, -1, 129, - 36, -1, 2366, 2367, 64, -1, 2370, -1, 2372, -1, - -1, -1, 64, -1, -1, -1, -1, -1, -1, 149, - -1, -1, -1, 2387, 2388, -1, 2390, 5, 64, -1, - -1, 9, 92, -1, -1, -1, 2400, -1, 16, 17, - 92, -1, 1171, -1, 2408, 23, -1, 25, -1, -1, - 28, 29, 30, 31, 32, -1, 92, -1, 2206, 37, - -1, -1, 2426, -1, -1, -1, -1, -1, -1, 129, - -1, 201, -1, -1, -1, -1, 7, 129, -1, 10, - -1, -1, 2230, 14, 15, 16, 17, -1, -1, 149, - 2454, -1, -1, 129, -1, -1, 27, 149, 2462, 2463, - -1, -1, -1, 34, -1, 36, 166, -1, -1, 2473, - -1, 771, 2476, 149, -1, 775, 2480, -1, 7, -1, - -1, 10, -1, -1, -1, 14, 15, 16, 17, -1, - -1, -1, -1, 64, -1, -1, -1, -1, 27, -1, - -1, 201, -1, -1, -1, 34, 5, 36, 2512, 201, - 9, -1, -1, -1, -1, 2519, -1, 16, 17, 2523, - -1, 92, 822, 2527, 23, 201, 25, 2531, 1297, 28, - 29, 30, 31, 32, 834, 64, -1, -1, 37, -1, - -1, 2545, 2546, 2547, -1, -1, -1, 7, -1, 78, - 10, -1, -1, -1, 14, 15, 16, 17, 129, 2347, - 2348, -1, -1, 92, -1, -1, -1, 27, -1, -1, - -1, -1, -1, -1, 34, -1, 36, -1, 149, -1, - -1, 881, 882, 883, 884, -1, 886, -1, -1, -1, - -1, -1, 1361, -1, -1, 166, -1, -1, -1, -1, - 129, -1, -1, -1, 64, -1, -1, 7, -1, -1, - 10, 2399, -1, -1, 14, 15, 16, 17, -1, -1, - 149, -1, -1, -1, -1, -1, -1, 27, -1, -1, - 201, -1, 92, -1, 34, -1, 36, -1, 938, -1, - 940, 941, 942, 943, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1427, -1, - 1429, -1, -1, -1, 64, -1, 2454, -1, -1, 129, - -1, -1, 201, -1, -1, -1, -1, -1, -1, 1448, - 1449, -1, -1, -1, -1, -1, -1, -1, -1, 149, - 1459, -1, 92, -1, -1, -1, 1465, -1, 1467, 999, - -1, 1470, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1482, -1, -1, -1, 1486, 1487, -1, - -1, 1021, -1, -1, -1, -1, -1, -1, -1, 129, - -1, 1031, 12, -1, -1, -1, -1, -1, 18, 1508, - 44, 201, -1, -1, -1, -1, 1515, -1, 28, 149, - -1, 31, 1052, -1, 34, 1524, 1525, 1526, -1, 1528, - 1529, 41, -1, 1532, -1, 45, -1, -1, 1068, 49, - -1, -1, 1072, 1073, -1, -1, -1, 1546, -1, -1, - -1, -1, -1, 87, -1, -1, -1, 67, -1, 93, - -1, 71, 72, -1, -1, -1, -1, 77, 78, -1, - -1, 201, -1, 83, 84, -1, 86, 87, 88, 89, - -1, 91, -1, -1, -1, 119, -1, -1, -1, -1, - 100, -1, -1, -1, -1, 105, -1, 107, -1, -1, - 1130, 111, -1, -1, -1, 115, -1, 117, 1607, 143, - -1, 145, -1, -1, 124, -1, -1, -1, 128, -1, - -1, -1, 132, -1, 134, -1, -1, -1, -1, -1, - -1, 141, 142, -1, -1, 145, 146, -1, -1, -1, - 1639, 151, -1, 153, 178, -1, -1, 157, -1, 183, - -1, -1, -1, 187, -1, -1, -1, 191, 1188, 1189, - 194, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 184, -1, 186, 7, -1, -1, - 10, -1, 216, 193, 14, 15, 16, 17, -1, -1, - -1, -1, -1, -1, -1, -1, 230, 27, -1, 1698, - 1699, 1700, 236, -1, 34, -1, 36, -1, -1, -1, - -1, -1, -1, 7, -1, -1, 10, -1, -1, -1, - 14, 15, 16, 17, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 27, 64, -1, -1, -1, -1, -1, - 34, -1, 36, -1, -1, -1, -1, -1, 7, 1748, - -1, 10, -1, -1, -1, 14, 15, 16, 17, -1, - -1, -1, 92, -1, -1, -1, -1, -1, 27, -1, - 64, -1, -1, -1, -1, 34, -1, 36, -1, 1309, - 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, - 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 92, 129, - -1, -1, -1, -1, -1, 64, -1, 7, -1, -1, - 10, -1, -1, 1343, 14, 15, 16, 17, -1, 149, - 1350, -1, 1352, -1, -1, -1, -1, 27, -1, -1, - -1, -1, 1362, 92, 34, 129, 36, -1, -1, -1, - -1, 1840, 1841, -1, -1, 1844, 1845, 1846, -1, 1848, - 1849, 1850, -1, -1, -1, 149, -1, 1856, 1857, -1, - -1, -1, -1, 1393, 64, -1, -1, -1, -1, -1, - 129, 201, 10, -1, -1, -1, 14, 15, 16, 17, - -1, -1, -1, -1, 1883, 1884, 1885, 1886, 1887, 27, - 149, 5, 92, -1, 404, 9, 34, -1, 36, -1, - -1, -1, 16, 17, -1, -1, -1, 201, 22, 23, - 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, - -1, 35, -1, 37, 38, -1, 64, -1, -1, 129, - -1, -1, 1462, 5, 1933, -1, -1, 9, 10, -1, - 1939, -1, 201, -1, 16, 17, 1476, -1, -1, 149, - 22, 23, 24, 25, 92, -1, 28, 29, 30, 31, - 32, 33, 34, 35, -1, 37, 38, 1497, -1, -1, - -1, -1, -1, 1972, 1973, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 129, -1, -1, -1, -1, 1995, -1, 508, -1, - -1, 201, -1, -1, -1, -1, -1, 2006, -1, -1, - -1, 149, 5, 1543, 7, -1, 9, 10, -1, -1, - -1, -1, -1, 16, 17, -1, -1, -1, 2027, 22, - 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, - 33, -1, 35, -1, 37, 38, -1, -1, -1, -1, - -1, -1, 2051, 2052, 5, -1, -1, 8, 9, 10, - -1, 1591, -1, 201, -1, 16, 17, -1, -1, -1, - -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, - 31, 32, 33, -1, 35, -1, 37, 38, -1, -1, - -1, -1, -1, 5, 1624, -1, 8, 9, 10, -1, - -1, 1631, -1, 2102, 16, 17, -1, 1637, -1, -1, - 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, - 32, 33, -1, 35, -1, 37, 38, -1, -1, -1, - 1660, -1, -1, 2132, -1, -1, 2135, -1, 2137, -1, - -1, -1, 1672, -1, -1, -1, -1, -1, -1, -1, - 1680, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1690, -1, -1, 1693, -1, -1, -1, -1, 5, -1, - -1, 8, 9, 10, -1, -1, -1, -1, 1708, 16, - 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, - 1720, 28, 29, 30, 31, 32, 33, -1, 35, -1, - 37, 38, -1, -1, 1734, -1, -1, 2206, -1, 5, - 1740, -1, -1, 9, 10, -1, 1746, -1, -1, -1, - 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, - -1, 2230, 28, 29, 30, 31, 32, 33, -1, 35, - 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, - -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, - 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, - 35, -1, 37, 38, -1, -1, 5, -1, 7, -1, - 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, - -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, - 29, 30, 31, 32, 33, -1, 35, 2306, 37, 38, - 5, 2310, 7, -1, 9, 10, -1, -1, -1, -1, + 50, 486, 378, 630, 493, 494, 495, 496, 483, 392, + 1024, 375, 1450, 887, 763, 541, 887, 918, 968, 1488, + 750, 387, 1131, 388, 62, 63, 888, 634, 1330, 401, + 430, 69, 967, 968, 877, 256, 1595, 656, 1301, 411, + 261, 413, 472, 1301, 209, 256, 418, 419, 420, 974, + 261, 1851, 1484, 1853, 426, 2012, 1508, 429, 467, 431, + 98, 258, 76, 1601, 261, 262, 1601, 1147, 118, 433, + 1625, 1972, 122, 7, 63, 1612, 1064, 480, 645, 2080, + 743, 696, 845, 1363, 5, 99, 450, 845, 15, 1520, + 1900, 1520, 468, 2190, 1621, 16, 17, 712, 1520, 1626, + 464, 22, 116, 24, 1520, 469, 1520, 1520, 1667, 473, + 388, 475, 33, 116, 35, 1520, 37, 7, 175, 609, + 71, 0, 1, 8, 488, 8, 7, 1703, 1704, 1705, + 144, 15, 655, 656, 47, 20, 500, 211, 502, 15, + 37, 15, 129, 191, 998, 509, 1020, 878, 15, 1020, + 5, 182, 8, 182, 191, 15, 673, 194, 1172, 5, + 8, 41, 64, 2400, 477, 655, 656, 241, 3, 1043, + 406, 1159, 20, 904, 15, 16, 17, 21, 5, 166, + 7, 15, 116, 15, 407, 8, 224, 8, 315, 116, + 169, 26, 8, 1518, 15, 1520, 8, 1522, 5, 1524, + 513, 1518, 129, 1520, 1518, 1522, 1520, 637, 1522, 574, + 8, 641, 58, 434, 21, 8, 129, 21, 648, 584, + 585, 586, 587, 350, 116, 37, 116, 129, 843, 208, + 8, 116, 129, 800, 282, 116, 15, 8, 159, 854, + 86, 162, 463, 15, 480, 1547, 129, 149, 5, 470, + 64, 472, 2489, 129, 257, 129, 871, 208, 15, 129, + 116, 472, 129, 2360, 177, 149, 323, 633, 116, 129, + 1846, 150, 129, 1849, 129, 1518, 183, 1520, 763, 1522, + 126, 1524, 149, 1184, 191, 129, 315, 318, 129, 318, + 905, 137, 809, 116, 15, 129, 519, 129, 521, 2109, + 116, 208, 129, 282, 919, 528, 529, 530, 149, 674, + 588, 534, 535, 536, 537, 172, 539, 540, 116, 165, + 692, 724, 129, 257, 690, 129, 247, 1436, 129, 209, + 257, 15, 697, 818, 647, 373, 374, 650, 116, 1602, + 1603, 379, 380, 381, 382, 116, 384, 385, 228, 1904, + 388, 751, 390, 391, 392, 393, 8, 129, 396, 1294, + 8, 399, 969, 401, 1644, 8, 1903, 257, 406, 799, + 1295, 409, 257, 411, 1901, 413, 257, 20, 257, 417, + 418, 419, 420, 1852, 305, 306, 307, 1818, 426, 1818, + 428, 429, 1007, 431, 8, 2296, 1818, 1012, 8, 437, + 438, 257, 1818, 1979, 1818, 1818, 444, 445, 811, 257, + 1335, 449, 258, 1818, 1428, 982, 637, 984, 456, 1182, + 641, 459, 1171, 1086, 991, 1183, 637, 648, 417, 794, + 641, 8, 653, 471, 257, 1449, 474, 648, 1053, 489, + 840, 257, 480, 481, 482, 483, 257, 485, 486, 356, + 357, 1078, 15, 15, 492, 493, 494, 495, 496, 257, + 498, 254, 94, 501, 116, 503, 504, 246, 116, 507, + 8, 8, 510, 116, 839, 998, 514, 842, 8, 257, + 1805, 92, 2058, 1408, 1103, 798, 257, 800, 1805, 8, + 20, 1805, 8, 1818, 544, 191, 8, 1485, 548, 1824, + 8, 1818, 116, 1828, 1818, 543, 915, 1824, 998, 8, + 1824, 5, 1592, 1593, 1368, 1369, 1370, 129, 37, 569, + 3, 20, 560, 7, 2525, 2526, 576, 2484, 7, 8, + 568, 15, 15, 571, 572, 573, 574, 149, 149, 116, + 1842, 579, 580, 37, 2013, 583, 584, 585, 586, 587, + 916, 565, 566, 591, 592, 985, 986, 987, 988, 989, + 8, 148, 1805, 577, 2102, 2120, 129, 2102, 2144, 2021, + 2002, 8, 769, 2474, 2111, 1818, 8, 8, 799, 116, + 1103, 1824, 23, 15, 1151, 1828, 116, 8, 799, 812, + 201, 266, 288, 180, 759, 2395, 37, 963, 230, 20, + 116, 147, 148, 299, 116, 257, 1905, 1906, 116, 257, + 8, 128, 287, 1103, 257, 665, 95, 116, 8, 657, + 658, 659, 660, 661, 662, 663, 8, 3, 666, 2530, + 16, 17, 1895, 683, 180, 5, 674, 1895, 7, 9, + 157, 8, 1900, 257, 23, 124, 8, 43, 191, 5, + 26, 8, 284, 9, 692, 876, 877, 695, 37, 697, + 1275, 23, 5, 295, 21, 208, 887, 37, 116, 1035, + 37, 67, 15, 8, 1548, 37, 128, 1548, 1293, 1045, + 257, 37, 720, 1526, 1527, 1528, 82, 1530, 1531, 1308, + 3, 87, 88, 743, 5, 116, 7, 129, 94, 2542, + 217, 1450, 1451, 8, 1434, 157, 92, 745, 21, 747, + 760, 191, 750, 2556, 2269, 1640, 195, 3, 116, 8, + 257, 3, 8, 202, 774, 763, 3, 257, 208, 147, + 148, 781, 63, 8, 116, 773, 18, 68, 15, 282, + 8, 257, 285, 8, 782, 257, 784, 290, 8, 257, + 129, 789, 244, 791, 1679, 298, 794, 8, 257, 90, + 91, 21, 180, 149, 985, 986, 987, 988, 989, 807, + 21, 8, 993, 994, 985, 986, 987, 988, 989, 8, + 818, 231, 232, 2359, 21, 1308, 824, 237, 1355, 1356, + 1357, 1358, 1359, 1647, 1648, 1649, 3, 847, 8, 1020, + 8, 839, 282, 8, 842, 285, 8, 1422, 15, 257, + 848, 21, 2371, 144, 8, 201, 21, 5, 1308, 21, + 1310, 9, 1043, 154, 2123, 2124, 15, 21, 16, 17, + 880, 1054, 228, 89, 2410, 23, 257, 8, 330, 889, + 890, 891, 1065, 8, 894, 1368, 1369, 1370, 8, 37, + 21, 2109, 2321, 345, 346, 347, 21, 895, 896, 257, + 1081, 21, 15, 259, 2580, 2581, 122, 1267, 18, 200, + 5, 8, 8, 911, 9, 257, 26, 2593, 1368, 1369, + 1370, 16, 17, 897, 934, 21, 21, 338, 23, 63, + 341, 342, 343, 8, 68, 933, 314, 315, 912, 155, + 318, 319, 37, 354, 355, 8, 21, 303, 8, 8, + 8, 7, 8, 1848, 5, 8, 90, 91, 9, 3, + 8, 21, 21, 21, 2393, 16, 17, 8, 21, 185, + 21, 15, 23, 1298, 8, 1158, 8, 22, 8, 24, + 1890, 1891, 1892, 1893, 1894, 8, 37, 21, 33, 21, + 35, 21, 3, 8, 2392, 1890, 1891, 1892, 1893, 1894, + 8, 8, 218, 8, 15, 2267, 21, 1017, 1344, 1192, + 144, 1845, 8, 21, 21, 1198, 1342, 1878, 1016, 1202, + 154, 1204, 1348, 1857, 1022, 1208, 1857, 1210, 3, 1429, + 1028, 1431, 8, 1855, 1856, 8, 252, 1727, 8, 1924, + 15, 1863, 1864, 1041, 1753, 21, 5, 8, 21, 7, + 9, 21, 1388, 2482, 8, 1940, 8, 16, 17, 8, + 21, 1946, 21, 1948, 23, 1401, 200, 21, 1066, 21, + 2139, 8, 1639, 1071, 12, 1417, 1086, 1419, 37, 8, + 18, 1656, 2480, 15, 1094, 8, 3, 8, 1414, 1087, + 28, 8, 21, 31, 63, 1427, 34, 231, 21, 68, + 21, 15, 8, 41, 1102, 8, 1940, 45, 15, 1940, + 244, 49, 1946, 158, 159, 21, 161, 162, 21, 15, + 5, 90, 91, 149, 9, 8, 7, 8, 1138, 67, + 41, 16, 17, 71, 72, 15, 1460, 149, 21, 77, + 78, 8, 1851, 1718, 1853, 83, 84, 192, 86, 87, + 88, 89, 37, 91, 21, 124, 15, 8, 15, 8, + 71, 8, 100, 8, 1647, 1648, 1649, 105, 8, 107, + 21, 1181, 21, 111, 21, 144, 21, 115, 8, 117, + 8, 21, 1363, 1507, 7, 154, 124, 8, 8, 234, + 128, 21, 8, 21, 132, 8, 134, 1647, 1648, 1649, + 21, 21, 247, 141, 142, 21, 5, 145, 146, 15, + 9, 15, 8, 151, 1224, 153, 8, 16, 17, 157, + 1546, 8, 8, 8, 135, 21, 1236, 1237, 1238, 21, + 7, 200, 8, 15, 21, 21, 21, 8, 37, 16, + 17, 1424, 15, 8, 8, 21, 184, 8, 186, 8, + 21, 8, 1262, 1643, 8, 193, 21, 21, 169, 84, + 21, 8, 21, 8, 233, 8, 8, 21, 256, 679, + 1268, 1269, 8, 261, 21, 244, 21, 15, 21, 21, + 191, 1767, 15, 1769, 1770, 21, 1467, 15, 8, 8, + 1473, 16, 17, 15, 1292, 1781, 21, 208, 209, 15, + 1298, 21, 21, 8, 1302, 1791, 84, 1793, 1634, 2378, + 221, 8, 223, 224, 8, 226, 21, 15, 229, 858, + 859, 8, 861, 37, 21, 15, 8, 21, 3, 1510, + 1513, 15, 1658, 1516, 21, 1922, 1519, 15, 1521, 21, + 1523, 2315, 1525, 8, 1670, 1526, 1527, 1528, 1674, 1530, + 1531, 8, 15, 1534, 15, 8, 21, 1689, 124, 8, + 2125, 2126, 2127, 22, 21, 24, 191, 1548, 21, 8, + 15, 282, 21, 5, 33, 1373, 35, 9, 10, 2264, + 15, 2215, 21, 208, 16, 17, 1647, 1648, 1649, 15, + 22, 23, 24, 25, 26, 8, 28, 29, 30, 31, + 32, 33, 1929, 35, 2289, 37, 38, 2241, 21, 320, + 2241, 322, 8, 191, 8, 8, 7, 8, 1416, 1417, + 15, 1419, 8, 15, 8, 21, 8, 21, 21, 1427, + 208, 1429, 8, 1431, 8, 21, 1434, 21, 15, 21, + 265, 8, 15, 8, 15, 21, 856, 21, 8, 15, + 860, 251, 8, 15, 21, 865, 21, 282, 868, 869, + 285, 21, 1643, 1644, 289, 21, 404, 8, 1466, 8, + 129, 8, 1643, 1483, 299, 15, 8, 1475, 7, 304, + 21, 15, 21, 1481, 21, 15, 5, 265, 7, 21, + 124, 10, 1502, 1491, 1504, 14, 15, 16, 17, 158, + 159, 15, 161, 162, 282, 8, 246, 285, 27, 239, + 1508, 289, 290, 21, 924, 34, 926, 36, 21, 1529, + 298, 299, 1703, 1704, 1705, 246, 304, 15, 16, 17, + 1540, 5, 26, 192, 351, 352, 10, 316, 317, 27, + 14, 15, 16, 17, 8, 64, 1556, 15, 36, 2523, + 7, 1561, 240, 27, 348, 349, 16, 17, 8, 1569, + 34, 15, 36, 1602, 1603, 993, 994, 1577, 247, 248, + 508, 2576, 2577, 92, 15, 234, 64, 1587, 15, 1589, + 2457, 2458, 866, 867, 1582, 8, 15, 15, 247, 8, + 64, 149, 175, 15, 1777, 8, 8, 15, 8, 1782, + 8, 26, 7, 62, 92, 1941, 15, 8, 2317, 15, + 129, 15, 1795, 8, 1612, 287, 15, 8, 92, 21, + 1944, 314, 8, 8, 213, 5, 2213, 1625, 15, 9, + 149, 8, 8, 64, 1817, 15, 16, 17, 9, 129, + 1823, 129, 21, 9, 1827, 8, 1644, 27, 8, 1647, + 1648, 1649, 452, 8, 15, 129, 36, 15, 15, 1657, + 67, 149, 37, 15, 1845, 1846, 15, 15, 1849, 15, + 2013, 15, 8, 8, 129, 149, 1857, 203, 204, 205, + 206, 207, 201, 2392, 64, 2394, 2395, 487, 5, 26, + 15, 1689, 166, 7, 7, 21, 18, 497, 15, 16, + 17, 44, 21, 21, 37, 26, 7, 15, 7, 15, + 27, 1709, 92, 201, 5, 8, 26, 15, 9, 36, + 8, 8, 5, 15, 21, 16, 17, 201, 8, 1727, + 15, 22, 23, 15, 25, 21, 15, 28, 29, 30, + 31, 32, 15, 15, 87, 2454, 37, 64, 15, 129, + 550, 551, 552, 553, 554, 2190, 21, 21, 15, 1940, + 15, 21, 62, 1761, 1762, 1946, 8, 7, 15, 149, + 2479, 2480, 8, 8, 2100, 92, 119, 8, 8, 255, + 7, 15, 166, 1193, 2110, 8, 166, 15, 1786, 1199, + 239, 16, 21, 1203, 15, 1205, 1206, 1207, 1979, 1209, + 143, 1211, 145, 15, 15, 208, 21, 7, 191, 609, + 610, 611, 129, 613, 15, 330, 315, 15, 331, 15, + 620, 201, 15, 2532, 15, 15, 15, 2010, 15, 15, + 15, 15, 149, 15, 634, 178, 15, 1847, 15, 15, + 183, 2024, 15, 15, 187, 15, 2029, 15, 191, 2032, + 7, 194, 1862, 246, 246, 5, 1866, 2306, 2307, 2042, + 8, 2044, 15, 2046, 246, 2048, 15, 21, 246, 21, + 5, 8, 246, 216, 9, 10, 676, 2058, 7, 14, + 15, 16, 17, 21, 201, 21, 8, 230, 21, 15, + 21, 691, 27, 236, 26, 15, 173, 8, 15, 34, + 15, 36, 255, 8, 7, 1903, 1904, 1905, 1906, 21, + 71, 15, 208, 5, 15, 8, 18, 9, 1916, 719, + 15, 15, 21, 15, 16, 17, 726, 15, 15, 64, + 15, 21, 732, 733, 15, 27, 15, 21, 21, 21, + 149, 21, 5, 15, 36, 1943, 9, 2392, 2393, 1959, + 2286, 15, 21, 16, 17, 21, 8, 92, 15, 5, + 23, 15, 25, 2144, 7, 28, 29, 30, 31, 32, + 9, 1981, 64, 20, 37, 913, 5, 26, 778, 21, + 21, 21, 15, 21, 21, 21, 15, 16, 17, 15, + 8, 26, 1402, 21, 129, 26, 26, 21, 27, 1997, + 92, 21, 8, 2001, 7, 2003, 21, 36, 15, 26, + 8, 254, 21, 15, 149, 2013, 21, 2027, 15, 5, + 8, 21, 2020, 2021, 10, 132, 2036, 7, 14, 15, + 16, 17, 7, 37, 2215, 64, 21, 129, 21, 15, + 7, 27, 15, 7, 2054, 255, 353, 21, 34, 21, + 36, 851, 852, 15, 16, 17, 15, 149, 15, 15, + 2241, 15, 15, 92, 15, 27, 201, 1477, 15, 15, + 15, 15, 7, 21, 36, 1013, 8, 8, 64, 5, + 8, 7, 7, 21, 10, 8, 7, 21, 14, 15, + 16, 17, 8, 15, 7, 7, 15, 59, 352, 78, + 129, 27, 64, 21, 8, 329, 92, 351, 34, 201, + 36, 7, 7, 2111, 21, 15, 15, 15, 15, 21, + 149, 8, 2120, 17, 2122, 2123, 2124, 2125, 2126, 2127, + 92, 17, 15, 7, 7, 15, 7, 128, 64, 1269, + 896, 1999, 2152, 129, 944, 945, 946, 947, 948, 949, + 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 149, 222, 1875, 92, 1587, 1185, 969, + 1090, 582, 201, 1591, 974, 2264, 1876, 2358, 2359, 5, + 166, 981, 710, 983, 10, 1300, 1621, 149, 14, 15, + 16, 17, 2190, 2191, 590, 593, 933, 2269, 998, 2122, + 1903, 27, 933, 129, 1895, 2102, 1491, 1154, 34, 1728, + 36, 2172, 1997, 1475, 40, 201, 2191, 1026, 1411, 1046, + 1088, 1390, 2232, 149, 1024, 1700, 75, 1924, 1702, 2410, + 1030, 2582, 1946, 711, 246, 246, 1397, 463, 64, 201, + 1434, 2251, 792, 1643, 1035, 246, 1046, 5, 998, 1071, + 246, 1640, 10, 838, 1102, 1174, 14, 15, 16, 17, + 657, 661, 2316, 1413, 1415, 659, 92, 2151, 2530, 27, + 660, 2269, 2001, 662, 2378, 201, 34, 1016, 36, 1014, + 807, 2502, 1087, 5, 2465, 1943, 1041, 1028, 10, 2437, + 1983, 442, 14, 15, 16, 17, 788, 2391, 2532, 2558, + 2578, 2580, 2324, 129, 1753, 27, 64, 1489, 2306, 2307, + 2004, 1451, 34, 761, 36, 666, 504, 382, 2316, 1948, + 2008, 1540, 1805, 149, 415, 2296, 1828, 1780, 1824, 45, + 46, 1131, 48, 49, 92, 1785, 1818, 53, 1276, 2034, + 2347, 2033, 64, 878, 2364, 61, 1224, 2054, 1556, 1149, + 66, 2215, 1561, 69, 1569, 1577, 2251, -1, -1, -1, + -1, 77, -1, 79, -1, 81, -1, -1, -1, -1, + 92, 129, 1172, 1173, 1174, 201, -1, -1, -1, -1, + -1, -1, -1, -1, 2382, -1, -1, -1, 104, -1, + 434, 149, -1, -1, 2392, 2393, 2406, -1, -1, 115, + -1, -1, -1, -1, -1, 2415, -1, 129, -1, -1, + -1, 2421, -1, 2423, -1, -1, -1, -1, -1, 463, + -1, 45, 46, 139, 48, 49, 470, 149, 2426, 53, + -1, -1, -1, -1, 478, -1, 152, 61, -1, 1239, + -1, -1, 66, 201, -1, 69, -1, 2457, 2458, -1, + -1, -1, -1, 77, 170, 79, 7, 81, -1, 10, + 176, -1, -1, 14, 15, 16, 17, -1, 184, -1, + 186, -1, 188, -1, 190, -1, 27, -1, -1, 201, + 104, 197, -1, 34, -1, 36, -1, -1, -1, -1, + -1, 115, -1, -1, -1, 1295, -1, -1, 214, 215, + 5, -1, -1, -1, 2502, 10, 2504, 1307, -1, 14, + 15, 16, 17, 64, -1, 139, 232, -1, -1, -1, + -1, -1, 27, 239, -1, -1, -1, -1, 152, 34, + -1, 36, -1, -1, -1, 1335, -1, 253, -1, -1, + 256, 92, -1, -1, -1, 589, 170, 1347, -1, -1, + 2560, -1, 176, -1, -1, 2565, -1, -1, -1, 64, + 184, -1, 186, -1, 188, -1, 190, -1, 2578, -1, + 2580, 2581, -1, 197, -1, -1, -1, -1, 129, -1, + -1, -1, -1, 2593, -1, -1, -1, 92, -1, -1, + 214, 215, -1, -1, 5, -1, 1396, 1397, 149, 10, + -1, -1, -1, 14, 15, 16, 17, -1, 232, 653, + -1, 1411, -1, -1, -1, 166, 27, -1, 1418, -1, + -1, -1, -1, 34, 129, 36, -1, -1, 1428, 253, + -1, -1, 256, -1, 1434, -1, 1436, -1, -1, -1, + -1, -1, -1, -1, 149, -1, -1, -1, -1, 1449, + 201, 7, -1, 64, 10, -1, -1, -1, 14, 15, + 16, 17, -1, 1463, -1, -1, -1, -1, -1, -1, + -1, 27, -1, -1, 1474, -1, -1, -1, 34, 5, + 36, 92, -1, 9, -1, -1, -1, 1487, -1, -1, + 16, 17, 1492, -1, 1494, -1, 201, 23, -1, 25, + -1, 745, 28, 29, 30, 31, 32, -1, 64, -1, + -1, 37, -1, -1, -1, -1, -1, -1, 129, 763, + -1, -1, 78, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 777, -1, -1, 92, -1, 149, -1, + -1, 785, 786, -1, -1, -1, 790, -1, -1, 7, + -1, -1, 10, -1, -1, -1, 14, 15, 16, 17, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, + -1, -1, -1, 129, 818, -1, 34, -1, 36, -1, + -1, -1, 826, -1, -1, -1, -1, -1, -1, -1, + 201, -1, -1, 149, -1, -1, -1, 1597, -1, -1, + 7, -1, -1, 10, -1, -1, 64, 14, 15, 16, + 17, 855, -1, 857, -1, -1, -1, -1, -1, -1, + 27, -1, -1, -1, -1, -1, -1, 34, -1, 36, + -1, -1, 876, 877, 92, -1, -1, -1, 1638, 1639, + 1640, -1, -1, 887, 888, 201, 7, -1, -1, 10, + -1, -1, -1, 14, 15, 16, 17, 64, -1, -1, + -1, -1, -1, -1, -1, -1, 27, -1, -1, 1669, + -1, 129, 1672, 34, -1, 36, -1, -1, -1, 7, + 1680, -1, 10, -1, -1, 92, 14, 15, 16, 17, + -1, 149, -1, -1, -1, -1, -1, -1, -1, 27, + -1, -1, -1, 64, -1, -1, 34, -1, 36, -1, + 7, -1, 1712, 10, 1714, -1, -1, 14, 15, 16, + 17, -1, 129, 967, 968, 7, -1, -1, 10, 44, + 27, 92, 14, 15, 16, 17, 64, 34, -1, 36, + -1, -1, 149, 201, -1, 27, -1, -1, -1, 993, + 994, -1, 34, -1, 36, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 92, -1, -1, 64, 129, -1, + -1, -1, 87, -1, -1, -1, 1020, -1, 93, -1, + -1, -1, 64, -1, -1, -1, -1, -1, 149, -1, + -1, -1, -1, -1, 201, 92, -1, -1, -1, 1043, + -1, 129, -1, -1, 119, -1, -1, 10, -1, -1, + 92, 14, 15, 16, 17, -1, -1, -1, -1, -1, + -1, 149, -1, -1, 27, -1, -1, -1, 143, -1, + 145, 34, 129, 36, -1, -1, -1, 1081, 10, -1, + 201, -1, 14, 15, 16, 17, -1, 129, -1, -1, + -1, -1, 149, -1, -1, 27, -1, -1, 1858, -1, + -1, 64, 34, 178, 36, 1865, -1, 149, 183, 1869, + 1870, -1, 187, 201, -1, -1, 191, 1877, -1, 194, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, + -1, -1, 64, -1, -1, -1, -1, -1, -1, -1, + -1, 216, -1, -1, 201, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 230, -1, -1, 1918, 201, + 92, 236, -1, -1, 1924, -1, 129, 1171, -1, -1, + -1, -1, -1, -1, -1, -1, 5, -1, 7, -1, + 9, 10, -1, -1, -1, -1, 149, 16, 17, 1949, + -1, -1, 21, 22, 23, 24, 25, 129, 1958, 28, + 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, + -1, 9, 10, -1, -1, 1975, 1976, 149, 16, 17, + -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, + 28, 29, 30, 31, 32, 33, 34, 35, 201, 37, + 38, -1, -1, -1, 2004, -1, -1, -1, -1, -1, + -1, -1, 2012, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2022, -1, -1, -1, -1, -1, -1, 201, + -1, -1, -1, -1, -1, -1, -1, -1, 2038, 5, + 2040, 7, -1, 9, 10, -1, -1, -1, -1, -1, + 16, 17, -1, -1, -1, 1299, 22, 23, 24, 25, + -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, + 5, 37, 38, 8, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, - 35, 5, 37, 38, 1874, 9, 10, -1, 2347, 2348, - -1, -1, 16, 17, -1, -1, -1, 21, 22, 23, + 35, 621, 37, 38, -1, 5, -1, -1, 8, 9, + 10, -1, -1, -1, -1, -1, 16, 17, -1, 1363, + -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, + 30, 31, 32, 33, 2134, 35, -1, 37, 38, 2139, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, + 2150, 2151, 8, 9, 10, 2155, -1, -1, -1, -1, + 16, 17, -1, -1, -1, 2165, 22, 23, 24, 25, + -1, 2171, 28, 29, 30, 31, 32, 33, -1, 35, + -1, 37, 38, -1, -1, 1429, -1, 1431, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1450, 1451, -1, 5, + -1, -1, -1, 9, 2214, -1, -1, 1461, -1, -1, + 16, 17, -1, 1467, -1, 1469, 22, 23, 1472, 25, + -1, -1, 28, 29, 30, 31, 32, -1, -1, 35, + 1484, 37, 38, 2243, 1488, 1489, -1, -1, -1, -1, + -1, 771, -1, -1, -1, 775, -1, -1, 2258, -1, + -1, -1, -1, -1, 2264, -1, 1510, -1, -1, -1, + -1, -1, -1, 1517, -1, -1, -1, -1, -1, -1, + -1, -1, 1526, 1527, 1528, -1, 1530, 1531, -1, -1, + 1534, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2300, 5, 822, -1, 1548, 9, 10, -1, -1, -1, + -1, -1, 16, 17, 834, 2315, -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, -1, -1, -1, -1, -1, - -1, -1, 2381, 2382, 2383, 2384, -1, -1, 1918, -1, - 2389, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2399, 5, -1, 913, -1, 9, 10, -1, 1938, -1, - 1940, -1, 16, 17, 1944, -1, -1, 21, 22, 23, - 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, - -1, 35, -1, 37, 38, -1, -1, 1967, -1, -1, - 1970, -1, -1, -1, 2443, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1992, -1, -1, -1, -1, -1, -1, 2468, - 2469, -1, 2471, -1, -1, -1, -1, -1, -1, 2478, - -1, 5, -1, -1, -1, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 881, 882, 883, 884, -1, 886, -1, 1612, -1, + -1, -1, -1, -1, -1, -1, -1, 2377, 2378, -1, + -1, 2381, -1, 2383, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2398, 2399, + 1644, 2401, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2411, -1, -1, -1, -1, -1, -1, 938, 2419, + 940, 941, 942, 943, 5, -1, -1, -1, 9, 10, + -1, -1, -1, -1, -1, 16, 17, 2437, -1, -1, + 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, + 31, 32, 33, -1, 35, -1, 37, 38, -1, 1703, + 1704, 1705, -1, -1, -1, 2465, -1, -1, -1, -1, + -1, -1, -1, 2473, 2474, -1, -1, -1, -1, 999, + -1, -1, -1, -1, 2484, -1, -1, 2487, -1, -1, + -1, 2491, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1021, -1, -1, -1, -1, -1, -1, -1, 1753, + -1, 1031, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2523, -1, -1, -1, -1, -1, -1, + 2530, -1, 1052, -1, 2534, -1, -1, -1, 2538, -1, + -1, -1, 2542, -1, -1, -1, -1, -1, 1068, -1, + -1, -1, 1072, 1073, -1, -1, 2556, 2557, 2558, 5, + -1, 7, -1, 9, 10, -1, -1, -1, -1, -1, + 16, 17, -1, -1, -1, -1, 22, 23, 24, 25, + -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, + -1, 37, 38, -1, -1, -1, -1, -1, -1, -1, + -1, 1845, 1846, -1, -1, 1849, -1, 1851, 1852, 1853, + 1130, 1855, 1856, 1857, -1, -1, -1, -1, -1, 1863, + 1864, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1890, 1891, 1892, 1893, + 1894, -1, -1, 5, -1, 7, -1, 9, 10, -1, + -1, -1, -1, -1, 16, 17, -1, -1, 1188, 1189, + 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, + 32, 33, -1, 35, -1, 37, 38, 5, -1, -1, + -1, 9, 10, -1, -1, -1, 1940, -1, 16, 17, + -1, -1, 1946, 21, 22, 23, 24, 25, -1, -1, + 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, + 38, 5, -1, -1, -1, 9, 10, -1, -1, -1, + -1, -1, 16, 17, -1, 1979, 1980, 21, 22, 23, + 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, + -1, 35, -1, 37, 38, 5, -1, -1, 2002, 9, + 10, -1, -1, -1, -1, -1, 16, 17, -1, 2013, + -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, + 30, 31, 32, 33, -1, 35, -1, 37, 38, -1, + 2034, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, + 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, + -1, -1, -1, -1, 2058, 2059, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1345, -1, -1, -1, -1, + -1, 5, 1352, -1, 1354, 9, 10, -1, -1, -1, + -1, -1, 16, 17, 1364, -1, -1, 21, 22, 23, + 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, + -1, 35, -1, 37, 38, -1, 5, 2111, -1, -1, + 9, 10, -1, -1, -1, 1395, -1, 16, 17, -1, + -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, + 29, 30, 31, 32, 33, -1, 35, 2141, 37, 38, + 2144, 5, 2146, -1, -1, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, 22, 23, - 24, 25, -1, 1013, 28, 29, 30, 31, 32, 33, + 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, -1, 5, -1, -1, -1, - 9, 10, 2521, -1, -1, -1, -1, 16, 17, -1, - -1, -1, 21, 22, 23, 24, 25, -1, 2068, 28, - 29, 30, 31, 32, 33, -1, 35, 2077, 37, 38, - 5, 2081, 2082, -1, 9, 10, -1, -1, -1, 2089, - -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, + 9, 10, -1, -1, 1464, -1, -1, 16, 17, -1, + -1, -1, 21, 22, 23, 24, 25, -1, 1478, 28, + 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, + -1, 2215, -1, -1, -1, -1, 5, -1, -1, 1499, + 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, + -1, -1, 21, 22, 23, 24, 25, 2241, -1, 28, + 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, + 5, -1, 7, -1, 9, 10, -1, -1, -1, -1, + -1, 16, 17, -1, -1, 1545, -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, -1, -1, -1, -1, -1, -1, - 2120, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 2139, - -1, 5, -1, -1, 2144, 9, 10, -1, -1, -1, - -1, -1, 16, 17, 2154, 2155, -1, 21, 22, 23, - 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, - -1, 35, -1, 37, 38, -1, -1, -1, -1, -1, - -1, -1, 5, -1, -1, 2185, 9, 10, -1, -1, - -1, -1, -1, 16, 17, 2195, 2196, -1, 21, 22, - 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, - 33, -1, 35, 5, 37, 38, -1, 9, 10, -1, - -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5, -1, -1, -1, 9, 10, -1, + -1, -1, -1, 2317, 16, 17, 1596, 2321, -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, -1, -1, -1, + 5, -1, 7, -1, 9, 10, -1, -1, -1, 1629, + -1, 16, 17, -1, 2358, 2359, 1636, 22, 23, 24, + 25, -1, 1642, 28, 29, 30, 31, 32, 33, -1, + 35, -1, 37, 38, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1665, -1, -1, 2392, 2393, + 2394, 2395, -1, -1, -1, -1, 2400, 1677, -1, -1, + -1, -1, -1, -1, -1, 1685, 2410, -1, -1, -1, + -1, -1, -1, -1, -1, 1695, -1, -1, 1698, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 2268, -1, - 2270, -1, -1, -1, -1, -1, -1, -1, 5, 2279, - 7, -1, 9, 10, 2284, -1, -1, 2287, -1, 16, - 17, -1, -1, -1, 1274, 22, 23, 24, 25, -1, - 2300, 28, 29, 30, 31, 32, 33, -1, 35, 5, - 37, 38, -1, 9, 10, -1, -1, -1, -1, -1, - 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, - -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, - -1, 37, 38, -1, -1, 2345, -1, -1, -1, -1, - -1, 2351, -1, -1, 5, -1, 7, 2357, 9, 10, - -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, - -1, 22, 23, 24, 25, -1, 2376, 28, 29, 30, - 31, 32, 33, -1, 35, 5, 37, 38, -1, 9, - 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, - -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, - 30, 31, 32, 33, -1, 35, -1, 37, 38, 2419, - -1, 2421, -1, -1, -1, 2425, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2436, 2437, -1, -1, - -1, 2441, 5, -1, 7, -1, 9, 10, -1, -1, - -1, 2451, -1, 16, 17, 2455, -1, -1, -1, 22, - 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, - 33, -1, 35, -1, 37, 38, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2487, -1, -1, - -1, -1, 2492, -1, 2494, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2506, -1, 2508, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, - 15, 16, 17, -1, 19, -1, 21, -1, 23, 24, - -1, 26, -1, -1, -1, 30, 2536, 32, 33, -1, - 2540, 36, 37, 38, -1, 40, -1, 42, 43, -1, - -1, 46, 2552, -1, -1, -1, 51, 52, 53, 54, - 55, 56, 57, 58, -1, 60, 61, -1, -1, 64, - 65, 66, -1, 68, -1, 70, -1, -1, 73, 74, - -1, -1, -1, -1, -1, -1, 81, 82, -1, -1, - 85, -1, -1, -1, -1, -1, -1, 92, -1, 94, - -1, 96, 97, -1, -1, -1, 101, 102, 103, -1, - -1, 106, -1, -1, 109, 110, -1, 112, 113, 114, - -1, -1, -1, -1, 119, 120, -1, -1, 123, -1, - 125, 126, 127, -1, 129, 130, -1, -1, 133, -1, - 135, 136, 137, 138, 139, 140, -1, -1, -1, -1, - -1, -1, 147, 148, 149, -1, -1, -1, -1, 154, - 155, 156, -1, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, -1, - 185, -1, 187, -1, 189, -1, 191, 192, -1, 194, - 195, 196, 197, 198, 199, 200, 201, 5, -1, 7, - 6, 9, 10, -1, -1, -1, -1, 13, 16, 17, - -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, + -1, -1, -1, 1713, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1725, -1, -1, -1, -1, + 2454, -1, -1, -1, -1, -1, -1, -1, -1, 1739, + -1, -1, -1, -1, -1, 1745, -1, -1, -1, -1, + -1, 1751, -1, -1, -1, 2479, 2480, 5, 2482, -1, + -1, 9, 10, -1, -1, 2489, -1, -1, 16, 17, + -1, -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, - 38, -1, -1, -1, -1, -1, -1, 43, 44, 45, - 46, -1, 48, 49, 50, 51, 52, 53, -1, 254, - 56, 57, 257, -1, 259, 61, 62, 63, -1, 65, - 66, 67, 68, 69, 70, -1, 72, 73, 74, 75, - 76, 77, -1, 79, 80, 81, 82, 83, 84, -1, - -1, 87, 88, 89, 90, 91, -1, -1, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - -1, 117, -1, 119, 120, -1, 122, 123, 124, -1, - -1, 127, -1, -1, 130, 131, -1, 133, 134, 135, - 136, -1, 138, 139, 140, 141, 142, 143, 144, 145, - 146, -1, -1, -1, -1, -1, 152, 153, 154, 155, - -1, -1, -1, -1, 160, -1, -1, 163, 164, -1, - -1, 167, 168, -1, 170, -1, -1, -1, 174, -1, - 176, -1, 178, -1, -1, -1, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, -1, 193, 194, 195, - -1, 197, -1, 199, 200, -1, 202, -1, 204, 205, - 206, 207, -1, -1, 210, 211, 212, -1, 214, 215, - 216, -1, 218, 219, 220, -1, 222, -1, 224, 225, - 226, 227, 228, -1, 230, -1, 232, 233, -1, -1, - 236, 237, 238, -1, -1, 241, 242, -1, 244, 245, - -1, 247, 248, -1, -1, -1, 252, 253, -1, -1, - 256, -1, -1, 259, -1, -1, -1, 263, 264, -1, - -1, 267, 268, 269, -1, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, -1, 283, -1, -1, - 286, -1, -1, -1, 290, 291, 292, 293, 294, -1, - 296, 297, -1, -1, 300, 301, 302, 303, -1, -1, - -1, -1, 308, 309, 310, 311, 312, 313, -1, -1, - -1, -1, -1, -1, -1, 321, -1, -1, 324, 325, - 326, 327, 328, -1, -1, -1, 332, 333, 334, 335, - 336, 337, 5, 339, 340, 8, 9, 10, 344, -1, + 38, -1, 5, -1, 7, -1, 9, 10, -1, -1, + -1, -1, -1, 16, 17, -1, -1, -1, 2532, 22, + 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, + 33, -1, 35, -1, 37, 38, 5, -1, 7, -1, + 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, + -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, + 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 14, 15, 16, 17, -1, 19, -1, 21, -1, 23, + 24, 1881, 26, -1, -1, -1, 30, -1, 32, 33, + -1, -1, 36, 37, 38, -1, 40, -1, 42, 43, + -1, -1, 46, -1, -1, -1, -1, 51, 52, 53, + 54, 55, 56, 57, 58, -1, 60, 61, -1, -1, + 64, 65, 66, -1, 68, 1925, 70, -1, -1, 73, + 74, -1, -1, -1, -1, -1, -1, 81, 82, -1, + -1, 85, -1, -1, -1, 1945, -1, 1947, 92, -1, + 94, 1951, 96, 97, -1, -1, -1, 101, 102, 103, + -1, -1, 106, -1, -1, 109, 110, -1, 112, 113, + 114, -1, -1, -1, 1974, 119, 120, 1977, -1, 123, + -1, 125, 126, 127, -1, 129, 130, -1, -1, 133, + -1, 135, 136, 137, 138, 139, 140, -1, -1, 1999, + -1, -1, -1, 147, 148, 149, -1, -1, -1, -1, + 154, 155, 156, -1, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + -1, 185, -1, 187, -1, 189, -1, 191, 192, -1, + 194, 195, 196, 197, 198, 199, 200, 201, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5, 2077, -1, 8, + 9, 10, -1, -1, -1, -1, 2086, 16, 17, -1, + 2090, 2091, -1, 22, 23, 24, 25, -1, 2098, 28, + 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, + 254, 9, 10, 257, -1, 259, -1, -1, 16, 17, + -1, -1, -1, 21, 22, 23, 24, 25, -1, 2129, + 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, + 38, -1, -1, -1, -1, -1, -1, -1, 2148, -1, + 5, -1, -1, 2153, 9, 10, -1, -1, -1, -1, + -1, 16, 17, 2163, 2164, -1, 21, 22, 23, 24, + 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, + 35, -1, 37, 38, -1, -1, -1, -1, -1, -1, + -1, 5, -1, -1, 2194, 9, 10, -1, -1, -1, + -1, -1, 16, 17, 2204, 2205, -1, 21, 22, 23, + 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, + -1, 35, 5, 37, 38, 8, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, -1, -1, -1, -1, - -1, -1, 5, -1, -1, -1, 9, 10, -1, -1, - -1, -1, -1, 16, 17, -1, -1, -1, 21, 22, - 23, 24, 25, 598, 599, 28, 29, 30, 31, 32, - 33, -1, 35, 5, 37, 38, -1, 9, 10, -1, - -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, - 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, - 32, 33, -1, 35, 5, 37, 38, -1, 9, 10, - -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, - 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, - 31, 32, 33, -1, 35, 5, 37, 38, 8, 9, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2279, + -1, 2281, -1, -1, -1, -1, -1, -1, -1, 5, + 2290, -1, -1, 9, 10, 2295, -1, -1, 2298, -1, + 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, + -1, 2311, 28, 29, 30, 31, 32, 33, -1, 35, + 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, + -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, + 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, + 35, -1, 37, 38, -1, -1, 2356, -1, -1, -1, + -1, -1, 2362, -1, -1, 5, -1, -1, 2368, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, - -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, - 30, 31, 32, 33, -1, 35, 5, 37, 38, -1, + -1, 21, 22, 23, 24, 25, -1, 2387, 28, 29, + 30, 31, 32, 33, -1, 35, 5, 37, 38, 8, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, - -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, - 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, - -1, 9, 10, -1, -1, -1, -1, -1, 16, 17, - -1, -1, -1, 21, 22, 23, 24, 25, -1, -1, + -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, + 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, + 2430, -1, 2432, -1, -1, -1, 2436, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2447, 2448, -1, + -1, -1, 2452, 5, 598, 599, -1, 9, 10, -1, + -1, -1, 2462, -1, 16, 17, 2466, -1, -1, 21, + 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, + 32, 33, -1, 35, -1, 37, 38, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2498, -1, + -1, -1, -1, 2503, -1, 2505, -1, -1, -1, 5, + -1, -1, 8, 9, 10, 6, -1, 2517, -1, 2519, + 16, 17, 13, -1, -1, -1, 22, 23, 24, 25, + -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, + -1, 37, 38, -1, -1, -1, -1, 2547, -1, -1, + -1, 2551, 43, 44, 45, 46, -1, 48, 49, 50, + 51, 52, 53, 2563, -1, 56, 57, -1, -1, -1, + 61, 62, 63, -1, 65, 66, 67, 68, 69, 70, + -1, 72, 73, 74, 75, 76, 77, -1, 79, 80, + 81, 82, 83, 84, -1, -1, 87, 88, 89, 90, + 91, -1, -1, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, -1, 117, -1, 119, 120, + -1, 122, 123, 124, -1, -1, 127, -1, -1, 130, + 131, -1, 133, 134, 135, 136, -1, 138, 139, 140, + 141, 142, 143, 144, 145, 146, -1, -1, -1, -1, + -1, 152, 153, 154, 155, -1, -1, -1, -1, 160, + -1, -1, 163, 164, -1, -1, 167, 168, -1, 170, + -1, -1, -1, 174, -1, 176, -1, 178, -1, -1, + -1, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, -1, 193, 194, 195, -1, 197, -1, 199, 200, + -1, 202, -1, 204, 205, 206, 207, -1, -1, 210, + 211, 212, -1, 214, 215, 216, -1, 218, 219, 220, + -1, 222, -1, 224, 225, 226, 227, 228, -1, 230, + -1, 232, 233, -1, -1, 236, 237, 238, -1, -1, + 241, 242, -1, 244, 245, -1, 247, 248, -1, -1, + -1, 252, 253, -1, -1, 256, -1, -1, 259, -1, + -1, -1, 263, 264, -1, -1, 267, 268, 269, -1, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, -1, 283, -1, -1, 286, -1, -1, -1, 290, + 291, 292, 293, 294, -1, 296, 297, -1, -1, 300, + 301, 302, 303, -1, -1, -1, -1, 308, 309, 310, + 311, 312, 313, -1, -1, -1, -1, -1, -1, -1, + 321, -1, -1, 324, 325, 326, 327, 328, -1, -1, + -1, 332, 333, 334, 335, 336, 337, 5, 339, 340, + 8, 9, 10, 344, -1, -1, -1, -1, 16, 17, + -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, -1, @@ -4358,54 +4408,42 @@ static const yytype_int16 yycheck[] = 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, - 35, 5, 37, 38, 8, 9, 10, -1, -1, -1, - -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, + 35, 5, 37, 38, -1, 9, 10, -1, -1, -1, + -1, -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, 8, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, - 33, -1, 35, 5, 37, 38, -1, 9, 10, -1, - -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, + 33, -1, 35, 5, 37, 38, 8, 9, 10, -1, + -1, -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, - 32, 33, -1, 35, 5, 37, 38, 8, 9, 10, + 32, 33, -1, 35, 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, - -1, 22, 23, 24, 25, -1, -1, 28, 29, 30, + 21, 22, 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, 29, - 30, 31, 32, 33, -1, 35, 5, 37, 38, -1, - 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, - -1, -1, 21, 22, 23, 24, 25, -1, -1, 28, - 29, 30, 31, 32, 33, -1, 35, 5, 37, 38, - 8, 9, 10, -1, -1, -1, -1, -1, 16, 17, - -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, - 28, 29, 30, 31, 32, 33, -1, 35, 5, 37, - 38, 8, 9, 10, -1, -1, -1, -1, -1, 16, - 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, - -1, 28, 29, 30, 31, 32, 33, -1, 35, 5, - 37, 38, -1, 9, 10, -1, -1, -1, -1, -1, - 16, 17, -1, -1, -1, 21, 22, 23, 24, 25, - -1, -1, 28, 29, 30, 31, 32, 33, -1, 35, - 5, 37, 38, -1, 9, 10, -1, -1, -1, -1, - -1, 16, 17, -1, -1, -1, 21, 22, 23, 24, - 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, - 35, 5, 37, 38, 8, 9, 10, -1, -1, -1, - -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, - 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, - -1, 35, -1, 37, 38, 5, -1, 7, -1, 9, - 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, - -1, -1, 22, 23, 24, 25, -1, -1, 28, 29, - 30, 31, 32, 33, -1, 35, 5, 37, 38, -1, + 30, 31, 32, 33, -1, 35, 5, 37, 38, 8, 9, 10, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, 24, 25, -1, -1, 28, - 29, 30, 31, 32, 33, -1, 35, -1, 37, 38 + 29, 30, 31, 32, 33, -1, 35, -1, 37, 38, + 5, -1, 7, -1, 9, 10, -1, -1, -1, -1, + -1, 16, 17, -1, -1, -1, -1, 22, 23, 24, + 25, -1, -1, 28, 29, 30, 31, 32, 33, -1, + 35, 5, 37, 38, -1, 9, 10, -1, -1, -1, + -1, -1, 16, 17, -1, -1, -1, -1, 22, 23, + 24, 25, -1, -1, 28, 29, 30, 31, 32, 33, + -1, 35, 5, 37, 38, -1, 9, -1, -1, -1, + -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, + 23, 24, 25, -1, -1, 28, 29, 30, 31, 32, + 33, -1, 35, -1, 37, 38 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 358, 0, 1, 150, 257, 359, 360, 116, 6, + 0, 361, 0, 1, 150, 257, 362, 363, 116, 6, 13, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 56, 57, 61, 62, 63, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 76, 77, 79, 80, @@ -4425,245 +4463,246 @@ static const yytype_uint16 yystos[] = 278, 279, 280, 281, 283, 286, 290, 291, 292, 293, 294, 296, 297, 300, 301, 302, 303, 308, 309, 310, 311, 312, 313, 321, 324, 325, 326, 327, 328, 332, - 333, 334, 335, 336, 337, 339, 340, 344, 361, 363, - 366, 378, 379, 383, 384, 385, 391, 392, 393, 394, - 396, 397, 399, 401, 402, 403, 404, 411, 412, 413, - 414, 415, 416, 420, 421, 422, 426, 427, 465, 467, - 480, 523, 524, 526, 527, 533, 534, 535, 536, 543, - 544, 545, 546, 548, 551, 555, 556, 557, 558, 559, - 560, 566, 567, 568, 579, 580, 581, 583, 586, 589, - 594, 595, 597, 599, 601, 604, 605, 629, 630, 641, - 642, 643, 644, 649, 652, 655, 658, 659, 709, 710, - 711, 712, 713, 714, 715, 716, 722, 724, 726, 728, - 730, 731, 732, 733, 734, 737, 739, 740, 741, 744, - 745, 749, 750, 752, 753, 754, 755, 756, 757, 758, - 761, 766, 771, 773, 774, 775, 776, 778, 779, 780, - 781, 782, 783, 800, 803, 804, 805, 806, 812, 815, - 820, 821, 822, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 844, 845, - 846, 847, 848, 858, 859, 860, 862, 863, 864, 865, - 866, 871, 889, 15, 490, 490, 552, 552, 552, 552, - 552, 490, 552, 552, 362, 552, 552, 552, 490, 552, - 490, 552, 552, 490, 552, 552, 552, 489, 552, 490, - 552, 552, 7, 15, 491, 15, 490, 612, 552, 490, - 375, 552, 552, 552, 552, 552, 552, 552, 552, 552, - 552, 129, 368, 532, 532, 552, 552, 552, 490, 552, - 368, 552, 490, 490, 552, 552, 489, 362, 490, 490, - 64, 374, 552, 552, 490, 490, 552, 490, 490, 490, - 490, 490, 552, 429, 552, 552, 552, 368, 466, 362, - 490, 552, 552, 552, 490, 552, 490, 552, 552, 490, - 552, 552, 552, 490, 362, 490, 375, 552, 552, 375, - 552, 490, 552, 552, 552, 490, 552, 552, 490, 552, - 490, 552, 552, 552, 552, 552, 552, 15, 490, 590, - 490, 362, 490, 490, 552, 552, 552, 15, 8, 490, - 490, 552, 552, 552, 490, 552, 552, 552, 552, 552, - 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, - 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, - 552, 490, 552, 490, 552, 552, 552, 552, 490, 552, - 552, 552, 552, 552, 552, 552, 552, 895, 895, 895, - 895, 895, 895, 257, 578, 124, 233, 399, 15, 371, - 578, 8, 8, 8, 8, 7, 8, 124, 363, 386, - 8, 368, 400, 8, 8, 8, 8, 8, 547, 8, - 547, 8, 8, 8, 8, 547, 578, 7, 218, 252, - 524, 526, 535, 536, 239, 544, 544, 10, 14, 15, - 16, 17, 27, 34, 36, 64, 92, 149, 201, 368, - 380, 496, 497, 499, 500, 501, 502, 508, 509, 510, - 511, 512, 515, 15, 552, 5, 9, 15, 16, 17, - 129, 498, 500, 508, 562, 576, 577, 552, 15, 562, - 552, 5, 561, 562, 577, 562, 8, 8, 8, 8, - 8, 8, 8, 8, 7, 8, 8, 5, 7, 368, - 639, 640, 368, 632, 491, 15, 15, 149, 479, 368, - 368, 742, 743, 8, 368, 656, 657, 743, 368, 370, - 368, 15, 528, 574, 23, 37, 368, 418, 419, 15, - 368, 602, 368, 670, 670, 368, 653, 654, 368, 531, - 428, 15, 368, 582, 149, 748, 531, 7, 474, 475, - 490, 613, 614, 368, 608, 614, 15, 553, 368, 584, - 585, 531, 15, 15, 531, 748, 532, 531, 531, 531, - 531, 368, 531, 371, 531, 15, 423, 491, 499, 500, - 15, 365, 368, 368, 650, 651, 481, 482, 483, 484, - 8, 671, 738, 15, 368, 596, 368, 587, 588, 575, - 15, 15, 368, 491, 15, 496, 751, 15, 15, 368, - 725, 727, 8, 368, 37, 417, 15, 500, 501, 491, - 15, 15, 553, 479, 491, 500, 368, 717, 5, 15, - 576, 577, 491, 368, 369, 491, 575, 15, 499, 633, - 634, 608, 612, 368, 600, 368, 697, 697, 15, 368, - 598, 717, 496, 507, 491, 375, 15, 368, 703, 703, - 703, 703, 703, 7, 496, 591, 592, 368, 593, 491, - 364, 368, 491, 368, 723, 725, 368, 490, 491, 368, - 468, 15, 15, 575, 368, 15, 614, 15, 614, 614, - 614, 614, 786, 842, 614, 614, 614, 614, 614, 614, - 786, 368, 375, 849, 850, 851, 15, 15, 375, 861, - 15, 496, 496, 496, 496, 495, 496, 15, 15, 15, - 15, 15, 368, 887, 15, 362, 362, 124, 5, 21, - 368, 372, 373, 367, 375, 368, 368, 368, 419, 7, - 375, 362, 124, 368, 368, 5, 15, 406, 407, 368, - 419, 419, 419, 419, 418, 499, 417, 368, 368, 423, - 430, 431, 433, 434, 552, 552, 239, 409, 496, 497, - 496, 496, 496, 496, 5, 9, 16, 17, 22, 23, + 333, 334, 335, 336, 337, 339, 340, 344, 364, 366, + 369, 381, 382, 386, 387, 388, 394, 395, 396, 397, + 399, 400, 402, 404, 405, 406, 407, 414, 415, 416, + 417, 418, 419, 423, 424, 425, 429, 430, 468, 470, + 483, 526, 527, 529, 530, 536, 537, 538, 539, 546, + 547, 548, 549, 551, 554, 558, 559, 560, 561, 562, + 563, 569, 570, 571, 582, 583, 584, 586, 589, 592, + 597, 598, 600, 602, 604, 607, 608, 632, 633, 644, + 645, 646, 647, 652, 655, 658, 661, 662, 712, 713, + 714, 715, 716, 717, 718, 719, 725, 727, 729, 731, + 733, 734, 735, 736, 737, 740, 742, 743, 744, 747, + 748, 752, 753, 755, 756, 757, 758, 759, 760, 761, + 764, 769, 774, 776, 777, 778, 779, 781, 782, 783, + 784, 785, 786, 803, 806, 807, 808, 809, 815, 818, + 823, 824, 825, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 847, 848, + 849, 850, 851, 861, 862, 863, 865, 866, 867, 868, + 869, 874, 894, 15, 493, 493, 555, 555, 555, 555, + 555, 493, 555, 555, 365, 555, 555, 555, 493, 555, + 493, 555, 555, 493, 555, 555, 555, 492, 555, 493, + 555, 555, 7, 15, 494, 15, 493, 615, 555, 493, + 378, 555, 555, 555, 555, 555, 555, 555, 555, 555, + 555, 129, 371, 535, 535, 555, 555, 555, 493, 555, + 371, 555, 493, 493, 555, 555, 492, 365, 493, 493, + 64, 377, 555, 555, 493, 493, 555, 493, 493, 493, + 493, 493, 555, 432, 555, 555, 555, 371, 469, 365, + 493, 555, 555, 555, 493, 555, 493, 555, 555, 493, + 555, 555, 555, 493, 365, 493, 378, 555, 555, 378, + 555, 493, 555, 555, 555, 493, 555, 555, 493, 555, + 493, 555, 555, 555, 555, 555, 555, 15, 493, 593, + 493, 365, 493, 493, 555, 555, 555, 15, 8, 493, + 493, 555, 555, 555, 493, 555, 555, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, + 555, 493, 555, 493, 555, 555, 555, 555, 493, 555, + 555, 555, 555, 555, 555, 555, 555, 900, 900, 900, + 900, 900, 900, 257, 581, 124, 233, 402, 15, 374, + 581, 8, 8, 8, 8, 7, 8, 124, 366, 389, + 8, 371, 403, 8, 8, 8, 8, 8, 550, 8, + 550, 8, 8, 8, 8, 550, 581, 7, 218, 252, + 527, 529, 538, 539, 239, 547, 547, 10, 14, 15, + 16, 17, 27, 34, 36, 64, 92, 149, 201, 371, + 383, 499, 500, 502, 503, 504, 505, 511, 512, 513, + 514, 515, 518, 15, 555, 5, 9, 15, 16, 17, + 129, 501, 503, 511, 565, 579, 580, 555, 15, 565, + 555, 5, 564, 565, 580, 565, 8, 8, 8, 8, + 8, 8, 8, 8, 7, 8, 8, 5, 7, 371, + 642, 643, 371, 635, 494, 15, 15, 149, 482, 371, + 371, 745, 746, 8, 371, 659, 660, 746, 371, 373, + 371, 15, 531, 577, 23, 37, 371, 421, 422, 15, + 371, 605, 371, 673, 673, 371, 656, 657, 371, 534, + 431, 15, 371, 585, 149, 751, 534, 7, 477, 478, + 493, 616, 617, 371, 611, 617, 15, 556, 371, 587, + 588, 534, 15, 15, 534, 751, 535, 534, 534, 534, + 534, 371, 534, 374, 534, 15, 426, 494, 502, 503, + 15, 368, 371, 371, 653, 654, 484, 485, 486, 487, + 8, 674, 741, 15, 371, 599, 371, 590, 591, 578, + 15, 15, 371, 494, 15, 499, 754, 15, 15, 371, + 728, 730, 8, 371, 37, 420, 15, 503, 504, 494, + 15, 15, 556, 482, 494, 503, 371, 720, 5, 15, + 579, 580, 494, 371, 372, 494, 578, 15, 502, 636, + 637, 611, 615, 371, 603, 371, 700, 700, 15, 371, + 601, 720, 499, 510, 494, 378, 15, 371, 706, 706, + 706, 706, 706, 7, 499, 594, 595, 371, 596, 494, + 367, 371, 494, 371, 726, 728, 371, 493, 494, 371, + 471, 15, 15, 578, 371, 15, 617, 15, 617, 617, + 617, 617, 789, 845, 617, 617, 617, 617, 617, 617, + 789, 371, 378, 852, 853, 854, 15, 15, 378, 864, + 15, 499, 499, 499, 499, 498, 499, 15, 15, 15, + 15, 15, 371, 892, 15, 365, 365, 124, 5, 21, + 371, 375, 376, 370, 378, 371, 371, 371, 422, 7, + 378, 365, 124, 371, 371, 5, 15, 409, 410, 371, + 422, 422, 422, 422, 421, 502, 420, 371, 371, 426, + 433, 434, 436, 437, 555, 555, 239, 412, 499, 500, + 499, 499, 499, 499, 5, 9, 16, 17, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 35, - 37, 38, 380, 15, 246, 3, 15, 246, 246, 15, - 505, 506, 21, 549, 574, 507, 5, 9, 166, 563, - 564, 565, 576, 26, 576, 5, 9, 23, 37, 498, - 575, 576, 575, 8, 15, 500, 569, 570, 15, 496, - 497, 512, 571, 572, 573, 571, 582, 368, 596, 598, - 600, 602, 368, 7, 375, 723, 8, 21, 634, 419, - 521, 496, 240, 547, 15, 375, 15, 473, 8, 574, - 7, 496, 529, 530, 531, 15, 368, 473, 419, 478, - 479, 8, 430, 521, 473, 15, 8, 21, 5, 7, - 476, 477, 496, 368, 8, 21, 5, 58, 86, 126, - 137, 165, 258, 615, 611, 612, 175, 603, 496, 149, - 542, 8, 496, 496, 367, 368, 424, 425, 499, 504, - 368, 26, 368, 537, 538, 540, 371, 8, 8, 15, - 231, 399, 485, 375, 8, 738, 368, 499, 707, 717, - 735, 736, 8, 562, 26, 5, 9, 16, 17, 22, + 37, 38, 383, 15, 246, 3, 15, 246, 246, 15, + 508, 509, 21, 552, 577, 510, 5, 9, 166, 566, + 567, 568, 579, 26, 579, 5, 9, 23, 37, 501, + 578, 579, 578, 8, 15, 503, 572, 573, 15, 499, + 500, 515, 574, 575, 576, 574, 585, 371, 599, 601, + 603, 605, 371, 7, 378, 726, 8, 21, 637, 422, + 524, 499, 240, 550, 15, 378, 15, 476, 8, 577, + 7, 499, 532, 533, 534, 15, 371, 476, 422, 481, + 482, 8, 433, 524, 476, 15, 8, 21, 5, 7, + 479, 480, 499, 371, 8, 21, 5, 58, 86, 126, + 137, 165, 258, 618, 614, 615, 175, 606, 499, 149, + 545, 8, 499, 499, 370, 371, 427, 428, 502, 507, + 371, 26, 371, 540, 541, 543, 374, 8, 8, 15, + 231, 402, 488, 378, 8, 741, 371, 502, 710, 720, + 738, 739, 8, 565, 26, 5, 9, 16, 17, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, - 35, 37, 38, 380, 381, 382, 368, 375, 389, 499, - 496, 15, 375, 368, 368, 499, 499, 522, 8, 672, - 729, 368, 499, 660, 368, 463, 464, 542, 419, 18, - 575, 576, 575, 395, 398, 639, 634, 7, 612, 614, - 707, 717, 718, 719, 418, 419, 457, 458, 62, 499, - 762, 15, 15, 7, 8, 21, 590, 419, 371, 419, - 473, 8, 669, 694, 21, 375, 368, 8, 496, 496, - 473, 499, 547, 807, 499, 287, 819, 819, 547, 816, - 819, 15, 547, 784, 547, 823, 784, 784, 547, 801, - 547, 813, 473, 147, 148, 180, 314, 315, 318, 319, - 376, 852, 853, 854, 8, 21, 500, 675, 855, 21, - 855, 376, 853, 375, 759, 760, 8, 8, 8, 8, - 499, 502, 503, 777, 660, 375, 872, 873, 874, 875, - 876, 375, 879, 880, 881, 882, 883, 375, 884, 885, - 8, 375, 890, 891, 368, 364, 362, 8, 21, 213, - 376, 473, 44, 87, 93, 119, 143, 145, 178, 183, - 187, 191, 194, 216, 230, 236, 387, 388, 390, 368, - 362, 490, 553, 574, 400, 473, 547, 547, 8, 37, - 15, 368, 436, 441, 375, 15, 516, 21, 8, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 574, 64, - 129, 492, 494, 574, 499, 510, 513, 64, 513, 507, - 8, 21, 5, 496, 550, 565, 8, 21, 5, 9, - 496, 21, 496, 576, 576, 576, 576, 576, 21, 569, - 569, 8, 496, 497, 572, 573, 8, 8, 8, 473, - 473, 490, 43, 67, 82, 87, 88, 94, 228, 259, - 303, 643, 640, 375, 503, 519, 21, 368, 15, 495, - 67, 474, 657, 496, 7, 8, 21, 549, 37, 8, - 21, 654, 499, 502, 518, 520, 574, 746, 476, 7, - 473, 614, 15, 15, 15, 15, 15, 15, 603, 614, - 368, 21, 554, 585, 21, 21, 15, 8, 21, 8, - 506, 500, 8, 539, 26, 367, 651, 482, 129, 486, - 487, 488, 404, 169, 208, 282, 375, 15, 7, 8, - 21, 588, 571, 21, 21, 147, 148, 180, 21, 18, - 21, 7, 496, 514, 175, 323, 37, 8, 21, 375, - 8, 21, 26, 8, 21, 554, 496, 21, 459, 460, - 459, 21, 7, 614, 603, 15, 7, 8, 21, 8, - 15, 15, 26, 704, 705, 707, 495, 496, 592, 375, - 8, 694, 8, 669, 400, 390, 377, 21, 21, 21, - 614, 547, 21, 614, 547, 843, 614, 547, 614, 547, - 614, 547, 614, 547, 15, 15, 15, 15, 15, 15, - 375, 851, 8, 21, 21, 182, 315, 318, 8, 21, - 375, 375, 375, 496, 15, 15, 8, 21, 21, 183, - 191, 208, 8, 21, 41, 209, 228, 8, 21, 338, - 341, 342, 343, 354, 8, 21, 375, 244, 330, 345, - 346, 347, 8, 21, 371, 368, 373, 15, 405, 406, - 473, 490, 15, 7, 8, 368, 473, 15, 510, 5, - 408, 496, 565, 419, 499, 433, 15, 16, 17, 27, - 36, 59, 64, 92, 149, 201, 432, 434, 444, 445, - 446, 447, 448, 449, 450, 451, 436, 441, 442, 443, - 15, 437, 438, 62, 496, 571, 497, 492, 21, 8, - 493, 496, 514, 565, 7, 574, 479, 496, 574, 8, - 570, 21, 8, 8, 8, 497, 573, 497, 573, 497, - 573, 368, 255, 8, 21, 479, 478, 21, 7, 21, - 496, 529, 21, 479, 547, 8, 21, 565, 747, 8, - 21, 477, 496, 615, 574, 15, 617, 368, 616, 616, - 496, 616, 473, 614, 239, 531, 495, 425, 425, 368, - 496, 538, 21, 496, 514, 8, 21, 16, 15, 15, - 15, 495, 735, 736, 491, 499, 767, 7, 496, 7, - 21, 21, 368, 610, 500, 499, 191, 499, 614, 661, - 496, 464, 547, 8, 47, 177, 368, 462, 375, 631, - 633, 603, 7, 7, 496, 720, 721, 718, 719, 458, - 496, 5, 617, 763, 764, 770, 496, 627, 8, 21, - 15, 21, 71, 208, 375, 375, 491, 172, 368, 471, - 472, 500, 191, 208, 282, 285, 290, 298, 787, 788, - 789, 796, 808, 809, 810, 614, 266, 817, 818, 819, - 614, 37, 499, 840, 841, 84, 265, 289, 299, 304, - 785, 787, 788, 789, 790, 791, 792, 794, 795, 796, - 614, 787, 788, 789, 790, 791, 792, 794, 795, 796, - 809, 810, 824, 614, 787, 788, 789, 796, 802, 614, - 787, 788, 814, 614, 855, 855, 855, 375, 856, 857, - 855, 855, 500, 760, 330, 315, 331, 574, 492, 503, - 15, 15, 15, 873, 15, 15, 15, 880, 15, 15, - 15, 15, 885, 351, 352, 15, 15, 15, 15, 15, - 891, 368, 18, 26, 410, 15, 389, 7, 375, 405, - 554, 554, 409, 5, 496, 447, 448, 449, 452, 448, - 450, 448, 450, 246, 246, 246, 246, 246, 8, 37, - 368, 435, 499, 5, 437, 438, 8, 15, 16, 17, - 149, 368, 435, 439, 440, 453, 454, 455, 456, 15, - 438, 15, 21, 517, 21, 21, 506, 574, 496, 507, - 550, 564, 576, 540, 541, 497, 541, 541, 541, 473, - 368, 635, 638, 574, 8, 21, 7, 409, 496, 574, - 496, 574, 565, 628, 496, 618, 619, 21, 21, 21, - 21, 8, 8, 254, 525, 531, 21, 487, 488, 675, - 675, 675, 21, 21, 368, 15, 21, 496, 7, 7, - 496, 473, 15, 173, 8, 665, 666, 667, 668, 669, - 671, 672, 673, 676, 678, 679, 680, 694, 702, 540, - 460, 15, 15, 461, 255, 8, 7, 8, 21, 21, - 21, 8, 21, 21, 705, 706, 15, 15, 368, 368, - 469, 470, 472, 18, 8, 26, 786, 15, 786, 786, - 15, 614, 808, 786, 614, 817, 368, 8, 21, 15, - 786, 15, 786, 15, 614, 785, 614, 824, 614, 802, - 614, 814, 21, 21, 21, 316, 317, 8, 21, 21, - 21, 15, 15, 492, 21, 503, 877, 878, 675, 375, - 698, 704, 718, 704, 660, 660, 503, 888, 496, 886, - 15, 15, 375, 892, 893, 660, 660, 496, 375, 894, - 21, 496, 496, 645, 646, 21, 388, 410, 5, 496, - 400, 8, 21, 8, 513, 513, 513, 513, 513, 444, - 5, 15, 434, 445, 438, 368, 435, 443, 453, 454, - 454, 8, 21, 7, 16, 17, 5, 37, 9, 453, - 496, 20, 506, 493, 21, 26, 21, 21, 21, 21, - 15, 503, 565, 479, 656, 491, 518, 565, 747, 496, - 21, 7, 8, 21, 496, 375, 15, 21, 21, 21, - 7, 768, 769, 770, 496, 496, 7, 675, 499, 662, - 375, 667, 26, 462, 26, 381, 635, 633, 368, 606, - 607, 608, 609, 721, 764, 614, 78, 591, 368, 670, - 718, 695, 8, 368, 472, 496, 614, 797, 375, 614, - 614, 842, 499, 840, 375, 496, 496, 614, 614, 614, - 614, 857, 675, 499, 21, 26, 8, 21, 21, 22, - 24, 33, 35, 158, 159, 161, 162, 192, 234, 247, - 699, 700, 701, 8, 21, 21, 21, 21, 21, 21, - 8, 21, 8, 21, 375, 867, 868, 867, 315, 350, - 8, 21, 21, 21, 21, 348, 349, 8, 8, 21, - 7, 21, 21, 574, 452, 445, 574, 435, 26, 21, - 453, 440, 454, 454, 455, 455, 455, 21, 496, 5, - 496, 514, 636, 637, 499, 8, 675, 499, 8, 496, - 619, 375, 21, 254, 496, 8, 21, 496, 21, 15, - 41, 135, 209, 221, 223, 224, 226, 229, 320, 322, - 496, 461, 21, 21, 15, 8, 132, 765, 21, 21, - 7, 21, 697, 699, 470, 5, 16, 17, 22, 24, - 33, 35, 37, 159, 162, 247, 305, 306, 307, 799, - 21, 94, 230, 284, 295, 811, 37, 191, 288, 299, - 793, 21, 21, 21, 21, 496, 878, 15, 15, 375, - 503, 496, 353, 8, 21, 21, 893, 496, 7, 7, - 408, 21, 492, 439, 453, 21, 8, 8, 21, 479, - 565, 255, 15, 21, 769, 5, 496, 663, 664, 15, - 681, 15, 15, 15, 15, 703, 703, 15, 15, 15, - 8, 495, 607, 707, 708, 15, 718, 696, 696, 7, - 8, 21, 843, 21, 8, 500, 675, 699, 8, 868, - 8, 869, 8, 870, 21, 7, 409, 21, 21, 496, - 637, 496, 368, 620, 621, 496, 8, 21, 682, 681, - 717, 735, 717, 718, 707, 704, 496, 496, 674, 662, - 677, 496, 21, 8, 375, 21, 7, 8, 21, 675, - 798, 496, 375, 21, 8, 496, 375, 375, 368, 647, - 648, 21, 8, 15, 21, 664, 148, 180, 683, 7, - 21, 7, 21, 15, 21, 21, 8, 21, 8, 21, - 8, 707, 78, 698, 698, 21, 329, 496, 500, 352, - 351, 8, 496, 40, 496, 622, 623, 770, 7, 7, - 684, 685, 707, 735, 718, 591, 496, 662, 496, 21, - 21, 21, 15, 21, 15, 15, 648, 368, 624, 8, - 21, 8, 21, 15, 21, 21, 21, 8, 495, 867, - 867, 17, 625, 626, 623, 685, 496, 686, 687, 21, - 496, 21, 21, 21, 627, 17, 7, 8, 21, 8, - 772, 627, 496, 687, 15, 375, 375, 688, 689, 690, - 691, 692, 182, 318, 128, 157, 217, 8, 21, 7, - 7, 15, 693, 693, 693, 689, 375, 691, 692, 375, - 692, 494, 7, 21, 692 + 35, 37, 38, 383, 384, 385, 371, 378, 392, 502, + 499, 15, 378, 371, 371, 502, 502, 525, 8, 675, + 732, 371, 502, 663, 371, 466, 467, 545, 422, 18, + 578, 579, 578, 398, 401, 642, 637, 7, 615, 617, + 710, 720, 721, 722, 421, 422, 460, 461, 62, 502, + 765, 15, 15, 7, 8, 21, 593, 422, 374, 422, + 476, 8, 672, 697, 21, 378, 371, 8, 499, 499, + 476, 502, 550, 810, 502, 287, 822, 822, 550, 819, + 822, 15, 550, 787, 550, 826, 787, 787, 550, 804, + 550, 816, 476, 147, 148, 180, 314, 315, 318, 319, + 379, 855, 856, 857, 8, 21, 503, 678, 858, 21, + 858, 379, 856, 378, 762, 763, 8, 8, 8, 8, + 502, 505, 506, 780, 663, 378, 875, 876, 877, 878, + 879, 880, 881, 378, 884, 885, 886, 887, 888, 378, + 889, 890, 8, 378, 895, 896, 371, 367, 365, 8, + 21, 213, 379, 476, 44, 87, 93, 119, 143, 145, + 178, 183, 187, 191, 194, 216, 230, 236, 390, 391, + 393, 371, 365, 493, 556, 577, 403, 476, 550, 550, + 8, 37, 15, 371, 439, 444, 378, 15, 519, 21, + 8, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, + 577, 64, 129, 495, 497, 577, 502, 513, 516, 64, + 516, 510, 8, 21, 5, 499, 553, 568, 8, 21, + 5, 9, 499, 21, 499, 579, 579, 579, 579, 579, + 21, 572, 572, 8, 499, 500, 575, 576, 8, 8, + 8, 476, 476, 493, 43, 67, 82, 87, 88, 94, + 228, 259, 303, 646, 643, 378, 506, 522, 21, 371, + 15, 498, 67, 477, 660, 499, 7, 8, 21, 552, + 37, 8, 21, 657, 502, 505, 521, 523, 577, 749, + 479, 7, 476, 617, 15, 15, 15, 15, 15, 15, + 606, 617, 371, 21, 557, 588, 21, 21, 15, 8, + 21, 8, 509, 503, 8, 542, 26, 370, 654, 485, + 129, 489, 490, 491, 407, 169, 208, 282, 378, 15, + 7, 8, 21, 591, 574, 21, 21, 147, 148, 180, + 21, 18, 21, 7, 499, 517, 175, 323, 37, 8, + 21, 378, 8, 21, 26, 8, 21, 557, 499, 21, + 462, 463, 462, 21, 7, 617, 606, 15, 7, 8, + 21, 8, 15, 15, 26, 707, 708, 710, 498, 499, + 595, 378, 8, 697, 8, 672, 403, 393, 380, 21, + 21, 21, 617, 550, 21, 617, 550, 846, 617, 550, + 617, 550, 617, 550, 617, 550, 15, 15, 15, 15, + 15, 15, 378, 854, 8, 21, 21, 182, 315, 318, + 8, 21, 378, 378, 378, 499, 15, 15, 8, 21, + 21, 183, 191, 208, 356, 357, 8, 21, 41, 209, + 228, 8, 21, 338, 341, 342, 343, 354, 355, 8, + 21, 378, 244, 330, 345, 346, 347, 8, 21, 374, + 371, 376, 15, 408, 409, 476, 493, 15, 7, 8, + 371, 476, 15, 513, 5, 411, 499, 568, 422, 502, + 436, 15, 16, 17, 27, 36, 59, 64, 92, 149, + 201, 435, 437, 447, 448, 449, 450, 451, 452, 453, + 454, 439, 444, 445, 446, 15, 440, 441, 62, 499, + 574, 500, 495, 21, 8, 496, 499, 517, 568, 7, + 577, 482, 499, 577, 8, 573, 21, 8, 8, 8, + 500, 576, 500, 576, 500, 576, 371, 255, 8, 21, + 482, 481, 21, 7, 21, 499, 532, 21, 482, 550, + 8, 21, 568, 750, 8, 21, 480, 499, 618, 577, + 15, 620, 371, 619, 619, 499, 619, 476, 617, 239, + 534, 498, 428, 428, 371, 499, 541, 21, 499, 517, + 8, 21, 16, 15, 15, 15, 498, 738, 739, 494, + 502, 770, 7, 499, 7, 21, 21, 371, 613, 503, + 502, 191, 502, 617, 664, 499, 467, 550, 8, 47, + 177, 371, 465, 378, 634, 636, 606, 7, 7, 499, + 723, 724, 721, 722, 461, 499, 5, 620, 766, 767, + 773, 499, 630, 8, 21, 15, 21, 71, 208, 378, + 378, 494, 172, 371, 474, 475, 503, 191, 208, 282, + 285, 290, 298, 790, 791, 792, 799, 811, 812, 813, + 617, 266, 820, 821, 822, 617, 37, 502, 843, 844, + 84, 265, 289, 299, 304, 788, 790, 791, 792, 793, + 794, 795, 797, 798, 799, 617, 790, 791, 792, 793, + 794, 795, 797, 798, 799, 812, 813, 827, 617, 790, + 791, 792, 799, 805, 617, 790, 791, 817, 617, 858, + 858, 858, 378, 859, 860, 858, 858, 503, 763, 330, + 315, 331, 577, 495, 506, 15, 15, 15, 15, 15, + 876, 15, 15, 15, 885, 15, 15, 15, 15, 890, + 351, 352, 15, 15, 15, 15, 15, 896, 371, 18, + 26, 413, 15, 392, 7, 378, 408, 557, 557, 412, + 5, 499, 450, 451, 452, 455, 451, 453, 451, 453, + 246, 246, 246, 246, 246, 8, 37, 371, 438, 502, + 5, 440, 441, 8, 15, 16, 17, 149, 371, 438, + 442, 443, 456, 457, 458, 459, 15, 441, 15, 21, + 520, 21, 21, 509, 577, 499, 510, 553, 567, 579, + 543, 544, 500, 544, 544, 544, 476, 371, 638, 641, + 577, 8, 21, 7, 412, 499, 577, 499, 577, 568, + 631, 499, 621, 622, 21, 21, 21, 21, 8, 8, + 254, 528, 534, 21, 490, 491, 678, 678, 678, 21, + 21, 371, 15, 21, 499, 7, 7, 499, 476, 15, + 173, 8, 668, 669, 670, 671, 672, 674, 675, 676, + 679, 681, 682, 683, 697, 705, 543, 463, 15, 15, + 464, 255, 8, 7, 8, 21, 21, 21, 8, 21, + 21, 708, 709, 15, 15, 371, 371, 472, 473, 475, + 18, 8, 26, 789, 15, 789, 789, 15, 617, 811, + 789, 617, 820, 371, 8, 21, 15, 789, 15, 789, + 15, 617, 788, 617, 827, 617, 805, 617, 817, 21, + 21, 21, 316, 317, 8, 21, 21, 21, 15, 15, + 495, 21, 506, 882, 883, 678, 378, 701, 513, 678, + 707, 721, 707, 663, 663, 506, 893, 499, 891, 15, + 15, 378, 897, 898, 663, 663, 499, 378, 899, 21, + 499, 499, 648, 649, 21, 391, 413, 5, 499, 403, + 8, 21, 8, 516, 516, 516, 516, 516, 447, 5, + 15, 437, 448, 441, 371, 438, 446, 456, 457, 457, + 8, 21, 7, 16, 17, 5, 37, 9, 456, 499, + 20, 509, 496, 21, 26, 21, 21, 21, 21, 15, + 506, 568, 482, 659, 494, 521, 568, 750, 499, 21, + 7, 8, 21, 499, 378, 15, 21, 21, 21, 7, + 771, 772, 773, 499, 499, 7, 678, 502, 665, 378, + 670, 26, 465, 26, 384, 638, 636, 371, 609, 610, + 611, 612, 724, 767, 617, 78, 594, 371, 673, 721, + 698, 8, 371, 475, 499, 617, 800, 378, 617, 617, + 845, 502, 843, 378, 499, 499, 617, 617, 617, 617, + 860, 678, 502, 21, 26, 8, 21, 21, 22, 24, + 33, 35, 158, 159, 161, 162, 192, 234, 247, 702, + 703, 704, 8, 21, 21, 21, 21, 21, 21, 21, + 21, 8, 21, 8, 21, 378, 870, 871, 870, 315, + 350, 8, 21, 21, 21, 21, 348, 349, 8, 8, + 21, 7, 21, 21, 577, 455, 448, 577, 438, 26, + 21, 456, 443, 457, 457, 458, 458, 458, 21, 499, + 5, 499, 517, 639, 640, 502, 8, 678, 502, 8, + 499, 622, 378, 21, 254, 499, 8, 21, 499, 21, + 15, 41, 135, 209, 221, 223, 224, 226, 229, 320, + 322, 499, 464, 21, 21, 15, 8, 132, 768, 21, + 21, 7, 21, 700, 702, 473, 5, 16, 17, 22, + 24, 33, 35, 37, 159, 162, 247, 305, 306, 307, + 802, 21, 94, 230, 284, 295, 814, 37, 191, 288, + 299, 796, 21, 21, 21, 21, 499, 883, 15, 15, + 378, 506, 499, 353, 8, 21, 21, 898, 499, 7, + 7, 411, 21, 495, 442, 456, 21, 8, 8, 21, + 482, 568, 255, 15, 21, 772, 5, 499, 666, 667, + 15, 684, 15, 15, 15, 15, 706, 706, 15, 15, + 15, 8, 498, 610, 710, 711, 15, 721, 699, 699, + 7, 8, 21, 846, 21, 8, 503, 678, 702, 8, + 871, 8, 872, 8, 873, 21, 7, 412, 21, 21, + 499, 640, 499, 371, 623, 624, 499, 8, 21, 685, + 684, 720, 738, 720, 721, 710, 707, 499, 499, 677, + 665, 680, 499, 21, 8, 378, 21, 7, 8, 21, + 678, 801, 499, 378, 21, 8, 499, 378, 378, 371, + 650, 651, 21, 8, 15, 21, 667, 148, 180, 686, + 7, 21, 7, 21, 15, 21, 21, 8, 21, 8, + 21, 8, 710, 78, 701, 701, 21, 329, 499, 503, + 352, 351, 8, 499, 40, 499, 625, 626, 773, 7, + 7, 687, 688, 710, 738, 721, 594, 499, 665, 499, + 21, 21, 21, 15, 21, 15, 15, 651, 371, 627, + 8, 21, 8, 21, 15, 21, 21, 21, 8, 498, + 870, 870, 17, 628, 629, 626, 688, 499, 689, 690, + 21, 499, 21, 21, 21, 630, 17, 7, 8, 21, + 8, 775, 630, 499, 690, 15, 378, 378, 691, 692, + 693, 694, 695, 182, 318, 128, 157, 217, 8, 21, + 7, 7, 15, 696, 696, 696, 692, 378, 694, 695, + 378, 695, 497, 7, 21, 695 }; #define yyerrok (yyerrstatus = 0) @@ -5478,22 +5517,22 @@ yyreduce: switch (yyn) { case 2: -#line 789 "gram1.y" +#line 793 "gram1.y" { (yyval.bf_node) = BFNULL; ;} break; case 3: -#line 791 "gram1.y" +#line 795 "gram1.y" { (yyval.bf_node) = set_stat_list((yyvsp[(1) - (3)].bf_node),(yyvsp[(2) - (3)].bf_node)); ;} break; case 4: -#line 795 "gram1.y" +#line 799 "gram1.y" { lastwasbranch = NO; (yyval.bf_node) = BFNULL; ;} break; case 5: -#line 797 "gram1.y" +#line 801 "gram1.y" { if ((yyvsp[(2) - (3)].bf_node) != BFNULL) { @@ -5510,7 +5549,7 @@ yyreduce: break; case 6: -#line 811 "gram1.y" +#line 815 "gram1.y" { PTR_BFND p; if(lastwasbranch && ! thislabel) @@ -5544,7 +5583,7 @@ yyreduce: break; case 7: -#line 842 "gram1.y" +#line 846 "gram1.y" { /* PTR_LLND p; */ doinclude( (yyvsp[(3) - (3)].charp) ); /* p = make_llnd(fi, STRING_VAL, LLNULL, LLNULL, SMNULL); @@ -5556,7 +5595,7 @@ yyreduce: break; case 8: -#line 851 "gram1.y" +#line 855 "gram1.y" { err("Unclassifiable statement", 10); flline(); @@ -5565,7 +5604,7 @@ yyreduce: break; case 9: -#line 857 "gram1.y" +#line 861 "gram1.y" { PTR_CMNT p; PTR_BFND bif; @@ -5587,7 +5626,7 @@ yyreduce: break; case 10: -#line 877 "gram1.y" +#line 881 "gram1.y" { flline(); needkwd = NO; inioctl = NO; /*!!!*/ @@ -5597,7 +5636,7 @@ yyreduce: break; case 11: -#line 886 "gram1.y" +#line 890 "gram1.y" { if(yystno) { @@ -5614,7 +5653,7 @@ yyreduce: break; case 12: -#line 902 "gram1.y" +#line 906 "gram1.y" { PTR_BFND p; if (pred_bfnd != global_bfnd) @@ -5628,7 +5667,7 @@ yyreduce: break; case 13: -#line 914 "gram1.y" +#line 918 "gram1.y" { PTR_BFND q = BFNULL; (yyvsp[(3) - (3)].symbol)->variant = PROCEDURE_NAME; @@ -5640,7 +5679,7 @@ yyreduce: break; case 14: -#line 924 "gram1.y" +#line 928 "gram1.y" { install_param_list((yyvsp[(3) - (4)].symbol), (yyvsp[(4) - (4)].symbol), LLNULL, PROCEDURE_NAME); /* if there is only a control end the control parent is not set */ @@ -5649,7 +5688,7 @@ yyreduce: break; case 15: -#line 931 "gram1.y" +#line 935 "gram1.y" { install_param_list((yyvsp[(4) - (5)].symbol), (yyvsp[(5) - (5)].symbol), LLNULL, PROCEDURE_NAME); if((yyvsp[(1) - (5)].ll_node)->variant == RECURSIVE_OP) (yyvsp[(4) - (5)].symbol)->attr = (yyvsp[(4) - (5)].symbol)->attr | RECURSIVE_BIT; @@ -5658,7 +5697,7 @@ yyreduce: break; case 16: -#line 937 "gram1.y" +#line 941 "gram1.y" { install_param_list((yyvsp[(3) - (5)].symbol), (yyvsp[(4) - (5)].symbol), (yyvsp[(5) - (5)].ll_node), FUNCTION_NAME); pred_bfnd->entry.Template.ll_ptr1 = (yyvsp[(5) - (5)].ll_node); @@ -5666,7 +5705,7 @@ yyreduce: break; case 17: -#line 942 "gram1.y" +#line 946 "gram1.y" { install_param_list((yyvsp[(1) - (3)].symbol), (yyvsp[(2) - (3)].symbol), (yyvsp[(3) - (3)].ll_node), FUNCTION_NAME); pred_bfnd->entry.Template.ll_ptr1 = (yyvsp[(3) - (3)].ll_node); @@ -5674,7 +5713,7 @@ yyreduce: break; case 18: -#line 947 "gram1.y" +#line 951 "gram1.y" {PTR_BFND p, bif; PTR_SYMB q = SMNULL; PTR_LLND l = LLNULL; @@ -5701,7 +5740,7 @@ yyreduce: break; case 19: -#line 971 "gram1.y" +#line 975 "gram1.y" { PTR_SYMB s; PTR_BFND p; /* @@ -5729,7 +5768,7 @@ yyreduce: break; case 20: -#line 997 "gram1.y" +#line 1001 "gram1.y" { newprog(); if (position == IN_OUTSIDE) position = IN_PROC; @@ -5745,22 +5784,22 @@ yyreduce: break; case 21: -#line 1012 "gram1.y" +#line 1016 "gram1.y" { (yyval.ll_node) = make_llnd(fi, RECURSIVE_OP, LLNULL, LLNULL, SMNULL); ;} break; case 22: -#line 1014 "gram1.y" +#line 1018 "gram1.y" { (yyval.ll_node) = make_llnd(fi, PURE_OP, LLNULL, LLNULL, SMNULL); ;} break; case 23: -#line 1016 "gram1.y" +#line 1020 "gram1.y" { (yyval.ll_node) = make_llnd(fi, ELEMENTAL_OP, LLNULL, LLNULL, SMNULL); ;} break; case 24: -#line 1020 "gram1.y" +#line 1024 "gram1.y" { PTR_BFND p; (yyval.symbol) = make_procedure((yyvsp[(1) - (1)].hash_entry), LOCAL); @@ -5778,7 +5817,7 @@ yyreduce: break; case 25: -#line 1037 "gram1.y" +#line 1041 "gram1.y" { PTR_BFND p; (yyval.symbol) = make_function((yyvsp[(1) - (1)].hash_entry), TYNULL, LOCAL); @@ -5793,7 +5832,7 @@ yyreduce: break; case 26: -#line 1051 "gram1.y" +#line 1055 "gram1.y" { PTR_BFND p; PTR_LLND l; @@ -5820,7 +5859,7 @@ yyreduce: break; case 27: -#line 1075 "gram1.y" +#line 1079 "gram1.y" { PTR_BFND p; PTR_LLND l; (yyval.symbol) = make_function((yyvsp[(5) - (5)].hash_entry), (yyvsp[(1) - (5)].data_type), LOCAL); @@ -5839,7 +5878,7 @@ yyreduce: break; case 28: -#line 1091 "gram1.y" +#line 1095 "gram1.y" { PTR_BFND p; (yyval.symbol) = make_function((yyvsp[(4) - (4)].hash_entry), TYNULL, LOCAL); @@ -5856,7 +5895,7 @@ yyreduce: break; case 29: -#line 1105 "gram1.y" +#line 1109 "gram1.y" { PTR_BFND p; PTR_LLND l; (yyval.symbol) = make_function((yyvsp[(5) - (5)].hash_entry), (yyvsp[(2) - (5)].data_type), LOCAL); @@ -5875,12 +5914,12 @@ yyreduce: break; case 30: -#line 1123 "gram1.y" +#line 1127 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 31: -#line 1125 "gram1.y" +#line 1129 "gram1.y" { PTR_SYMB s; s = make_scalar((yyvsp[(4) - (5)].hash_entry), TYNULL, LOCAL); (yyval.ll_node) = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s); @@ -5888,17 +5927,17 @@ yyreduce: break; case 32: -#line 1132 "gram1.y" +#line 1136 "gram1.y" { (yyval.hash_entry) = look_up_sym(yytext); ;} break; case 33: -#line 1135 "gram1.y" +#line 1139 "gram1.y" { (yyval.symbol) = make_program(look_up_sym("_MAIN")); ;} break; case 34: -#line 1137 "gram1.y" +#line 1141 "gram1.y" { (yyval.symbol) = make_program((yyvsp[(1) - (1)].hash_entry)); (yyval.symbol)->decl = YES; /* variable declaration has been seen. */ @@ -5906,12 +5945,12 @@ yyreduce: break; case 35: -#line 1143 "gram1.y" +#line 1147 "gram1.y" { (yyval.symbol) = make_program(look_up_sym("_BLOCK")); ;} break; case 36: -#line 1145 "gram1.y" +#line 1149 "gram1.y" { (yyval.symbol) = make_program((yyvsp[(1) - (1)].hash_entry)); (yyval.symbol)->decl = YES; /* variable declaration has been seen. */ @@ -5919,39 +5958,39 @@ yyreduce: break; case 37: -#line 1152 "gram1.y" +#line 1156 "gram1.y" { (yyval.symbol) = SMNULL; ;} break; case 38: -#line 1154 "gram1.y" +#line 1158 "gram1.y" { (yyval.symbol) = SMNULL; ;} break; case 39: -#line 1156 "gram1.y" +#line 1160 "gram1.y" { (yyval.symbol) = (yyvsp[(2) - (3)].symbol); ;} break; case 41: -#line 1161 "gram1.y" +#line 1165 "gram1.y" { (yyval.symbol) = set_id_list((yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); ;} break; case 42: -#line 1165 "gram1.y" +#line 1169 "gram1.y" { (yyval.symbol) = make_scalar((yyvsp[(1) - (1)].hash_entry), TYNULL, IO); ;} break; case 43: -#line 1169 "gram1.y" +#line 1173 "gram1.y" { (yyval.symbol) = make_scalar(look_up_sym("*"), TYNULL, IO); ;} break; case 44: -#line 1175 "gram1.y" +#line 1179 "gram1.y" { char *s; s = copyn(yyleng+1, yytext); @@ -5961,22 +6000,22 @@ yyreduce: break; case 45: -#line 1184 "gram1.y" +#line 1188 "gram1.y" { needkwd = 1; ;} break; case 46: -#line 1188 "gram1.y" +#line 1192 "gram1.y" { needkwd = NO; ;} break; case 47: -#line 1193 "gram1.y" +#line 1197 "gram1.y" { colon_flag = YES; ;} break; case 61: -#line 1214 "gram1.y" +#line 1218 "gram1.y" { saveall = YES; (yyval.bf_node) = get_bfnd(fi,SAVE_DECL, SMNULL, LLNULL, LLNULL, LLNULL); @@ -5984,14 +6023,14 @@ yyreduce: break; case 62: -#line 1219 "gram1.y" +#line 1223 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SAVE_DECL, SMNULL, (yyvsp[(4) - (4)].ll_node), LLNULL, LLNULL); ;} break; case 63: -#line 1224 "gram1.y" +#line 1228 "gram1.y" { PTR_LLND p; p = make_llnd(fi,STMT_STR, LLNULL, LLNULL, SMNULL); @@ -6001,19 +6040,19 @@ yyreduce: break; case 64: -#line 1231 "gram1.y" +#line 1235 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,PARAM_DECL, SMNULL, (yyvsp[(4) - (5)].ll_node), LLNULL, LLNULL); ;} break; case 77: -#line 1247 "gram1.y" +#line 1251 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, INTERFACE_STMT, SMNULL, LLNULL, LLNULL, LLNULL); add_scope_level((yyval.bf_node), NO); ;} break; case 78: -#line 1251 "gram1.y" +#line 1255 "gram1.y" { PTR_SYMB s; s = make_procedure((yyvsp[(3) - (3)].hash_entry), LOCAL); @@ -6024,7 +6063,7 @@ yyreduce: break; case 79: -#line 1259 "gram1.y" +#line 1263 "gram1.y" { PTR_SYMB s; s = make_function((yyvsp[(4) - (5)].hash_entry), global_default, LOCAL); @@ -6035,7 +6074,7 @@ yyreduce: break; case 80: -#line 1267 "gram1.y" +#line 1271 "gram1.y" { PTR_SYMB s; @@ -6047,7 +6086,7 @@ yyreduce: break; case 81: -#line 1276 "gram1.y" +#line 1280 "gram1.y" { parstate = INDCL; (yyval.bf_node) = get_bfnd(fi, CONTROL_END, SMNULL, LLNULL, LLNULL, LLNULL); /*process_interface($$);*/ /*podd 01.02.03*/ @@ -6056,112 +6095,112 @@ yyreduce: break; case 82: -#line 1284 "gram1.y" +#line 1288 "gram1.y" { (yyval.hash_entry) = look_up_sym(yytext); ;} break; case 83: -#line 1288 "gram1.y" +#line 1292 "gram1.y" { (yyval.hash_entry) = (yyvsp[(1) - (1)].hash_entry); ;} break; case 84: -#line 1290 "gram1.y" +#line 1294 "gram1.y" { (yyval.hash_entry) = (yyvsp[(1) - (1)].hash_entry); ;} break; case 85: -#line 1294 "gram1.y" +#line 1298 "gram1.y" { (yyval.hash_entry) = look_up_op(PLUS); ;} break; case 86: -#line 1296 "gram1.y" +#line 1300 "gram1.y" { (yyval.hash_entry) = look_up_op(MINUS); ;} break; case 87: -#line 1298 "gram1.y" +#line 1302 "gram1.y" { (yyval.hash_entry) = look_up_op(ASTER); ;} break; case 88: -#line 1300 "gram1.y" +#line 1304 "gram1.y" { (yyval.hash_entry) = look_up_op(DASTER); ;} break; case 89: -#line 1302 "gram1.y" +#line 1306 "gram1.y" { (yyval.hash_entry) = look_up_op(SLASH); ;} break; case 90: -#line 1304 "gram1.y" +#line 1308 "gram1.y" { (yyval.hash_entry) = look_up_op(DSLASH); ;} break; case 91: -#line 1306 "gram1.y" +#line 1310 "gram1.y" { (yyval.hash_entry) = look_up_op(AND); ;} break; case 92: -#line 1308 "gram1.y" +#line 1312 "gram1.y" { (yyval.hash_entry) = look_up_op(OR); ;} break; case 93: -#line 1310 "gram1.y" +#line 1314 "gram1.y" { (yyval.hash_entry) = look_up_op(XOR); ;} break; case 94: -#line 1312 "gram1.y" +#line 1316 "gram1.y" { (yyval.hash_entry) = look_up_op(NOT); ;} break; case 95: -#line 1314 "gram1.y" +#line 1318 "gram1.y" { (yyval.hash_entry) = look_up_op(EQ); ;} break; case 96: -#line 1316 "gram1.y" +#line 1320 "gram1.y" { (yyval.hash_entry) = look_up_op(NE); ;} break; case 97: -#line 1318 "gram1.y" +#line 1322 "gram1.y" { (yyval.hash_entry) = look_up_op(GT); ;} break; case 98: -#line 1320 "gram1.y" +#line 1324 "gram1.y" { (yyval.hash_entry) = look_up_op(GE); ;} break; case 99: -#line 1322 "gram1.y" +#line 1326 "gram1.y" { (yyval.hash_entry) = look_up_op(LT); ;} break; case 100: -#line 1324 "gram1.y" +#line 1328 "gram1.y" { (yyval.hash_entry) = look_up_op(LE); ;} break; case 101: -#line 1326 "gram1.y" +#line 1330 "gram1.y" { (yyval.hash_entry) = look_up_op(NEQV); ;} break; case 102: -#line 1328 "gram1.y" +#line 1332 "gram1.y" { (yyval.hash_entry) = look_up_op(EQV); ;} break; case 103: -#line 1333 "gram1.y" +#line 1337 "gram1.y" { PTR_SYMB s; @@ -6172,7 +6211,7 @@ yyreduce: break; case 104: -#line 1342 "gram1.y" +#line 1346 "gram1.y" { PTR_SYMB s; type_var = s = make_derived_type((yyvsp[(7) - (7)].hash_entry), TYNULL, LOCAL); @@ -6183,7 +6222,7 @@ yyreduce: break; case 105: -#line 1352 "gram1.y" +#line 1356 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, CONTROL_END, SMNULL, LLNULL, LLNULL, LLNULL); if (type_var != SMNULL) @@ -6194,7 +6233,7 @@ yyreduce: break; case 106: -#line 1360 "gram1.y" +#line 1364 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, CONTROL_END, SMNULL, LLNULL, LLNULL, LLNULL); if (type_var != SMNULL) @@ -6205,7 +6244,7 @@ yyreduce: break; case 107: -#line 1370 "gram1.y" +#line 1374 "gram1.y" { PTR_LLND q, r, l; /* PTR_SYMB s;*/ @@ -6229,7 +6268,7 @@ yyreduce: break; case 108: -#line 1391 "gram1.y" +#line 1395 "gram1.y" { PTR_LLND q, r; /* PTR_SYMB s;*/ @@ -6249,51 +6288,51 @@ yyreduce: break; case 109: -#line 1410 "gram1.y" +#line 1414 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 110: -#line 1412 "gram1.y" +#line 1416 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 111: -#line 1414 "gram1.y" +#line 1418 "gram1.y" { (yyval.ll_node) = (yyvsp[(3) - (5)].ll_node); ;} break; case 112: -#line 1418 "gram1.y" +#line 1422 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 113: -#line 1420 "gram1.y" +#line 1424 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); ;} break; case 114: -#line 1424 "gram1.y" +#line 1428 "gram1.y" { type_options = type_options | PARAMETER_BIT; (yyval.ll_node) = make_llnd(fi, PARAMETER_OP, LLNULL, LLNULL, SMNULL); ;} break; case 115: -#line 1428 "gram1.y" +#line 1432 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 116: -#line 1430 "gram1.y" +#line 1434 "gram1.y" { type_options = type_options | ALLOCATABLE_BIT; (yyval.ll_node) = make_llnd(fi, ALLOCATABLE_OP, LLNULL, LLNULL, SMNULL); ;} break; case 117: -#line 1434 "gram1.y" +#line 1438 "gram1.y" { type_options = type_options | DIMENSION_BIT; attr_ndim = ndim; attr_dims = (yyvsp[(2) - (2)].ll_node); @@ -6302,82 +6341,82 @@ yyreduce: break; case 118: -#line 1440 "gram1.y" +#line 1444 "gram1.y" { type_options = type_options | EXTERNAL_BIT; (yyval.ll_node) = make_llnd(fi, EXTERNAL_OP, LLNULL, LLNULL, SMNULL); ;} break; case 119: -#line 1444 "gram1.y" +#line 1448 "gram1.y" { (yyval.ll_node) = (yyvsp[(3) - (4)].ll_node); ;} break; case 120: -#line 1446 "gram1.y" +#line 1450 "gram1.y" { type_options = type_options | INTRINSIC_BIT; (yyval.ll_node) = make_llnd(fi, INTRINSIC_OP, LLNULL, LLNULL, SMNULL); ;} break; case 121: -#line 1450 "gram1.y" +#line 1454 "gram1.y" { type_options = type_options | OPTIONAL_BIT; (yyval.ll_node) = make_llnd(fi, OPTIONAL_OP, LLNULL, LLNULL, SMNULL); ;} break; case 122: -#line 1454 "gram1.y" +#line 1458 "gram1.y" { type_options = type_options | POINTER_BIT; (yyval.ll_node) = make_llnd(fi, POINTER_OP, LLNULL, LLNULL, SMNULL); ;} break; case 123: -#line 1458 "gram1.y" +#line 1462 "gram1.y" { type_options = type_options | SAVE_BIT; (yyval.ll_node) = make_llnd(fi, SAVE_OP, LLNULL, LLNULL, SMNULL); ;} break; case 124: -#line 1462 "gram1.y" +#line 1466 "gram1.y" { type_options = type_options | SAVE_BIT; (yyval.ll_node) = make_llnd(fi, STATIC_OP, LLNULL, LLNULL, SMNULL); ;} break; case 125: -#line 1466 "gram1.y" +#line 1470 "gram1.y" { type_options = type_options | TARGET_BIT; (yyval.ll_node) = make_llnd(fi, TARGET_OP, LLNULL, LLNULL, SMNULL); ;} break; case 126: -#line 1472 "gram1.y" +#line 1476 "gram1.y" { type_options = type_options | IN_BIT; type_opt = IN_BIT; (yyval.ll_node) = make_llnd(fi, IN_OP, LLNULL, LLNULL, SMNULL); ;} break; case 127: -#line 1476 "gram1.y" +#line 1480 "gram1.y" { type_options = type_options | OUT_BIT; type_opt = OUT_BIT; (yyval.ll_node) = make_llnd(fi, OUT_OP, LLNULL, LLNULL, SMNULL); ;} break; case 128: -#line 1480 "gram1.y" +#line 1484 "gram1.y" { type_options = type_options | INOUT_BIT; type_opt = INOUT_BIT; (yyval.ll_node) = make_llnd(fi, INOUT_OP, LLNULL, LLNULL, SMNULL); ;} break; case 129: -#line 1486 "gram1.y" +#line 1490 "gram1.y" { type_options = type_options | PUBLIC_BIT; type_opt = PUBLIC_BIT; (yyval.ll_node) = make_llnd(fi, PUBLIC_OP, LLNULL, LLNULL, SMNULL); @@ -6385,7 +6424,7 @@ yyreduce: break; case 130: -#line 1491 "gram1.y" +#line 1495 "gram1.y" { type_options = type_options | PRIVATE_BIT; type_opt = PRIVATE_BIT; (yyval.ll_node) = make_llnd(fi, PRIVATE_OP, LLNULL, LLNULL, SMNULL); @@ -6393,7 +6432,7 @@ yyreduce: break; case 131: -#line 1498 "gram1.y" +#line 1502 "gram1.y" { PTR_LLND q, r; PTR_SYMB s; @@ -6407,7 +6446,7 @@ yyreduce: break; case 132: -#line 1509 "gram1.y" +#line 1513 "gram1.y" { PTR_LLND q, r; PTR_SYMB s; @@ -6421,7 +6460,7 @@ yyreduce: break; case 133: -#line 1522 "gram1.y" +#line 1526 "gram1.y" { PTR_LLND q, r; PTR_SYMB s; @@ -6435,7 +6474,7 @@ yyreduce: break; case 134: -#line 1533 "gram1.y" +#line 1537 "gram1.y" { PTR_LLND q, r; PTR_SYMB s; @@ -6449,7 +6488,7 @@ yyreduce: break; case 135: -#line 1546 "gram1.y" +#line 1550 "gram1.y" { PTR_LLND r; PTR_SYMB s; @@ -6462,7 +6501,7 @@ yyreduce: break; case 136: -#line 1556 "gram1.y" +#line 1560 "gram1.y" { PTR_LLND r; PTR_SYMB s; @@ -6475,7 +6514,7 @@ yyreduce: break; case 137: -#line 1569 "gram1.y" +#line 1573 "gram1.y" { privateall = 1; (yyval.bf_node) = get_bfnd(fi, PRIVATE_STMT, SMNULL, LLNULL, LLNULL, LLNULL); @@ -6483,7 +6522,7 @@ yyreduce: break; case 138: -#line 1574 "gram1.y" +#line 1578 "gram1.y" { /*type_options = type_options | PRIVATE_BIT;*/ (yyval.bf_node) = get_bfnd(fi, PRIVATE_STMT, SMNULL, (yyvsp[(5) - (5)].ll_node), LLNULL, LLNULL); @@ -6491,19 +6530,19 @@ yyreduce: break; case 139: -#line 1580 "gram1.y" +#line 1584 "gram1.y" {type_opt = PRIVATE_BIT;;} break; case 140: -#line 1584 "gram1.y" +#line 1588 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, SEQUENCE_STMT, SMNULL, LLNULL, LLNULL, LLNULL); ;} break; case 141: -#line 1589 "gram1.y" +#line 1593 "gram1.y" { /*saveall = YES;*/ /*14.03.03*/ (yyval.bf_node) = get_bfnd(fi, PUBLIC_STMT, SMNULL, LLNULL, LLNULL, LLNULL); @@ -6511,7 +6550,7 @@ yyreduce: break; case 142: -#line 1594 "gram1.y" +#line 1598 "gram1.y" { /*type_options = type_options | PUBLIC_BIT;*/ (yyval.bf_node) = get_bfnd(fi, PUBLIC_STMT, SMNULL, (yyvsp[(5) - (5)].ll_node), LLNULL, LLNULL); @@ -6519,12 +6558,12 @@ yyreduce: break; case 143: -#line 1600 "gram1.y" +#line 1604 "gram1.y" {type_opt = PUBLIC_BIT;;} break; case 144: -#line 1604 "gram1.y" +#line 1608 "gram1.y" { type_options = 0; /* following block added by dbg */ @@ -6537,7 +6576,7 @@ yyreduce: break; case 145: -#line 1614 "gram1.y" +#line 1618 "gram1.y" { PTR_TYPE t; type_options = 0; @@ -6551,12 +6590,12 @@ yyreduce: break; case 146: -#line 1627 "gram1.y" +#line 1631 "gram1.y" {opt_kwd_hedr = YES;;} break; case 147: -#line 1632 "gram1.y" +#line 1636 "gram1.y" { PTR_TYPE p; PTR_LLND q; PTR_SYMB s; @@ -6576,7 +6615,7 @@ yyreduce: break; case 148: -#line 1651 "gram1.y" +#line 1655 "gram1.y" { PTR_TYPE p; PTR_LLND q, r; PTR_SYMB s; @@ -6603,17 +6642,17 @@ yyreduce: break; case 149: -#line 1677 "gram1.y" +#line 1681 "gram1.y" { (yyval.token) = ATT_GLOBAL; ;} break; case 150: -#line 1679 "gram1.y" +#line 1683 "gram1.y" { (yyval.token) = ATT_CLUSTER; ;} break; case 151: -#line 1691 "gram1.y" +#line 1695 "gram1.y" { /* varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]); */ vartype = (yyvsp[(1) - (1)].data_type); @@ -6621,57 +6660,57 @@ yyreduce: break; case 152: -#line 1698 "gram1.y" +#line 1702 "gram1.y" { (yyval.data_type) = global_int; ;} break; case 153: -#line 1699 "gram1.y" +#line 1703 "gram1.y" { (yyval.data_type) = global_float; ;} break; case 154: -#line 1700 "gram1.y" +#line 1704 "gram1.y" { (yyval.data_type) = global_complex; ;} break; case 155: -#line 1701 "gram1.y" +#line 1705 "gram1.y" { (yyval.data_type) = global_double; ;} break; case 156: -#line 1702 "gram1.y" +#line 1706 "gram1.y" { (yyval.data_type) = global_dcomplex; ;} break; case 157: -#line 1703 "gram1.y" +#line 1707 "gram1.y" { (yyval.data_type) = global_bool; ;} break; case 158: -#line 1704 "gram1.y" +#line 1708 "gram1.y" { (yyval.data_type) = global_string; ;} break; case 159: -#line 1709 "gram1.y" +#line 1713 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 160: -#line 1711 "gram1.y" +#line 1715 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 161: -#line 1715 "gram1.y" +#line 1719 "gram1.y" { (yyval.ll_node) = make_llnd(fi, LEN_OP, (yyvsp[(3) - (5)].ll_node), LLNULL, SMNULL); ;} break; case 162: -#line 1717 "gram1.y" +#line 1721 "gram1.y" { PTR_LLND l; l = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -6681,27 +6720,27 @@ yyreduce: break; case 163: -#line 1724 "gram1.y" +#line 1728 "gram1.y" {(yyval.ll_node) = make_llnd(fi, LEN_OP, (yyvsp[(5) - (6)].ll_node), (yyvsp[(5) - (6)].ll_node), SMNULL);;} break; case 164: -#line 1728 "gram1.y" +#line 1732 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 165: -#line 1730 "gram1.y" +#line 1734 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 166: -#line 1732 "gram1.y" +#line 1736 "gram1.y" { /*$$ = make_llnd(fi, PAREN_OP, $2, LLNULL, SMNULL);*/ (yyval.ll_node) = (yyvsp[(3) - (5)].ll_node); ;} break; case 167: -#line 1740 "gram1.y" +#line 1744 "gram1.y" { if((yyvsp[(7) - (9)].ll_node)->variant==LENGTH_OP && (yyvsp[(3) - (9)].ll_node)->variant==(yyvsp[(7) - (9)].ll_node)->variant) (yyvsp[(7) - (9)].ll_node)->variant=KIND_OP; (yyval.ll_node) = make_llnd(fi, CONS, (yyvsp[(3) - (9)].ll_node), (yyvsp[(7) - (9)].ll_node), SMNULL); @@ -6709,7 +6748,7 @@ yyreduce: break; case 168: -#line 1747 "gram1.y" +#line 1751 "gram1.y" { if(vartype->variant == T_STRING) (yyval.ll_node) = make_llnd(fi,LENGTH_OP,(yyvsp[(1) - (1)].ll_node),LLNULL,SMNULL); else @@ -6718,7 +6757,7 @@ yyreduce: break; case 169: -#line 1753 "gram1.y" +#line 1757 "gram1.y" { PTR_LLND l; l = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); l->entry.string_val = (char *)"*"; @@ -6727,7 +6766,7 @@ yyreduce: break; case 170: -#line 1759 "gram1.y" +#line 1763 "gram1.y" { /* $$ = make_llnd(fi, SPEC_PAIR, $2, LLNULL, SMNULL); */ char *q; q = (yyvsp[(1) - (2)].ll_node)->entry.string_val; @@ -6739,7 +6778,7 @@ yyreduce: break; case 171: -#line 1768 "gram1.y" +#line 1772 "gram1.y" { PTR_LLND l; l = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); l->entry.string_val = (char *)"*"; @@ -6748,27 +6787,27 @@ yyreduce: break; case 172: -#line 1776 "gram1.y" +#line 1780 "gram1.y" {endioctl();;} break; case 173: -#line 1789 "gram1.y" +#line 1793 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 174: -#line 1791 "gram1.y" +#line 1795 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (2)].ll_node); ;} break; case 175: -#line 1794 "gram1.y" +#line 1798 "gram1.y" { (yyval.ll_node) = make_llnd(fi, POINTST_OP, LLNULL, (yyvsp[(2) - (2)].ll_node), SMNULL); ;} break; case 176: -#line 1798 "gram1.y" +#line 1802 "gram1.y" { PTR_SYMB s; PTR_LLND q, r; if(! (yyvsp[(5) - (5)].ll_node)) { @@ -6786,7 +6825,7 @@ yyreduce: break; case 177: -#line 1813 "gram1.y" +#line 1817 "gram1.y" { PTR_SYMB s; PTR_LLND q, r; if(! (yyvsp[(4) - (4)].ll_node)) { @@ -6802,7 +6841,7 @@ yyreduce: break; case 178: -#line 1829 "gram1.y" +#line 1833 "gram1.y" {/* PTR_SYMB s;*/ PTR_LLND r; @@ -6822,7 +6861,7 @@ yyreduce: break; case 179: -#line 1847 "gram1.y" +#line 1851 "gram1.y" { /*PTR_SYMB s;*/ PTR_LLND r; @@ -6843,7 +6882,7 @@ yyreduce: break; case 180: -#line 1867 "gram1.y" +#line 1871 "gram1.y" { PTR_SYMB s; PTR_LLND r; @@ -6866,7 +6905,7 @@ yyreduce: break; case 181: -#line 1887 "gram1.y" +#line 1891 "gram1.y" { PTR_SYMB s; PTR_LLND r; @@ -6889,7 +6928,7 @@ yyreduce: break; case 182: -#line 1909 "gram1.y" +#line 1913 "gram1.y" {/* PTR_SYMB s;*/ PTR_LLND r; @@ -6909,7 +6948,7 @@ yyreduce: break; case 183: -#line 1926 "gram1.y" +#line 1930 "gram1.y" { /*PTR_SYMB s;*/ PTR_LLND r; @@ -6928,7 +6967,7 @@ yyreduce: break; case 184: -#line 1944 "gram1.y" +#line 1948 "gram1.y" { PTR_LLND p, q; p = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); @@ -6938,7 +6977,7 @@ yyreduce: break; case 185: -#line 1951 "gram1.y" +#line 1955 "gram1.y" { PTR_LLND p, q; p = make_llnd(fi,EXPR_LIST, (yyvsp[(4) - (4)].ll_node), LLNULL, SMNULL); @@ -6948,7 +6987,7 @@ yyreduce: break; case 186: -#line 1958 "gram1.y" +#line 1962 "gram1.y" { PTR_LLND p, q; p = make_llnd(fi,EXPR_LIST, (yyvsp[(5) - (5)].ll_node), LLNULL, SMNULL); @@ -6958,7 +6997,7 @@ yyreduce: break; case 187: -#line 1965 "gram1.y" +#line 1969 "gram1.y" { PTR_LLND p, r; p = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); @@ -6971,7 +7010,7 @@ yyreduce: break; case 188: -#line 1978 "gram1.y" +#line 1982 "gram1.y" { PTR_LLND q, r; q = make_llnd(fi,EXPR_LIST, (yyvsp[(4) - (4)].ll_node), LLNULL, SMNULL); @@ -6981,7 +7020,7 @@ yyreduce: break; case 189: -#line 1985 "gram1.y" +#line 1989 "gram1.y" { PTR_LLND q, r; q = make_llnd(fi,EXPR_LIST, (yyvsp[(5) - (5)].ll_node), LLNULL, SMNULL); @@ -6991,7 +7030,7 @@ yyreduce: break; case 190: -#line 1992 "gram1.y" +#line 1996 "gram1.y" { PTR_LLND q, r; q = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); @@ -7003,22 +7042,22 @@ yyreduce: break; case 191: -#line 2003 "gram1.y" +#line 2007 "gram1.y" { (yyval.symbol) = make_local_entity((yyvsp[(2) - (3)].hash_entry), NAMELIST_NAME,global_default,LOCAL); ;} break; case 192: -#line 2007 "gram1.y" +#line 2011 "gram1.y" { (yyval.symbol) = NULL; /*make_common(look_up_sym("*"));*/ ;} break; case 193: -#line 2009 "gram1.y" +#line 2013 "gram1.y" { (yyval.symbol) = make_common((yyvsp[(2) - (3)].hash_entry)); ;} break; case 194: -#line 2014 "gram1.y" +#line 2018 "gram1.y" { PTR_SYMB s; if((yyvsp[(2) - (2)].ll_node)) { @@ -7036,7 +7075,7 @@ yyreduce: break; case 195: -#line 2032 "gram1.y" +#line 2036 "gram1.y" { PTR_LLND p, q; PTR_SYMB s; @@ -7049,7 +7088,7 @@ yyreduce: break; case 196: -#line 2043 "gram1.y" +#line 2047 "gram1.y" { PTR_LLND p, q; PTR_SYMB s; @@ -7062,7 +7101,7 @@ yyreduce: break; case 197: -#line 2055 "gram1.y" +#line 2059 "gram1.y" { PTR_LLND p, q; PTR_SYMB s; @@ -7076,7 +7115,7 @@ yyreduce: break; case 198: -#line 2067 "gram1.y" +#line 2071 "gram1.y" { PTR_LLND p, q; PTR_SYMB s; @@ -7089,7 +7128,7 @@ yyreduce: break; case 199: -#line 2081 "gram1.y" +#line 2085 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,EQUI_STAT, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL); @@ -7097,21 +7136,21 @@ yyreduce: break; case 200: -#line 2087 "gram1.y" +#line 2091 "gram1.y" { add_to_lowLevelList((yyvsp[(3) - (3)].ll_node), (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr1); ;} break; case 201: -#line 2094 "gram1.y" +#line 2098 "gram1.y" { (yyval.ll_node) = make_llnd(fi,EQUI_LIST, (yyvsp[(2) - (3)].ll_node), LLNULL, SMNULL); ;} break; case 202: -#line 2100 "gram1.y" +#line 2104 "gram1.y" { PTR_LLND p; p = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); (yyval.ll_node) = make_llnd(fi,EXPR_LIST, (yyvsp[(1) - (3)].ll_node), p, SMNULL); @@ -7119,7 +7158,7 @@ yyreduce: break; case 203: -#line 2106 "gram1.y" +#line 2110 "gram1.y" { PTR_LLND p; p = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); @@ -7128,7 +7167,7 @@ yyreduce: break; case 204: -#line 2114 "gram1.y" +#line 2118 "gram1.y" { PTR_SYMB s; s=make_scalar((yyvsp[(1) - (1)].hash_entry),TYNULL,LOCAL); (yyval.ll_node) = make_llnd(fi,VAR_REF, LLNULL, LLNULL, s); @@ -7138,7 +7177,7 @@ yyreduce: break; case 205: -#line 2121 "gram1.y" +#line 2125 "gram1.y" { PTR_SYMB s; s=make_array((yyvsp[(1) - (4)].hash_entry),TYNULL,LLNULL,0,LOCAL); (yyval.ll_node) = make_llnd(fi,ARRAY_REF, (yyvsp[(3) - (4)].ll_node), LLNULL, s); @@ -7148,7 +7187,7 @@ yyreduce: break; case 207: -#line 2140 "gram1.y" +#line 2144 "gram1.y" { PTR_LLND p; data_stat = NO; p = make_llnd(fi,STMT_STR, LLNULL, LLNULL, @@ -7159,12 +7198,12 @@ yyreduce: break; case 210: -#line 2154 "gram1.y" +#line 2158 "gram1.y" {data_stat = YES;;} break; case 211: -#line 2158 "gram1.y" +#line 2162 "gram1.y" { if (parstate == OUTSIDE) { PTR_BFND p; @@ -7186,79 +7225,79 @@ yyreduce: break; case 222: -#line 2203 "gram1.y" +#line 2207 "gram1.y" {;;} break; case 223: -#line 2207 "gram1.y" +#line 2211 "gram1.y" { (yyval.symbol)= make_scalar((yyvsp[(1) - (1)].hash_entry), TYNULL, LOCAL);;} break; case 224: -#line 2211 "gram1.y" +#line 2215 "gram1.y" { (yyval.symbol)= make_scalar((yyvsp[(1) - (1)].hash_entry), TYNULL, LOCAL); (yyval.symbol)->attr = (yyval.symbol)->attr | DATA_BIT; ;} break; case 225: -#line 2217 "gram1.y" +#line 2221 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DATA_SUBS, (yyvsp[(2) - (3)].ll_node), LLNULL, SMNULL); ;} break; case 226: -#line 2221 "gram1.y" +#line 2225 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DATA_RANGE, (yyvsp[(2) - (5)].ll_node), (yyvsp[(4) - (5)].ll_node), SMNULL); ;} break; case 227: -#line 2225 "gram1.y" +#line 2229 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 228: -#line 2227 "gram1.y" +#line 2231 "gram1.y" { (yyval.ll_node) = add_to_lowLevelList((yyvsp[(3) - (3)].ll_node), (yyvsp[(1) - (3)].ll_node)); ;} break; case 229: -#line 2231 "gram1.y" +#line 2235 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 230: -#line 2233 "gram1.y" +#line 2237 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 231: -#line 2237 "gram1.y" +#line 2241 "gram1.y" {(yyval.ll_node)= make_llnd(fi, DATA_IMPL_DO, (yyvsp[(2) - (7)].ll_node), (yyvsp[(6) - (7)].ll_node), (yyvsp[(4) - (7)].symbol)); ;} break; case 232: -#line 2241 "gram1.y" +#line 2245 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 233: -#line 2243 "gram1.y" +#line 2247 "gram1.y" { (yyval.ll_node) = add_to_lowLevelList((yyvsp[(3) - (3)].ll_node), (yyvsp[(1) - (3)].ll_node)); ;} break; case 234: -#line 2247 "gram1.y" +#line 2251 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DATA_ELT, (yyvsp[(2) - (2)].ll_node), LLNULL, (yyvsp[(1) - (2)].symbol)); ;} break; case 235: -#line 2249 "gram1.y" +#line 2253 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DATA_ELT, (yyvsp[(2) - (2)].ll_node), LLNULL, (yyvsp[(1) - (2)].symbol)); ;} break; case 236: -#line 2251 "gram1.y" +#line 2255 "gram1.y" { (yyvsp[(2) - (3)].ll_node)->entry.Template.ll_ptr2 = (yyvsp[(3) - (3)].ll_node); (yyval.ll_node) = make_llnd(fi, DATA_ELT, (yyvsp[(2) - (3)].ll_node), LLNULL, (yyvsp[(1) - (3)].symbol)); @@ -7266,24 +7305,24 @@ yyreduce: break; case 237: -#line 2256 "gram1.y" +#line 2260 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DATA_ELT, (yyvsp[(1) - (1)].ll_node), LLNULL, SMNULL); ;} break; case 251: -#line 2280 "gram1.y" +#line 2284 "gram1.y" {if((yyvsp[(2) - (6)].ll_node)->entry.Template.symbol->variant != TYPE_NAME) errstr("Undefined type %s",(yyvsp[(2) - (6)].ll_node)->entry.Template.symbol->ident,319); ;} break; case 268: -#line 2325 "gram1.y" +#line 2329 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ICON_EXPR, (yyvsp[(1) - (1)].ll_node), LLNULL, SMNULL); ;} break; case 269: -#line 2327 "gram1.y" +#line 2331 "gram1.y" { PTR_LLND p; @@ -7293,7 +7332,7 @@ yyreduce: break; case 270: -#line 2334 "gram1.y" +#line 2338 "gram1.y" { PTR_LLND p; @@ -7303,7 +7342,7 @@ yyreduce: break; case 271: -#line 2341 "gram1.y" +#line 2345 "gram1.y" { PTR_LLND p; @@ -7313,7 +7352,7 @@ yyreduce: break; case 272: -#line 2348 "gram1.y" +#line 2352 "gram1.y" { PTR_LLND p; @@ -7323,32 +7362,32 @@ yyreduce: break; case 273: -#line 2357 "gram1.y" +#line 2361 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 274: -#line 2359 "gram1.y" +#line 2363 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("*", MULT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 275: -#line 2361 "gram1.y" +#line 2365 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("/", DIV_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 276: -#line 2365 "gram1.y" +#line 2369 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 277: -#line 2367 "gram1.y" +#line 2371 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("**", EXP_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 278: -#line 2371 "gram1.y" +#line 2375 "gram1.y" { PTR_LLND p; @@ -7360,7 +7399,7 @@ yyreduce: break; case 279: -#line 2380 "gram1.y" +#line 2384 "gram1.y" { PTR_LLND p; @@ -7370,58 +7409,58 @@ yyreduce: break; case 280: -#line 2387 "gram1.y" +#line 2391 "gram1.y" { (yyval.ll_node) = make_llnd(fi,EXPR_LIST, (yyvsp[(2) - (3)].ll_node), LLNULL, SMNULL); ;} break; case 281: -#line 2394 "gram1.y" +#line 2398 "gram1.y" { (yyval.ll_node) = make_llnd(fi,EXPR_LIST, (yyvsp[(1) - (1)].ll_node), LLNULL, SMNULL); ;} break; case 282: -#line 2396 "gram1.y" +#line 2400 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 283: -#line 2400 "gram1.y" +#line 2404 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); (yyval.ll_node)->entry.Template.symbol->attr = (yyval.ll_node)->entry.Template.symbol->attr | SAVE_BIT; ;} break; case 284: -#line 2404 "gram1.y" +#line 2408 "gram1.y" { (yyval.ll_node) = make_llnd(fi,COMM_LIST, LLNULL, LLNULL, (yyvsp[(1) - (1)].symbol)); (yyval.ll_node)->entry.Template.symbol->attr = (yyval.ll_node)->entry.Template.symbol->attr | SAVE_BIT; ;} break; case 285: -#line 2410 "gram1.y" +#line 2414 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (3)].ll_node), LLNULL, EXPR_LIST); ;} break; case 286: -#line 2412 "gram1.y" +#line 2416 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node), (yyvsp[(4) - (5)].ll_node), EXPR_LIST); ;} break; case 287: -#line 2416 "gram1.y" +#line 2420 "gram1.y" { as_op_kwd_ = YES; ;} break; case 288: -#line 2420 "gram1.y" +#line 2424 "gram1.y" { as_op_kwd_ = NO; ;} break; case 289: -#line 2425 "gram1.y" +#line 2429 "gram1.y" { PTR_SYMB s; s = make_scalar((yyvsp[(1) - (1)].hash_entry), TYNULL, LOCAL); @@ -7431,7 +7470,7 @@ yyreduce: break; case 290: -#line 2432 "gram1.y" +#line 2436 "gram1.y" { PTR_SYMB s; s = make_function((yyvsp[(3) - (4)].hash_entry), global_default, LOCAL); s->variant = INTERFACE_NAME; @@ -7441,7 +7480,7 @@ yyreduce: break; case 291: -#line 2439 "gram1.y" +#line 2443 "gram1.y" { PTR_SYMB s; s = make_procedure(look_up_sym("="), LOCAL); s->variant = INTERFACE_NAME; @@ -7451,17 +7490,17 @@ yyreduce: break; case 292: -#line 2449 "gram1.y" +#line 2453 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 293: -#line 2451 "gram1.y" +#line 2455 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 294: -#line 2455 "gram1.y" +#line 2459 "gram1.y" { PTR_SYMB p; /* The check if name and expr have compatible types has @@ -7474,12 +7513,12 @@ yyreduce: break; case 295: -#line 2467 "gram1.y" +#line 2471 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, MODULE_PROC_STMT, SMNULL, (yyvsp[(2) - (2)].ll_node), LLNULL, LLNULL); ;} break; case 296: -#line 2470 "gram1.y" +#line 2474 "gram1.y" { PTR_SYMB s; PTR_LLND q; @@ -7491,7 +7530,7 @@ yyreduce: break; case 297: -#line 2479 "gram1.y" +#line 2483 "gram1.y" { PTR_LLND p, q; PTR_SYMB s; @@ -7504,7 +7543,7 @@ yyreduce: break; case 298: -#line 2492 "gram1.y" +#line 2496 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, USE_STMT, (yyvsp[(3) - (3)].symbol), LLNULL, LLNULL, LLNULL); /*add_scope_level($3->entry.Template.func_hedr, YES);*/ /*17.06.01*/ copy_module_scope((yyvsp[(3) - (3)].symbol),LLNULL); /*17.03.03*/ @@ -7513,7 +7552,7 @@ yyreduce: break; case 299: -#line 2498 "gram1.y" +#line 2502 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, USE_STMT, (yyvsp[(3) - (6)].symbol), (yyvsp[(6) - (6)].ll_node), LLNULL, LLNULL); /*add_scope_level(module_scope, YES); *//* 17.06.01*/ copy_module_scope((yyvsp[(3) - (6)].symbol),(yyvsp[(6) - (6)].ll_node)); /*17.03.03 */ @@ -7522,7 +7561,7 @@ yyreduce: break; case 300: -#line 2504 "gram1.y" +#line 2508 "gram1.y" { PTR_LLND l; l = make_llnd(fi, ONLY_NODE, LLNULL, LLNULL, SMNULL); @@ -7531,7 +7570,7 @@ yyreduce: break; case 301: -#line 2510 "gram1.y" +#line 2514 "gram1.y" { PTR_LLND l; l = make_llnd(fi, ONLY_NODE, (yyvsp[(7) - (7)].ll_node), LLNULL, SMNULL); @@ -7540,7 +7579,7 @@ yyreduce: break; case 302: -#line 2518 "gram1.y" +#line 2522 "gram1.y" { if ((yyvsp[(1) - (1)].hash_entry)->id_attr == SMNULL) warn1("Unknown module %s", (yyvsp[(1) - (1)].hash_entry)->ident,308); @@ -7551,22 +7590,22 @@ yyreduce: break; case 303: -#line 2528 "gram1.y" +#line 2532 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 304: -#line 2530 "gram1.y" +#line 2534 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 305: -#line 2534 "gram1.y" +#line 2538 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 306: -#line 2536 "gram1.y" +#line 2540 "gram1.y" { PTR_HASH oldhash,copyhash; PTR_SYMB oldsym, newsym; PTR_LLND m; @@ -7599,17 +7638,17 @@ yyreduce: break; case 307: -#line 2569 "gram1.y" +#line 2573 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 308: -#line 2571 "gram1.y" +#line 2575 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 309: -#line 2575 "gram1.y" +#line 2579 "gram1.y" { PTR_HASH oldhash,copyhash; PTR_SYMB oldsym, newsym; PTR_LLND l, m; @@ -7640,22 +7679,22 @@ yyreduce: break; case 310: -#line 2613 "gram1.y" +#line 2617 "gram1.y" { ndim = 0; explicit_shape = 1; (yyval.ll_node) = LLNULL; ;} break; case 311: -#line 2615 "gram1.y" +#line 2619 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); ;} break; case 312: -#line 2618 "gram1.y" +#line 2622 "gram1.y" { ndim = 0; explicit_shape = 1;;} break; case 313: -#line 2619 "gram1.y" +#line 2623 "gram1.y" { (yyval.ll_node) = make_llnd(fi,EXPR_LIST, (yyvsp[(2) - (2)].ll_node), LLNULL, SMNULL); (yyval.ll_node)->type = global_default; @@ -7663,12 +7702,12 @@ yyreduce: break; case 314: -#line 2624 "gram1.y" +#line 2628 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 315: -#line 2628 "gram1.y" +#line 2632 "gram1.y" { if(ndim == maxdim) err("Too many dimensions", 43); @@ -7679,7 +7718,7 @@ yyreduce: break; case 316: -#line 2636 "gram1.y" +#line 2640 "gram1.y" { if(ndim == maxdim) err("Too many dimensions", 43); @@ -7691,7 +7730,7 @@ yyreduce: break; case 317: -#line 2645 "gram1.y" +#line 2649 "gram1.y" { if(ndim == maxdim) err("Too many dimensions", 43); @@ -7703,7 +7742,7 @@ yyreduce: break; case 318: -#line 2654 "gram1.y" +#line 2658 "gram1.y" { if(ndim == maxdim) err("Too many dimensions", 43); @@ -7714,7 +7753,7 @@ yyreduce: break; case 319: -#line 2664 "gram1.y" +#line 2668 "gram1.y" { (yyval.ll_node) = make_llnd(fi,STAR_RANGE, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->type = global_default; @@ -7723,17 +7762,17 @@ yyreduce: break; case 321: -#line 2673 "gram1.y" +#line 2677 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 322: -#line 2675 "gram1.y" +#line 2679 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 323: -#line 2679 "gram1.y" +#line 2683 "gram1.y" {PTR_LABEL p; p = make_label_node(fi,convci(yyleng, yytext)); p->scope = cur_scope(); @@ -7742,7 +7781,7 @@ yyreduce: break; case 324: -#line 2687 "gram1.y" +#line 2691 "gram1.y" { /*PTR_LLND l;*/ /* l = make_llnd(fi, EXPR_LIST, $3, LLNULL, SMNULL);*/ @@ -7752,7 +7791,7 @@ yyreduce: break; case 325: -#line 2702 "gram1.y" +#line 2706 "gram1.y" { /*undeftype = YES; setimpl(TYNULL, (int)'a', (int)'z'); FB COMMENTED---> NOT QUITE RIGHT BUT AVOID PB WITH COMMON*/ (yyval.bf_node) = get_bfnd(fi,IMPL_DECL, SMNULL, LLNULL, LLNULL, LLNULL); @@ -7760,17 +7799,17 @@ yyreduce: break; case 326: -#line 2709 "gram1.y" +#line 2713 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 327: -#line 2711 "gram1.y" +#line 2715 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 328: -#line 2715 "gram1.y" +#line 2719 "gram1.y" { (yyval.ll_node) = make_llnd(fi, IMPL_TYPE, (yyvsp[(3) - (4)].ll_node), LLNULL, SMNULL); @@ -7779,37 +7818,37 @@ yyreduce: break; case 329: -#line 2730 "gram1.y" +#line 2734 "gram1.y" { implkwd = YES; ;} break; case 330: -#line 2731 "gram1.y" +#line 2735 "gram1.y" { vartype = (yyvsp[(2) - (2)].data_type); ;} break; case 331: -#line 2735 "gram1.y" +#line 2739 "gram1.y" { (yyval.data_type) = (yyvsp[(2) - (2)].data_type); ;} break; case 332: -#line 2737 "gram1.y" +#line 2741 "gram1.y" { (yyval.data_type) = (yyvsp[(1) - (1)].data_type);;} break; case 333: -#line 2749 "gram1.y" +#line 2753 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 334: -#line 2751 "gram1.y" +#line 2755 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 335: -#line 2755 "gram1.y" +#line 2759 "gram1.y" { setimpl(vartype, (int)(yyvsp[(1) - (1)].charv), (int)(yyvsp[(1) - (1)].charv)); (yyval.ll_node) = make_llnd(fi,CHAR_VAL, LLNULL, LLNULL, SMNULL); @@ -7818,7 +7857,7 @@ yyreduce: break; case 336: -#line 2761 "gram1.y" +#line 2765 "gram1.y" { PTR_LLND p,q; setimpl(vartype, (int)(yyvsp[(1) - (3)].charv), (int)(yyvsp[(3) - (3)].charv)); @@ -7831,7 +7870,7 @@ yyreduce: break; case 337: -#line 2773 "gram1.y" +#line 2777 "gram1.y" { if(yyleng!=1 || yytext[0]<'a' || yytext[0]>'z') { @@ -7843,7 +7882,7 @@ yyreduce: break; case 338: -#line 2784 "gram1.y" +#line 2788 "gram1.y" { if (parstate == OUTSIDE) { PTR_BFND p; @@ -7861,7 +7900,7 @@ yyreduce: break; case 339: -#line 2801 "gram1.y" +#line 2805 "gram1.y" { switch(parstate) { case OUTSIDE: @@ -7891,27 +7930,27 @@ yyreduce: break; case 342: -#line 2839 "gram1.y" +#line 2843 "gram1.y" { (yyval.ll_node) = LLNULL; endioctl(); ;} break; case 343: -#line 2841 "gram1.y" +#line 2845 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); endioctl();;} break; case 344: -#line 2845 "gram1.y" +#line 2849 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 345: -#line 2847 "gram1.y" +#line 2851 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 346: -#line 2849 "gram1.y" +#line 2853 "gram1.y" { PTR_LLND l; l = make_llnd(fi, KEYWORD_ARG, (yyvsp[(1) - (2)].ll_node), (yyvsp[(2) - (2)].ll_node), SMNULL); l->type = (yyvsp[(2) - (2)].ll_node)->type; @@ -7920,181 +7959,181 @@ yyreduce: break; case 347: -#line 2860 "gram1.y" +#line 2864 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (2)].ll_node), LLNULL, EXPR_LIST); endioctl(); ;} break; case 348: -#line 2864 "gram1.y" +#line 2868 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); endioctl(); ;} break; case 349: -#line 2870 "gram1.y" +#line 2874 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 350: -#line 2872 "gram1.y" +#line 2876 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 351: -#line 2876 "gram1.y" - { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} - break; - - case 352: -#line 2878 "gram1.y" - { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); ;} - break; - - case 353: #line 2880 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; - case 354: + case 352: +#line 2882 "gram1.y" + { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); ;} + break; + + case 353: #line 2884 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; - case 355: -#line 2886 "gram1.y" + case 354: +#line 2888 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; - case 356: + case 355: #line 2890 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; + case 356: +#line 2894 "gram1.y" + { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} + break; + case 357: -#line 2892 "gram1.y" +#line 2896 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("+", ADD_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 358: -#line 2894 "gram1.y" +#line 2898 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("-", SUBT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 359: -#line 2896 "gram1.y" +#line 2900 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("*", MULT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 360: -#line 2898 "gram1.y" +#line 2902 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("/", DIV_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 361: -#line 2900 "gram1.y" +#line 2904 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("**", EXP_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 362: -#line 2902 "gram1.y" +#line 2906 "gram1.y" { (yyval.ll_node) = defined_op_node((yyvsp[(1) - (2)].hash_entry), (yyvsp[(2) - (2)].ll_node), LLNULL); ;} break; case 363: -#line 2904 "gram1.y" +#line 2908 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("+", UNARY_ADD_OP, (yyvsp[(2) - (2)].ll_node), LLNULL); ;} break; case 364: -#line 2906 "gram1.y" +#line 2910 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("-", MINUS_OP, (yyvsp[(2) - (2)].ll_node), LLNULL); ;} break; case 365: -#line 2908 "gram1.y" +#line 2912 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".eq.", EQ_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 366: -#line 2910 "gram1.y" +#line 2914 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".gt.", GT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 367: -#line 2912 "gram1.y" +#line 2916 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".lt.", LT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 368: -#line 2914 "gram1.y" +#line 2918 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".ge.", GTEQL_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 369: -#line 2916 "gram1.y" +#line 2920 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".ge.", LTEQL_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 370: -#line 2918 "gram1.y" +#line 2922 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".ne.", NOTEQL_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 371: -#line 2920 "gram1.y" +#line 2924 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".eqv.", EQV_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 372: -#line 2922 "gram1.y" +#line 2926 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".neqv.", NEQV_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 373: -#line 2924 "gram1.y" +#line 2928 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".xor.", XOR_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 374: -#line 2926 "gram1.y" +#line 2930 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".or.", OR_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 375: -#line 2928 "gram1.y" +#line 2932 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".and.", AND_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 376: -#line 2930 "gram1.y" +#line 2934 "gram1.y" { (yyval.ll_node) = intrinsic_op_node(".not.", NOT_OP, (yyvsp[(2) - (2)].ll_node), LLNULL); ;} break; case 377: -#line 2932 "gram1.y" +#line 2936 "gram1.y" { (yyval.ll_node) = intrinsic_op_node("//", CONCAT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 378: -#line 2934 "gram1.y" +#line 2938 "gram1.y" { (yyval.ll_node) = defined_op_node((yyvsp[(2) - (3)].hash_entry), (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node)); ;} break; case 379: -#line 2937 "gram1.y" +#line 2941 "gram1.y" { (yyval.token) = ADD_OP; ;} break; case 380: -#line 2938 "gram1.y" +#line 2942 "gram1.y" { (yyval.token) = SUBT_OP; ;} break; case 381: -#line 2950 "gram1.y" +#line 2954 "gram1.y" { PTR_SYMB s; PTR_TYPE t; /* PTR_LLND l;*/ @@ -8169,7 +8208,7 @@ yyreduce: break; case 382: -#line 3024 "gram1.y" +#line 3028 "gram1.y" { PTR_SYMB s; (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); s= (yyval.ll_node)->entry.Template.symbol; @@ -8184,17 +8223,17 @@ yyreduce: break; case 383: -#line 3036 "gram1.y" +#line 3040 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 384: -#line 3038 "gram1.y" +#line 3042 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 385: -#line 3042 "gram1.y" +#line 3046 "gram1.y" { int num_triplets; PTR_SYMB s; /*, sym;*/ /* PTR_LLND l; */ @@ -8328,7 +8367,7 @@ yyreduce: break; case 386: -#line 3173 "gram1.y" +#line 3177 "gram1.y" { int num_triplets; PTR_SYMB s; PTR_LLND l; @@ -8381,7 +8420,7 @@ yyreduce: break; case 387: -#line 3223 "gram1.y" +#line 3227 "gram1.y" { int num_triplets; PTR_LLND l,l1,l2; PTR_TYPE tp; @@ -8427,7 +8466,7 @@ yyreduce: break; case 388: -#line 3267 "gram1.y" +#line 3271 "gram1.y" { int num_triplets; PTR_LLND l,q; @@ -8469,7 +8508,7 @@ yyreduce: break; case 389: -#line 3309 "gram1.y" +#line 3313 "gram1.y" { PTR_TYPE t; PTR_SYMB field; /* PTR_BFND at_scope;*/ @@ -8518,17 +8557,17 @@ yyreduce: break; case 390: -#line 3367 "gram1.y" +#line 3371 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 391: -#line 3369 "gram1.y" +#line 3373 "gram1.y" {(yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 392: -#line 3371 "gram1.y" +#line 3375 "gram1.y" { int num_triplets; PTR_TYPE tp; /* PTR_LLND l;*/ @@ -8570,7 +8609,7 @@ yyreduce: break; case 393: -#line 3411 "gram1.y" +#line 3415 "gram1.y" { int num_triplets; PTR_LLND l,l1,l2; @@ -8613,7 +8652,7 @@ yyreduce: break; case 394: -#line 3453 "gram1.y" +#line 3457 "gram1.y" { if ((yyvsp[(1) - (2)].ll_node)->type->variant == T_STRING) { (yyvsp[(1) - (2)].ll_node)->entry.Template.ll_ptr1 = (yyvsp[(2) - (2)].ll_node); @@ -8624,37 +8663,37 @@ yyreduce: break; case 395: -#line 3463 "gram1.y" +#line 3467 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 396: -#line 3465 "gram1.y" +#line 3469 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 397: -#line 3469 "gram1.y" +#line 3473 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DDOT, (yyvsp[(2) - (5)].ll_node), (yyvsp[(4) - (5)].ll_node), SMNULL); ;} break; case 398: -#line 3473 "gram1.y" +#line 3477 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 399: -#line 3475 "gram1.y" +#line 3479 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 400: -#line 3479 "gram1.y" +#line 3483 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 401: -#line 3481 "gram1.y" +#line 3485 "gram1.y" { PTR_TYPE t; t = make_type_node((yyvsp[(1) - (3)].ll_node)->type, (yyvsp[(3) - (3)].ll_node)); (yyval.ll_node) = (yyvsp[(1) - (3)].ll_node); @@ -8663,12 +8702,12 @@ yyreduce: break; case 402: -#line 3487 "gram1.y" +#line 3491 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 403: -#line 3489 "gram1.y" +#line 3493 "gram1.y" { PTR_TYPE t; t = make_type_node((yyvsp[(1) - (3)].ll_node)->type, (yyvsp[(3) - (3)].ll_node)); (yyval.ll_node) = (yyvsp[(1) - (3)].ll_node); @@ -8677,7 +8716,7 @@ yyreduce: break; case 404: -#line 3495 "gram1.y" +#line 3499 "gram1.y" { if ((yyvsp[(2) - (2)].ll_node) != LLNULL) { @@ -8690,7 +8729,7 @@ yyreduce: break; case 405: -#line 3508 "gram1.y" +#line 3512 "gram1.y" { (yyval.ll_node) = make_llnd(fi,BOOL_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.bval = 1; @@ -8699,7 +8738,7 @@ yyreduce: break; case 406: -#line 3514 "gram1.y" +#line 3518 "gram1.y" { (yyval.ll_node) = make_llnd(fi,BOOL_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.bval = 0; @@ -8708,7 +8747,7 @@ yyreduce: break; case 407: -#line 3521 "gram1.y" +#line 3525 "gram1.y" { (yyval.ll_node) = make_llnd(fi,FLOAT_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = copys(yytext); @@ -8717,7 +8756,7 @@ yyreduce: break; case 408: -#line 3527 "gram1.y" +#line 3531 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DOUBLE_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = copys(yytext); @@ -8726,7 +8765,7 @@ yyreduce: break; case 409: -#line 3535 "gram1.y" +#line 3539 "gram1.y" { (yyval.ll_node) = make_llnd(fi,INT_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.ival = atoi(yytext); @@ -8735,7 +8774,7 @@ yyreduce: break; case 410: -#line 3543 "gram1.y" +#line 3547 "gram1.y" { PTR_TYPE t; PTR_LLND p,q; (yyval.ll_node) = make_llnd(fi,STRING_VAL, LLNULL, LLNULL, SMNULL); @@ -8754,7 +8793,7 @@ yyreduce: break; case 411: -#line 3559 "gram1.y" +#line 3563 "gram1.y" { PTR_TYPE t; (yyval.ll_node) = make_llnd(fi,STRING_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = copys(yytext); @@ -8767,7 +8806,7 @@ yyreduce: break; case 412: -#line 3569 "gram1.y" +#line 3573 "gram1.y" { PTR_TYPE t; (yyval.ll_node) = make_llnd(fi,STRING_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = copys(yytext); @@ -8780,7 +8819,7 @@ yyreduce: break; case 413: -#line 3582 "gram1.y" +#line 3586 "gram1.y" { (yyval.ll_node) = make_llnd(fi,COMPLEX_VAL, (yyvsp[(2) - (5)].ll_node), (yyvsp[(4) - (5)].ll_node), SMNULL); (yyval.ll_node)->type = global_complex; @@ -8788,67 +8827,67 @@ yyreduce: break; case 414: -#line 3589 "gram1.y" +#line 3593 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 415: -#line 3591 "gram1.y" +#line 3595 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 416: -#line 3614 "gram1.y" +#line 3618 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),SMNULL); ;} break; case 417: -#line 3616 "gram1.y" +#line 3620 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(1) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 418: -#line 3618 "gram1.y" +#line 3622 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,make_llnd(fi,DDOT,(yyvsp[(1) - (5)].ll_node),(yyvsp[(3) - (5)].ll_node),SMNULL),(yyvsp[(5) - (5)].ll_node),SMNULL); ;} break; case 419: -#line 3620 "gram1.y" +#line 3624 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,make_llnd(fi,DDOT,(yyvsp[(1) - (4)].ll_node),LLNULL,SMNULL),(yyvsp[(4) - (4)].ll_node),SMNULL); ;} break; case 420: -#line 3622 "gram1.y" +#line 3626 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, make_llnd(fi,DDOT,LLNULL,(yyvsp[(2) - (4)].ll_node),SMNULL),(yyvsp[(4) - (4)].ll_node),SMNULL); ;} break; case 421: -#line 3624 "gram1.y" +#line 3628 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,make_llnd(fi,DDOT,LLNULL,LLNULL,SMNULL),(yyvsp[(3) - (3)].ll_node),SMNULL); ;} break; case 422: -#line 3626 "gram1.y" +#line 3630 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,LLNULL,(yyvsp[(2) - (2)].ll_node),SMNULL); ;} break; case 423: -#line 3628 "gram1.y" +#line 3632 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,LLNULL,LLNULL,SMNULL); ;} break; case 424: -#line 3631 "gram1.y" +#line 3635 "gram1.y" {in_vec=YES;;} break; case 425: -#line 3631 "gram1.y" +#line 3635 "gram1.y" {in_vec=NO;;} break; case 426: -#line 3632 "gram1.y" +#line 3636 "gram1.y" { PTR_TYPE array_type; (yyval.ll_node) = make_llnd (fi,CONSTRUCTOR_REF,(yyvsp[(4) - (6)].ll_node),LLNULL,SMNULL); /*$$->type = $2->type;*/ /*28.02.03*/ @@ -8863,81 +8902,81 @@ yyreduce: break; case 427: -#line 3646 "gram1.y" +#line 3650 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 428: -#line 3648 "gram1.y" +#line 3652 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 429: -#line 3671 "gram1.y" +#line 3675 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 430: -#line 3673 "gram1.y" +#line 3677 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); endioctl(); ;} break; case 431: -#line 3675 "gram1.y" +#line 3679 "gram1.y" { stat_alloc = make_llnd(fi, SPEC_PAIR, (yyvsp[(4) - (5)].ll_node), (yyvsp[(5) - (5)].ll_node), SMNULL); endioctl(); ;} break; case 432: -#line 3691 "gram1.y" +#line 3695 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 433: -#line 3693 "gram1.y" +#line 3697 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); endioctl(); ;} break; case 434: -#line 3695 "gram1.y" +#line 3699 "gram1.y" { stat_alloc = make_llnd(fi, SPEC_PAIR, (yyvsp[(4) - (5)].ll_node), (yyvsp[(5) - (5)].ll_node), SMNULL); endioctl(); ;} break; case 435: -#line 3708 "gram1.y" +#line 3712 "gram1.y" {stat_alloc = LLNULL;;} break; case 436: -#line 3712 "gram1.y" +#line 3716 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 437: -#line 3714 "gram1.y" +#line 3718 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 438: -#line 3722 "gram1.y" - { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} - break; - - case 439: -#line 3724 "gram1.y" - { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} - break; - - case 440: #line 3726 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; - case 441: + case 439: #line 3728 "gram1.y" + { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} + break; + + case 440: +#line 3730 "gram1.y" + { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} + break; + + case 441: +#line 3732 "gram1.y" { (yyval.bf_node) = (yyvsp[(2) - (2)].bf_node); (yyval.bf_node)->entry.Template.ll_ptr3 = (yyvsp[(1) - (2)].ll_node); @@ -8945,7 +8984,7 @@ yyreduce: break; case 442: -#line 3782 "gram1.y" +#line 3786 "gram1.y" { PTR_BFND biff; (yyval.bf_node) = get_bfnd(fi,CONTROL_END, SMNULL, LLNULL, LLNULL, LLNULL); @@ -8968,7 +9007,7 @@ yyreduce: break; case 443: -#line 3804 "gram1.y" +#line 3808 "gram1.y" { make_extend((yyvsp[(3) - (3)].symbol)); (yyval.bf_node) = BFNULL; @@ -8977,7 +9016,7 @@ yyreduce: break; case 444: -#line 3817 "gram1.y" +#line 3821 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,CONTROL_END, SMNULL, LLNULL, LLNULL, LLNULL); bind(); delete_beyond_scope_level(pred_bfnd); @@ -8986,12 +9025,12 @@ yyreduce: break; case 445: -#line 3826 "gram1.y" +#line 3830 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; case 446: -#line 3829 "gram1.y" +#line 3833 "gram1.y" { (yyval.bf_node) = (yyvsp[(2) - (2)].bf_node); (yyval.bf_node)->entry.Template.ll_ptr3 = (yyvsp[(1) - (2)].ll_node); @@ -8999,7 +9038,7 @@ yyreduce: break; case 447: -#line 3879 "gram1.y" +#line 3883 "gram1.y" { thiswasbranch = NO; (yyvsp[(1) - (2)].bf_node)->variant = LOGIF_NODE; (yyval.bf_node) = make_logif((yyvsp[(1) - (2)].bf_node), (yyvsp[(2) - (2)].bf_node)); @@ -9008,7 +9047,7 @@ yyreduce: break; case 448: -#line 3885 "gram1.y" +#line 3889 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (2)].bf_node); set_blobs((yyval.bf_node), pred_bfnd, NEW_GROUP1); @@ -9016,7 +9055,7 @@ yyreduce: break; case 449: -#line 3890 "gram1.y" +#line 3894 "gram1.y" { (yyval.bf_node) = (yyvsp[(2) - (3)].bf_node); (yyval.bf_node)->entry.Template.ll_ptr3 = (yyvsp[(1) - (3)].ll_node); @@ -9025,32 +9064,32 @@ yyreduce: break; case 450: -#line 3908 "gram1.y" +#line 3912 "gram1.y" { make_elseif((yyvsp[(4) - (7)].ll_node),(yyvsp[(7) - (7)].symbol)); lastwasbranch = NO; (yyval.bf_node) = BFNULL;;} break; case 451: -#line 3910 "gram1.y" +#line 3914 "gram1.y" { make_else((yyvsp[(3) - (3)].symbol)); lastwasbranch = NO; (yyval.bf_node) = BFNULL; ;} break; case 452: -#line 3912 "gram1.y" +#line 3916 "gram1.y" { make_endif((yyvsp[(3) - (3)].symbol)); (yyval.bf_node) = BFNULL; ;} break; case 453: -#line 3914 "gram1.y" +#line 3918 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; case 454: -#line 3916 "gram1.y" +#line 3920 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, CONTAINS_STMT, SMNULL, LLNULL, LLNULL, LLNULL); ;} break; case 455: -#line 3919 "gram1.y" +#line 3923 "gram1.y" { thiswasbranch = NO; (yyvsp[(1) - (2)].bf_node)->variant = FORALL_STAT; (yyval.bf_node) = make_logif((yyvsp[(1) - (2)].bf_node), (yyvsp[(2) - (2)].bf_node)); @@ -9059,37 +9098,37 @@ yyreduce: break; case 456: -#line 3925 "gram1.y" +#line 3929 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; case 457: -#line 3927 "gram1.y" +#line 3931 "gram1.y" { (yyval.bf_node) = (yyvsp[(2) - (2)].bf_node); (yyval.bf_node)->entry.Template.ll_ptr3 = (yyvsp[(1) - (2)].ll_node);;} break; case 458: -#line 3929 "gram1.y" +#line 3933 "gram1.y" { make_endforall((yyvsp[(3) - (3)].symbol)); (yyval.bf_node) = BFNULL; ;} break; case 459: -#line 3932 "gram1.y" - { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} - break; - - case 460: -#line 3934 "gram1.y" - { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} - break; - - case 461: #line 3936 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; + case 460: +#line 3938 "gram1.y" + { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} + break; + + case 461: +#line 3940 "gram1.y" + { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} + break; + case 462: -#line 3963 "gram1.y" +#line 3967 "gram1.y" { /* if($5 && $5->labdefined) execerr("no backward DO loops", (char *)NULL); */ @@ -9099,7 +9138,7 @@ yyreduce: break; case 463: -#line 3972 "gram1.y" +#line 3976 "gram1.y" { if( (yyvsp[(4) - (7)].label) && (yyvsp[(4) - (7)].label)->labdefined) err("No backward DO loops", 46); @@ -9108,22 +9147,22 @@ yyreduce: break; case 464: -#line 3980 "gram1.y" +#line 3984 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 465: -#line 3982 "gram1.y" +#line 3986 "gram1.y" { (yyval.ll_node) = (yyvsp[(5) - (6)].ll_node);;} break; case 466: -#line 3984 "gram1.y" +#line 3988 "gram1.y" { (yyval.ll_node) = (yyvsp[(3) - (4)].ll_node);;} break; case 467: -#line 3989 "gram1.y" +#line 3993 "gram1.y" { if( (yyvsp[(4) - (11)].label) && (yyvsp[(4) - (11)].label)->labdefined) err("No backward DO loops", 46); @@ -9132,7 +9171,7 @@ yyreduce: break; case 468: -#line 3996 "gram1.y" +#line 4000 "gram1.y" { if( (yyvsp[(4) - (13)].label) && (yyvsp[(4) - (13)].label)->labdefined) err("No backward DO loops", 46); @@ -9141,64 +9180,64 @@ yyreduce: break; case 469: -#line 4004 "gram1.y" +#line 4008 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, CASE_NODE, (yyvsp[(4) - (4)].symbol), (yyvsp[(3) - (4)].ll_node), LLNULL, LLNULL); ;} break; case 470: -#line 4006 "gram1.y" +#line 4010 "gram1.y" { /*PTR_LLND p;*/ /* p = make_llnd(fi, DEFAULT, LLNULL, LLNULL, SMNULL); */ (yyval.bf_node) = get_bfnd(fi, DEFAULT_NODE, (yyvsp[(3) - (3)].symbol), LLNULL, LLNULL, LLNULL); ;} break; case 471: -#line 4010 "gram1.y" +#line 4014 "gram1.y" { make_endselect((yyvsp[(3) - (3)].symbol)); (yyval.bf_node) = BFNULL; ;} break; case 472: -#line 4013 "gram1.y" +#line 4017 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, SWITCH_NODE, SMNULL, (yyvsp[(6) - (7)].ll_node), LLNULL, LLNULL) ; ;} break; case 473: -#line 4015 "gram1.y" +#line 4019 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, SWITCH_NODE, SMNULL, (yyvsp[(7) - (8)].ll_node), LLNULL, (yyvsp[(1) - (8)].ll_node)) ; ;} break; case 474: -#line 4019 "gram1.y" +#line 4023 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); ;} break; case 475: -#line 4025 "gram1.y" +#line 4029 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 476: -#line 4027 "gram1.y" +#line 4031 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DDOT, (yyvsp[(1) - (2)].ll_node), LLNULL, SMNULL); ;} break; case 477: -#line 4029 "gram1.y" +#line 4033 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DDOT, LLNULL, (yyvsp[(2) - (2)].ll_node), SMNULL); ;} break; case 478: -#line 4031 "gram1.y" +#line 4035 "gram1.y" { (yyval.ll_node) = make_llnd(fi, DDOT, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); ;} break; case 479: -#line 4035 "gram1.y" +#line 4039 "gram1.y" { (yyval.ll_node) = make_llnd(fi, EXPR_LIST, (yyvsp[(1) - (1)].ll_node), LLNULL, SMNULL); ;} break; case 480: -#line 4037 "gram1.y" +#line 4041 "gram1.y" { PTR_LLND p; p = make_llnd(fi, EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); @@ -9207,33 +9246,33 @@ yyreduce: break; case 481: -#line 4045 "gram1.y" +#line 4049 "gram1.y" { (yyval.symbol) = SMNULL; ;} break; case 482: -#line 4047 "gram1.y" +#line 4051 "gram1.y" { (yyval.symbol) = make_local_entity((yyvsp[(1) - (1)].hash_entry), CONSTRUCT_NAME, global_default, LOCAL); ;} break; case 483: -#line 4053 "gram1.y" +#line 4057 "gram1.y" {(yyval.hash_entry) = HSNULL;;} break; case 484: -#line 4055 "gram1.y" +#line 4059 "gram1.y" { (yyval.hash_entry) = (yyvsp[(1) - (1)].hash_entry);;} break; case 485: -#line 4059 "gram1.y" +#line 4063 "gram1.y" {(yyval.hash_entry) = look_up_sym(yytext);;} break; case 486: -#line 4063 "gram1.y" +#line 4067 "gram1.y" { PTR_SYMB s; s = make_local_entity( (yyvsp[(1) - (2)].hash_entry), CONSTRUCT_NAME, global_default, LOCAL); (yyval.ll_node) = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s); @@ -9241,22 +9280,22 @@ yyreduce: break; case 487: -#line 4084 "gram1.y" +#line 4088 "gram1.y" { (yyval.bf_node) = make_if((yyvsp[(4) - (5)].ll_node)); ;} break; case 488: -#line 4087 "gram1.y" +#line 4091 "gram1.y" { (yyval.bf_node) = make_forall((yyvsp[(4) - (6)].ll_node),(yyvsp[(5) - (6)].ll_node)); ;} break; case 489: -#line 4091 "gram1.y" +#line 4095 "gram1.y" { (yyval.ll_node) = make_llnd(fi, EXPR_LIST, (yyvsp[(1) - (1)].ll_node), LLNULL, SMNULL); ;} break; case 490: -#line 4093 "gram1.y" +#line 4097 "gram1.y" { PTR_LLND p; p = make_llnd(fi, EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); add_to_lowLevelList(p, (yyvsp[(1) - (3)].ll_node)); @@ -9264,22 +9303,22 @@ yyreduce: break; case 491: -#line 4100 "gram1.y" +#line 4104 "gram1.y" {(yyval.ll_node) = make_llnd(fi, FORALL_OP, (yyvsp[(3) - (3)].ll_node), LLNULL, (yyvsp[(1) - (3)].symbol)); ;} break; case 492: -#line 4104 "gram1.y" +#line 4108 "gram1.y" { (yyval.ll_node)=LLNULL;;} break; case 493: -#line 4106 "gram1.y" +#line 4110 "gram1.y" { (yyval.ll_node)=(yyvsp[(2) - (2)].ll_node);;} break; case 494: -#line 4117 "gram1.y" +#line 4121 "gram1.y" { PTR_SYMB s; s = (yyvsp[(1) - (1)].hash_entry)->id_attr; if (!s || s->variant == DEFAULT) @@ -9292,7 +9331,7 @@ yyreduce: break; case 495: -#line 4130 "gram1.y" +#line 4134 "gram1.y" { PTR_SYMB s; PTR_LLND l; int vrnt; @@ -9317,7 +9356,7 @@ yyreduce: break; case 496: -#line 4153 "gram1.y" +#line 4157 "gram1.y" { PTR_SYMB s; PTR_LLND l; int vrnt; @@ -9341,12 +9380,12 @@ yyreduce: break; case 497: -#line 4176 "gram1.y" +#line 4180 "gram1.y" { (yyval.label) = LBNULL; ;} break; case 498: -#line 4178 "gram1.y" +#line 4182 "gram1.y" { (yyval.label) = make_label_node(fi,convci(yyleng, yytext)); (yyval.label)->scope = cur_scope(); @@ -9354,32 +9393,32 @@ yyreduce: break; case 499: -#line 4185 "gram1.y" +#line 4189 "gram1.y" { make_endwhere((yyvsp[(3) - (3)].symbol)); (yyval.bf_node) = BFNULL; ;} break; case 500: -#line 4187 "gram1.y" +#line 4191 "gram1.y" { make_elsewhere((yyvsp[(3) - (3)].symbol)); lastwasbranch = NO; (yyval.bf_node) = BFNULL; ;} break; case 501: -#line 4189 "gram1.y" +#line 4193 "gram1.y" { make_elsewhere_mask((yyvsp[(4) - (6)].ll_node),(yyvsp[(6) - (6)].symbol)); lastwasbranch = NO; (yyval.bf_node) = BFNULL; ;} break; case 502: -#line 4191 "gram1.y" +#line 4195 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, WHERE_BLOCK_STMT, SMNULL, (yyvsp[(4) - (5)].ll_node), LLNULL, LLNULL); ;} break; case 503: -#line 4193 "gram1.y" +#line 4197 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, WHERE_BLOCK_STMT, SMNULL, (yyvsp[(5) - (6)].ll_node), LLNULL, (yyvsp[(1) - (6)].ll_node)); ;} break; case 504: -#line 4198 "gram1.y" +#line 4202 "gram1.y" { PTR_LLND p, r; PTR_SYMB s1, s2 = SMNULL, s3, arg_list; PTR_HASH hash_entry; @@ -9458,7 +9497,7 @@ yyreduce: break; case 505: -#line 4274 "gram1.y" +#line 4278 "gram1.y" { /*PTR_SYMB s;*/ /*s = make_scalar($2, TYNULL, LOCAL);*/ @@ -9467,7 +9506,7 @@ yyreduce: break; case 506: -#line 4286 "gram1.y" +#line 4290 "gram1.y" { PTR_SYMB p; p = make_scalar((yyvsp[(5) - (5)].hash_entry), TYNULL, LOCAL); @@ -9477,17 +9516,17 @@ yyreduce: break; case 507: -#line 4293 "gram1.y" +#line 4297 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,CONT_STAT,SMNULL,LLNULL,LLNULL,LLNULL); ;} break; case 509: -#line 4296 "gram1.y" +#line 4300 "gram1.y" { inioctl = NO; ;} break; case 510: -#line 4298 "gram1.y" +#line 4302 "gram1.y" { PTR_LLND p; p = make_llnd(fi,EXPR_LIST, (yyvsp[(10) - (10)].ll_node), LLNULL, SMNULL); @@ -9499,7 +9538,7 @@ yyreduce: break; case 511: -#line 4307 "gram1.y" +#line 4311 "gram1.y" { (yyval.bf_node) = subroutine_call((yyvsp[(1) - (1)].symbol), LLNULL, LLNULL, PLAIN); /* match_parameters($1, LLNULL); @@ -9509,7 +9548,7 @@ yyreduce: break; case 512: -#line 4314 "gram1.y" +#line 4318 "gram1.y" { (yyval.bf_node) = subroutine_call((yyvsp[(1) - (3)].symbol), LLNULL, LLNULL, PLAIN); /* match_parameters($1, LLNULL); @@ -9519,7 +9558,7 @@ yyreduce: break; case 513: -#line 4321 "gram1.y" +#line 4325 "gram1.y" { (yyval.bf_node) = subroutine_call((yyvsp[(1) - (4)].symbol), (yyvsp[(3) - (4)].ll_node), LLNULL, PLAIN); /* match_parameters($1, $3); @@ -9529,7 +9568,7 @@ yyreduce: break; case 514: -#line 4329 "gram1.y" +#line 4333 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,RETURN_STAT,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL); thiswasbranch = YES; @@ -9537,7 +9576,7 @@ yyreduce: break; case 515: -#line 4334 "gram1.y" +#line 4338 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,(yyvsp[(1) - (3)].token),SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL); thiswasbranch = ((yyvsp[(1) - (3)].token) == STOP_STAT); @@ -9545,42 +9584,42 @@ yyreduce: break; case 516: -#line 4339 "gram1.y" +#line 4343 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, CYCLE_STMT, (yyvsp[(3) - (3)].symbol), LLNULL, LLNULL, LLNULL); ;} break; case 517: -#line 4342 "gram1.y" +#line 4346 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, EXIT_STMT, (yyvsp[(3) - (3)].symbol), LLNULL, LLNULL, LLNULL); ;} break; case 518: -#line 4345 "gram1.y" +#line 4349 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, ALLOCATE_STMT, SMNULL, (yyvsp[(5) - (6)].ll_node), stat_alloc, LLNULL); ;} break; case 519: -#line 4348 "gram1.y" +#line 4352 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, DEALLOCATE_STMT, SMNULL, (yyvsp[(5) - (6)].ll_node), stat_alloc , LLNULL); ;} break; case 520: -#line 4351 "gram1.y" +#line 4355 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, NULLIFY_STMT, SMNULL, (yyvsp[(4) - (5)].ll_node), LLNULL, LLNULL); ;} break; case 521: -#line 4354 "gram1.y" +#line 4358 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, WHERE_NODE, SMNULL, (yyvsp[(4) - (8)].ll_node), (yyvsp[(6) - (8)].ll_node), (yyvsp[(8) - (8)].ll_node)); ;} break; case 522: -#line 4372 "gram1.y" +#line 4376 "gram1.y" {(yyval.ll_node) = LLNULL;;} break; case 523: -#line 4376 "gram1.y" +#line 4380 "gram1.y" { (yyval.bf_node)=get_bfnd(fi,GOTO_NODE,SMNULL,LLNULL,LLNULL,(PTR_LLND)(yyvsp[(3) - (3)].ll_node)); thiswasbranch = YES; @@ -9588,7 +9627,7 @@ yyreduce: break; case 524: -#line 4381 "gram1.y" +#line 4385 "gram1.y" { PTR_SYMB p; if((yyvsp[(3) - (3)].hash_entry)->id_attr) @@ -9610,7 +9649,7 @@ yyreduce: break; case 525: -#line 4400 "gram1.y" +#line 4404 "gram1.y" { PTR_SYMB p; if((yyvsp[(3) - (7)].hash_entry)->id_attr) @@ -9632,17 +9671,17 @@ yyreduce: break; case 526: -#line 4419 "gram1.y" +#line 4423 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,COMGOTO_NODE, SMNULL, (yyvsp[(4) - (7)].ll_node), (yyvsp[(7) - (7)].ll_node), LLNULL); ;} break; case 529: -#line 4427 "gram1.y" +#line 4431 "gram1.y" { (yyval.symbol) = make_procedure((yyvsp[(3) - (4)].hash_entry), LOCAL); ;} break; case 530: -#line 4431 "gram1.y" +#line 4435 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (2)].ll_node), LLNULL, EXPR_LIST); endioctl(); @@ -9650,7 +9689,7 @@ yyreduce: break; case 531: -#line 4436 "gram1.y" +#line 4440 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); endioctl(); @@ -9658,32 +9697,32 @@ yyreduce: break; case 532: -#line 4443 "gram1.y" +#line 4447 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 533: -#line 4445 "gram1.y" +#line 4449 "gram1.y" { (yyval.ll_node) = make_llnd(fi, KEYWORD_ARG, (yyvsp[(1) - (2)].ll_node), (yyvsp[(2) - (2)].ll_node), SMNULL); ;} break; case 534: -#line 4447 "gram1.y" +#line 4451 "gram1.y" { (yyval.ll_node) = make_llnd(fi,LABEL_ARG,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 535: -#line 4450 "gram1.y" +#line 4454 "gram1.y" { (yyval.token) = PAUSE_NODE; ;} break; case 536: -#line 4451 "gram1.y" +#line 4455 "gram1.y" { (yyval.token) = STOP_STAT; ;} break; case 537: -#line 4462 "gram1.y" +#line 4466 "gram1.y" { if(parstate == OUTSIDE) { PTR_BFND p; @@ -9699,23 +9738,23 @@ yyreduce: break; case 538: -#line 4477 "gram1.y" +#line 4481 "gram1.y" { intonly = YES; ;} break; case 539: -#line 4481 "gram1.y" +#line 4485 "gram1.y" { intonly = NO; ;} break; case 540: -#line 4489 "gram1.y" +#line 4493 "gram1.y" { (yyvsp[(1) - (2)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (2)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (2)].bf_node); ;} break; case 541: -#line 4492 "gram1.y" +#line 4496 "gram1.y" { PTR_LLND p, q = LLNULL; q = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -9728,7 +9767,7 @@ yyreduce: break; case 542: -#line 4502 "gram1.y" +#line 4506 "gram1.y" { PTR_LLND p, q, r; p = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -9744,7 +9783,7 @@ yyreduce: break; case 543: -#line 4515 "gram1.y" +#line 4519 "gram1.y" { PTR_LLND p, q, r; p = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -9760,113 +9799,113 @@ yyreduce: break; case 544: -#line 4528 "gram1.y" +#line 4532 "gram1.y" { (yyvsp[(1) - (2)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (2)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (2)].bf_node); ;} break; case 545: -#line 4531 "gram1.y" +#line 4535 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; case 546: -#line 4533 "gram1.y" +#line 4537 "gram1.y" { (yyvsp[(1) - (2)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (2)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (2)].bf_node); ;} break; case 547: -#line 4536 "gram1.y" +#line 4540 "gram1.y" { (yyvsp[(1) - (2)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (2)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (2)].bf_node); ;} break; case 548: -#line 4539 "gram1.y" +#line 4543 "gram1.y" { (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (3)].ll_node); (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr1 = (yyvsp[(3) - (3)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (3)].bf_node); ;} break; case 549: -#line 4543 "gram1.y" +#line 4547 "gram1.y" { (yyvsp[(1) - (4)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (4)].ll_node); (yyvsp[(1) - (4)].bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (4)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (4)].bf_node); ;} break; case 550: -#line 4552 "gram1.y" +#line 4556 "gram1.y" { (yyvsp[(1) - (2)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (2)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (2)].bf_node); ;} break; case 551: -#line 4555 "gram1.y" +#line 4559 "gram1.y" { (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr2 = (yyvsp[(2) - (3)].ll_node); (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr1 = (yyvsp[(3) - (3)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (3)].bf_node); ;} break; case 552: -#line 4559 "gram1.y" +#line 4563 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (1)].bf_node); ;} break; case 553: -#line 4561 "gram1.y" +#line 4565 "gram1.y" { (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr1 = (yyvsp[(3) - (3)].ll_node); (yyval.bf_node) = (yyvsp[(1) - (3)].bf_node); ;} break; case 554: -#line 4567 "gram1.y" +#line 4571 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (3)].bf_node); ;} break; case 555: -#line 4571 "gram1.y" +#line 4575 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, BACKSPACE_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 556: -#line 4573 "gram1.y" +#line 4577 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, REWIND_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 557: -#line 4575 "gram1.y" +#line 4579 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, ENDFILE_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 558: -#line 4582 "gram1.y" +#line 4586 "gram1.y" { (yyval.bf_node) = (yyvsp[(1) - (3)].bf_node); ;} break; case 559: -#line 4586 "gram1.y" +#line 4590 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, OPEN_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 560: -#line 4588 "gram1.y" +#line 4592 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, CLOSE_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 561: -#line 4592 "gram1.y" +#line 4596 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, INQUIRE_STAT, SMNULL, LLNULL, (yyvsp[(4) - (4)].ll_node), LLNULL);;} break; case 562: -#line 4594 "gram1.y" +#line 4598 "gram1.y" { (yyval.bf_node) = get_bfnd(fi, INQUIRE_STAT, SMNULL, (yyvsp[(5) - (5)].ll_node), (yyvsp[(4) - (5)].ll_node), LLNULL);;} break; case 563: -#line 4598 "gram1.y" +#line 4602 "gram1.y" { PTR_LLND p; PTR_LLND q = LLNULL; @@ -9888,7 +9927,7 @@ yyreduce: break; case 564: -#line 4617 "gram1.y" +#line 4621 "gram1.y" { PTR_LLND p; PTR_LLND q; @@ -9904,7 +9943,7 @@ yyreduce: break; case 565: -#line 4633 "gram1.y" +#line 4637 "gram1.y" { PTR_LLND p; p = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -9916,7 +9955,7 @@ yyreduce: break; case 566: -#line 4644 "gram1.y" +#line 4648 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); endioctl(); @@ -9924,17 +9963,17 @@ yyreduce: break; case 567: -#line 4651 "gram1.y" +#line 4655 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); endioctl();;} break; case 568: -#line 4653 "gram1.y" +#line 4657 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); endioctl();;} break; case 569: -#line 4657 "gram1.y" +#line 4661 "gram1.y" { PTR_LLND p; PTR_LLND q; @@ -9963,7 +10002,7 @@ yyreduce: break; case 570: -#line 4683 "gram1.y" +#line 4687 "gram1.y" { PTR_LLND p; PTR_LLND q; @@ -9981,7 +10020,7 @@ yyreduce: break; case 571: -#line 4698 "gram1.y" +#line 4702 "gram1.y" { PTR_LLND p; PTR_LLND q; @@ -9999,7 +10038,7 @@ yyreduce: break; case 572: -#line 4713 "gram1.y" +#line 4717 "gram1.y" { PTR_LLND p; char *q; @@ -10019,7 +10058,7 @@ yyreduce: break; case 573: -#line 4730 "gram1.y" +#line 4734 "gram1.y" { PTR_LLND p; p = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -10030,7 +10069,7 @@ yyreduce: break; case 574: -#line 4738 "gram1.y" +#line 4742 "gram1.y" { PTR_LLND p; p = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); p->entry.string_val = (char *)"*"; @@ -10040,7 +10079,7 @@ yyreduce: break; case 575: -#line 4747 "gram1.y" +#line 4751 "gram1.y" { (yyval.ll_node) = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = copys(yytext); (yyval.ll_node)->type = global_string; @@ -10048,17 +10087,17 @@ yyreduce: break; case 576: -#line 4755 "gram1.y" +#line 4759 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, READ_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 577: -#line 4760 "gram1.y" +#line 4764 "gram1.y" {(yyval.bf_node) = get_bfnd(fi, WRITE_STAT, SMNULL, LLNULL, LLNULL, LLNULL);;} break; case 578: -#line 4765 "gram1.y" +#line 4769 "gram1.y" { PTR_LLND p, q, l; @@ -10083,7 +10122,7 @@ yyreduce: break; case 579: -#line 4787 "gram1.y" +#line 4791 "gram1.y" { PTR_LLND p, q, r; p = make_llnd(fi, KEYWORD_VAL, LLNULL, LLNULL, SMNULL); @@ -10099,22 +10138,22 @@ yyreduce: break; case 580: -#line 4803 "gram1.y" +#line 4807 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST);;} break; case 581: -#line 4805 "gram1.y" +#line 4809 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST);;} break; case 582: -#line 4809 "gram1.y" +#line 4813 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 583: -#line 4811 "gram1.y" +#line 4815 "gram1.y" { (yyvsp[(4) - (5)].ll_node)->entry.Template.ll_ptr1 = (yyvsp[(2) - (5)].ll_node); (yyval.ll_node) = (yyvsp[(4) - (5)].ll_node); @@ -10122,64 +10161,64 @@ yyreduce: break; case 584: -#line 4818 "gram1.y" +#line 4822 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (1)].ll_node)->type;;} break; case 585: -#line 4820 "gram1.y" +#line 4824 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 586: -#line 4822 "gram1.y" +#line 4826 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 587: -#line 4826 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} - break; - - case 588: -#line 4828 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} - break; - - case 589: #line 4830 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} break; - case 590: + case 588: #line 4832 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} break; - case 591: + case 589: #line 4834 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} break; - case 592: + case 590: #line 4836 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} break; - case 593: + case 591: +#line 4838 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} + break; + + case 592: #line 4840 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(1) - (3)].ll_node)->type;;} + break; + + case 593: +#line 4844 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); (yyval.ll_node)->type = global_complex; ;} break; case 594: -#line 4843 "gram1.y" +#line 4847 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (3)].ll_node), LLNULL, EXPR_LIST); (yyval.ll_node)->type = (yyvsp[(2) - (3)].ll_node)->type; ;} break; case 595: -#line 4846 "gram1.y" +#line 4850 "gram1.y" { (yyvsp[(4) - (5)].ll_node)->entry.Template.ll_ptr1 = (yyvsp[(2) - (5)].ll_node); (yyval.ll_node) = set_ll_list((yyvsp[(4) - (5)].ll_node), LLNULL, EXPR_LIST); @@ -10188,7 +10227,7 @@ yyreduce: break; case 596: -#line 4852 "gram1.y" +#line 4856 "gram1.y" { (yyvsp[(4) - (5)].ll_node)->entry.Template.ll_ptr1 = (yyvsp[(2) - (5)].ll_node); (yyval.ll_node) = set_ll_list((yyvsp[(4) - (5)].ll_node), LLNULL, EXPR_LIST); @@ -10197,7 +10236,7 @@ yyreduce: break; case 597: -#line 4858 "gram1.y" +#line 4862 "gram1.y" { (yyvsp[(4) - (5)].ll_node)->entry.Template.ll_ptr1 = (yyvsp[(2) - (5)].ll_node); (yyval.ll_node) = set_ll_list((yyvsp[(4) - (5)].ll_node), LLNULL, EXPR_LIST); @@ -10206,37 +10245,37 @@ yyreduce: break; case 598: -#line 4866 "gram1.y" +#line 4870 "gram1.y" { inioctl = YES; ;} break; case 599: -#line 4870 "gram1.y" +#line 4874 "gram1.y" { startioctl();;} break; case 600: -#line 4878 "gram1.y" +#line 4882 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 601: -#line 4880 "gram1.y" +#line 4884 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); ;} break; case 602: -#line 4884 "gram1.y" +#line 4888 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 603: -#line 4886 "gram1.y" +#line 4890 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 604: -#line 4888 "gram1.y" +#line 4892 "gram1.y" { (yyval.ll_node) = make_llnd(fi,(yyvsp[(2) - (3)].token), (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); set_expr_type((yyval.ll_node)); @@ -10244,7 +10283,7 @@ yyreduce: break; case 605: -#line 4893 "gram1.y" +#line 4897 "gram1.y" { (yyval.ll_node) = make_llnd(fi,MULT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); set_expr_type((yyval.ll_node)); @@ -10252,7 +10291,7 @@ yyreduce: break; case 606: -#line 4898 "gram1.y" +#line 4902 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DIV_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); set_expr_type((yyval.ll_node)); @@ -10260,7 +10299,7 @@ yyreduce: break; case 607: -#line 4903 "gram1.y" +#line 4907 "gram1.y" { (yyval.ll_node) = make_llnd(fi,EXP_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); set_expr_type((yyval.ll_node)); @@ -10268,7 +10307,7 @@ yyreduce: break; case 608: -#line 4908 "gram1.y" +#line 4912 "gram1.y" { if((yyvsp[(1) - (2)].token) == SUBT_OP) { @@ -10280,7 +10319,7 @@ yyreduce: break; case 609: -#line 4917 "gram1.y" +#line 4921 "gram1.y" { (yyval.ll_node) = make_llnd(fi,CONCAT_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); set_expr_type((yyval.ll_node)); @@ -10288,17 +10327,17 @@ yyreduce: break; case 610: -#line 4922 "gram1.y" +#line 4926 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 611: -#line 4927 "gram1.y" +#line 4931 "gram1.y" { comments = cur_comment = CMNULL; ;} break; case 612: -#line 4929 "gram1.y" +#line 4933 "gram1.y" { PTR_CMNT p; p = make_comment(fi,*commentbuf, HALF); if (cur_comment) @@ -10315,12 +10354,12 @@ yyreduce: break; case 676: -#line 5012 "gram1.y" +#line 5016 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,HPF_TEMPLATE_STAT, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL); ;} break; case 677: -#line 5014 "gram1.y" +#line 5018 "gram1.y" { PTR_SYMB s; if((yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr2) { @@ -10332,7 +10371,7 @@ yyreduce: break; case 678: -#line 5025 "gram1.y" +#line 5029 "gram1.y" {PTR_SYMB s; PTR_LLND q; /* 27.06.18 @@ -10354,22 +10393,22 @@ yyreduce: break; case 679: -#line 5046 "gram1.y" +#line 5050 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_DYNAMIC_DIR, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL);;} break; case 680: -#line 5050 "gram1.y" +#line 5054 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 681: -#line 5052 "gram1.y" +#line 5056 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 682: -#line 5056 "gram1.y" +#line 5060 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); if(s->attr & DYNAMIC_BIT) @@ -10383,22 +10422,22 @@ yyreduce: break; case 683: -#line 5069 "gram1.y" +#line 5073 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_INHERIT_DIR, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL);;} break; case 684: -#line 5073 "gram1.y" +#line 5077 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 685: -#line 5075 "gram1.y" +#line 5079 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 686: -#line 5079 "gram1.y" +#line 5083 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); if((s->attr & PROCESSORS_BIT) ||(s->attr & TASK_BIT) || (s->attr & TEMPLATE_BIT) || (s->attr & ALIGN_BIT) || (s->attr & DISTRIBUTE_BIT)) @@ -10410,7 +10449,7 @@ yyreduce: break; case 687: -#line 5090 "gram1.y" +#line 5094 "gram1.y" { PTR_LLND q; q = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); /* (void)fprintf(stderr,"hpf.gram: shadow\n");*/ @@ -10419,32 +10458,32 @@ yyreduce: break; case 688: -#line 5101 "gram1.y" +#line 5105 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node);;} break; case 689: -#line 5105 "gram1.y" +#line 5109 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 690: -#line 5107 "gram1.y" +#line 5111 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 691: -#line 5111 "gram1.y" +#line 5115 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 692: -#line 5113 "gram1.y" +#line 5117 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL);;} break; case 693: -#line 5115 "gram1.y" +#line 5119 "gram1.y" { if(parstate!=INEXEC) err("Illegal shadow width specification", 56); @@ -10453,7 +10492,7 @@ yyreduce: break; case 694: -#line 5130 "gram1.y" +#line 5134 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); if(s->attr & SHADOW_BIT) @@ -10467,7 +10506,7 @@ yyreduce: break; case 695: -#line 5142 "gram1.y" +#line 5146 "gram1.y" { PTR_SYMB s; PTR_LLND q, r; if(! explicit_shape) { @@ -10490,7 +10529,7 @@ yyreduce: break; case 696: -#line 5162 "gram1.y" +#line 5166 "gram1.y" { PTR_SYMB s; PTR_LLND q, r; if(! explicit_shape) { @@ -10513,7 +10552,7 @@ yyreduce: break; case 697: -#line 5182 "gram1.y" +#line 5186 "gram1.y" { PTR_SYMB s; PTR_LLND q, r; if(! explicit_shape) { @@ -10536,7 +10575,7 @@ yyreduce: break; case 698: -#line 5204 "gram1.y" +#line 5208 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10545,7 +10584,7 @@ yyreduce: break; case 699: -#line 5210 "gram1.y" +#line 5214 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10555,7 +10594,7 @@ yyreduce: break; case 700: -#line 5219 "gram1.y" +#line 5223 "gram1.y" {(yyval.symbol) = make_local_entity((yyvsp[(1) - (1)].hash_entry), REF_GROUP_NAME,global_default,LOCAL); if((yyval.symbol)->attr & INDIRECT_BIT) errstr( "Multiple declaration of identifier %s ", (yyval.symbol)->ident, 73); @@ -10564,7 +10603,7 @@ yyreduce: break; case 701: -#line 5227 "gram1.y" +#line 5231 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10573,7 +10612,7 @@ yyreduce: break; case 702: -#line 5233 "gram1.y" +#line 5237 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10582,7 +10621,7 @@ yyreduce: break; case 703: -#line 5241 "gram1.y" +#line 5245 "gram1.y" {(yyval.symbol) = make_local_entity((yyvsp[(1) - (1)].hash_entry), REF_GROUP_NAME,global_default,LOCAL); if((yyval.symbol)->attr & INDIRECT_BIT) errstr( "Inconsistent declaration of identifier %s ", (yyval.symbol)->ident, 16); @@ -10590,7 +10629,7 @@ yyreduce: break; case 704: -#line 5248 "gram1.y" +#line 5252 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10599,7 +10638,7 @@ yyreduce: break; case 705: -#line 5254 "gram1.y" +#line 5258 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10609,12 +10648,12 @@ yyreduce: break; case 706: -#line 5263 "gram1.y" +#line 5267 "gram1.y" {(yyval.symbol) = make_local_entity((yyvsp[(1) - (1)].hash_entry), REDUCTION_GROUP_NAME,global_default,LOCAL);;} break; case 707: -#line 5267 "gram1.y" +#line 5271 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10623,7 +10662,7 @@ yyreduce: break; case 708: -#line 5273 "gram1.y" +#line 5277 "gram1.y" { PTR_LLND q,r; q = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(3) - (3)].symbol)); r = make_llnd(fi,EXPR_LIST, q, LLNULL, SMNULL); @@ -10632,12 +10671,12 @@ yyreduce: break; case 709: -#line 5281 "gram1.y" +#line 5285 "gram1.y" {(yyval.symbol) = make_local_entity((yyvsp[(1) - (1)].hash_entry), CONSISTENT_GROUP_NAME,global_default,LOCAL);;} break; case 710: -#line 5295 "gram1.y" +#line 5299 "gram1.y" { PTR_SYMB s; if(parstate == INEXEC){ if (!(s = (yyvsp[(2) - (3)].hash_entry)->id_attr)) @@ -10653,12 +10692,12 @@ yyreduce: break; case 711: -#line 5308 "gram1.y" +#line 5312 "gram1.y" { (yyval.ll_node) = LLNULL; opt_kwd_ = NO;;} break; case 712: -#line 5314 "gram1.y" +#line 5318 "gram1.y" { PTR_LLND q; if(!(yyvsp[(4) - (5)].ll_node)) err("Distribution format list is omitted", 51); @@ -10670,7 +10709,7 @@ yyreduce: break; case 713: -#line 5330 "gram1.y" +#line 5334 "gram1.y" { PTR_LLND q; /* if(!$4) {err("Distribution format is omitted", 51); errcnt--;} @@ -10687,7 +10726,7 @@ yyreduce: break; case 714: -#line 5345 "gram1.y" +#line 5349 "gram1.y" { /* r = LLNULL; if($5){ @@ -10701,27 +10740,27 @@ yyreduce: break; case 715: -#line 5373 "gram1.y" +#line 5377 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 716: -#line 5375 "gram1.y" +#line 5379 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 717: -#line 5379 "gram1.y" +#line 5383 "gram1.y" {(yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 718: -#line 5381 "gram1.y" +#line 5385 "gram1.y" {(yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 719: -#line 5385 "gram1.y" +#line 5389 "gram1.y" { PTR_SYMB s; if(parstate == INEXEC){ @@ -10751,7 +10790,7 @@ yyreduce: break; case 720: -#line 5414 "gram1.y" +#line 5418 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (4)].hash_entry), TYNULL, LLNULL, 0, LOCAL); @@ -10774,7 +10813,7 @@ yyreduce: break; case 721: -#line 5437 "gram1.y" +#line 5441 "gram1.y" { PTR_SYMB s; if((s=(yyvsp[(1) - (1)].hash_entry)->id_attr) == SMNULL) s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); @@ -10785,44 +10824,44 @@ yyreduce: break; case 722: -#line 5457 "gram1.y" +#line 5461 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 723: -#line 5459 "gram1.y" +#line 5463 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (2)].ll_node);;} break; case 724: -#line 5463 "gram1.y" +#line 5467 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node);;} break; case 725: -#line 5484 "gram1.y" +#line 5488 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (2)].ll_node),LLNULL,EXPR_LIST); ;} break; case 726: -#line 5486 "gram1.y" +#line 5490 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node),(yyvsp[(4) - (4)].ll_node),EXPR_LIST); ;} break; case 727: -#line 5489 "gram1.y" +#line 5493 "gram1.y" { opt_kwd_ = YES; ;} break; case 728: -#line 5498 "gram1.y" +#line 5502 "gram1.y" { (yyval.ll_node) = make_llnd(fi,BLOCK_OP, LLNULL, LLNULL, SMNULL); ;} break; case 729: -#line 5502 "gram1.y" +#line 5506 "gram1.y" { err("Distribution format BLOCK(n) is not permitted in FDVM", 55); (yyval.ll_node) = make_llnd(fi,BLOCK_OP, (yyvsp[(4) - (5)].ll_node), LLNULL, SMNULL); endioctl(); @@ -10830,22 +10869,22 @@ yyreduce: break; case 730: -#line 5507 "gram1.y" +#line 5511 "gram1.y" { (yyval.ll_node) = make_llnd(fi,BLOCK_OP, LLNULL, LLNULL, (yyvsp[(3) - (4)].symbol)); ;} break; case 731: -#line 5509 "gram1.y" +#line 5513 "gram1.y" { (yyval.ll_node) = make_llnd(fi,BLOCK_OP, (yyvsp[(5) - (6)].ll_node), LLNULL, (yyvsp[(3) - (6)].symbol)); ;} break; case 732: -#line 5511 "gram1.y" +#line 5515 "gram1.y" { (yyval.ll_node) = make_llnd(fi,BLOCK_OP, LLNULL, (yyvsp[(3) - (4)].ll_node), SMNULL); ;} break; case 733: -#line 5513 "gram1.y" +#line 5517 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = (char *) "*"; @@ -10854,17 +10893,17 @@ yyreduce: break; case 734: -#line 5519 "gram1.y" +#line 5523 "gram1.y" { (yyval.ll_node) = make_llnd(fi,INDIRECT_OP, LLNULL, LLNULL, (yyvsp[(3) - (4)].symbol)); ;} break; case 735: -#line 5521 "gram1.y" +#line 5525 "gram1.y" { (yyval.ll_node) = make_llnd(fi,INDIRECT_OP, (yyvsp[(3) - (4)].ll_node), LLNULL, SMNULL); ;} break; case 736: -#line 5525 "gram1.y" +#line 5529 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); if((s->attr & PROCESSORS_BIT) ||(s->attr & TASK_BIT) || (s->attr & TEMPLATE_BIT)) @@ -10875,46 +10914,46 @@ yyreduce: break; case 737: -#line 5535 "gram1.y" +#line 5539 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DERIVED_OP, (yyvsp[(2) - (6)].ll_node), (yyvsp[(6) - (6)].ll_node), SMNULL); ;} break; case 738: -#line 5539 "gram1.y" +#line 5543 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 739: -#line 5541 "gram1.y" +#line 5545 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 740: -#line 5546 "gram1.y" +#line 5550 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 741: -#line 5548 "gram1.y" +#line 5552 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL);;} break; case 742: -#line 5552 "gram1.y" +#line 5556 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ARRAY_REF, LLNULL, LLNULL, (yyvsp[(1) - (1)].symbol)); ;} break; case 743: -#line 5556 "gram1.y" +#line 5560 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ARRAY_REF, (yyvsp[(3) - (4)].ll_node), LLNULL, (yyvsp[(1) - (4)].symbol)); ;} break; case 744: -#line 5562 "gram1.y" +#line 5566 "gram1.y" { if (!((yyval.symbol) = (yyvsp[(1) - (1)].hash_entry)->id_attr)) { @@ -10925,27 +10964,27 @@ yyreduce: break; case 745: -#line 5572 "gram1.y" +#line 5576 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 746: -#line 5574 "gram1.y" +#line 5578 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 747: -#line 5578 "gram1.y" +#line 5582 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 748: -#line 5580 "gram1.y" +#line 5584 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 749: -#line 5582 "gram1.y" +#line 5586 "gram1.y" { (yyvsp[(2) - (3)].ll_node)->entry.Template.ll_ptr1 = (yyvsp[(3) - (3)].ll_node); (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node); @@ -10953,7 +10992,7 @@ yyreduce: break; case 750: -#line 5589 "gram1.y" +#line 5593 "gram1.y" { PTR_SYMB s; s = make_scalar((yyvsp[(1) - (1)].hash_entry),TYNULL,LOCAL); (yyval.ll_node) = make_llnd(fi,DUMMY_REF, LLNULL, LLNULL, s); @@ -10962,27 +11001,27 @@ yyreduce: break; case 751: -#line 5606 "gram1.y" +#line 5610 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 752: -#line 5608 "gram1.y" +#line 5612 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 753: -#line 5612 "gram1.y" +#line 5616 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (2)].ll_node),LLNULL,EXPR_LIST); ;} break; case 754: -#line 5614 "gram1.y" +#line 5618 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 755: -#line 5618 "gram1.y" +#line 5622 "gram1.y" { if((yyvsp[(1) - (1)].ll_node)->type->variant != T_STRING) errstr( "Illegal type of shadow_name", 627); (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); @@ -10990,7 +11029,7 @@ yyreduce: break; case 756: -#line 5625 "gram1.y" +#line 5629 "gram1.y" { char *q; nioctl = 1; q = (yyvsp[(1) - (2)].ll_node)->entry.string_val; @@ -11003,7 +11042,7 @@ yyreduce: break; case 757: -#line 5635 "gram1.y" +#line 5639 "gram1.y" { char *ql, *qh; PTR_LLND p1, p2; nioctl = 2; @@ -11023,7 +11062,7 @@ yyreduce: break; case 758: -#line 5664 "gram1.y" +#line 5668 "gram1.y" { PTR_LLND q; q = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); (yyval.bf_node) = (yyvsp[(4) - (4)].bf_node); @@ -11032,7 +11071,7 @@ yyreduce: break; case 759: -#line 5679 "gram1.y" +#line 5683 "gram1.y" { PTR_LLND q; q = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); (yyval.bf_node) = (yyvsp[(4) - (4)].bf_node); @@ -11042,7 +11081,7 @@ yyreduce: break; case 760: -#line 5686 "gram1.y" +#line 5690 "gram1.y" { (yyval.bf_node) = (yyvsp[(3) - (6)].bf_node); (yyval.bf_node)->variant = DVM_REALIGN_DIR; @@ -11051,17 +11090,17 @@ yyreduce: break; case 761: -#line 5704 "gram1.y" +#line 5708 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 762: -#line 5706 "gram1.y" +#line 5710 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 763: -#line 5710 "gram1.y" +#line 5714 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); if((s->attr & ALIGN_BIT)) @@ -11076,7 +11115,7 @@ yyreduce: break; case 764: -#line 5724 "gram1.y" +#line 5728 "gram1.y" {PTR_SYMB s; s = (yyvsp[(1) - (1)].ll_node)->entry.Template.symbol; if(s->attr & PROCESSORS_BIT) @@ -11103,7 +11142,7 @@ yyreduce: break; case 765: -#line 5750 "gram1.y" +#line 5754 "gram1.y" { /* PTR_LLND r; if($7) { r = set_ll_list($6,LLNULL,EXPR_LIST); @@ -11117,29 +11156,29 @@ yyreduce: break; case 766: -#line 5763 "gram1.y" +#line 5767 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ARRAY_REF, (yyvsp[(3) - (4)].ll_node), LLNULL, (yyvsp[(1) - (4)].symbol)); ;} break; case 767: -#line 5779 "gram1.y" +#line 5783 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 768: -#line 5781 "gram1.y" +#line 5785 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 769: -#line 5784 "gram1.y" +#line 5788 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 770: -#line 5786 "gram1.y" +#line 5790 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = (char *) "*"; @@ -11148,12 +11187,12 @@ yyreduce: break; case 771: -#line 5792 "gram1.y" +#line 5796 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 772: -#line 5796 "gram1.y" +#line 5800 "gram1.y" { /* if(parstate == INEXEC){ *for REALIGN directive* if (!($$ = $1->id_attr)) @@ -11182,17 +11221,17 @@ yyreduce: break; case 773: -#line 5824 "gram1.y" +#line 5828 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 774: -#line 5826 "gram1.y" +#line 5830 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 775: -#line 5830 "gram1.y" +#line 5834 "gram1.y" { PTR_SYMB s; s = make_scalar((yyvsp[(1) - (1)].hash_entry),TYNULL,LOCAL); if(s->type->variant != T_INT || s->attr & PARAMETER_BIT) @@ -11203,7 +11242,7 @@ yyreduce: break; case 776: -#line 5838 "gram1.y" +#line 5842 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = (char *) "*"; @@ -11212,12 +11251,12 @@ yyreduce: break; case 777: -#line 5844 "gram1.y" +#line 5848 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, LLNULL, LLNULL, SMNULL); ;} break; case 778: -#line 5847 "gram1.y" +#line 5851 "gram1.y" { PTR_SYMB s; PTR_LLND q, r, p; int numdim; @@ -11278,7 +11317,7 @@ yyreduce: break; case 779: -#line 5905 "gram1.y" +#line 5909 "gram1.y" { PTR_SYMB s; PTR_LLND q, r, p; int numdim; @@ -11337,45 +11376,45 @@ yyreduce: break; case 780: -#line 5969 "gram1.y" +#line 5973 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); type_options = type_opt; ;} break; case 781: -#line 5971 "gram1.y" +#line 5975 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node),(yyvsp[(4) - (4)].ll_node),EXPR_LIST); type_options = type_options | type_opt;;} break; case 782: -#line 5974 "gram1.y" +#line 5978 "gram1.y" { type_opt = TEMPLATE_BIT; (yyval.ll_node) = make_llnd(fi,TEMPLATE_OP,LLNULL,LLNULL,SMNULL); ;} break; case 783: -#line 5978 "gram1.y" - { type_opt = PROCESSORS_BIT; - (yyval.ll_node) = make_llnd(fi,PROCESSORS_OP,LLNULL,LLNULL,SMNULL); - ;} - break; - - case 784: #line 5982 "gram1.y" { type_opt = PROCESSORS_BIT; (yyval.ll_node) = make_llnd(fi,PROCESSORS_OP,LLNULL,LLNULL,SMNULL); ;} break; - case 785: + case 784: #line 5986 "gram1.y" + { type_opt = PROCESSORS_BIT; + (yyval.ll_node) = make_llnd(fi,PROCESSORS_OP,LLNULL,LLNULL,SMNULL); + ;} + break; + + case 785: +#line 5990 "gram1.y" { type_opt = DYNAMIC_BIT; (yyval.ll_node) = make_llnd(fi,DYNAMIC_OP,LLNULL,LLNULL,SMNULL); ;} break; case 786: -#line 6003 "gram1.y" +#line 6007 "gram1.y" { if(! explicit_shape) { err("Explicit shape specification is required", 50); @@ -11390,28 +11429,28 @@ yyreduce: break; case 787: -#line 6015 "gram1.y" +#line 6019 "gram1.y" { type_opt = SHADOW_BIT; (yyval.ll_node) = make_llnd(fi,SHADOW_OP,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 788: -#line 6019 "gram1.y" +#line 6023 "gram1.y" { type_opt = ALIGN_BIT; (yyval.ll_node) = make_llnd(fi,ALIGN_OP,(yyvsp[(3) - (7)].ll_node),(yyvsp[(7) - (7)].ll_node),SMNULL); ;} break; case 789: -#line 6023 "gram1.y" +#line 6027 "gram1.y" { type_opt = ALIGN_BIT; (yyval.ll_node) = make_llnd(fi,ALIGN_OP,LLNULL,SMNULL,SMNULL); ;} break; case 790: -#line 6033 "gram1.y" +#line 6037 "gram1.y" { type_opt = DISTRIBUTE_BIT; (yyval.ll_node) = make_llnd(fi,DISTRIBUTE_OP,(yyvsp[(2) - (4)].ll_node),(yyvsp[(4) - (4)].ll_node),SMNULL); @@ -11419,7 +11458,7 @@ yyreduce: break; case 791: -#line 6038 "gram1.y" +#line 6042 "gram1.y" { type_opt = DISTRIBUTE_BIT; (yyval.ll_node) = make_llnd(fi,DISTRIBUTE_OP,LLNULL,LLNULL,SMNULL); @@ -11427,7 +11466,7 @@ yyreduce: break; case 792: -#line 6043 "gram1.y" +#line 6047 "gram1.y" { type_opt = COMMON_BIT; (yyval.ll_node) = make_llnd(fi,COMMON_OP, LLNULL, LLNULL, SMNULL); @@ -11435,7 +11474,7 @@ yyreduce: break; case 793: -#line 6050 "gram1.y" +#line 6054 "gram1.y" { PTR_LLND l; l = make_llnd(fi, TYPE_OP, LLNULL, LLNULL, SMNULL); @@ -11445,12 +11484,12 @@ yyreduce: break; case 794: -#line 6058 "gram1.y" +#line 6062 "gram1.y" {ndim = 0;;} break; case 795: -#line 6059 "gram1.y" +#line 6063 "gram1.y" { PTR_LLND q; if(ndim == maxdim) err("Too many dimensions", 43); @@ -11464,7 +11503,7 @@ yyreduce: break; case 796: -#line 6070 "gram1.y" +#line 6074 "gram1.y" { PTR_LLND q; if(ndim == maxdim) err("Too many dimensions", 43); @@ -11476,17 +11515,17 @@ yyreduce: break; case 797: -#line 6081 "gram1.y" +#line 6085 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 798: -#line 6083 "gram1.y" +#line 6087 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 799: -#line 6087 "gram1.y" +#line 6091 "gram1.y" {PTR_SYMB s; /* s = make_scalar($1,TYNULL,LOCAL);*/ s = make_array((yyvsp[(1) - (1)].hash_entry),TYNULL,LLNULL,0,LOCAL); @@ -11498,22 +11537,22 @@ yyreduce: break; case 800: -#line 6098 "gram1.y" +#line 6102 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_HEAP_DIR, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL);;} break; case 801: -#line 6102 "gram1.y" +#line 6106 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 802: -#line 6104 "gram1.y" +#line 6108 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 803: -#line 6108 "gram1.y" +#line 6112 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); s->attr = s->attr | HEAP_BIT; @@ -11525,22 +11564,22 @@ yyreduce: break; case 804: -#line 6119 "gram1.y" +#line 6123 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CONSISTENT_DIR, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL);;} break; case 805: -#line 6123 "gram1.y" +#line 6127 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 806: -#line 6125 "gram1.y" +#line 6129 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 807: -#line 6129 "gram1.y" +#line 6133 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); s->attr = s->attr | CONSISTENT_BIT; @@ -11552,12 +11591,12 @@ yyreduce: break; case 808: -#line 6141 "gram1.y" +#line 6145 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ASYNCID_DIR, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL);;} break; case 809: -#line 6143 "gram1.y" +#line 6147 "gram1.y" { PTR_LLND p; p = make_llnd(fi,COMM_LIST, LLNULL, LLNULL, SMNULL); (yyval.bf_node) = get_bfnd(fi,DVM_ASYNCID_DIR, SMNULL, (yyvsp[(8) - (8)].ll_node), p, LLNULL); @@ -11565,17 +11604,17 @@ yyreduce: break; case 810: -#line 6150 "gram1.y" +#line 6154 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 811: -#line 6152 "gram1.y" +#line 6156 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 812: -#line 6156 "gram1.y" +#line 6160 "gram1.y" { PTR_SYMB s; if((yyvsp[(2) - (2)].ll_node)){ s = make_array((yyvsp[(1) - (2)].hash_entry), global_default, (yyvsp[(2) - (2)].ll_node), ndim, LOCAL); @@ -11591,12 +11630,12 @@ yyreduce: break; case 813: -#line 6172 "gram1.y" +#line 6176 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_NEW_VALUE_DIR,SMNULL, LLNULL, LLNULL,LLNULL);;} break; case 814: -#line 6182 "gram1.y" +#line 6186 "gram1.y" { if((yyvsp[(6) - (7)].ll_node) && (yyvsp[(6) - (7)].ll_node)->entry.Template.symbol->attr & TASK_BIT) (yyval.bf_node) = get_bfnd(fi,DVM_PARALLEL_TASK_DIR,SMNULL,(yyvsp[(6) - (7)].ll_node),(yyvsp[(7) - (7)].ll_node),(yyvsp[(4) - (7)].ll_node)); else @@ -11605,27 +11644,27 @@ yyreduce: break; case 815: -#line 6191 "gram1.y" +#line 6195 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 816: -#line 6193 "gram1.y" +#line 6197 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 817: -#line 6197 "gram1.y" +#line 6201 "gram1.y" { (yyval.ll_node) = (yyvsp[(3) - (3)].ll_node);;} break; case 818: -#line 6200 "gram1.y" +#line 6204 "gram1.y" { (yyval.ll_node) = LLNULL; opt_kwd_ = NO;;} break; case 819: -#line 6205 "gram1.y" +#line 6209 "gram1.y" { if((yyvsp[(1) - (4)].ll_node)->type->variant != T_ARRAY) errstr("'%s' isn't array", (yyvsp[(1) - (4)].ll_node)->entry.Template.symbol->ident, 66); @@ -11636,22 +11675,22 @@ yyreduce: break; case 820: -#line 6215 "gram1.y" +#line 6219 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 821: -#line 6217 "gram1.y" +#line 6221 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 822: -#line 6221 "gram1.y" +#line 6225 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 823: -#line 6223 "gram1.y" +#line 6227 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = (char *) "*"; @@ -11660,27 +11699,27 @@ yyreduce: break; case 824: -#line 6231 "gram1.y" +#line 6235 "gram1.y" { (yyval.ll_node) = LLNULL;;} break; case 825: -#line 6233 "gram1.y" +#line 6237 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 826: -#line 6237 "gram1.y" +#line 6241 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 827: -#line 6239 "gram1.y" +#line 6243 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (2)].ll_node),(yyvsp[(2) - (2)].ll_node),EXPR_LIST); ;} break; case 839: -#line 6257 "gram1.y" +#line 6261 "gram1.y" { if((yyvsp[(5) - (8)].symbol)->attr & INDIRECT_BIT) errstr("'%s' is not remote group name", (yyvsp[(5) - (8)].symbol)->ident, 68); (yyval.ll_node) = make_llnd(fi,REMOTE_ACCESS_OP,(yyvsp[(7) - (8)].ll_node),LLNULL,(yyvsp[(5) - (8)].symbol)); @@ -11688,24 +11727,24 @@ yyreduce: break; case 840: -#line 6262 "gram1.y" +#line 6266 "gram1.y" { (yyval.ll_node) = make_llnd(fi,REMOTE_ACCESS_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 841: -#line 6266 "gram1.y" +#line 6270 "gram1.y" { (yyval.ll_node) = make_llnd(fi,CONSISTENT_OP,(yyvsp[(7) - (8)].ll_node),LLNULL,(yyvsp[(5) - (8)].symbol)); ;} break; case 842: -#line 6270 "gram1.y" +#line 6274 "gram1.y" { (yyval.ll_node) = make_llnd(fi,CONSISTENT_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 843: -#line 6274 "gram1.y" +#line 6278 "gram1.y" { if(((yyval.symbol)=(yyvsp[(1) - (1)].hash_entry)->id_attr) == SMNULL){ errstr("'%s' is not declared as group", (yyvsp[(1) - (1)].hash_entry)->ident, 74); @@ -11718,67 +11757,67 @@ yyreduce: break; case 844: -#line 6287 "gram1.y" - {(yyval.ll_node) = make_llnd(fi,NEW_SPEC_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} - break; - - case 845: #line 6291 "gram1.y" {(yyval.ll_node) = make_llnd(fi,NEW_SPEC_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; - case 846: + case 845: #line 6295 "gram1.y" + {(yyval.ll_node) = make_llnd(fi,NEW_SPEC_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} + break; + + case 846: +#line 6299 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_PRIVATE_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 847: -#line 6299 "gram1.y" +#line 6303 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_CUDA_BLOCK_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 848: -#line 6302 "gram1.y" +#line 6306 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 849: -#line 6304 "gram1.y" +#line 6308 "gram1.y" {(yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 850: -#line 6306 "gram1.y" +#line 6310 "gram1.y" {(yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(3) - (5)].ll_node),EXPR_LIST); (yyval.ll_node) = set_ll_list((yyval.ll_node),(yyvsp[(5) - (5)].ll_node),EXPR_LIST);;} break; case 851: -#line 6310 "gram1.y" +#line 6314 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 852: -#line 6312 "gram1.y" +#line 6316 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 853: -#line 6316 "gram1.y" +#line 6320 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_TIE_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 854: -#line 6320 "gram1.y" +#line 6324 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 855: -#line 6322 "gram1.y" +#line 6326 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 856: -#line 6326 "gram1.y" +#line 6330 "gram1.y" { if(!((yyvsp[(5) - (8)].symbol)->attr & INDIRECT_BIT)) errstr("'%s' is not indirect group name", (yyvsp[(5) - (8)].symbol)->ident, 313); (yyval.ll_node) = make_llnd(fi,INDIRECT_ACCESS_OP,(yyvsp[(7) - (8)].ll_node),LLNULL,(yyvsp[(5) - (8)].symbol)); @@ -11786,27 +11825,27 @@ yyreduce: break; case 857: -#line 6331 "gram1.y" +#line 6335 "gram1.y" { (yyval.ll_node) = make_llnd(fi,INDIRECT_ACCESS_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 858: -#line 6335 "gram1.y" +#line 6339 "gram1.y" {(yyval.ll_node) = make_llnd(fi,STAGE_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 859: -#line 6339 "gram1.y" +#line 6343 "gram1.y" {(yyval.ll_node) = make_llnd(fi,ACROSS_OP,(yyvsp[(4) - (4)].ll_node),LLNULL,SMNULL);;} break; case 860: -#line 6341 "gram1.y" +#line 6345 "gram1.y" {(yyval.ll_node) = make_llnd(fi,ACROSS_OP,(yyvsp[(4) - (5)].ll_node),(yyvsp[(5) - (5)].ll_node),SMNULL);;} break; case 861: -#line 6345 "gram1.y" +#line 6349 "gram1.y" { if((yyvsp[(3) - (5)].ll_node)) (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(3) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),SMNULL); else @@ -11815,12 +11854,12 @@ yyreduce: break; case 862: -#line 6353 "gram1.y" +#line 6357 "gram1.y" { opt_in_out = YES; ;} break; case 863: -#line 6357 "gram1.y" +#line 6361 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "in"; @@ -11829,7 +11868,7 @@ yyreduce: break; case 864: -#line 6363 "gram1.y" +#line 6367 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "out"; @@ -11838,34 +11877,34 @@ yyreduce: break; case 865: -#line 6369 "gram1.y" +#line 6373 "gram1.y" { (yyval.ll_node) = LLNULL; opt_in_out = NO;;} break; case 866: -#line 6373 "gram1.y" +#line 6377 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 867: -#line 6375 "gram1.y" +#line 6379 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 868: -#line 6379 "gram1.y" +#line 6383 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 869: -#line 6381 "gram1.y" +#line 6385 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (4)].ll_node); (yyval.ll_node)-> entry.Template.ll_ptr1 = (yyvsp[(3) - (4)].ll_node); ;} break; case 870: -#line 6385 "gram1.y" +#line 6389 "gram1.y" { /* PTR_LLND p; p = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); p->entry.string_val = (char *) "corner"; @@ -11877,87 +11916,87 @@ yyreduce: break; case 871: -#line 6397 "gram1.y" +#line 6401 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 872: -#line 6399 "gram1.y" +#line 6403 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 873: -#line 6403 "gram1.y" +#line 6407 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL);;} break; case 874: -#line 6407 "gram1.y" +#line 6411 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 875: -#line 6409 "gram1.y" +#line 6413 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 876: -#line 6413 "gram1.y" +#line 6417 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(1) - (5)].ll_node),make_llnd(fi,DDOT,(yyvsp[(3) - (5)].ll_node),(yyvsp[(5) - (5)].ll_node),SMNULL),SMNULL); ;} break; case 877: -#line 6415 "gram1.y" +#line 6419 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(1) - (3)].ll_node),make_llnd(fi,DDOT,(yyvsp[(3) - (3)].ll_node),LLNULL,SMNULL),SMNULL); ;} break; case 878: -#line 6417 "gram1.y" +#line 6421 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(1) - (3)].ll_node),make_llnd(fi,DDOT,LLNULL,(yyvsp[(3) - (3)].ll_node),SMNULL),SMNULL); ;} break; case 879: -#line 6419 "gram1.y" +#line 6423 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(1) - (1)].ll_node),LLNULL,SMNULL); ;} break; case 880: -#line 6421 "gram1.y" +#line 6425 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,LLNULL,make_llnd(fi,DDOT,(yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),SMNULL),SMNULL); ;} break; case 881: -#line 6423 "gram1.y" +#line 6427 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,LLNULL,make_llnd(fi,DDOT,(yyvsp[(1) - (1)].ll_node),LLNULL,SMNULL),SMNULL); ;} break; case 882: -#line 6425 "gram1.y" +#line 6429 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT,LLNULL,make_llnd(fi,DDOT,LLNULL,(yyvsp[(1) - (1)].ll_node),SMNULL),SMNULL); ;} break; case 883: -#line 6429 "gram1.y" - { (yyval.ll_node) = (yyvsp[(3) - (3)].ll_node);;} - break; - - case 884: #line 6433 "gram1.y" { (yyval.ll_node) = (yyvsp[(3) - (3)].ll_node);;} break; - case 885: + case 884: #line 6437 "gram1.y" { (yyval.ll_node) = (yyvsp[(3) - (3)].ll_node);;} break; - case 886: + case 885: #line 6441 "gram1.y" + { (yyval.ll_node) = (yyvsp[(3) - (3)].ll_node);;} + break; + + case 886: +#line 6445 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (3)].ll_node);;} break; case 887: -#line 6445 "gram1.y" +#line 6449 "gram1.y" {PTR_LLND q; /* q = set_ll_list($9,$6,EXPR_LIST); */ q = set_ll_list((yyvsp[(6) - (10)].ll_node),LLNULL,EXPR_LIST); /*podd 11.10.01*/ @@ -11967,7 +12006,7 @@ yyreduce: break; case 888: -#line 6452 "gram1.y" +#line 6456 "gram1.y" {PTR_LLND q; q = set_ll_list((yyvsp[(6) - (8)].ll_node),LLNULL,EXPR_LIST); (yyval.ll_node) = make_llnd(fi,REDUCTION_OP,q,LLNULL,SMNULL); @@ -11975,22 +12014,22 @@ yyreduce: break; case 889: -#line 6458 "gram1.y" +#line 6462 "gram1.y" { (yyval.ll_node) = make_llnd(fi,REDUCTION_OP,(yyvsp[(9) - (10)].ll_node),LLNULL,(yyvsp[(6) - (10)].symbol)); ;} break; case 890: -#line 6462 "gram1.y" +#line 6466 "gram1.y" { opt_kwd_r = YES; ;} break; case 891: -#line 6465 "gram1.y" +#line 6469 "gram1.y" { opt_kwd_r = NO; ;} break; case 892: -#line 6469 "gram1.y" +#line 6473 "gram1.y" { if(((yyval.symbol)=(yyvsp[(1) - (1)].hash_entry)->id_attr) == SMNULL) { errstr("'%s' is not declared as reduction group", (yyvsp[(1) - (1)].hash_entry)->ident, 69); @@ -12003,28 +12042,28 @@ yyreduce: break; case 893: -#line 6482 "gram1.y" +#line 6486 "gram1.y" {(yyval.ll_node) = set_ll_list((yyvsp[(2) - (2)].ll_node),LLNULL,EXPR_LIST);;} break; case 894: -#line 6484 "gram1.y" +#line 6488 "gram1.y" {(yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node),(yyvsp[(4) - (4)].ll_node),EXPR_LIST);;} break; case 895: -#line 6488 "gram1.y" +#line 6492 "gram1.y" {(yyval.ll_node) = make_llnd(fi,ARRAY_OP,(yyvsp[(1) - (4)].ll_node),(yyvsp[(3) - (4)].ll_node),SMNULL);;} break; case 896: -#line 6490 "gram1.y" +#line 6494 "gram1.y" {(yyvsp[(3) - (6)].ll_node) = set_ll_list((yyvsp[(3) - (6)].ll_node),(yyvsp[(5) - (6)].ll_node),EXPR_LIST); (yyval.ll_node) = make_llnd(fi,ARRAY_OP,(yyvsp[(1) - (6)].ll_node),(yyvsp[(3) - (6)].ll_node),SMNULL);;} break; case 897: -#line 6495 "gram1.y" +#line 6499 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "sum"; @@ -12033,7 +12072,7 @@ yyreduce: break; case 898: -#line 6501 "gram1.y" +#line 6505 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "product"; @@ -12042,7 +12081,7 @@ yyreduce: break; case 899: -#line 6507 "gram1.y" +#line 6511 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "min"; @@ -12051,7 +12090,7 @@ yyreduce: break; case 900: -#line 6513 "gram1.y" +#line 6517 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "max"; @@ -12060,7 +12099,7 @@ yyreduce: break; case 901: -#line 6519 "gram1.y" +#line 6523 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "or"; @@ -12069,7 +12108,7 @@ yyreduce: break; case 902: -#line 6525 "gram1.y" +#line 6529 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "and"; @@ -12078,7 +12117,7 @@ yyreduce: break; case 903: -#line 6531 "gram1.y" +#line 6535 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "eqv"; @@ -12087,7 +12126,7 @@ yyreduce: break; case 904: -#line 6537 "gram1.y" +#line 6541 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "neqv"; @@ -12096,7 +12135,7 @@ yyreduce: break; case 905: -#line 6543 "gram1.y" +#line 6547 "gram1.y" { err("Illegal reduction operation name", 70); errcnt--; (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); @@ -12106,7 +12145,7 @@ yyreduce: break; case 906: -#line 6552 "gram1.y" +#line 6556 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "maxloc"; @@ -12115,7 +12154,7 @@ yyreduce: break; case 907: -#line 6558 "gram1.y" +#line 6562 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "minloc"; @@ -12124,52 +12163,52 @@ yyreduce: break; case 908: -#line 6575 "gram1.y" +#line 6579 "gram1.y" { (yyval.ll_node) = make_llnd(fi,SHADOW_RENEW_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 909: -#line 6583 "gram1.y" +#line 6587 "gram1.y" { (yyval.ll_node) = make_llnd(fi,SHADOW_START_OP,LLNULL,LLNULL,(yyvsp[(4) - (4)].symbol));;} break; case 910: -#line 6591 "gram1.y" +#line 6595 "gram1.y" { (yyval.ll_node) = make_llnd(fi,SHADOW_WAIT_OP,LLNULL,LLNULL,(yyvsp[(4) - (4)].symbol));;} break; case 911: -#line 6593 "gram1.y" +#line 6597 "gram1.y" { (yyval.ll_node) = make_llnd(fi,SHADOW_COMP_OP,LLNULL,LLNULL,SMNULL);;} break; case 912: -#line 6595 "gram1.y" +#line 6599 "gram1.y" { (yyvsp[(5) - (9)].ll_node)-> entry.Template.ll_ptr1 = (yyvsp[(7) - (9)].ll_node); (yyval.ll_node) = make_llnd(fi,SHADOW_COMP_OP,(yyvsp[(5) - (9)].ll_node),LLNULL,SMNULL);;} break; case 913: -#line 6599 "gram1.y" +#line 6603 "gram1.y" {(yyval.symbol) = make_local_entity((yyvsp[(1) - (1)].hash_entry), SHADOW_GROUP_NAME,global_default,LOCAL);;} break; case 914: -#line 6603 "gram1.y" +#line 6607 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST);;} break; case 915: -#line 6605 "gram1.y" +#line 6609 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST);;} break; case 916: -#line 6609 "gram1.y" +#line 6613 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 917: -#line 6611 "gram1.y" +#line 6615 "gram1.y" { PTR_LLND p; p = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); p->entry.string_val = (char *) "corner"; @@ -12179,14 +12218,14 @@ yyreduce: break; case 918: -#line 6619 "gram1.y" +#line 6623 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (5)].ll_node); (yyval.ll_node)-> entry.Template.ll_ptr1 = (yyvsp[(4) - (5)].ll_node); ;} break; case 919: -#line 6623 "gram1.y" +#line 6627 "gram1.y" { PTR_LLND p; p = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); p->entry.string_val = (char *) "corner"; @@ -12197,12 +12236,12 @@ yyreduce: break; case 920: -#line 6634 "gram1.y" +#line 6638 "gram1.y" { optcorner = YES; ;} break; case 921: -#line 6638 "gram1.y" +#line 6642 "gram1.y" { PTR_SYMB s; s = (yyvsp[(1) - (1)].ll_node)->entry.Template.symbol; if(s->attr & PROCESSORS_BIT) @@ -12221,62 +12260,62 @@ yyreduce: break; case 922: -#line 6656 "gram1.y" +#line 6660 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 923: -#line 6658 "gram1.y" +#line 6662 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 924: -#line 6662 "gram1.y" +#line 6666 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_SHADOW_START_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 925: -#line 6664 "gram1.y" +#line 6668 "gram1.y" {errstr("Missing DVM directive prefix", 49);;} break; case 926: -#line 6668 "gram1.y" +#line 6672 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_SHADOW_WAIT_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 927: -#line 6670 "gram1.y" +#line 6674 "gram1.y" {errstr("Missing DVM directive prefix", 49);;} break; case 928: -#line 6674 "gram1.y" +#line 6678 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_SHADOW_GROUP_DIR,(yyvsp[(3) - (6)].symbol),(yyvsp[(5) - (6)].ll_node),LLNULL,LLNULL);;} break; case 929: -#line 6678 "gram1.y" +#line 6682 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_REDUCTION_START_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 930: -#line 6682 "gram1.y" +#line 6686 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_REDUCTION_WAIT_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 931: -#line 6691 "gram1.y" +#line 6695 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CONSISTENT_START_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 932: -#line 6695 "gram1.y" +#line 6699 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CONSISTENT_WAIT_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 933: -#line 6699 "gram1.y" +#line 6703 "gram1.y" { if(((yyvsp[(4) - (7)].symbol)->attr & INDIRECT_BIT)) errstr("'%s' is not remote group name", (yyvsp[(4) - (7)].symbol)->ident, 68); (yyval.bf_node) = get_bfnd(fi,DVM_REMOTE_ACCESS_DIR,(yyvsp[(4) - (7)].symbol),(yyvsp[(6) - (7)].ll_node),LLNULL,LLNULL); @@ -12284,12 +12323,12 @@ yyreduce: break; case 934: -#line 6704 "gram1.y" +#line 6708 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_REMOTE_ACCESS_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 935: -#line 6708 "gram1.y" +#line 6712 "gram1.y" { if(((yyval.symbol)=(yyvsp[(1) - (1)].hash_entry)->id_attr) == SMNULL){ errstr("'%s' is not declared as group", (yyvsp[(1) - (1)].hash_entry)->ident, 74); @@ -12302,17 +12341,17 @@ yyreduce: break; case 936: -#line 6720 "gram1.y" +#line 6724 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 937: -#line 6722 "gram1.y" +#line 6726 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 938: -#line 6726 "gram1.y" +#line 6730 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (4)].ll_node); (yyval.ll_node)->entry.Template.ll_ptr1 = (yyvsp[(3) - (4)].ll_node); @@ -12320,32 +12359,32 @@ yyreduce: break; case 939: -#line 6731 "gram1.y" +#line 6735 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 940: -#line 6735 "gram1.y" +#line 6739 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 941: -#line 6737 "gram1.y" +#line 6741 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 942: -#line 6741 "gram1.y" +#line 6745 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 943: -#line 6743 "gram1.y" +#line 6747 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, LLNULL, LLNULL, SMNULL);;} break; case 944: -#line 6747 "gram1.y" +#line 6751 "gram1.y" { PTR_LLND q; q = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); (yyval.bf_node) = get_bfnd(fi,DVM_TASK_DIR,SMNULL,q,LLNULL,LLNULL); @@ -12353,7 +12392,7 @@ yyreduce: break; case 945: -#line 6752 "gram1.y" +#line 6756 "gram1.y" { PTR_LLND q; q = make_llnd(fi,EXPR_LIST, (yyvsp[(3) - (3)].ll_node), LLNULL, SMNULL); add_to_lowLevelList(q, (yyvsp[(1) - (3)].bf_node)->entry.Template.ll_ptr1); @@ -12361,7 +12400,7 @@ yyreduce: break; case 946: -#line 6759 "gram1.y" +#line 6763 "gram1.y" { PTR_SYMB s; s = make_array((yyvsp[(1) - (2)].hash_entry), global_int, (yyvsp[(2) - (2)].ll_node), ndim, LOCAL); @@ -12385,32 +12424,32 @@ yyreduce: break; case 947: -#line 6782 "gram1.y" +#line 6786 "gram1.y" {(yyval.bf_node) = get_bfnd(fi,DVM_TASK_REGION_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 948: -#line 6784 "gram1.y" +#line 6788 "gram1.y" {(yyval.bf_node) = get_bfnd(fi,DVM_TASK_REGION_DIR,(yyvsp[(3) - (4)].symbol),(yyvsp[(4) - (4)].ll_node),LLNULL,LLNULL);;} break; case 949: -#line 6786 "gram1.y" +#line 6790 "gram1.y" {(yyval.bf_node) = get_bfnd(fi,DVM_TASK_REGION_DIR,(yyvsp[(3) - (4)].symbol),LLNULL,(yyvsp[(4) - (4)].ll_node),LLNULL);;} break; case 950: -#line 6788 "gram1.y" +#line 6792 "gram1.y" {(yyval.bf_node) = get_bfnd(fi,DVM_TASK_REGION_DIR,(yyvsp[(3) - (5)].symbol),(yyvsp[(4) - (5)].ll_node),(yyvsp[(5) - (5)].ll_node),LLNULL);;} break; case 951: -#line 6790 "gram1.y" +#line 6794 "gram1.y" {(yyval.bf_node) = get_bfnd(fi,DVM_TASK_REGION_DIR,(yyvsp[(3) - (5)].symbol),(yyvsp[(5) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),LLNULL);;} break; case 952: -#line 6794 "gram1.y" +#line 6798 "gram1.y" { PTR_SYMB s; if((s=(yyvsp[(1) - (1)].hash_entry)->id_attr) == SMNULL) s = make_array((yyvsp[(1) - (1)].hash_entry), TYNULL, LLNULL, 0, LOCAL); @@ -12422,12 +12461,12 @@ yyreduce: break; case 953: -#line 6805 "gram1.y" +#line 6809 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_END_TASK_REGION_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 954: -#line 6809 "gram1.y" +#line 6813 "gram1.y" { PTR_SYMB s; PTR_LLND q; /* @@ -12445,7 +12484,7 @@ yyreduce: break; case 955: -#line 6824 "gram1.y" +#line 6828 "gram1.y" { PTR_LLND q; q = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); (yyval.ll_node) = make_llnd(fi,ARRAY_REF, q, LLNULL, (yyvsp[(1) - (4)].symbol)); @@ -12453,29 +12492,29 @@ yyreduce: break; case 956: -#line 6831 "gram1.y" +#line 6835 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ON_DIR,SMNULL,(yyvsp[(3) - (4)].ll_node),(yyvsp[(4) - (4)].ll_node),LLNULL); ;} break; case 957: -#line 6837 "gram1.y" +#line 6841 "gram1.y" {(yyval.ll_node) = LLNULL;;} break; case 958: -#line 6839 "gram1.y" +#line 6843 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 959: -#line 6843 "gram1.y" +#line 6847 "gram1.y" {(yyval.bf_node) = get_bfnd(fi,DVM_END_ON_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 960: -#line 6847 "gram1.y" +#line 6851 "gram1.y" { PTR_LLND q; /* if(!($6->attr & PROCESSORS_BIT)) errstr("'%s' is not processor array", $6->ident, 67); @@ -12486,22 +12525,22 @@ yyreduce: break; case 961: -#line 6855 "gram1.y" +#line 6859 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_MAP_DIR,SMNULL,(yyvsp[(3) - (6)].ll_node),LLNULL,(yyvsp[(6) - (6)].ll_node)); ;} break; case 962: -#line 6859 "gram1.y" +#line 6863 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_PREFETCH_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 963: -#line 6863 "gram1.y" +#line 6867 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_RESET_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 964: -#line 6871 "gram1.y" +#line 6875 "gram1.y" { if(!((yyvsp[(4) - (7)].symbol)->attr & INDIRECT_BIT)) errstr("'%s' is not indirect group name", (yyvsp[(4) - (7)].symbol)->ident, 313); (yyval.bf_node) = get_bfnd(fi,DVM_INDIRECT_ACCESS_DIR,(yyvsp[(4) - (7)].symbol),(yyvsp[(6) - (7)].ll_node),LLNULL,LLNULL); @@ -12509,72 +12548,72 @@ yyreduce: break; case 965: -#line 6876 "gram1.y" +#line 6880 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_INDIRECT_ACCESS_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 966: -#line 6890 "gram1.y" +#line 6894 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 967: -#line 6892 "gram1.y" +#line 6896 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 968: -#line 6896 "gram1.y" +#line 6900 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 969: -#line 6898 "gram1.y" +#line 6902 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (4)].ll_node); (yyval.ll_node)->entry.Template.ll_ptr1 = (yyvsp[(3) - (4)].ll_node);;} break; case 970: -#line 6907 "gram1.y" +#line 6911 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,HPF_INDEPENDENT_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 971: -#line 6909 "gram1.y" +#line 6913 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,HPF_INDEPENDENT_DIR,SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL);;} break; case 972: -#line 6911 "gram1.y" +#line 6915 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,HPF_INDEPENDENT_DIR,SMNULL, LLNULL, (yyvsp[(3) - (3)].ll_node), LLNULL);;} break; case 973: -#line 6913 "gram1.y" +#line 6917 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,HPF_INDEPENDENT_DIR,SMNULL, (yyvsp[(3) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node),LLNULL);;} break; case 974: -#line 6949 "gram1.y" +#line 6953 "gram1.y" {(yyval.ll_node) = make_llnd(fi,REDUCTION_OP,(yyvsp[(5) - (6)].ll_node),LLNULL,SMNULL);;} break; case 975: -#line 6953 "gram1.y" +#line 6957 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ASYNCHRONOUS_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 976: -#line 6957 "gram1.y" +#line 6961 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ENDASYNCHRONOUS_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 977: -#line 6961 "gram1.y" +#line 6965 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ASYNCWAIT_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 978: -#line 6965 "gram1.y" +#line 6969 "gram1.y" { if(((yyval.symbol)=(yyvsp[(1) - (1)].hash_entry)->id_attr) == SMNULL) { errstr("'%s' is not declared as ASYNCID", (yyvsp[(1) - (1)].hash_entry)->ident, 115); @@ -12587,32 +12626,32 @@ yyreduce: break; case 979: -#line 6977 "gram1.y" +#line 6981 "gram1.y" { (yyval.ll_node) = make_llnd(fi,VAR_REF, LLNULL, LLNULL, (yyvsp[(1) - (1)].symbol));;} break; case 980: -#line 6979 "gram1.y" +#line 6983 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ARRAY_REF, (yyvsp[(3) - (4)].ll_node), LLNULL, (yyvsp[(1) - (4)].symbol));;} break; case 981: -#line 6983 "gram1.y" +#line 6987 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_F90_DIR,SMNULL,(yyvsp[(3) - (5)].ll_node),(yyvsp[(5) - (5)].ll_node),LLNULL);;} break; case 982: -#line 6986 "gram1.y" +#line 6990 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_DEBUG_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 983: -#line 6988 "gram1.y" +#line 6992 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_DEBUG_DIR,SMNULL,(yyvsp[(3) - (6)].ll_node),(yyvsp[(5) - (6)].ll_node),LLNULL);;} break; case 984: -#line 6992 "gram1.y" +#line 6996 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(2) - (2)].ll_node), LLNULL, EXPR_LIST); endioctl(); @@ -12620,7 +12659,7 @@ yyreduce: break; case 985: -#line 6997 "gram1.y" +#line 7001 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (4)].ll_node), (yyvsp[(4) - (4)].ll_node), EXPR_LIST); endioctl(); @@ -12628,12 +12667,12 @@ yyreduce: break; case 986: -#line 7004 "gram1.y" +#line 7008 "gram1.y" { (yyval.ll_node) = make_llnd(fi, KEYWORD_ARG, (yyvsp[(1) - (2)].ll_node), (yyvsp[(2) - (2)].ll_node), SMNULL); ;} break; case 987: -#line 7007 "gram1.y" +#line 7011 "gram1.y" { (yyval.ll_node) = make_llnd(fi,INT_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.ival = atoi(yytext); @@ -12642,22 +12681,22 @@ yyreduce: break; case 988: -#line 7015 "gram1.y" +#line 7019 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ENDDEBUG_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 989: -#line 7019 "gram1.y" +#line 7023 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_INTERVAL_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 990: -#line 7023 "gram1.y" +#line 7027 "gram1.y" { (yyval.ll_node) = LLNULL;;} break; case 991: -#line 7026 "gram1.y" +#line 7030 "gram1.y" { if((yyvsp[(1) - (1)].ll_node)->type->variant != T_INT) err("Illegal interval number", 78); (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); @@ -12665,72 +12704,72 @@ yyreduce: break; case 992: -#line 7034 "gram1.y" +#line 7038 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_EXIT_INTERVAL_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 993: -#line 7038 "gram1.y" +#line 7042 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_ENDINTERVAL_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 994: -#line 7042 "gram1.y" +#line 7046 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_TRACEON_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 995: -#line 7046 "gram1.y" +#line 7050 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_TRACEOFF_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 996: -#line 7050 "gram1.y" +#line 7054 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_BARRIER_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 997: -#line 7054 "gram1.y" +#line 7058 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CHECK_DIR,SMNULL,(yyvsp[(9) - (9)].ll_node),(yyvsp[(5) - (9)].ll_node),LLNULL); ;} break; case 998: -#line 7058 "gram1.y" +#line 7062 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_IO_MODE_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 999: -#line 7061 "gram1.y" +#line 7065 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1000: -#line 7063 "gram1.y" +#line 7067 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1001: -#line 7067 "gram1.y" +#line 7071 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_ASYNC_OP,LLNULL,LLNULL,SMNULL);;} break; case 1002: -#line 7069 "gram1.y" +#line 7073 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_LOCAL_OP, LLNULL,LLNULL,SMNULL);;} break; case 1003: -#line 7071 "gram1.y" +#line 7075 "gram1.y" { (yyval.ll_node) = make_llnd(fi,PARALLEL_OP, LLNULL,LLNULL,SMNULL);;} break; case 1004: -#line 7075 "gram1.y" +#line 7079 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_SHADOW_ADD_DIR,SMNULL,(yyvsp[(4) - (9)].ll_node),(yyvsp[(6) - (9)].ll_node),(yyvsp[(9) - (9)].ll_node)); ;} break; case 1005: -#line 7079 "gram1.y" +#line 7083 "gram1.y" { if((yyvsp[(1) - (4)].ll_node)->type->variant != T_ARRAY) errstr("'%s' isn't array", (yyvsp[(1) - (4)].ll_node)->entry.Template.symbol->ident, 66); @@ -12743,42 +12782,42 @@ yyreduce: break; case 1006: -#line 7091 "gram1.y" +#line 7095 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1007: -#line 7093 "gram1.y" +#line 7097 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1008: -#line 7097 "gram1.y" +#line 7101 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 1009: -#line 7099 "gram1.y" +#line 7103 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 1010: -#line 7103 "gram1.y" +#line 7107 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (2)].ll_node);;} break; case 1011: -#line 7105 "gram1.y" +#line 7109 "gram1.y" { (yyval.ll_node) = LLNULL; opt_kwd_ = NO;;} break; case 1012: -#line 7109 "gram1.y" +#line 7113 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_LOCALIZE_DIR,SMNULL,(yyvsp[(4) - (7)].ll_node),(yyvsp[(6) - (7)].ll_node),LLNULL); ;} break; case 1013: -#line 7113 "gram1.y" +#line 7117 "gram1.y" { if((yyvsp[(1) - (1)].ll_node)->type->variant != T_ARRAY) errstr("'%s' isn't array", (yyvsp[(1) - (1)].ll_node)->entry.Template.symbol->ident, 66); @@ -12787,7 +12826,7 @@ yyreduce: break; case 1014: -#line 7119 "gram1.y" +#line 7123 "gram1.y" { if((yyvsp[(1) - (4)].ll_node)->type->variant != T_ARRAY) errstr("'%s' isn't array", (yyvsp[(1) - (4)].ll_node)->entry.Template.symbol->ident, 66); @@ -12799,27 +12838,27 @@ yyreduce: break; case 1015: -#line 7131 "gram1.y" +#line 7135 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1016: -#line 7133 "gram1.y" +#line 7137 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1017: -#line 7137 "gram1.y" +#line 7141 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 1018: -#line 7139 "gram1.y" +#line 7143 "gram1.y" { (yyval.ll_node) = make_llnd(fi,DDOT, LLNULL, LLNULL, SMNULL);;} break; case 1019: -#line 7143 "gram1.y" +#line 7147 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL, LLNULL, LLNULL, SMNULL); (yyval.ll_node)->entry.string_val = (char *) "*"; @@ -12828,7 +12867,7 @@ yyreduce: break; case 1020: -#line 7151 "gram1.y" +#line 7155 "gram1.y" { PTR_LLND q; if((yyvsp[(16) - (16)].ll_node)) @@ -12840,32 +12879,32 @@ yyreduce: break; case 1021: -#line 7162 "gram1.y" +#line 7166 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 1022: -#line 7164 "gram1.y" +#line 7168 "gram1.y" { (yyval.ll_node) = make_llnd(fi, PARALLEL_OP, LLNULL, LLNULL, SMNULL); ;} break; case 1023: -#line 7166 "gram1.y" +#line 7170 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_LOCAL_OP, LLNULL, LLNULL, SMNULL); ;} break; case 1024: -#line 7170 "gram1.y" +#line 7174 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CP_LOAD_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL); ;} break; case 1025: -#line 7174 "gram1.y" +#line 7178 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CP_SAVE_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL); ;} break; case 1026: -#line 7176 "gram1.y" +#line 7180 "gram1.y" { PTR_LLND q; q = make_llnd(fi,ACC_ASYNC_OP,LLNULL,LLNULL,SMNULL); @@ -12874,46 +12913,46 @@ yyreduce: break; case 1027: -#line 7184 "gram1.y" +#line 7188 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_CP_WAIT_DIR,SMNULL,(yyvsp[(3) - (9)].ll_node),(yyvsp[(8) - (9)].ll_node),LLNULL); ;} break; case 1028: -#line 7188 "gram1.y" +#line 7192 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_TEMPLATE_CREATE_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL); ;} break; case 1029: -#line 7191 "gram1.y" +#line 7195 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 1030: -#line 7193 "gram1.y" +#line 7197 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 1031: -#line 7197 "gram1.y" +#line 7201 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,DVM_TEMPLATE_DELETE_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL); ;} break; case 1059: -#line 7231 "gram1.y" +#line 7235 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_ONETHREAD_DIR,SMNULL,LLNULL,LLNULL,LLNULL); ;} break; case 1060: -#line 7237 "gram1.y" +#line 7241 "gram1.y" { (yyval.bf_node) = make_endparallel(); ;} break; case 1061: -#line 7243 "gram1.y" +#line 7247 "gram1.y" { (yyval.bf_node) = make_parallel(); (yyval.bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (4)].ll_node); @@ -12922,7 +12961,7 @@ yyreduce: break; case 1062: -#line 7249 "gram1.y" +#line 7253 "gram1.y" { (yyval.bf_node) = make_parallel(); opt_kwd_ = NO; @@ -12930,70 +12969,70 @@ yyreduce: break; case 1063: -#line 7255 "gram1.y" +#line 7259 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1064: -#line 7259 "gram1.y" +#line 7263 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),EXPR_LIST); ;} break; case 1074: -#line 7276 "gram1.y" +#line 7280 "gram1.y" { (yyval.ll_node) = (yyvsp[(4) - (5)].ll_node); ;} break; case 1075: -#line 7281 "gram1.y" +#line 7285 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_PRIVATE,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 1076: -#line 7286 "gram1.y" +#line 7290 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_FIRSTPRIVATE,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 1077: -#line 7292 "gram1.y" +#line 7296 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_LASTPRIVATE,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 1078: -#line 7298 "gram1.y" +#line 7302 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_COPYIN,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 1079: -#line 7304 "gram1.y" +#line 7308 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_SHARED,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 1080: -#line 7309 "gram1.y" +#line 7313 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_DEFAULT,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL); ;} break; case 1081: -#line 7315 "gram1.y" +#line 7319 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "private"; @@ -13002,7 +13041,7 @@ yyreduce: break; case 1082: -#line 7321 "gram1.y" +#line 7325 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "shared"; @@ -13011,7 +13050,7 @@ yyreduce: break; case 1083: -#line 7327 "gram1.y" +#line 7331 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "none"; @@ -13020,21 +13059,21 @@ yyreduce: break; case 1084: -#line 7334 "gram1.y" +#line 7338 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_IF,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL); ;} break; case 1085: -#line 7340 "gram1.y" +#line 7344 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_NUM_THREADS,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL); ;} break; case 1086: -#line 7346 "gram1.y" +#line 7350 "gram1.y" { PTR_LLND q; q = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); @@ -13043,12 +13082,12 @@ yyreduce: break; case 1087: -#line 7353 "gram1.y" +#line 7357 "gram1.y" {(yyval.ll_node) = make_llnd(fi,DDOT,(yyvsp[(2) - (4)].ll_node),(yyvsp[(4) - (4)].ll_node),SMNULL);;} break; case 1089: -#line 7359 "gram1.y" +#line 7363 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "+"; @@ -13057,7 +13096,7 @@ yyreduce: break; case 1090: -#line 7365 "gram1.y" +#line 7369 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "-"; @@ -13066,7 +13105,7 @@ yyreduce: break; case 1091: -#line 7372 "gram1.y" +#line 7376 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "*"; @@ -13075,7 +13114,7 @@ yyreduce: break; case 1092: -#line 7378 "gram1.y" +#line 7382 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "/"; @@ -13084,7 +13123,7 @@ yyreduce: break; case 1093: -#line 7384 "gram1.y" +#line 7388 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "min"; @@ -13093,7 +13132,7 @@ yyreduce: break; case 1094: -#line 7390 "gram1.y" +#line 7394 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "max"; @@ -13102,7 +13141,7 @@ yyreduce: break; case 1095: -#line 7396 "gram1.y" +#line 7400 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) ".or."; @@ -13111,7 +13150,7 @@ yyreduce: break; case 1096: -#line 7402 "gram1.y" +#line 7406 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) ".and."; @@ -13120,7 +13159,7 @@ yyreduce: break; case 1097: -#line 7408 "gram1.y" +#line 7412 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) ".eqv."; @@ -13129,7 +13168,7 @@ yyreduce: break; case 1098: -#line 7414 "gram1.y" +#line 7418 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) ".neqv."; @@ -13138,7 +13177,7 @@ yyreduce: break; case 1099: -#line 7420 "gram1.y" +#line 7424 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "iand"; @@ -13147,7 +13186,7 @@ yyreduce: break; case 1100: -#line 7426 "gram1.y" +#line 7430 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "ieor"; @@ -13156,7 +13195,7 @@ yyreduce: break; case 1101: -#line 7432 "gram1.y" +#line 7436 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "ior"; @@ -13165,7 +13204,7 @@ yyreduce: break; case 1102: -#line 7438 "gram1.y" +#line 7442 "gram1.y" { err("Illegal reduction operation name", 70); errcnt--; (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); @@ -13175,7 +13214,7 @@ yyreduce: break; case 1103: -#line 7448 "gram1.y" +#line 7452 "gram1.y" { (yyval.bf_node) = make_sections((yyvsp[(4) - (4)].ll_node)); opt_kwd_ = NO; @@ -13183,7 +13222,7 @@ yyreduce: break; case 1104: -#line 7453 "gram1.y" +#line 7457 "gram1.y" { (yyval.bf_node) = make_sections(LLNULL); opt_kwd_ = NO; @@ -13191,21 +13230,21 @@ yyreduce: break; case 1105: -#line 7459 "gram1.y" +#line 7463 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1106: -#line 7463 "gram1.y" +#line 7467 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),EXPR_LIST); ;} break; case 1111: -#line 7475 "gram1.y" +#line 7479 "gram1.y" { PTR_LLND q; (yyval.bf_node) = make_endsections(); @@ -13216,7 +13255,7 @@ yyreduce: break; case 1112: -#line 7483 "gram1.y" +#line 7487 "gram1.y" { (yyval.bf_node) = make_endsections(); opt_kwd_ = NO; @@ -13224,14 +13263,14 @@ yyreduce: break; case 1113: -#line 7489 "gram1.y" +#line 7493 "gram1.y" { (yyval.bf_node) = make_ompsection(); ;} break; case 1114: -#line 7495 "gram1.y" +#line 7499 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_DO_DIR,SMNULL,(yyvsp[(4) - (4)].ll_node),LLNULL,LLNULL); opt_kwd_ = NO; @@ -13239,7 +13278,7 @@ yyreduce: break; case 1115: -#line 7500 "gram1.y" +#line 7504 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); opt_kwd_ = NO; @@ -13247,7 +13286,7 @@ yyreduce: break; case 1116: -#line 7506 "gram1.y" +#line 7510 "gram1.y" { PTR_LLND q; q = set_ll_list((yyvsp[(4) - (4)].ll_node),LLNULL,EXPR_LIST); @@ -13257,7 +13296,7 @@ yyreduce: break; case 1117: -#line 7513 "gram1.y" +#line 7517 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_END_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); opt_kwd_ = NO; @@ -13265,21 +13304,21 @@ yyreduce: break; case 1118: -#line 7519 "gram1.y" +#line 7523 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1119: -#line 7523 "gram1.y" +#line 7527 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),EXPR_LIST); ;} break; case 1126: -#line 7537 "gram1.y" +#line 7541 "gram1.y" { /*$$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "ORDERED"; @@ -13289,21 +13328,21 @@ yyreduce: break; case 1127: -#line 7546 "gram1.y" +#line 7550 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_SCHEDULE,(yyvsp[(4) - (7)].ll_node),(yyvsp[(6) - (7)].ll_node),SMNULL); ;} break; case 1128: -#line 7550 "gram1.y" +#line 7554 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_SCHEDULE,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL); ;} break; case 1129: -#line 7556 "gram1.y" +#line 7560 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "STATIC"; @@ -13313,7 +13352,7 @@ yyreduce: break; case 1130: -#line 7563 "gram1.y" +#line 7567 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "DYNAMIC"; @@ -13323,7 +13362,7 @@ yyreduce: break; case 1131: -#line 7570 "gram1.y" +#line 7574 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "GUIDED"; @@ -13333,7 +13372,7 @@ yyreduce: break; case 1132: -#line 7577 "gram1.y" +#line 7581 "gram1.y" { (yyval.ll_node) = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); (yyval.ll_node)->entry.string_val = (char *) "RUNTIME"; @@ -13343,7 +13382,7 @@ yyreduce: break; case 1133: -#line 7586 "gram1.y" +#line 7590 "gram1.y" { (yyval.bf_node) = make_single(); (yyval.bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (4)].ll_node); @@ -13352,7 +13391,7 @@ yyreduce: break; case 1134: -#line 7592 "gram1.y" +#line 7596 "gram1.y" { (yyval.bf_node) = make_single(); opt_kwd_ = NO; @@ -13360,21 +13399,21 @@ yyreduce: break; case 1135: -#line 7598 "gram1.y" +#line 7602 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1136: -#line 7602 "gram1.y" +#line 7606 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),EXPR_LIST); ;} break; case 1139: -#line 7612 "gram1.y" +#line 7616 "gram1.y" { (yyval.bf_node) = make_endsingle(); (yyval.bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (4)].ll_node); @@ -13383,7 +13422,7 @@ yyreduce: break; case 1140: -#line 7618 "gram1.y" +#line 7622 "gram1.y" { (yyval.bf_node) = make_endsingle(); opt_kwd_ = NO; @@ -13391,42 +13430,42 @@ yyreduce: break; case 1141: -#line 7624 "gram1.y" +#line 7628 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1142: -#line 7628 "gram1.y" +#line 7632 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),EXPR_LIST); ;} break; case 1145: -#line 7639 "gram1.y" +#line 7643 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_COPYPRIVATE,(yyvsp[(2) - (2)].ll_node),LLNULL,SMNULL); ;} break; case 1146: -#line 7645 "gram1.y" +#line 7649 "gram1.y" { (yyval.ll_node) = make_llnd(fi,OMP_NOWAIT,LLNULL,LLNULL,SMNULL); ;} break; case 1147: -#line 7651 "gram1.y" +#line 7655 "gram1.y" { (yyval.bf_node) = make_workshare(); ;} break; case 1148: -#line 7656 "gram1.y" +#line 7660 "gram1.y" { PTR_LLND q; (yyval.bf_node) = make_endworkshare(); @@ -13437,7 +13476,7 @@ yyreduce: break; case 1149: -#line 7664 "gram1.y" +#line 7668 "gram1.y" { (yyval.bf_node) = make_endworkshare(); opt_kwd_ = NO; @@ -13445,7 +13484,7 @@ yyreduce: break; case 1150: -#line 7670 "gram1.y" +#line 7674 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_PARALLEL_DO_DIR,SMNULL,(yyvsp[(4) - (4)].ll_node),LLNULL,LLNULL); opt_kwd_ = NO; @@ -13453,7 +13492,7 @@ yyreduce: break; case 1151: -#line 7675 "gram1.y" +#line 7679 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_PARALLEL_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); opt_kwd_ = NO; @@ -13461,28 +13500,28 @@ yyreduce: break; case 1152: -#line 7682 "gram1.y" +#line 7686 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(3) - (4)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1153: -#line 7686 "gram1.y" +#line 7690 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node),(yyvsp[(4) - (5)].ll_node),EXPR_LIST); ;} break; case 1165: -#line 7706 "gram1.y" +#line 7710 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_END_PARALLEL_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); ;} break; case 1166: -#line 7711 "gram1.y" +#line 7715 "gram1.y" { (yyval.bf_node) = make_parallelsections((yyvsp[(4) - (4)].ll_node)); opt_kwd_ = NO; @@ -13490,7 +13529,7 @@ yyreduce: break; case 1167: -#line 7716 "gram1.y" +#line 7720 "gram1.y" { (yyval.bf_node) = make_parallelsections(LLNULL); opt_kwd_ = NO; @@ -13498,14 +13537,14 @@ yyreduce: break; case 1168: -#line 7723 "gram1.y" +#line 7727 "gram1.y" { (yyval.bf_node) = make_endparallelsections(); ;} break; case 1169: -#line 7728 "gram1.y" +#line 7732 "gram1.y" { (yyval.bf_node) = make_parallelworkshare(); (yyval.bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (4)].ll_node); @@ -13514,7 +13553,7 @@ yyreduce: break; case 1170: -#line 7734 "gram1.y" +#line 7738 "gram1.y" { (yyval.bf_node) = make_parallelworkshare(); opt_kwd_ = NO; @@ -13522,77 +13561,77 @@ yyreduce: break; case 1171: -#line 7740 "gram1.y" +#line 7744 "gram1.y" { (yyval.bf_node) = make_endparallelworkshare(); ;} break; case 1172: -#line 7745 "gram1.y" +#line 7749 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_THREADPRIVATE_DIR, SMNULL, (yyvsp[(3) - (3)].ll_node), LLNULL, LLNULL); ;} break; case 1173: -#line 7750 "gram1.y" +#line 7754 "gram1.y" { (yyval.bf_node) = make_master(); ;} break; case 1174: -#line 7755 "gram1.y" +#line 7759 "gram1.y" { (yyval.bf_node) = make_endmaster(); ;} break; case 1175: -#line 7759 "gram1.y" +#line 7763 "gram1.y" { (yyval.bf_node) = make_ordered(); ;} break; case 1176: -#line 7764 "gram1.y" +#line 7768 "gram1.y" { (yyval.bf_node) = make_endordered(); ;} break; case 1177: -#line 7769 "gram1.y" +#line 7773 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_BARRIER_DIR,SMNULL,LLNULL,LLNULL,LLNULL); ;} break; case 1178: -#line 7773 "gram1.y" +#line 7777 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_ATOMIC_DIR,SMNULL,LLNULL,LLNULL,LLNULL); ;} break; case 1179: -#line 7778 "gram1.y" +#line 7782 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_FLUSH_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL); ;} break; case 1180: -#line 7782 "gram1.y" +#line 7786 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,OMP_FLUSH_DIR,SMNULL,LLNULL,LLNULL,LLNULL); ;} break; case 1181: -#line 7788 "gram1.y" +#line 7792 "gram1.y" { (yyval.bf_node) = make_critical(); (yyval.bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (5)].ll_node); @@ -13600,14 +13639,14 @@ yyreduce: break; case 1182: -#line 7793 "gram1.y" +#line 7797 "gram1.y" { (yyval.bf_node) = make_critical(); ;} break; case 1183: -#line 7799 "gram1.y" +#line 7803 "gram1.y" { (yyval.bf_node) = make_endcritical(); (yyval.bf_node)->entry.Template.ll_ptr1 = (yyvsp[(4) - (5)].ll_node); @@ -13615,14 +13654,14 @@ yyreduce: break; case 1184: -#line 7804 "gram1.y" +#line 7808 "gram1.y" { (yyval.bf_node) = make_endcritical(); ;} break; case 1185: -#line 7810 "gram1.y" +#line 7814 "gram1.y" { PTR_SYMB s; PTR_LLND l; @@ -13633,482 +13672,497 @@ yyreduce: break; case 1186: -#line 7820 "gram1.y" +#line 7824 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1187: -#line 7824 "gram1.y" +#line 7828 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1188: -#line 7828 "gram1.y" - { - (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); - ;} - break; - - case 1189: #line 7832 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; + case 1189: +#line 7836 "gram1.y" + { + (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); + ;} + break; + case 1190: -#line 7837 "gram1.y" +#line 7841 "gram1.y" { operator_slash = 1; ;} break; case 1191: -#line 7840 "gram1.y" +#line 7844 "gram1.y" { operator_slash = 0; ;} break; case 1199: -#line 7854 "gram1.y" +#line 7858 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_REGION_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 1200: -#line 7858 "gram1.y" +#line 7862 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_CHECKSECTION_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1201: -#line 7862 "gram1.y" +#line 7866 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_GET_ACTUAL_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 1202: -#line 7864 "gram1.y" +#line 7868 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_GET_ACTUAL_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1203: -#line 7866 "gram1.y" +#line 7870 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_GET_ACTUAL_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1204: -#line 7870 "gram1.y" +#line 7874 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_ACTUAL_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 1205: -#line 7872 "gram1.y" +#line 7876 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_ACTUAL_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1206: -#line 7874 "gram1.y" +#line 7878 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_ACTUAL_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1207: -#line 7878 "gram1.y" +#line 7882 "gram1.y" { (yyval.ll_node) = LLNULL;;} break; case 1208: -#line 7880 "gram1.y" +#line 7884 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node); ;} break; case 1209: -#line 7884 "gram1.y" +#line 7888 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1210: -#line 7886 "gram1.y" +#line 7890 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1211: -#line 7890 "gram1.y" +#line 7894 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (2)].ll_node);;} break; case 1212: -#line 7893 "gram1.y" +#line 7897 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (2)].ll_node);;} break; case 1213: -#line 7896 "gram1.y" +#line 7900 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (2)].ll_node);;} break; case 1214: -#line 7901 "gram1.y" +#line 7905 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_INOUT_OP,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL);;} break; case 1215: -#line 7903 "gram1.y" +#line 7907 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_IN_OP,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL);;} break; case 1216: -#line 7905 "gram1.y" +#line 7909 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_OUT_OP,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL);;} break; case 1217: -#line 7907 "gram1.y" +#line 7911 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_LOCAL_OP,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL);;} break; case 1218: -#line 7909 "gram1.y" +#line 7913 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_INLOCAL_OP,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL);;} break; case 1219: -#line 7913 "gram1.y" +#line 7917 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_TARGETS_OP,(yyvsp[(3) - (4)].ll_node),LLNULL,SMNULL);;} break; case 1220: -#line 7917 "gram1.y" +#line 7921 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_ASYNC_OP,LLNULL,LLNULL,SMNULL);;} break; case 1221: -#line 7922 "gram1.y" +#line 7926 "gram1.y" { (yyval.ll_node) = (yyvsp[(1) - (1)].ll_node);;} break; case 1222: -#line 7926 "gram1.y" +#line 7930 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1223: -#line 7928 "gram1.y" +#line 7932 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1224: -#line 7932 "gram1.y" +#line 7936 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_HOST_OP, LLNULL,LLNULL,SMNULL);;} break; case 1225: -#line 7934 "gram1.y" +#line 7938 "gram1.y" { (yyval.ll_node) = make_llnd(fi,ACC_CUDA_OP, LLNULL,LLNULL,SMNULL);;} break; case 1226: -#line 7938 "gram1.y" +#line 7942 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_END_REGION_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1227: -#line 7942 "gram1.y" +#line 7946 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_END_CHECKSECTION_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1228: -#line 7946 "gram1.y" +#line 7950 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,ACC_ROUTINE_DIR,SMNULL,(yyvsp[(3) - (3)].ll_node),LLNULL,LLNULL);;} break; case 1229: -#line 7950 "gram1.y" +#line 7954 "gram1.y" { (yyval.ll_node) = LLNULL; ;} break; case 1230: -#line 7952 "gram1.y" +#line 7956 "gram1.y" { (yyval.ll_node) = (yyvsp[(2) - (2)].ll_node);;} break; case 1237: -#line 7964 "gram1.y" +#line 7968 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_ANALYSIS_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 1238: -#line 7968 "gram1.y" +#line 7972 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_PARALLEL_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 1239: -#line 7972 "gram1.y" +#line 7976 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_TRANSFORM_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 1240: -#line 7976 "gram1.y" +#line 7980 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_PARALLEL_REG_DIR,(yyvsp[(3) - (3)].symbol),LLNULL,LLNULL,LLNULL);;} break; case 1241: -#line 7978 "gram1.y" +#line 7982 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_PARALLEL_REG_DIR,(yyvsp[(3) - (10)].symbol),(yyvsp[(8) - (10)].ll_node),(yyvsp[(10) - (10)].ll_node),LLNULL);;} break; case 1242: -#line 7980 "gram1.y" +#line 7984 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_PARALLEL_REG_DIR,(yyvsp[(3) - (10)].symbol),(yyvsp[(10) - (10)].ll_node),(yyvsp[(8) - (10)].ll_node),LLNULL);;} break; case 1243: -#line 7984 "gram1.y" +#line 7988 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1244: -#line 7986 "gram1.y" +#line 7990 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1245: -#line 7990 "gram1.y" +#line 7994 "gram1.y" { (yyval.ll_node) = make_llnd(fi,SPF_CODE_COVERAGE_OP,LLNULL,LLNULL,SMNULL);;} break; case 1246: -#line 7994 "gram1.y" +#line 7998 "gram1.y" { (yyval.ll_node) = LLNULL;;} break; case 1247: -#line 7996 "gram1.y" +#line 8000 "gram1.y" { (yyval.ll_node) = (yyvsp[(5) - (6)].ll_node);;} break; case 1248: -#line 8000 "gram1.y" +#line 8004 "gram1.y" { (yyval.ll_node) = LLNULL;;} break; case 1249: -#line 8002 "gram1.y" +#line 8006 "gram1.y" { (yyval.ll_node) = (yyvsp[(5) - (6)].ll_node);;} break; case 1250: -#line 8006 "gram1.y" +#line 8010 "gram1.y" { (yyval.bf_node) = get_bfnd(fi,SPF_END_PARALLEL_REG_DIR,SMNULL,LLNULL,LLNULL,LLNULL);;} break; case 1251: -#line 8010 "gram1.y" +#line 8014 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1252: -#line 8012 "gram1.y" +#line 8016 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; - case 1256: -#line 8021 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,REDUCTION_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL); ;} - break; - - case 1257: -#line 8025 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,ACC_PRIVATE_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} - break; - case 1258: -#line 8029 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_PARAMETER_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} +#line 8027 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,REDUCTION_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL); ;} break; case 1259: -#line 8032 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} +#line 8031 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,ACC_PRIVATE_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1260: -#line 8034 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} +#line 8035 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_PROCESS_PRIVATE_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1261: -#line 8038 "gram1.y" - { (yyval.ll_node) = make_llnd(fi, ASSGN_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); ;} +#line 8039 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_COVER_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1262: -#line 8042 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} +#line 8043 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_PARAMETER_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1263: -#line 8044 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} +#line 8046 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} + break; + + case 1264: +#line 8048 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} + break; + + case 1265: +#line 8052 "gram1.y" + { (yyval.ll_node) = make_llnd(fi, ASSGN_OP, (yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), SMNULL); ;} + break; + + case 1266: +#line 8056 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1267: -#line 8053 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SHADOW_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} - break; - - case 1268: -#line 8057 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,ACROSS_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} - break; - - case 1269: -#line 8061 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,REMOTE_ACCESS_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} - break; - - case 1270: -#line 8065 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} +#line 8058 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1271: #line 8067 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} + { (yyval.ll_node) = make_llnd(fi,SHADOW_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1272: #line 8071 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_NOINLINE_OP,LLNULL,LLNULL,SMNULL);;} + { (yyval.ll_node) = make_llnd(fi,ACROSS_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1273: -#line 8073 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_FISSION_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} +#line 8075 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,REMOTE_ACCESS_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1274: -#line 8075 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_EXPAND_OP,LLNULL,LLNULL,SMNULL);;} +#line 8079 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1275: -#line 8077 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_EXPAND_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} +#line 8081 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; case 1276: -#line 8080 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_SHRINK_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} +#line 8085 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_NOINLINE_OP,LLNULL,LLNULL,SMNULL);;} break; case 1277: -#line 8082 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_UNROLL_OP,LLNULL,LLNULL,SMNULL);;} +#line 8087 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_FISSION_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1278: -#line 8084 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_UNROLL_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} +#line 8089 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_EXPAND_OP,LLNULL,LLNULL,SMNULL);;} break; case 1279: -#line 8088 "gram1.y" +#line 8091 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_EXPAND_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + break; + + case 1280: +#line 8094 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_SHRINK_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + break; + + case 1281: +#line 8096 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_UNROLL_OP,LLNULL,LLNULL,SMNULL);;} + break; + + case 1282: +#line 8098 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_UNROLL_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + break; + + case 1283: +#line 8100 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_MERGE_OP,LLNULL,LLNULL,SMNULL);;} + break; + + case 1284: +#line 8104 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (5)].ll_node), (yyvsp[(3) - (5)].ll_node), EXPR_LIST); (yyval.ll_node) = set_ll_list((yyval.ll_node), (yyvsp[(5) - (5)].ll_node), EXPR_LIST); ;} break; - case 1280: -#line 8095 "gram1.y" - { (yyval.symbol) = make_parallel_region((yyvsp[(1) - (1)].hash_entry));;} - break; - - case 1281: -#line 8099 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} - break; - - case 1282: -#line 8101 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} - break; - - case 1283: -#line 8105 "gram1.y" - { (yyval.bf_node) = get_bfnd(fi,SPF_CHECKPOINT_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} - break; - - case 1284: -#line 8109 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} - break; - case 1285: #line 8111 "gram1.y" - { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} + { (yyval.symbol) = make_parallel_region((yyvsp[(1) - (1)].hash_entry));;} break; case 1286: #line 8115 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_TYPE_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node), LLNULL, EXPR_LIST); ;} break; case 1287: #line 8117 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_VARLIST_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node), (yyvsp[(3) - (3)].ll_node), EXPR_LIST); ;} break; case 1288: -#line 8119 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_EXCEPT_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} +#line 8121 "gram1.y" + { (yyval.bf_node) = get_bfnd(fi,SPF_CHECKPOINT_DIR,SMNULL,(yyvsp[(4) - (5)].ll_node),LLNULL,LLNULL);;} break; case 1289: -#line 8121 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_FILES_COUNT_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} - break; - - case 1290: -#line 8123 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_INTERVAL_OP,(yyvsp[(4) - (7)].ll_node),(yyvsp[(6) - (7)].ll_node),SMNULL);;} - break; - - case 1291: -#line 8127 "gram1.y" +#line 8125 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; - case 1292: -#line 8129 "gram1.y" + case 1290: +#line 8127 "gram1.y" { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} break; - case 1293: + case 1291: +#line 8131 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_TYPE_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + break; + + case 1292: #line 8133 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,ACC_ASYNC_OP, LLNULL,LLNULL,SMNULL);;} + { (yyval.ll_node) = make_llnd(fi,SPF_VARLIST_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} + break; + + case 1293: +#line 8135 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_EXCEPT_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1294: -#line 8135 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_FLEXIBLE_OP, LLNULL,LLNULL,SMNULL);;} +#line 8137 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_FILES_COUNT_OP,(yyvsp[(4) - (5)].ll_node),LLNULL,SMNULL);;} break; case 1295: #line 8139 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_TIME_OP, LLNULL,LLNULL,SMNULL);;} + { (yyval.ll_node) = make_llnd(fi,SPF_INTERVAL_OP,(yyvsp[(4) - (7)].ll_node),(yyvsp[(6) - (7)].ll_node),SMNULL);;} break; case 1296: -#line 8141 "gram1.y" - { (yyval.ll_node) = make_llnd(fi,SPF_ITER_OP, LLNULL,LLNULL,SMNULL);;} +#line 8143 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (1)].ll_node),LLNULL,EXPR_LIST); ;} break; case 1297: #line 8145 "gram1.y" + { (yyval.ll_node) = set_ll_list((yyvsp[(1) - (3)].ll_node),(yyvsp[(3) - (3)].ll_node),EXPR_LIST); ;} + break; + + case 1298: +#line 8149 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,ACC_ASYNC_OP, LLNULL,LLNULL,SMNULL);;} + break; + + case 1299: +#line 8151 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_FLEXIBLE_OP, LLNULL,LLNULL,SMNULL);;} + break; + + case 1300: +#line 8155 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_TIME_OP, LLNULL,LLNULL,SMNULL);;} + break; + + case 1301: +#line 8157 "gram1.y" + { (yyval.ll_node) = make_llnd(fi,SPF_ITER_OP, LLNULL,LLNULL,SMNULL);;} + break; + + case 1302: +#line 8161 "gram1.y" { if(position==IN_OUTSIDE) err("Misplaced SPF-directive",103); ;} @@ -14116,7 +14170,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 14120 "gram1.tab.c" +#line 14174 "gram1.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/dvm/fdvm/trunk/parser/gram1.tab.h b/dvm/fdvm/trunk/parser/gram1.tab.h index 350c0b5..4103314 100644 --- a/dvm/fdvm/trunk/parser/gram1.tab.h +++ b/dvm/fdvm/trunk/parser/gram1.tab.h @@ -391,8 +391,11 @@ SPF_APPLY_FRAGMENT = 350, SPF_CODE_COVERAGE = 351, SPF_UNROLL = 352, - BINARY_OP = 355, - UNARY_OP = 356 + SPF_MERGE = 353, + SPF_COVER = 354, + SPF_PROCESS_PRIVATE = 355, + BINARY_OP = 358, + UNARY_OP = 359 }; #endif /* Tokens. */ @@ -748,15 +751,18 @@ #define SPF_APPLY_FRAGMENT 350 #define SPF_CODE_COVERAGE 351 #define SPF_UNROLL 352 -#define BINARY_OP 355 -#define UNARY_OP 356 +#define SPF_MERGE 353 +#define SPF_COVER 354 +#define SPF_PROCESS_PRIVATE 355 +#define BINARY_OP 358 +#define UNARY_OP 359 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE -#line 435 "gram1.y" +#line 438 "gram1.y" { int token; char charv; @@ -769,7 +775,7 @@ typedef union YYSTYPE PTR_LABEL label; } /* Line 1489 of yacc.c. */ -#line 773 "gram1.tab.h" +#line 779 "gram1.tab.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/dvm/fdvm/trunk/parser/gram1.y b/dvm/fdvm/trunk/parser/gram1.y index 625d72c..7c33a7b 100644 --- a/dvm/fdvm/trunk/parser/gram1.y +++ b/dvm/fdvm/trunk/parser/gram1.y @@ -350,6 +350,9 @@ %token SPF_APPLY_FRAGMENT 350 %token SPF_CODE_COVERAGE 351 %token SPF_UNROLL 352 +%token SPF_MERGE 353 +%token SPF_COVER 354 +%token SPF_PROCESS_PRIVATE 355 %{ #include @@ -633,6 +636,7 @@ static int in_vec = NO; /* set if processing array constructor */ %type spf_directive spf_analysis spf_parallel spf_transform spf_parallel_reg spf_end_parallel_reg %type spf_checkpoint %type analysis_spec_list analysis_spec analysis_reduction_spec analysis_private_spec analysis_parameter_spec +%type analysis_cover_spec analysis_process_private_spec %type parallel_spec_list parallel_spec parallel_shadow_spec parallel_across_spec parallel_remote_access_spec %type transform_spec_list transform_spec array_element_list spf_parameter_list spf_parameter %type characteristic characteristic_list opt_clause_apply_region opt_clause_apply_fragment @@ -8014,17 +8018,27 @@ analysis_spec_list: analysis_spec analysis_spec: analysis_reduction_spec | analysis_private_spec - | analysis_parameter_spec + | analysis_process_private_spec + | analysis_parameter_spec + | analysis_cover_spec ; analysis_reduction_spec: needkeyword REDUCTION LEFTPAR reduction_list RIGHTPAR { $$ = make_llnd(fi,REDUCTION_OP,$4,LLNULL,SMNULL); } - ; + ; analysis_private_spec: needkeyword PRIVATE LEFTPAR variable_list RIGHTPAR { $$ = make_llnd(fi,ACC_PRIVATE_OP,$4,LLNULL,SMNULL);} ; +analysis_process_private_spec: needkeyword SPF_PROCESS_PRIVATE LEFTPAR variable_list RIGHTPAR + { $$ = make_llnd(fi,SPF_PROCESS_PRIVATE_OP,$4,LLNULL,SMNULL);} + ; + +analysis_cover_spec: needkeyword SPF_COVER LEFTPAR integer_constant RIGHTPAR + { $$ = make_llnd(fi,SPF_COVER_OP,$4,LLNULL,SMNULL);} + ; + analysis_parameter_spec: needkeyword PARAMETER LEFTPAR spf_parameter_list RIGHTPAR { $$ = make_llnd(fi,SPF_PARAMETER_OP,$4,LLNULL,SMNULL);} ; @@ -8082,6 +8096,8 @@ transform_spec: needkeyword SPF_NOINLINE { $$ = make_llnd(fi,SPF_UNROLL_OP,LLNULL,LLNULL,SMNULL);} | needkeyword SPF_UNROLL LEFTPAR unroll_list RIGHTPAR { $$ = make_llnd(fi,SPF_UNROLL_OP,$4,LLNULL,SMNULL);} + | needkeyword SPF_MERGE + { $$ = make_llnd(fi,SPF_MERGE_OP,LLNULL,LLNULL,SMNULL);} ; unroll_list: expr COMMA expr COMMA expr diff --git a/dvm/fdvm/trunk/parser/lexfdvm.c b/dvm/fdvm/trunk/parser/lexfdvm.c index 686e44c..d3a7fc5 100644 --- a/dvm/fdvm/trunk/parser/lexfdvm.c +++ b/dvm/fdvm/trunk/parser/lexfdvm.c @@ -370,6 +370,7 @@ struct Keylist keys[] = { {"copyin", OMPDVM_COPYIN},/*OMP*/ {"copyprivate", OMPDVM_COPYPRIVATE},/*OMP*/ {"corner", CORNER}, + {"cover", SPF_COVER}, /*SPF*/ /* {"criticalsection", CRITICALSECTION},*/ {"cuda_block", ACC_CUDA_BLOCK}, /*ACC*/ {"cuda", ACC_CUDA}, /*ACC*/ @@ -494,7 +495,7 @@ struct Keylist keys[] = { {"maxloc", MAXLOC}, /* {"maxparallel", MAXPARALLEL},*/ {"max", MAX}, -/* {"merger", MERGER},*/ + {"merge", SPF_MERGE}, /*SPF*/ {"minloc", MINLOC}, {"min", MIN}, {"moduleprocedure", MODULE_PROCEDURE}, @@ -536,6 +537,7 @@ struct Keylist keys[] = { {"private", PRIVATE}, /*!!! {"probe", PROBE}, */ /*!!! {"procedure", PROCEDURE},*/ + {"process_private", SPF_PROCESS_PRIVATE}, /*SPF*/ {"product", PRODUCT}, {"program", PROGRAM}, /*!!! {"processcluster", PROCESS_CLUSTER},*/ diff --git a/dvm/fdvm/trunk/parser/tag b/dvm/fdvm/trunk/parser/tag index 3ea61d6..77be3b4 100644 --- a/dvm/fdvm/trunk/parser/tag +++ b/dvm/fdvm/trunk/parser/tag @@ -619,3 +619,7 @@ #define SPF_PARAMETER_OP 969 /* SAPFOR */ #define SPF_CODE_COVERAGE_OP 970 /* SAPFOR */ #define SPF_UNROLL_OP 971 /* SAPFOR */ +#define SPF_COVER_OP 972 /* SAPFOR */ +#define SPF_MERGE_OP 973 /* SAPFOR */ +#define SPF_PROCESS_PRIVATE_OP 974 /* SAPFOR */ + diff --git a/dvm/fdvm/trunk/parser/tag.h b/dvm/fdvm/trunk/parser/tag.h index f09a6cf..38e9115 100644 --- a/dvm/fdvm/trunk/parser/tag.h +++ b/dvm/fdvm/trunk/parser/tag.h @@ -621,3 +621,7 @@ script using "tag". Run make tag.h to regenerate this file */ tag [ SPF_PARAMETER_OP ] = "SPF_PARAMETER_OP"; tag [ SPF_CODE_COVERAGE_OP ] = "SPF_CODE_COVERAGE_OP"; tag [ SPF_UNROLL_OP ] = "SPF_UNROLL_OP"; + tag [ SPF_COVER_OP ] = "SPF_COVER_OP"; + tag [ SPF_MERGE_OP ] = "SPF_MERGE_OP"; + tag [ SPF_PROCESS_PRIVATE_OP ] = "SPF_PROCESS_PRIVATE_OP"; + diff --git a/dvm/fdvm/trunk/parser/tokdefs.h b/dvm/fdvm/trunk/parser/tokdefs.h index 5dd32ef..93b1455 100644 --- a/dvm/fdvm/trunk/parser/tokdefs.h +++ b/dvm/fdvm/trunk/parser/tokdefs.h @@ -350,3 +350,6 @@ #define SPF_APPLY_FRAGMENT 350 #define SPF_CODE_COVERAGE 351 #define SPF_UNROLL 352 +#define SPF_MERGE 353 +#define SPF_COVER 354 +#define SPF_PROCESS_PRIVATE 355 diff --git a/dvm/fdvm/trunk/parser/tokens b/dvm/fdvm/trunk/parser/tokens index 0b478e7..8a3bda9 100644 --- a/dvm/fdvm/trunk/parser/tokens +++ b/dvm/fdvm/trunk/parser/tokens @@ -350,3 +350,6 @@ SPF_APPLY_REGION SPF_APPLY_FRAGMENT SPF_CODE_COVERAGE SPF_UNROLL +SPF_MERGE +SPF_COVER +SPF_PROCESS_PRIVATE diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp index d2860c5..df9e069 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.cpp @@ -84,7 +84,7 @@ static inline Symbol* getData(SgExpression *symb, Symbol**, bool moduleNameAdd = } template -void fillPrivatesFromComment(Statement *stIn, set &privates) +void fillPrivatesFromComment(Statement *stIn, set &privates, int type) { if (stIn) { @@ -94,7 +94,10 @@ void fillPrivatesFromComment(Statement *stIn, set &privates) SgExpression *exprList = st->expr(0); while (exprList) { - if (exprList->lhs()->variant() == ACC_PRIVATE_OP) + const int var = exprList->lhs()->variant(); + if ( ((var == ACC_PRIVATE_OP || var == SPF_PROCESS_PRIVATE_OP) && type == -1) || + (var == ACC_PRIVATE_OP && var == type) || + (var == SPF_PROCESS_PRIVATE_OP && var == type) ) { SgExpression *list = exprList->lhs()->lhs(); while (list) @@ -111,8 +114,8 @@ void fillPrivatesFromComment(Statement *stIn, set &privates) } } -template void fillPrivatesFromComment(Statement *st, set &privates); -template void fillPrivatesFromComment(Statement *st, set &privates); +template void fillPrivatesFromComment(Statement *st, set &privates, int type); +template void fillPrivatesFromComment(Statement *st, set &privates, int type); //XXX: need to remove message and to add implementation extern map> SPF_messages; @@ -594,3 +597,28 @@ void fillInfoFromDirectives(const LoopGraph *loopInfo, ParallelDirective *direct } } } + +int getCoverPropertyFromComment(Statement* stIn) +{ + if (stIn) + { + SgStatement* st = stIn->GetOriginal(); + if (st->variant() == SPF_ANALYSIS_DIR) + { + SgExpression* exprList = st->expr(0); + while (exprList) + { + if (exprList->lhs() && exprList->lhs()->variant() == SPF_COVER_OP) + { + auto value = exprList->lhs()->lhs(); + if (value->isInteger()) + return value->valueInteger(); + else + return -1; + } + exprList = exprList->rhs(); + } + } + } + return 0; +} diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h index 92e7acd..d71c72a 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_parser.h @@ -11,7 +11,7 @@ bool isSPF_NoInline(Statement *stPrev); template -void fillPrivatesFromComment(Statement *st, std::set &privates); +void fillPrivatesFromComment(Statement *st, std::set &privates, int type = -1); template void fillReductionsFromComment(Statement *st, std::map> &reduction, bool moduleNameAdd = false); @@ -40,3 +40,5 @@ void fillShrinkFromComment(Statement *stIn, std::vector void fillCheckpointFromComment(Statement *stIn, std::map &clauses, std::set &vars, std::set &expt); + +int getCoverPropertyFromComment(Statement* stIn); diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp index aa7f440..fd507d5 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp @@ -156,6 +156,76 @@ static void fillVarsSets(SgStatement *iterator, SgStatement *end, set &v } } +static bool checkCover(SgStatement* st, + SgStatement* attributeStatement, + const int coverLoops, + vector& messagesForFile) +{ + // COVER(VALUE) + const int var = st->variant(); + bool retVal = true; + + SgForStmt* forSt = (SgForStmt*)st; + const int nestedCount = countPerfectLoopNest(forSt); + if (coverLoops > nestedCount || coverLoops == 0) + { + __spf_print(1, "bad directive expression: expected %d nested loops on line %d but got %d on line %d\n", + coverLoops, attributeStatement->lineNumber(), nestedCount, st->lineNumber()); + + wstring messageE, messageR; + __spf_printToLongBuf(messageE, L"bad directive expression: expected %d nested loops on line %d but got %d", + coverLoops, attributeStatement->lineNumber(), nestedCount); + + __spf_printToLongBuf(messageR, R77, coverLoops, attributeStatement->lineNumber(), nestedCount); + + messagesForFile.push_back(Messages(ERROR, st->lineNumber(), messageR, messageE, 1043)); + retVal = false; + } + + return retVal; +} + +static bool checkProcessPrivate(SgStatement* st, + SgStatement* attributeStatement, + const set& privates, + vector& messagesForFile) +{ + // PROCESS_PRIVATE(VAR) + const int var = st->variant(); + bool retVal = true; + + if (!isSgExecutableStatement(st)) + { + st = skipDvmDirs(st); + SgStatement* iterator = st; + SgStatement* end = st->lexNext(); + set varDef, varUse; + + fillVarsSets(iterator, end, varDef, varUse); + for (auto& privElemS : privates) + { + const string privElem = privElemS->GetOriginal()->identifier(); + bool defCond = true; + + if (varDef.find(privElem) == varDef.end()) + defCond = false; + + if (!defCond) + { + BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "variable declaration", RR1_2, "", L"", attributeStatement->lineNumber()); + retVal = false; + } + } + } + else + { + BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "variable declaration", RR1_2, "", L"", attributeStatement->lineNumber()); + retVal = false; + } + + return retVal; +} + static bool checkPrivate(SgStatement *st, SgStatement *attributeStatement, const set &privates, @@ -165,19 +235,16 @@ static bool checkPrivate(SgStatement *st, const int var = st->variant(); bool retVal = true; - if (!isSgExecutableStatement(st) || var == FOR_NODE) + if (var == FOR_NODE) { st = skipDvmDirs(st); SgStatement *iterator = st; - SgStatement *end = (var == FOR_NODE) ? st->lastNodeOfStmt() : st->lexNext(); - set varDef; - set varUse; - - fillVarsSets(iterator, end, varDef, varUse); - + SgStatement *end = st->lastNodeOfStmt(); + set varDef, varUse; set wrongPrivFromOmpParallel; - for (auto &privElemS : privates) + fillVarsSets(iterator, end, varDef, varUse); + for (auto& privElemS : privates) { const string privElem = privElemS->GetOriginal()->identifier(); bool defCond = true; @@ -188,51 +255,40 @@ static bool checkPrivate(SgStatement *st, if (varUse.find(privElem) == varUse.end()) useCond = false; - if (var == FOR_NODE) + if (!defCond && !useCond) { - if (!defCond && !useCond) + if (attributeStatement->localLineNumber() != 888) { - if (attributeStatement->localLineNumber() != 888) - { - __spf_print(1, "variable '%s' is not used in loop on line %d\n", privElem.c_str(), attributeStatement->lineNumber()); - wstring messageE, messageR; - __spf_printToLongBuf(messageE, L"variable '%s' is not used in loop", to_wstring(privElem.c_str()).c_str()); + __spf_print(1, "variable '%s' is not used in loop on line %d\n", privElem.c_str(), attributeStatement->lineNumber()); + wstring messageE, messageR; + __spf_printToLongBuf(messageE, L"variable '%s' is not used in loop", to_wstring(privElem.c_str()).c_str()); - __spf_printToLongBuf(messageR, R21, to_wstring(privElem.c_str()).c_str()); + __spf_printToLongBuf(messageR, R21, to_wstring(privElem.c_str()).c_str()); - messagesForFile.push_back(Messages(WARR, attributeStatement->lineNumber(), messageR, messageE, 1002)); - } - else - wrongPrivFromOmpParallel.insert(privElem); - } - else if (!defCond && useCond) - { - if (attributeStatement->localLineNumber() != 888) - { - __spf_print(1, "variable '%s' is not changed in loop on line %d\n", privElem.c_str(), attributeStatement->lineNumber()); - wstring messageE, messageR; - __spf_printToLongBuf(messageE, L"variable '%s' is not changed in loop", to_wstring(privElem.c_str()).c_str()); - - __spf_printToLongBuf(messageR, R23, to_wstring(privElem.c_str()).c_str()); - - messagesForFile.push_back(Messages(ERROR, attributeStatement->lineNumber(), messageR, messageE, 1003)); - retVal = false; - } - else - wrongPrivFromOmpParallel.insert(privElem); + messagesForFile.push_back(Messages(WARR, attributeStatement->lineNumber(), messageR, messageE, 1002)); } + else + wrongPrivFromOmpParallel.insert(privElem); } - else + else if (!defCond && useCond) { - if (!defCond) + if (attributeStatement->localLineNumber() != 888) { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "variable declaration or", RR1_2, "DO statement", RR1_3, attributeStatement->lineNumber()); + __spf_print(1, "variable '%s' is not changed in loop on line %d\n", privElem.c_str(), attributeStatement->lineNumber()); + wstring messageE, messageR; + __spf_printToLongBuf(messageE, L"variable '%s' is not changed in loop", to_wstring(privElem.c_str()).c_str()); + + __spf_printToLongBuf(messageR, R23, to_wstring(privElem.c_str()).c_str()); + + messagesForFile.push_back(Messages(ERROR, attributeStatement->lineNumber(), messageR, messageE, 1003)); retVal = false; } + else + wrongPrivFromOmpParallel.insert(privElem); } } - if (var == FOR_NODE && wrongPrivFromOmpParallel.size()) // remove unnecessary + if (wrongPrivFromOmpParallel.size()) // remove unnecessary { if (wrongPrivFromOmpParallel.size() == privates.size()) // remove all attributeStatement->expr(0)->lhs()->setLhs(NULL); @@ -252,7 +308,7 @@ static bool checkPrivate(SgStatement *st, } else { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "variable declaration or", RR1_2, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } @@ -1246,17 +1302,17 @@ static bool checkFissionPrivatesExpansion(SgStatement *st, addSPFtoAttr(s, currFile, usersDirectives); SgForStmt *forSt = (SgForStmt*)st; - if (vars.size() > countPerfectLoopNest(forSt)) + const int nestedCount = countPerfectLoopNest(forSt); + if (vars.size() > nestedCount) { __spf_print(1, "bad directive expression: expected %d nested loops on line %d but got %d on line %d\n", - (int)vars.size(), attributeStatement->lineNumber(), countPerfectLoopNest(forSt), st->lineNumber()); + (int)vars.size(), attributeStatement->lineNumber(), nestedCount, st->lineNumber()); wstring messageE, messageR; __spf_printToLongBuf(messageE, L"bad directive expression: expected %d nested loops on line %d but got %d", - (int)vars.size(), attributeStatement->lineNumber(), countPerfectLoopNest(forSt)); + (int)vars.size(), attributeStatement->lineNumber(), nestedCount); - __spf_printToLongBuf(messageR, R77, - (int)vars.size(), attributeStatement->lineNumber(), countPerfectLoopNest(forSt)); + __spf_printToLongBuf(messageR, R77, (int)vars.size(), attributeStatement->lineNumber(), nestedCount); messagesForFile.push_back(Messages(ERROR, st->lineNumber(), messageR, messageE, 1043)); @@ -1708,18 +1764,29 @@ static inline bool processStat(SgStatement *st, const string &currFile, SgAttribute *attr = st->getAttribute(i); SgStatement *attributeStatement = (SgStatement *)(attr->getAttributeData()); int type = st->attributeType(i); + int count; + if (type == SPF_ANALYSIS_DIR) { // !$SPF ANALYSIS // PRIVATE(VAR) set privates; - fillPrivatesFromComment(new Statement(attributeStatement), privates); + fillPrivatesFromComment(new Statement(attributeStatement), privates, ACC_PRIVATE_OP); if (privates.size()) { bool result = checkPrivate(st, attributeStatement, privates, messagesForFile); retVal = retVal && result; } + // PROCESS_PRIVATE(VAR) + privates.clear(); + fillPrivatesFromComment(new Statement(attributeStatement), privates, SPF_PROCESS_PRIVATE_OP); + if (privates.size()) + { + bool result = checkProcessPrivate(st, attributeStatement, privates, messagesForFile); + retVal = retVal && result; + } + // REDUCTION(OP(VAR), MIN/MAXLOC(VAR, ARRAY, CONST)) map> reduction; map>> reductionLoc; @@ -1740,10 +1807,27 @@ static inline bool processStat(SgStatement *st, const string &currFile, bool result = checkParameter(st, attributeStatement, assigns, messagesForFile); retVal = retVal && result; } + + // COVER + if (isSPF_OP(attributeStatement, SPF_COVER_OP) && (count = countSPF_OP(st, SPF_ANALYSIS_DIR, SPF_COVER_OP))) + { + attributeStatement->setLocalLineNumber(-1); + if (count > 1 || st->variant() != FOR_NODE) + { + BAD_POSITION_FULL(1, ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + retVal = false; + } + else + { + bool result = checkCover(st, attributeStatement, getCoverPropertyFromComment(new Statement(attributeStatement)), messagesForFile); + retVal = retVal && result; + } + } } else if (type == SPF_PARALLEL_DIR) { // !$SPF PARALLEL + // SHADOW (VAR(list of shadows)) / ACROSS (VAR(list of shadows)) vector, vector>>> data; fillShadowAcrossFromComment(SHADOW_OP, new Statement(attributeStatement), data); @@ -1766,7 +1850,6 @@ static inline bool processStat(SgStatement *st, const string &currFile, else if (type == SPF_TRANSFORM_DIR) { // !$SPF TRANSFORM - int count; // NOINLINE if (isSPF_NoInline(new Statement(st))) @@ -1815,7 +1898,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, // SHRINK if (isSPF_OP(attributeStatement, SPF_SHRINK_OP)) { - attributeStatement->setLocalLineNumber(-1); // is it needed? + attributeStatement->setLocalLineNumber(-1); if (st->variant() != FOR_NODE) { BAD_POSITION_FULL(1, ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); @@ -1838,6 +1921,17 @@ static inline bool processStat(SgStatement *st, const string &currFile, retVal = false; } } + + // MERGE + if (isSPF_OP(attributeStatement, SPF_MERGE_OP)) + { + attributeStatement->setLocalLineNumber(-1); + if (st->variant() != FOR_NODE) + { + BAD_POSITION_FULL(1, ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + retVal = false; + } + } } else if (type == SPF_CHECKPOINT_DIR) { diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index e17ee2c..7014088 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1041,9 +1041,14 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne if (internalExit < 0) throw -1; - bool applyFor = (curr_regime == LOOPS_SPLITTER || curr_regime == LOOPS_COMBINER || curr_regime == PRIVATE_REMOVING || - curr_regime == PRIVATE_ARRAYS_EXPANSION || curr_regime == PRIVATE_ARRAYS_SHRINKING); - if ((countOfTransform == 0 || internalExit > 0) && applyFor) + set applyFor = { LOOPS_SPLITTER, + LOOPS_COMBINER, + PRIVATE_REMOVING, + PRIVATE_ARRAYS_EXPANSION, + PRIVATE_ARRAYS_SHRINKING, + REMOVE_DEAD_CODE }; + + if ((countOfTransform == 0 || internalExit > 0) && applyFor.find(curr_regime) != applyFor.end()) { SgStatement* mainUnit = findMainUnit(&project, SPF_messages); checkNull(mainUnit, convertFileName(__FILE__).c_str(), __LINE__); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 659eef7..3346c2f 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -381,11 +381,12 @@ public: }; -void removeDeadCode(SgStatement* func, - const map>& allFuncs, - const map& commonBlocks, - SgStatement* intervalDelStart, SgStatement* intervalDelEnd) +int removeDeadCode(SgStatement* func, + const map>& allFuncs, + const map& commonBlocks, + SgStatement* intervalDelStart, SgStatement* intervalDelEnd) { + int countOfTransform = 0; if (intervalDelStart && !intervalDelEnd || !intervalDelStart && intervalDelEnd) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); @@ -521,7 +522,8 @@ void removeDeadCode(SgStatement* func, __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); rem->deleteStmt(); } - + countOfTransform += remove.size(); + //remove empty blocks do { @@ -559,7 +561,10 @@ void removeDeadCode(SgStatement* func, __spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); rem->deleteStmt(); } + countOfTransform += remove.size(); } while (remove.size()); deleteCFG(cfg); + + return countOfTransform; } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h index 6f3ef35..741acff 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h @@ -9,7 +9,7 @@ #include "../CFGraph/DataFlow/data_flow.h" #include "../CFGraph/DataFlow/backward_data_flow.h" -void removeDeadCode(SgStatement* func, - const std::map>&allFuncs, - const std::map& commonBlocks, - SgStatement* intervalDelStart = NULL, SgStatement* intervalDelEnd = NULL); \ No newline at end of file +int removeDeadCode(SgStatement* func, + const std::map>&allFuncs, + const std::map& commonBlocks, + SgStatement* intervalDelStart = NULL, SgStatement* intervalDelEnd = NULL); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp index b9113d1..f47ef56 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp @@ -1153,7 +1153,7 @@ bool isSPF_stat(SgStatement *st) const int var = st->variant(); //for details see dvm_tag.h - if (var >= SPF_ANALYSIS_DIR && var <= SPF_UNROLL_OP) + if (var >= SPF_ANALYSIS_DIR && var <= SPF_PROCESS_PRIVATE_OP) ret = true; return ret; } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt b/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt index 671062c..f44d671 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt +++ b/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt @@ -1,7 +1,7 @@ //1001 R1 = "Неверное расположение директивы: можно располагать только %s %s %s" RR1_1 = "перед" -RR1_2 = "объявлением переменных или" +RR1_2 = "объявлением переменных" RR1_3 = "циклом" RR1_4 = "после" RR1_5 = "всех операторов объявления" diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 0cfc91a..c9de073 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2308" +#define VERSION_SPF "2311" From b0a63cc711e75f650b005ffaff6a3d5196613764 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 9 Apr 2024 16:50:47 +0300 Subject: [PATCH 56/68] added new directives --- dvm/fdvm/trunk/fdvm/acc_analyzer.cpp | 2 +- dvm/fdvm/trunk/include/dvm_tag.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dvm/fdvm/trunk/fdvm/acc_analyzer.cpp b/dvm/fdvm/trunk/fdvm/acc_analyzer.cpp index e39d1d9..428c0c9 100644 --- a/dvm/fdvm/trunk/fdvm/acc_analyzer.cpp +++ b/dvm/fdvm/trunk/fdvm/acc_analyzer.cpp @@ -81,7 +81,7 @@ static inline bool ifVarIsLoopSymb(SgStatement *stmt, const string symb) } -template void fillPrivatesFromComment(Statement *st, std::set &privates); +template void fillPrivatesFromComment(Statement *st, std::set &privates, int type = -1); inline void Warning(const char *s, const wchar_t *s1, const char *t, int num, SgStatement *stmt) { diff --git a/dvm/fdvm/trunk/include/dvm_tag.h b/dvm/fdvm/trunk/include/dvm_tag.h index 55f3f68..204699a 100644 --- a/dvm/fdvm/trunk/include/dvm_tag.h +++ b/dvm/fdvm/trunk/include/dvm_tag.h @@ -152,3 +152,6 @@ #define SPF_PARAMETER_OP 969 /* SAPFOR */ #define SPF_CODE_COVERAGE_OP 970 /* SAPFOR */ #define SPF_UNROLL_OP 971 /* SAPFOR */ +#define SPF_COVER_OP 972 /* SAPFOR */ +#define SPF_MERGE_OP 973 /* SAPFOR */ +#define SPF_PROCESS_PRIVATE_OP 974 /* SAPFOR */ From ba70047ebf6014eba3c7f1de90a15c9ba8b49ffb Mon Sep 17 00:00:00 2001 From: ALEXks Date: Wed, 10 Apr 2024 13:42:49 +0300 Subject: [PATCH 57/68] fixed TIE for shared parallelization, fixed messages, fixed privates insertion pass --- .../trunk/Sage/lib/include/unparseDVM.def | 2 +- .../directive_creator_base_nodist.cpp | 11 ++----- .../spf_directive_preproc.cpp | 30 +++++++++---------- .../Distribution/DvmhDirective_nodist.cpp | 15 +++++----- .../Sapfor_2017/_src/Utils/SgUtils.cpp | 16 +++++++--- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def b/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def index 2dc62a0..68d4409 100644 --- a/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def +++ b/dvm/fdvm/trunk/Sage/lib/include/unparseDVM.def @@ -436,7 +436,7 @@ DEFNODECODE(SPF_MERGE_OP, "MERGE", 'e',0,LLNODE) DEFNODECODE(SPF_COVER_OP, "COVER (%LL1)", 'e',1,LLNODE) -DEFNODECODE(SPF_PROCESS_PRIVATE_OP, "PROCESS_PRIVATE_OP (%LL1)", +DEFNODECODE(SPF_PROCESS_PRIVATE_OP, "PROCESS_PRIVATE (%LL1)", 'e',1,LLNODE) diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp index 27eb9d6..a663b5b 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp @@ -134,14 +134,7 @@ void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currPar #if __SPF //move label before loop - if (loop->hasRedistribute()) - { - auto prev = loop->loop->lexPrev(); - if (!prev) - printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - moveLabelBefore(prev, loop->loop); - } - else if(loop->lineNum > 0) + if(loop->lineNum > 0) moveLabelBefore(loop->loop, NULL); // check correctness @@ -157,7 +150,7 @@ void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currPar checkNull(local, convertFileName(__FILE__).c_str(), __LINE__); } #endif - toInsert.push_back(dirImpl); + toInsert.push_back(dirImpl); } } else //TODO: add checker for indexing in this loop diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp index fd507d5..ee9bb12 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp @@ -106,7 +106,7 @@ static bool isPrivateVar(SgStatement *st, SgSymbol *symbol) return retVal; } -#define BAD_POSITION_FULL(NEED_PRINT, ERR_TYPE, PLACE_E, PLACE_R, BEFORE_VAR_E, BEFORE_VAR_R, BEFORE_DO_E, BEFORE_DO_R, LINE) do { \ +#define BAD_POSITION_FULL(ERR_TYPE, PLACE_E, PLACE_R, BEFORE_VAR_E, BEFORE_VAR_R, BEFORE_DO_E, BEFORE_DO_R, LINE) do { \ __spf_print(1, "bad directive position on line %d, it can be placed only %s %s %s\n", LINE, PLACE_E, BEFORE_VAR_E, BEFORE_DO_E); \ wstring messageE, messageR;\ __spf_printToLongBuf(messageE, L"bad directive position, it can be placed only %s %s %s", to_wstring(PLACE_E).c_str(), to_wstring(BEFORE_VAR_E).c_str(), to_wstring(BEFORE_DO_E).c_str()); \ @@ -212,14 +212,14 @@ static bool checkProcessPrivate(SgStatement* st, if (!defCond) { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "variable declaration", RR1_2, "", L"", attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "before", RR1_1, "variable declaration", RR1_2, "", L" ", attributeStatement->lineNumber()); retVal = false; } } } else { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "variable declaration", RR1_2, "", L"", attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "before", RR1_1, "variable declaration", RR1_2, "", L" ", attributeStatement->lineNumber()); retVal = false; } @@ -308,7 +308,7 @@ static bool checkPrivate(SgStatement *st, } else { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } @@ -372,7 +372,7 @@ static bool checkReduction(SgStatement *st, } else { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } @@ -769,7 +769,7 @@ static bool checkShadowAcross(SgStatement *st, } else { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } @@ -993,7 +993,7 @@ static bool checkRemote(SgStatement *st, } else { - BAD_POSITION_FULL(1, ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "before", RR1_1, "", L"", "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } @@ -1225,7 +1225,7 @@ static bool checkParallelRegions(SgStatement *st, } else { - BAD_POSITION_FULL(1, ERROR, "after", RR1_4, "", L"", "all declaration statements", RR1_5, st->lineNumber()); + BAD_POSITION_FULL(ERROR, "after", RR1_4, "", L"", "all declaration statements", RR1_5, st->lineNumber()); retVal = false; } @@ -1814,7 +1814,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, attributeStatement->setLocalLineNumber(-1); if (count > 1 || st->variant() != FOR_NODE) { - BAD_POSITION_FULL(1, ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } else @@ -1858,7 +1858,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, const int prevVar = prev->variant(); if (prevVar != PROC_HEDR && prevVar != FUNC_HEDR) { - BAD_POSITION_FULL(1, ERROR, "after", RR1_4, "", L"", "function statements", RR1_6, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "after", RR1_4, "", L"", "function statements", RR1_6, attributeStatement->lineNumber()); retVal = false; } } @@ -1869,7 +1869,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, attributeStatement->setLocalLineNumber(-1); if (count > 1 || st->variant() != FOR_NODE) { - BAD_POSITION_FULL(1, ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } else @@ -1885,7 +1885,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, attributeStatement->setLocalLineNumber(-1); if (count > 1 || st->variant() != FOR_NODE) { - BAD_POSITION_FULL(1, ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "once", RR1_7, "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } else @@ -1901,7 +1901,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, attributeStatement->setLocalLineNumber(-1); if (st->variant() != FOR_NODE) { - BAD_POSITION_FULL(1, ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } else @@ -1917,7 +1917,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, attributeStatement->setLocalLineNumber(-1); if (st->variant() != FOR_NODE) { - BAD_POSITION_FULL(1, ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } } @@ -1928,7 +1928,7 @@ static inline bool processStat(SgStatement *st, const string &currFile, attributeStatement->setLocalLineNumber(-1); if (st->variant() != FOR_NODE) { - BAD_POSITION_FULL(1, ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); + BAD_POSITION_FULL(ERROR, "", "", "before", RR1_1, "DO statement", RR1_3, attributeStatement->lineNumber()); retVal = false; } } diff --git a/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective_nodist.cpp index 3860916..c25ad4d 100644 --- a/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Distribution/DvmhDirective_nodist.cpp @@ -29,11 +29,12 @@ using std::map; using std::make_pair; static vector -compliteTieListNoDist(const LoopGraph* currLoop, const vector& loops, +compliteTieListNoDist(const LoopGraph* currLoop, + const set& privates, + const vector& loops, const map>& arrayLinksByFuncCalls, const map>& byUseInFunc, - File* file, const pair& lineRange, - const set& onlyFor) + File* file, const pair& lineRange) { vector tieList; @@ -44,6 +45,9 @@ compliteTieListNoDist(const LoopGraph* currLoop, const vector& loops for (auto& elem : currLoop->usedArraysAll) { + if (privates.find(elem->GetShortName()) != privates.end()) + continue; + auto type = elem->GetDeclSymbol(currLoop->fileName, lineRange, getAllFilesInProject())->GetOriginal()->type(); SgSymbol* arrayS = getFromModule(byUseInFunc, findSymbolOrCreate(file, elem->GetShortName(), type)); SgArrayRefExp* array = new SgArrayRefExp(*arrayS); @@ -233,11 +237,8 @@ ParallelDirective::genDirectiveNoDist(File* file, LoopGraph* currLoop, DIST::Arr if (parallel[i] != "*") loopsTie.push_back(loops[i]); - set onlyFor; - vector tieList; - - tieList = compliteTieListNoDist(currLoop, loopsTie, arrayLinksByFuncCalls, byUseInFunc, file, lineRange, onlyFor); + tieList = compliteTieListNoDist(currLoop, uniqNamesOfPrivates, loopsTie, arrayLinksByFuncCalls, byUseInFunc, file, lineRange); if (tieList.size()) { diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp index f47ef56..2d19b4f 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp @@ -3543,10 +3543,11 @@ void getMaxMinBlockDistribution(SgFile* file, pair& min_max) } } +//TODO: need to add to includes void addPrivatesToArraysFromGUI(SgFile* file, const map, pair>& declaredArrays, const map& distrStateFromGUI) { - map> added; + map> added; for (auto& arrayPair : declaredArrays) { @@ -3570,12 +3571,19 @@ void addPrivatesToArraysFromGUI(SgFile* file, const mapidentifier()) + "))\n"; - added[declSt].insert(toAdd); + added[declSt].insert(symb); } } for (auto& toInsert : added) + { + vector list; for (auto& elem : toInsert.second) - toInsert.first->addComment(elem.c_str()); + list.push_back(new SgVarRefExp(elem)); + + SgStatement* op = new SgStatement(SPF_ANALYSIS_DIR); + op->setExpression(0, new SgExpression(SPF_PROCESS_PRIVATE_OP, makeExprList(list))); + + toInsert.first->insertStmtBefore(*op, *toInsert.first->controlParent()); + } } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index c9de073..10df47c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2311" +#define VERSION_SPF "2314" From ff2a1c69d87968c69d7c131b5bbbba48d62453ce Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Wed, 10 Apr 2024 18:58:46 +0300 Subject: [PATCH 58/68] dead code: fix for entry statements, improve perfomance --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 3 ++- .../Sapfor_2017/_src/Transformations/dead_code.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index e17ee2c..a99aa49 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1028,7 +1028,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { auto funcsForFile = getObjectForFileFromMap(file_name, allFuncInfo); for (auto& func : funcsForFile) - removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); + if(func->funcPointer->variant() != ENTRY_STAT) + removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); } else if (curr_regime == TEST_PASS) { diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 5befc48..1e11a48 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -228,7 +228,9 @@ public: updated |= updateNextNotEmpty(); updated |= updateJumpStatus(); - updated |= this->forwardData({ }); + + if(updated) + this->forwardData({ }); return updated; } @@ -316,6 +318,7 @@ public: { setBlock(block); useful.resize(block->getInstructions().size(), false); + this->forwardData({ }); } const vector& getResult() { return useful; } @@ -371,7 +374,8 @@ void removeDeadCode(SgStatement* func, set reachable; for (auto b : cfg_pair.second) - if(b->getInstructions().front()->isHeader()) + if(b->getInstructions().front()->isHeader() || + b->getInstructions().front()->getInstruction()->getOperation() == SAPFOR::CFG_OP::ENTRY) reachable.insert(b); set worklist = reachable; From aace0bf06f6ec6852a4ae06410506c2dafaf6e93 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Wed, 10 Apr 2024 19:04:25 +0300 Subject: [PATCH 59/68] dead code: add static const qualifier to constant sets --- .../experts/Sapfor_2017/_src/Transformations/dead_code.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 1e11a48..b9f58c7 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -52,7 +52,7 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru if (!useful) { - set always_useful = + static const set always_useful = { SAPFOR::CFG_OP::POINTER_ASS, SAPFOR::CFG_OP::STORE, @@ -456,7 +456,7 @@ void removeDeadCode(SgStatement* func, } // remove dead statements - set removable = + static const set removable = { ASSIGN_STAT, PROC_STAT, @@ -464,7 +464,7 @@ void removeDeadCode(SgStatement* func, READ_STAT }; - set skip = + static const set skip = { PROG_HEDR, PROC_HEDR, From a827c405438b13dafcd79da24465f299df39e108 Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Wed, 10 Apr 2024 22:03:27 +0300 Subject: [PATCH 60/68] dead code: handle STORE and LOAD instructions --- .../_src/CFGraph/live_variable_analysis.cpp | 138 ++++++++++-------- .../_src/CFGraph/live_variable_analysis.h | 3 +- .../_src/Transformations/dead_code.cpp | 35 +++-- 3 files changed, 101 insertions(+), 75 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp index 05f6bfb..841882e 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.cpp @@ -294,39 +294,46 @@ public: void getUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, vector& formal_parameters, vector& fcalls, - vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + vector& arg_stack, int& arg_stack_index, int& arg_stack_size, + bool& last_stack_op, string& fName, const map& funcByName, bool interprocedural) { for (auto arg : { instr->getArg1(), instr->getArg2(), instr->getResult() }) if (arg && arg->getMemType() == SAPFOR::CFG_MEM_TYPE::FUNC_PARAM_) formal_parameters[getParamIndex(arg, formal_parameters.size())] = arg; + last_stack_op = false; SAPFOR::Argument* res_arg = NULL; static const set skip = { SAPFOR::CFG_OP::ENTRY }; SAPFOR::CFG_OP instr_operation = instr->getOperation(); - if (hasStoreStructure(instr_operation)) + if (instr_operation == SAPFOR::CFG_OP::F_CALL || + instr_operation == SAPFOR::CFG_OP::STORE || + instr_operation == SAPFOR::CFG_OP::LOAD) + { + res_arg = (instr_operation == SAPFOR::CFG_OP::STORE ? instr->getArg1() : instr->getResult()); + if(instr_operation != SAPFOR::CFG_OP::F_CALL) + use.insert(instr_operation != SAPFOR::CFG_OP::STORE ? instr->getArg1() : instr->getResult()); + + arg_stack_size = stoi(instr->getArg2()->getValue()); + + arg_stack.clear(); + arg_stack.resize(arg_stack_size); + + arg_stack_index = arg_stack_size - 1; + + if(instr_operation == SAPFOR::CFG_OP::F_CALL) + fName = instr->getArg1()->getValue(); + } + else if (hasStoreStructure(instr_operation)) { res_arg = instr->getArg1(); set instr_args = { instr->getResult(), instr->getArg2() }; use.insert(instr_args.begin(), instr_args.end()); } - else if (instr_operation == SAPFOR::CFG_OP::PARAM) + else if (instr_operation == SAPFOR::CFG_OP::PARAM || instr_operation == SAPFOR::CFG_OP::REF) { - lastParamRef[last_param_ref_index--] = instr->getArg1(); - } - else if (instr_operation == SAPFOR::CFG_OP::F_CALL) - { - res_arg = instr->getResult(); - - last_param_ref_size = stoi(instr->getArg2()->getValue()); - - lastParamRef.clear(); - lastParamRef.resize(last_param_ref_size); - - last_param_ref_index = last_param_ref_size - 1; - - fName = instr->getArg1()->getValue(); + arg_stack[arg_stack_index--] = instr->getArg1(); } else if (skip.find(instr_operation) == skip.end()) { @@ -341,50 +348,60 @@ void getUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* ins return; } - if ((instr_operation == SAPFOR::CFG_OP::F_CALL || instr_operation == SAPFOR::CFG_OP::PARAM) && last_param_ref_index < 0) { - auto func_it = funcByName.find(fName); - if (interprocedural && func_it != funcByName.end()) + if (arg_stack_index < 0) { + if(instr_operation == SAPFOR::CFG_OP::PARAM || instr_operation == SAPFOR::CFG_OP::F_CALL) { - fcalls.push_back(LiveDeadVarsForCall(func_it->second, block, lastParamRef)); - - auto r_it = fcalls.rbegin(); - auto r_end = fcalls.rend(); - - for (auto e : def) - r_it->make_dead(e); - - for (auto e : use) - r_it->make_live(e, block); - } - - set make_live, make_dead; - if (fName == "_READ") - def.insert(lastParamRef.begin(), lastParamRef.end()); - else if (interprocedural && getLiveDead(lastParamRef, fName, make_live, make_dead)) - { - use.insert(make_live.begin(), make_live.end()); - def.insert(make_dead.begin(), make_dead.end()); - } - else if (func_it != funcByName.end()) - { - int arg_num = lastParamRef.size(); - for (int i = 0; i < arg_num; i++) + auto func_it = funcByName.find(fName); + if (interprocedural && func_it != funcByName.end()) { - if(func_it->second->funcParams.isArgOut(i)) - def.insert(lastParamRef[i]); + fcalls.push_back(LiveDeadVarsForCall(func_it->second, block, arg_stack)); - if (func_it->second->funcParams.isArgIn(i)) - use.insert(lastParamRef[i]); + auto r_it = fcalls.rbegin(); + auto r_end = fcalls.rend(); + + for (auto e : def) + r_it->make_dead(e); + + for (auto e : use) + r_it->make_live(e, block); } + + set make_live, make_dead; + if (fName == "_READ") + def.insert(arg_stack.begin(), arg_stack.end()); + else if (interprocedural && getLiveDead(arg_stack, fName, make_live, make_dead)) + { + use.insert(make_live.begin(), make_live.end()); + def.insert(make_dead.begin(), make_dead.end()); + } + else if (func_it != funcByName.end()) + { + int arg_num = arg_stack.size(); + for (int i = 0; i < arg_num; i++) + { + if(func_it->second->funcParams.isArgOut(i)) + def.insert(arg_stack[i]); + + if (func_it->second->funcParams.isArgIn(i)) + use.insert(arg_stack[i]); + } + } + else + use.insert(arg_stack.begin(), arg_stack.end()); + + fName = ""; + } + else + { + use.insert(arg_stack.begin(), arg_stack.end()); } - else - use.insert(lastParamRef.begin(), lastParamRef.end()); - last_param_ref_index = 0; - last_param_ref_size = 0; + arg_stack_index = 0; + arg_stack_size = 0; - lastParamRef.clear(); - fName = ""; + arg_stack.clear(); + + last_stack_op = true; } if (res_arg) @@ -394,15 +411,16 @@ void getUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* ins static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, vector& formal_parameters, vector& fcalls, - vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + vector& arg_stack, int& arg_stack_index, int& arg_stack_size, string& fName, const map& funcByName, bool interprocedural) { set res, args; - + bool last_stack_op; getUseDefForInstruction(block, instr, args, res, formal_parameters, fcalls, - lastParamRef, last_param_ref_index, last_param_ref_size, + arg_stack, arg_stack_index, arg_stack_size, + last_stack_op, fName, funcByName, interprocedural ); @@ -431,8 +449,8 @@ static void buildUseDef(SAPFOR::BasicBlock* block, set& use, vector& formal_parameters, vector& fcalls, const map& funcByName, bool interprocedural) { - vector lastParamRef; - int last_param_ref_index = 0, last_param_ref_size = 0; + vector arg_stack; + int arg_stack_index = 0, arg_stack_size = 0; string fName; const auto& instructions = block->getInstructions(); @@ -443,7 +461,7 @@ static void buildUseDef(SAPFOR::BasicBlock* block, set& use, updateUseDefForInstruction(block, (*ir_block_it)->getInstruction(), use, def, formal_parameters, fcalls, - lastParamRef, last_param_ref_index, last_param_ref_size, + arg_stack, arg_stack_index, arg_stack_size, fName, funcByName, interprocedural ); diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h index 7e6cd73..9b92523 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/live_variable_analysis.h @@ -42,7 +42,8 @@ void insertIfVar(IT begin, IT end, DEST& to) { void getUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, std::set& use, std::set& def, std::vector& formal_parameters, std::vector& fcalls, - std::vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + std::vector& arg_stack, int& arg_stack_index, int& arg_stack_size, + bool& last_stack_op, std::string& fName, const std::map& funcByName, bool interprocedural); void runLiveVariableAnalysis(const std::map>& CFGraph_for_project); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index b9f58c7..fb4cfba 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -19,23 +19,27 @@ using std::remove_if; static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, vector& formal_parameters, - vector& lastParamRef, int& last_param_ref_index, int& last_param_ref_size, + vector& arg_stack, int& arg_stack_index, int& arg_stack_size, string& fName, const map& funcByName, - bool& useful, bool& last_fcall_useful, + bool& useful, bool& last_stack_op_useful, set& usedByThisBlock) { set res, args; + bool last_stack_op; vector fcalls; getUseDefForInstruction(block, instr, args, res, formal_parameters, fcalls, - lastParamRef, last_param_ref_index, last_param_ref_size, + arg_stack, arg_stack_index, arg_stack_size, + last_stack_op, fName, funcByName, false ); + const auto instr_operation = instr->getOperation(); + if (!useful) { for (SAPFOR::Argument* r : res) @@ -64,21 +68,24 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru SAPFOR::CFG_OP::SPF_DIR }; - if (always_useful.find(instr->getOperation()) != always_useful.end()) + if (always_useful.find(instr_operation) != always_useful.end()) useful = true; - else if (instr->getOperation() == SAPFOR::CFG_OP::F_CALL) + else if (instr_operation == SAPFOR::CFG_OP::F_CALL) { auto func_it = funcByName.find(instr->getArg1()->getValue()); useful |= func_it == funcByName.end() || !(func_it->second->isPure); } - else if (instr->getOperation() == SAPFOR::CFG_OP::PARAM) - useful |= last_fcall_useful; + else if (instr_operation == SAPFOR::CFG_OP::PARAM || + instr_operation == SAPFOR::CFG_OP::REF) + useful |= last_stack_op_useful; } if (useful) { - if (instr->getOperation() == SAPFOR::CFG_OP::F_CALL) - last_fcall_useful = true; + if (instr_operation == SAPFOR::CFG_OP::F_CALL || + instr_operation == SAPFOR::CFG_OP::LOAD || + instr_operation == SAPFOR::CFG_OP::STORE) + last_stack_op_useful = true; for (auto e : res) { @@ -95,8 +102,8 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru usedByThisBlock.insert(args.begin(), args.end()); } - if ((instr->getOperation() == SAPFOR::CFG_OP::F_CALL || instr->getOperation() == SAPFOR::CFG_OP::PARAM) && fName == "") - last_fcall_useful = false; + if (last_stack_op) + last_stack_op_useful = false; } @@ -107,8 +114,8 @@ static void buildUseDef(SAPFOR::BasicBlock* block, set& use, { set use_with_regs = use, def_with_regs = def; - vector lastParamRef; - int last_param_ref_index = 0, last_param_ref_size = 0; + vector arg_stack; + int arg_stack_index = 0, arg_stack_size = 0; string fName = ""; bool last_fcall_useful = false; @@ -122,7 +129,7 @@ static void buildUseDef(SAPFOR::BasicBlock* block, set& use, updateUseDefForInstruction(block, instructions[i]->getInstruction(), use_with_regs, def_with_regs, formal_parameters, - lastParamRef, last_param_ref_index, last_param_ref_size, + arg_stack, arg_stack_index, arg_stack_size, fName, funcByName, u, last_fcall_useful, usedByThisBlock From 5b1e18cdfd882bf5042df54a72f75de8cfea4e43 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 12 Apr 2024 15:04:48 +0300 Subject: [PATCH 61/68] fixed f2c --- dvm/fdvm/trunk/fdvm/acc_f2c.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dvm/fdvm/trunk/fdvm/acc_f2c.cpp b/dvm/fdvm/trunk/fdvm/acc_f2c.cpp index 140c86a..07cb93a 100644 --- a/dvm/fdvm/trunk/fdvm/acc_f2c.cpp +++ b/dvm/fdvm/trunk/fdvm/acc_f2c.cpp @@ -1306,7 +1306,21 @@ static bool matchPrototype(SgSymbol *funcSymb, SgExpression *&listArgs, bool isF } } else - argInCall->setLhs(SgAddrOp(*argInCall->lhs())); + { + SgExpression* arr = argInCall->lhs(); + + if (options.isOn(O_PL2)) + { + SgType* cast = NULL; + if (typeInProtSave->hasBaseType()) + cast = C_PointerType(C_Type(typeInProtSave->baseType())); + else + cast = C_PointerType(C_Type(typeInProtSave)); + argInCall->setLhs(*new SgCastExp(*cast, SgAddrOp(*arr))); + } + else + argInCall->setLhs(SgAddrOp(*arr)); + } } } } From 18f58020f58bfe6ec7383b8d4e61541b9c69aefc Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 12 Apr 2024 15:25:48 +0300 Subject: [PATCH 62/68] improved --- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 2 +- .../_src/Transformations/dead_code.cpp | 43 +++++-------------- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index d2ee822..5724802 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1029,7 +1029,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne auto funcsForFile = getObjectForFileFromMap(file_name, allFuncInfo); for (auto& func : funcsForFile) if(func->funcPointer->variant() != ENTRY_STAT) - removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); + countOfTransform += removeDeadCode(func->funcPointer, allFuncInfo, commonBlocks); } else if (curr_regime == TEST_PASS) { diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 97db965..3971b8c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -472,34 +472,21 @@ int removeDeadCode(SgStatement* func, READ_STAT }; - static const set skip = - { - PROG_HEDR, - PROC_HEDR, - FUNC_HEDR - }; - vector remove; SgStatement* start = intervalDelStart ? intervalDelStart : func; SgStatement* end = intervalDelEnd ? intervalDelEnd : func->lastNodeOfStmt(); - auto st = start; - if (skip.find(st->variant()) != skip.end()) - st = st->lexNext(); - - for (; st != end; st = st->lexNext()) + for (auto st = start; st != end; st = st->lexNext()) { - if (skip.find(st->variant()) != skip.end()) - { - st = st->lastNodeOfStmt(); - continue; - } - - if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end()) + const int var = st->variant(); + if (removable.find(var) != removable.end() && useful.find(st) == useful.end()) { remove.push_back(st); st = st->lastNodeOfStmt(); } + + if (var == CONTAINS_STMT) + break; } for (auto& rem : remove) @@ -513,21 +500,9 @@ int removeDeadCode(SgStatement* func, do { remove.clear(); - - st = start; - if (skip.find(st->variant()) != skip.end()) - st = st->lexNext(); - - for (; st != end; st = st->lexNext()) + for (auto st = start; st != end; st = st->lexNext()) { const int var = st->variant(); - - if (skip.find(var) != skip.end()) - { - st = st->lastNodeOfStmt(); - continue; - } - if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && st->lexNext()->variant() == CONTROL_END) { @@ -550,6 +525,9 @@ int removeDeadCode(SgStatement* func, } //TODO: SWITCH and other block statements + + if (var == CONTAINS_STMT) + break; } @@ -562,6 +540,5 @@ int removeDeadCode(SgStatement* func, } while (remove.size()); deleteCFG(cfg); - return countOfTransform; } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 10df47c..573c892 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2314" +#define VERSION_SPF "2315" From b1eb7608ba6a85d662a40be6250762806b937985 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 12 Apr 2024 16:36:37 +0300 Subject: [PATCH 63/68] added cover --- .../directive_omp_parser.cpp | 2 +- .../directive_omp_parser.h | 4 + .../spf_directive_preproc.cpp | 76 ++++++++++++++++++- .../_src/Transformations/loops_splitter.cpp | 3 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp index 581886d..da472d8 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.cpp @@ -47,7 +47,7 @@ static inline void addToAttribute(SgStatement* st, int var, vectorsetLhs(new SgExpression(var, makeExprList(list), NULL)); SgStatement* toAdd = new SgStatement(SPF_ANALYSIS_DIR, NULL, NULL, ex, NULL, NULL); toAdd->setlineNumber(st->lineNumber()); - toAdd->setLocalLineNumber(888); + toAdd->setLocalLineNumber(SPF_OMP_DIR); //filter if (var == ACC_PRIVATE_OP) diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h index e241f38..8895289 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_omp_parser.h @@ -6,6 +6,10 @@ #include "../Utils/errors.h" +#define SPF_USER_DIR 777 +#define SPF_USER_DIR_COPY 999 +#define SPF_OMP_DIR 888 + struct OmpDir { std::set privVars; diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp index ee9bb12..da7ddee 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/spf_directive_preproc.cpp @@ -20,6 +20,7 @@ #include "directive_parser.h" #include "../ExpressionTransform/expr_transform.h" #include "../LoopAnalyzer/loop_analyzer.h" +#include "../DirectiveProcessing/directive_omp_parser.h" using std::string; using std::wstring; @@ -34,7 +35,7 @@ static void addToattribute(SgStatement *toAttr, SgStatement *curr, const int var // move SgStatement to attribute SgStatement *toAdd = new SgStatement(toAttr->variant(), NULL, toAttr->symbol(), toAttr->expr(0), toAttr->expr(1), toAttr->expr(2)); toAdd->setlineNumber(toAttr->lineNumber()); - toAdd->setLocalLineNumber(777); + toAdd->setLocalLineNumber(SPF_USER_DIR); curr->addAttribute(variant, toAdd, sizeof(SgStatement)); //copy comments to st @@ -257,7 +258,7 @@ static bool checkPrivate(SgStatement *st, if (!defCond && !useCond) { - if (attributeStatement->localLineNumber() != 888) + if (attributeStatement->localLineNumber() != SPF_OMP_DIR) { __spf_print(1, "variable '%s' is not used in loop on line %d\n", privElem.c_str(), attributeStatement->lineNumber()); wstring messageE, messageR; @@ -272,7 +273,7 @@ static bool checkPrivate(SgStatement *st, } else if (!defCond && useCond) { - if (attributeStatement->localLineNumber() != 888) + if (attributeStatement->localLineNumber() != SPF_OMP_DIR) { __spf_print(1, "variable '%s' is not changed in loop on line %d\n", privElem.c_str(), attributeStatement->lineNumber()); wstring messageE, messageR; @@ -2042,6 +2043,69 @@ bool check_par_reg_dirs(SgFile *file, vector &messagesForFile) return noError; } +static void distributeAnalysisWithCover(SgFile* file) +{ + int funcNum = file->numberOfFunctions(); + const string currFile = file->filename(); + + for (int i = 0; i < funcNum; ++i) + { + SgStatement* st = file->functions(i); + SgStatement* lastNode = st->lastNodeOfStmt(); + + map, int>> spfAnalysis; + do + { + st = st->lexNext(); + if (st == NULL) + { + __spf_print(1, "internal error in analysis, parallel directives will not be generated for this file!\n"); + break; + } + + if (st->variant() == CONTAINS_STMT) + break; + + if (st->variant() == FOR_NODE) + { + pair, int> newData = { set(), 0 }; + for (auto& data : getAttributes(st, set{ SPF_ANALYSIS_DIR })) + { + newData.first.insert(data); + int cover = getCoverPropertyFromComment(new Statement(data)); + if (cover != 0) + newData.second = cover; + } + if (newData.first.size()) + spfAnalysis[st] = newData; + } + } while (st != lastNode); + + for (auto& data : spfAnalysis) + { + SgForStmt* st = isSgForStmt(data.first); + checkNull(st, convertFileName(__FILE__).c_str(), __LINE__); + + int level = st->isPerfectLoopNest(); + if (data.second.second < level && data.second.second != 0) + level = data.second.second; + + for (int z = 0; z < level - 1; ++z) + { + st = isSgForStmt(st->lexNext()); + checkNull(st, convertFileName(__FILE__).c_str(), __LINE__); + + for (auto& dirs : data.second.first) + { + auto copy = dirs->copyPtr(); + copy->setLocalLineNumber(SPF_USER_DIR_COPY); + st->addAttribute(copy->variant(), copy, sizeof(SgStatement)); + } + } + } + } +} + bool preprocess_spf_dirs(SgFile *file, const map &commonBlocks, vector &messagesForFile, const set& allFileNames, map, set>& usersDirectives) { @@ -2084,6 +2148,10 @@ bool preprocess_spf_dirs(SgFile *file, const map &commonBl findModulesInFile(file, modules); bool result = processModules(modules, currFile, &commonBlocks, messagesForFile, allFileNames, usersDirectives); noError = noError && result; + + if (noError) + distributeAnalysisWithCover(file); + return noError; } @@ -2184,7 +2252,7 @@ vector filterUserSpf(const vector &toFilter, bool wi { vector ret; for (auto &elem : toFilter) - if (elem->localLineNumber() == 777 || (elem->localLineNumber() == 888 && with_omp)) // user and omp + if (elem->localLineNumber() == SPF_USER_DIR || (elem->localLineNumber() == SPF_OMP_DIR && with_omp)) // user and omp ret.push_back(elem); return ret; diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/loops_splitter.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/loops_splitter.cpp index 071999f..65f7eca 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/loops_splitter.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/loops_splitter.cpp @@ -9,6 +9,7 @@ #include "../CFGraph/CFGraph.h" #include "../SageAnalysisTool/OmegaForSage/include/lang-interf.h" #include "../DirectiveProcessing/directive_parser.h" +#include "../DirectiveProcessing/directive_omp_parser.h" using std::string; using std::vector; @@ -766,7 +767,7 @@ static void filterSpfAttributes(SgStatement* stat) if (attr->getAttributeType() == SPF_ANALYSIS_DIR) { SgStatement* data = (SgStatement*)attr->getAttributeData(); - if (data->localLineNumber() != 777) + if (data->localLineNumber() != SPF_USER_DIR) continue; //__spf_print(1, "%s", data->unparse()); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 573c892..9492715 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2315" +#define VERSION_SPF "2316" From 072b587e905678d1aeeaeeb43b8573570e42614a Mon Sep 17 00:00:00 2001 From: Mikhail Kocharmin Date: Sat, 13 Apr 2024 13:29:57 +0300 Subject: [PATCH 64/68] shared memory parallelization: add notification message --- .../Sapfor_2017/_src/GraphCall/select_array_conf.cpp | 1 + sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h | 8 +++++++- sapfor/experts/Sapfor_2017/_src/Utils/errors.h | 5 ++++- .../Sapfor_2017/_src/Utils/russian_errors_text.txt | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp index 3e11f6b..f4f50e2 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp @@ -105,6 +105,7 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const setlineNum, bufR, bufE, 3023)); + loop->hasAccessToSubArray = true; } } } diff --git a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h index d483eda..a6fb74c 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h +++ b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h @@ -72,6 +72,7 @@ public: inDvmhRegion = 0; isFor = false; inCanonicalFrom = false; + hasAccessToSubArray = false; } ~LoopGraph() @@ -111,7 +112,7 @@ public: { return hasUnknownArrayDep || hasUnknownScalarDep || hasGoto || hasPrints || (hasConflicts.size() != 0) || hasStops || hasNonPureProcedures || hasUnknownArrayAssigns || hasNonRectangularBounds || hasIndirectAccess || hasWritesToNonDistribute || hasDifferentAlignRules || hasDvmIntervals || - !isFor || lastprivateScalars.size(); + !isFor || lastprivateScalars.size() || hasAccessToSubArray; } bool hasLimitsToSplit() const @@ -171,6 +172,9 @@ public: if (lastprivateScalars.size()) messages->push_back(Messages(NOTE, line, R199, L"lastprivate scalar dependency prevents parallelization of this loop", 3006)); + + if(hasAccessToSubArray) + messages->push_back(Messages(NOTE, line, R204, L"Arrays' memory intersections prevents this loop from parallelization", 3024)); } void setNewRedistributeRules(const std::vector> &newRedistributeRules) @@ -443,6 +447,8 @@ public: bool isFor; bool inCanonicalFrom; + // make sense only for NODIST regime + bool hasAccessToSubArray; std::vector children; std::vector funcChildren; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/errors.h b/sapfor/experts/Sapfor_2017/_src/Utils/errors.h index dbc94b2..e123e97 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/errors.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/errors.h @@ -127,6 +127,7 @@ enum typeMessage { WARR, ERROR, NOTE }; // 21 "empty parallel regions is forbidden" // 22 "Can not find align rules" // 23 "Array reference '%s' has a different size from the original array" +// 24 "Arrays' memory intersections prevents this loop from parallelization" // 40xx LOW LEVEL WARNINGS // 01 @@ -275,7 +276,7 @@ static void printStackTrace() { }; } \ } while (0) -// Свободный - R204 +// Свободный - R205 // Гайд по русификации сообщений: При добавлении нового сообщения, меняется последний сводобный идентификатор. // В этом файле остаются только спецификаторы, для которых будет заполнен текст. Полный текст пишется в файле // russian_errors_text.txt. Спецификаторы там тоже сохраняются, по ним в визуализаторе будет восстановлен @@ -603,6 +604,8 @@ static const wchar_t *R151 = L"R151:"; static const wchar_t *R171 = L"R171:%s"; //3023 static const wchar_t *R202 = L"R202:%s"; +//3024 +static const wchar_t* R204 = L"R204:"; //4001 //---TODO ошибки из SAGE diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt b/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt index f44d671..8286bdd 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt +++ b/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt @@ -314,6 +314,8 @@ R151 = "Пустые области распараллеливания недо R171 = "Невозможно определить правила выравнивания для массива '%s'." //3023 R202 = "Ссылка '%s' имеет отличный от оригинального массива размер" +//3024 +R204 = "Пересечения памяти массивов препятствуют распараллеливанию цикла" //4001 //---TODO ошибки из SAGE From 2b9adf5d275433a09b1baac02cf3c7b83dfe2d39 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 13 Apr 2024 18:14:28 +0300 Subject: [PATCH 65/68] improved IR and dead_code --- .../experts/Sapfor_2017/_src/CFGraph/IR.cpp | 38 +++++++++++++++++-- sapfor/experts/Sapfor_2017/_src/CFGraph/IR.h | 7 ++-- .../_src/Transformations/dead_code.cpp | 5 ++- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.cpp b/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.cpp index fd59b00..5c8bd0c 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.cpp +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.cpp @@ -195,7 +195,7 @@ static SAPFOR::Argument* createConstArg(SgExpression* exp) else if (var == BOOL_VAL) newName = value->boolValue() ? "TRUE" : "FALSE"; else if (var == KEYWORD_VAL) - newName = string("%") + isSgKeywordValExp(exp)->value(); + newName = string("%") + "key_arg_" + isSgKeywordValExp(exp)->value(); else if (var == CONSTRUCTOR_REF) { type = CFG_ARG_TYPE::CONSTR_REF; @@ -395,7 +395,7 @@ static SAPFOR::Argument* processExpression(SgExpression* ex, vector& if (ex) { const int var = ex->variant(); - if ((var == VAR_REF || var == CONST_REF) && !ex->lhs() && !ex->rhs()) // + if ((var == VAR_REF || var == CONST_REF || var == LABEL_REF) && !ex->lhs() && !ex->rhs()) // { if (var == CONST_REF) { @@ -405,6 +405,14 @@ static SAPFOR::Argument* processExpression(SgExpression* ex, vector& else return createArg(ex->symbol(), commonVars, func); } + else if (var == LABEL_REF) + { + auto labRef = isSgLabelRefExp(ex); + if (labRef == NULL) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + return createConstArg(labRef->label()->getLabNumber()); + } else return createArg(ex->symbol(), commonVars, func); } @@ -609,13 +617,15 @@ static SAPFOR::Argument* processExpression(SgExpression* ex, vector& } else if (var == CONSTRUCTOR_REF) return createConstArg(ex); + else if (var == SPEC_PAIR) + return processExpression(ex->rhs(), blocks, func, commonVars); else { __spf_print(1, "unknown expression '%s'\n", tag[ex->variant()]); printInternalError(convertFileName(__FILE__).c_str(), __LINE__); } } - + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); return NULL; } @@ -1131,8 +1141,8 @@ static SgStatement* processStatement(SgStatement* st, vector& blocks, else if (var == PRINT_STAT || var == WRITE_STAT || var == READ_STAT) { SgInputOutputStmt* io = isSgInputOutputStmt(st); + SgExpression* item = io->itemList(); - vector> items; vector tmp; @@ -1200,10 +1210,30 @@ static SgStatement* processStatement(SgStatement* st, vector& blocks, } else { + SgExpression* spec = io->specList(); + vector specArgs; + + if (spec->variant() == SPEC_PAIR) + specArgs.push_back(processExpression(spec, blocks, func, commonVars)); + else + { + while (spec) + { + specArgs.push_back(processExpression(spec->lhs(), blocks, func, commonVars)); + spec = spec->rhs(); + } + } + vector args; for (auto& par : item) args.push_back(processExpression(par, blocks, func, commonVars)); + for (auto& arg : specArgs) + { + Instruction* instr = new Instruction(CFG_OP::IO_PARAM, arg); + blocks.push_back(new IR_Block(instr)); + } + for (auto& arg : args) { Instruction* instr = new Instruction(CFG_OP::PARAM, arg); diff --git a/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.h b/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.h index e50a7dc..505a428 100644 --- a/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.h +++ b/sapfor/experts/Sapfor_2017/_src/CFGraph/IR.h @@ -12,7 +12,7 @@ namespace SAPFOR { struct CFG_Settings; - enum class CFG_OP { NONE, ASSIGN, POINTER_ASS, LOAD, STORE, REC_REF_LOAD, REC_REF_STORE, REF, PARAM, RANGE, ENTRY, REC_REF, + enum class CFG_OP { NONE, ASSIGN, POINTER_ASS, LOAD, STORE, REC_REF_LOAD, REC_REF_STORE, REF, PARAM, IO_PARAM, RANGE, ENTRY, REC_REF, ADD, MULT, DIV, SUBT, UN_ADD, UN_MINUS, POW, CONCAT, CAST, JUMP, JUMP_IF, GE, LE, GT, LT, EQ, NEQV, EQV, EMPTY, OR, AND, NOT, @@ -22,7 +22,7 @@ namespace SAPFOR enum class CFG_ARG_TYPE { NONE, REG, VAR, ARRAY, CONST, FUNC, LAB, INSTR, CONST_STR, RECORD, CONSTR_REF }; enum class CFG_MEM_TYPE { NONE_, COMMON_, SAVE_, LOCAL_, MODULE_, FUNC_RES_, FUNC_PARAM_, FILED_ }; - static std::vector CFG_OP_S = { "--", " = ", " => ", "LOAD ", "STORE ", "LOAD_REF ", "STORE_REF ", "REF ", "PARAM ", "RANGE ", "ENTRY ", "->", + static std::vector CFG_OP_S = { "--", " = ", " => ", "LOAD ", "STORE ", "LOAD_REF ", "STORE_REF ", "REF ", "PARAM ", "IO_PARAM ", "RANGE ", "ENTRY ", "->", " + ", " * ", " / ", " - ", " + ", "-", " ** ", " // ", "CAST ", "GOTO ", "IF_FALSE ", " >= ", " <= ", " > " , " < ", " == ", " != ", " eqv ", "CONTINUE", " || ", " && ", " ! ", @@ -228,7 +228,8 @@ namespace SAPFOR res = "LOAD " + resultVal + " " + arg1Val + CFG_OP_S[(int)operation] + arg2Val; break; case CFG_OP::REF: - case CFG_OP::PARAM: + case CFG_OP::PARAM: + case CFG_OP::IO_PARAM: res = CFG_OP_S[(int)operation] + arg1Val; break; case CFG_OP::CAST: diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 3971b8c..98b22a1 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -65,7 +65,8 @@ static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instru SAPFOR::CFG_OP::ENTRY, SAPFOR::CFG_OP::EXIT, SAPFOR::CFG_OP::DVM_DIR, - SAPFOR::CFG_OP::SPF_DIR + SAPFOR::CFG_OP::SPF_DIR, + SAPFOR::CFG_OP::IO_PARAM }; if (always_useful.find(instr_operation) != always_useful.end()) @@ -245,7 +246,7 @@ public: bool forwardData(const map>& data) { bool inserted = false; - SAPFOR::BasicBlock* bb= getBlock(); + SAPFOR::BasicBlock* bb = getBlock(); set use, def; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 9492715..fb6d786 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2316" +#define VERSION_SPF "2317" From f7406cf729f12c3b544bfab0e9cb979cf7cd90e7 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 13 Apr 2024 20:01:26 +0300 Subject: [PATCH 66/68] improved --- sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h | 4 ++-- sapfor/experts/Sapfor_2017/_src/Utils/errors.h | 2 +- sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt | 2 +- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h index a6fb74c..d11f794 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h +++ b/sapfor/experts/Sapfor_2017/_src/GraphLoop/graph_loops.h @@ -172,9 +172,9 @@ public: if (lastprivateScalars.size()) messages->push_back(Messages(NOTE, line, R199, L"lastprivate scalar dependency prevents parallelization of this loop", 3006)); - + if(hasAccessToSubArray) - messages->push_back(Messages(NOTE, line, R204, L"Arrays' memory intersections prevents this loop from parallelization", 3024)); + messages->push_back(Messages(NOTE, line, R204, L"Array's memory intersections prevents this loop from parallelization", 3024)); } void setNewRedistributeRules(const std::vector> &newRedistributeRules) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/errors.h b/sapfor/experts/Sapfor_2017/_src/Utils/errors.h index e123e97..4a35466 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/errors.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/errors.h @@ -127,7 +127,7 @@ enum typeMessage { WARR, ERROR, NOTE }; // 21 "empty parallel regions is forbidden" // 22 "Can not find align rules" // 23 "Array reference '%s' has a different size from the original array" -// 24 "Arrays' memory intersections prevents this loop from parallelization" +// 24 "Array's memory intersections prevents this loop from parallelization" // 40xx LOW LEVEL WARNINGS // 01 diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt b/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt index 8286bdd..7c5e39f 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt +++ b/sapfor/experts/Sapfor_2017/_src/Utils/russian_errors_text.txt @@ -315,7 +315,7 @@ R171 = "Невозможно определить правила выравни //3023 R202 = "Ссылка '%s' имеет отличный от оригинального массива размер" //3024 -R204 = "Пересечения памяти массивов препятствуют распараллеливанию цикла" +R204 = "Пересечение памяти массивов препятствует распараллеливанию цикла" //4001 //---TODO ошибки из SAGE diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index fb6d786..cca339b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2317" +#define VERSION_SPF "2318" From d8bd2ec43ad6e6acda06f07d4e01843d77bba2f3 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 14 Apr 2024 21:30:09 +0300 Subject: [PATCH 67/68] fixed dead code --- dvm/tools/pppa/trunk/src/stat.cpp | 30 +++++++++ dvm/tools/pppa/trunk/src/statfile.cpp | 31 ++++++++- dvm/tools/pppa/trunk/src/statlist.h | 3 +- .../_src/Transformations/dead_code.cpp | 67 +++++++++++++++---- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 5 files changed, 116 insertions(+), 17 deletions(-) diff --git a/dvm/tools/pppa/trunk/src/stat.cpp b/dvm/tools/pppa/trunk/src/stat.cpp index 6c17d44..41eddfd 100644 --- a/dvm/tools/pppa/trunk/src/stat.cpp +++ b/dvm/tools/pppa/trunk/src/stat.cpp @@ -139,6 +139,36 @@ void CStat::init(const char* path) { strcpy(spath, path); } +void CStat::init(CStatRead* stat_) { + isjson = false; + if (isinitialized) { + err = true; + return; + } + stat = stat_; + int warn; + if (stat->Valid(&warn) != TRUE) { + err = true; + return; + } + nproc = stat->QProc(); + if (nproc == 0) { + err = true; + return; + } + stat->VMSSize(p_heading); + unsigned long n = stat->BeginTreeWalk(); + if (n != 0) inter_tree = new CStatInter(stat, n); + proc_info = new struct CProcInfo[nproc]; + for (unsigned long i = 0; i < nproc; i++) + stat->NameTimeProc(i, &proc_info[i].node_name, &proc_info[i].test_time); + isinitialized = true; + + //TODO: ? + /*spath = new char[strlen(path) + 1]; + strcpy(spath, path);*/ +} + CStatInter * find_inter(short type, long expr, short nlev, CStatInter * cur) { while (cur != NULL) { if (cur->id.t == type && cur->id.nlev == nlev) diff --git a/dvm/tools/pppa/trunk/src/statfile.cpp b/dvm/tools/pppa/trunk/src/statfile.cpp index aecde3a..dc9e065 100644 --- a/dvm/tools/pppa/trunk/src/statfile.cpp +++ b/dvm/tools/pppa/trunk/src/statfile.cpp @@ -15,6 +15,7 @@ #endif #include "statprintf.h" +#include "statlist.h" using namespace std; /** @@ -83,6 +84,7 @@ static void printHelp() printf(" StartShdGrp|WaitShdGrp|ShdGrp|DistrGrp|ReDistrGrp|\n"); printf(" MapPLGrp|DoPLGrp|ProgBlockGrp|IOGrp|RemAccessGrp|\n"); printf(" UserDebGrp|StatistGrp|SystemGrp.\n"); + printf(" -j Dump to json format\n"); } #ifdef __SPF_BUILT_IN_PPPA @@ -112,7 +114,7 @@ int main(int argv, char **argc) #endif } - BOOL proc = TRUE, comp = TRUE, gen = TRUE; + BOOL proc = TRUE, comp = TRUE, gen = TRUE, jsonDump = FALSE; BOOL dvmh_gpu = TRUE, dvmh_threads = FALSE, dvmh_threads_full = FALSE; int verbosity = VERBOSITY_LVL_CPU | VERBOSITY_LVL_GPU; char compr[3], mode[5]; @@ -139,7 +141,7 @@ int main(int argv, char **argc) exit(1); #endif } - if (argv == npar + 1) { + if (argv == npar + 1 && argc[npar][1] != 'j') { printf("Parameter for %s not set\n", argc[npar]); #ifdef __SPF_BUILT_IN_PPPA return 1; @@ -335,7 +337,9 @@ int main(int argv, char **argc) else ++buf; } while (cond); } - + break; + case 'j': + jsonDump = TRUE; break; default: printf("Incorrect parameter %s\n", argc[npar]); @@ -363,6 +367,27 @@ int main(int argv, char **argc) #endif } + if (jsonDump == TRUE) + { + CStat stat_json; + stat_json.init(&stat); + if (!stat_json.isinitialized) + return 1; + + json j; + stat_json.to_json(j); + std::string str = j.dump(); + + FILE* f = fopen(argc[nparout], "w"); + if (f == NULL) + { + printf("Can't open file %s\n", argc[nparout]); + return 1; + } + fprintf(f, "%s\n", str.c_str()); + fclose(f); + return 0; + } // Возвращает количество процессоров, на которых считалась задача. unsigned long qproc = stat.QProc(); diff --git a/dvm/tools/pppa/trunk/src/statlist.h b/dvm/tools/pppa/trunk/src/statlist.h index de7841e..e0fc8c3 100644 --- a/dvm/tools/pppa/trunk/src/statlist.h +++ b/dvm/tools/pppa/trunk/src/statlist.h @@ -85,7 +85,8 @@ private: public: CStat(); CStat(json source); - void init(const char* path) ; + void init(const char* path); + void init(CStatRead* stat); void clear(); ~CStat() ; CStatInter * inter_tree; //"�������" ������ ���������� diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 98b22a1..887b843 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -351,6 +351,28 @@ public: { } }; +static bool hasCalls(SgExpression* ex) +{ + if (ex) + { + if (ex->variant() == FUNC_CALL) + return true; + return hasCalls(ex->lhs()) || hasCalls(ex->rhs()); + } + return false; +} + +//TODO: add check for side effects for function calls +static bool hasCalls(SgStatement* stat) +{ + if (stat->variant() == FOR_NODE) + { + auto forSt = isSgForStmt(stat); + return hasCalls(forSt->start()) || hasCalls(forSt->end()) || hasCalls(forSt->step()); + } + else + return hasCalls(stat->expr(0)) || hasCalls(stat->expr(1)) || hasCalls(stat->expr(2)); +} int removeDeadCode(SgStatement* func, const map>& allFuncs, @@ -493,7 +515,20 @@ int removeDeadCode(SgStatement* func, for (auto& rem : remove) { __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); - rem->deleteStmt(); + + auto cp = rem->controlParent(); + if (cp->variant() == LOGIF_NODE) + { + if (hasCalls(cp)) + { + ((SgLogIfStmt*)cp)->convertLogicIf(); + rem->deleteStmt(); + } + else + cp->deleteStmt(); + } + else + rem->deleteStmt(); } countOfTransform += remove.size(); @@ -507,25 +542,33 @@ int removeDeadCode(SgStatement* func, if ((var == FOR_NODE || var == WHILE_NODE || var == SWITCH_NODE) && st->lexNext()->variant() == CONTROL_END) { - remove.push_back(st); + if (!hasCalls(st)) + remove.push_back(st); } else if (var == IF_NODE) { - SgStatement* ifS = st; - while (ifS->lexNext()->variant() == ELSEIF_NODE) + if (!hasCalls(st)) + { + bool hasCalls_ = false; + SgStatement* ifS = st; + while (ifS->lexNext()->variant() == ELSEIF_NODE) + { + hasCalls_ |= hasCalls(ifS->lexNext()); + ifS = ifS->lexNext(); + } + + SgStatement* lastNode = ifS->lastNodeOfStmt(); ifS = ifS->lexNext(); - SgStatement* lastNode = ifS->lastNodeOfStmt(); - ifS = ifS->lexNext(); + while (ifS->variant() == CONTROL_END && ifS != lastNode) + ifS = ifS->lexNext(); - while (ifS->variant() == CONTROL_END && ifS != lastNode) - ifS = ifS->lexNext(); - - if (ifS == lastNode) - remove.push_back(st); + if (ifS == lastNode && !hasCalls_) + remove.push_back(st); + } } - //TODO: SWITCH and other block statements + //TODO: other block statements if (var == CONTAINS_STMT) break; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index cca339b..60ab1ff 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2318" +#define VERSION_SPF "2319" From b2693b655a061f49fd87d122a81a94f767886e90 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Mon, 15 Apr 2024 09:31:25 +0300 Subject: [PATCH 68/68] fixed cyclic deletion --- .../experts/Sapfor_2017/_src/Transformations/dead_code.cpp | 6 +++++- sapfor/experts/Sapfor_2017/_src/Utils/version.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index 887b843..323d30b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -574,13 +574,17 @@ int removeDeadCode(SgStatement* func, break; } - + bool mainRemoved = false; for (auto& rem : remove) { __spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); rem->deleteStmt(); + if (rem == start) + mainRemoved = true; } countOfTransform += remove.size(); + if (mainRemoved) + break; } while (remove.size()); deleteCFG(cfg); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index 60ab1ff..cc57a16 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2319" +#define VERSION_SPF "2320"