#include "Array.h" #include "../Utils/errors.h" #include "../Utils/utils.h" #include "../GraphCall/graph_calls.h" using namespace std; static vector> applyNewOrder(const vector>& in, const vector& newOrder) { int countOfDepr = 0; for (int z = 0; z < in.size(); ++z) countOfDepr += (in[z].first == 0 && in[z].second == 0) ? 1 : 0; if (newOrder.size() == 0) return in; if (newOrder.size() + countOfDepr != in.size()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); vector> tmp, retTmp(newOrder.size()); for (int z = 0; z < in.size(); ++z) if (!(in[z].first == 0 && in[z].second == 0)) tmp.push_back(in[z]); for (int z = 0; z < newOrder.size(); ++z) retTmp[z] = tmp[newOrder[z]]; vector> retVal; for (int z = 0, z1 = 0; z < in.size(); ++z) if ((in[z].first == 0 && in[z].second == 0)) retVal.push_back(in[z]); else retVal.push_back(retTmp[z1++]); return retVal; } static vector applyNewOrder(const vector &in, const vector &newOrder) { int countOfDepr = 0; for (int z = 0; z < in.size(); ++z) countOfDepr += (in[z] == -1) ? 1 : 0; if (newOrder.size() == 0) return in; if (newOrder.size() + countOfDepr != in.size()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); vector tmp, retTmp(newOrder.size()); for (int z = 0; z < in.size(); ++z) if (in[z] != -1) tmp.push_back(in[z]); for (int z = 0; z < newOrder.size(); ++z) retTmp[z] = tmp[newOrder[z]]; vector retVal; for (int z = 0, z1 = 0; z < in.size(); ++z) if (in[z] == -1) retVal.push_back(in[z]); else retVal.push_back(retTmp[z1++]); return retVal; } template static vector applyNewOrderS(const vector &in, const vector &newOrder) { vector retVal(in.size()); if (newOrder.size() == 0) return in; if (newOrder.size() != in.size()) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); for (int z = 0; z < newOrder.size(); ++z) retVal[z] = in[newOrder[z]]; return retVal; } namespace Distribution { vector> TemplateLink::GetAlignRules() const { vector> retVal = alignRuleWithTemplate; if (templateArray == NULL) return retVal; vector newOrder = templateArray->GetNewTemplateDimsOrder(); if (newOrder.size() == 0) return alignRuleWithTemplate; else return applyNewOrder(retVal, newOrder); } vector TemplateLink::GetLinks() const { vector retVal = linkWithTemplate; if (templateArray == NULL) return retVal; vector newOrder = templateArray->GetNewTemplateDimsOrder(); if (newOrder.size() == 0) return linkWithTemplate; else return applyNewOrder(retVal, newOrder); } string TemplateLink::toString() const { string retVal = ""; retVal += "#" + to_string(linkWithTemplate.size()); for (int i = 0; i < linkWithTemplate.size(); ++i) retVal += "#" + to_string(linkWithTemplate[i]); retVal += "#" + to_string(alignRuleWithTemplate.size()); for (int i = 0; i < alignRuleWithTemplate.size(); ++i) retVal += "#" + to_string(alignRuleWithTemplate[i].first) + "#" + to_string(alignRuleWithTemplate[i].second); retVal += "#" + to_string((long long)templateArray); return retVal; } void TemplateLink::AddRule(const int dimNum, int dimTempl, const pair& rule, Array* templateArray_) { linkWithTemplate[dimNum] = dimTempl; alignRuleWithTemplate[dimNum] = rule; templateArray = templateArray_; } const vector>& Array::GetSizes() { if (templateDimsOrder.size() == 0) return sizes; else { if (orderedSizes.size() == 0) orderedSizes = applyNewOrderS(sizes, templateDimsOrder); return orderedSizes; } } const vector>, pair>>>& Array::GetSizesExpr() { if (templateDimsOrder.size() == 0) return sizesExpr; else { if (orderedSizesExpr.size() == 0) orderedSizesExpr = applyNewOrderS(sizesExpr, templateDimsOrder); return orderedSizesExpr; } } void printArrayInfo(const string& file, const map, pair>& declaredArrays) { FILE* out = fopen(file.c_str(), "w"); if (out == NULL) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); for (auto& elem : declaredArrays) { Array* currA = elem.second.first; ArrayAccessInfo* info = elem.second.second; fprintf(out, "Array '%s' (full name '%s'):\n", currA->GetShortName().c_str(), currA->GetName().c_str()); auto loc = currA->GetLocation(); string locN = ""; if (loc.first == l_COMMON) locN = "COMMON "; else if (loc.first == l_MODULE) locN = "MODULE "; else if (loc.first == l_PARAMETER) locN = "PARAMETER of "; else if (loc.first == l_LOCAL) locN = "LOCAL of "; else if (loc.first == l_LOCAL_SAVE) locN = "LOCAL (save) of "; else if (loc.first == l_STRUCT) locN = "STRUCT "; else locN = "UNKN "; locN += "'" + loc.second + "'"; fprintf(out, " type: %s\n", locN.c_str()); for (auto& byFile : info->GetAllAccessInfo()) { fprintf(out, " FOR FILE '%s':\n", convertFileName(byFile.first.c_str()).c_str()); for (auto& byLine : byFile.second) for (auto& onLine : byLine.second) fprintf(out, " %s\n", onLine.PrintInfo().c_str()); } fprintf(out, "=============== \n\n"); } fclose(out); } void fixTypeOfArrayInfoWithCallGraph(map, pair>& declaredArrays, const map& allFuncs) { for (auto& elem : declaredArrays) { ArrayAccessInfo* info = elem.second.second; info->checkAndUpdate(allFuncs); } } void ArrayAccessInfo::checkAndUpdate(const map& allFuncs) { for (auto& byFile : accessPatterns) { for (auto& byLine : byFile.second) { for (auto& acc : byLine.second) { if (acc.underFunctionPar != -1) { auto it = allFuncs.find(acc.fName); if (it != allFuncs.end()) { if (it->second->funcParams.isArgIn(acc.underFunctionPar) && !it->second->funcParams.isArgOut(acc.underFunctionPar)) { //switch to READ acc.type = 0; } } } } } } } }