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 9b2c7dd..9f9a9a2 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp @@ -81,7 +81,7 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const setusedArraysAll.begin(), loop->usedArraysAll.end(), back_inserter(conflict_arrays)); - for(DIST::Array* conflict_array: conflict_arrays) + for(auto& conflict_array : conflict_arrays) { // constructing string with array and it's sizes string array_bounds; @@ -90,11 +90,7 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const set= 0 ? to_string(bounds_pair.first) : "*"; - array_bounds += ":"; - array_bounds += bounds_pair.second >= 0 ? to_string(bounds_pair.second) : "*"; + array_bounds += "*"; } string array_ref = conflict_array->GetShortName() + "(" + array_bounds + ")"; @@ -219,7 +215,16 @@ void SelectArrayConfForParallelization(SgProject* proj, map realRefs; getRealArrayRefs(arr, arr, realRefs, arrayLinksByFuncCalls); - int num_of_dims = arr->GetDimSize(); + bool fullUnknownSizes = true; + for (auto& dim : arr->GetSizes()) + { + if (dim.first == dim.second && dim.first != -1) + fullUnknownSizes = false; + } + + if (fullUnknownSizes && realRefs.find(arr) != realRefs.end()) + continue; + for(DIST::Array* ref : realRefs) usedArrays[ref][DimConf(arr)][byFunc.first].insert(arr); } diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 5ba51d1..8d8bb8a 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -1336,7 +1336,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne detectCopies(allFuncInfo); fillInterfaceBlock(allFuncInfo); intentInsertToInterfaces(allFuncInfo); - //createInterfacesForAssumedSize(allFuncInfo); + createInterfacesForAssumedSize(allFuncInfo); //this call is only for testing //setPureStatus(allFuncInfo); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp index c53de5b..2f1a5b5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp @@ -30,6 +30,8 @@ using std::wstring; using std::make_pair; using std::to_string; +static bool isIntrincis(const string& name); + void insertIntrinsicStat(const vector& allFuncInfo) { for (auto& func : allFuncInfo) @@ -59,7 +61,7 @@ void insertIntrinsicStat(const vector& allFuncInfo) if (intrincis.find(name) != intrincis.end()) continue; - if (!isIntrinsicFunctionName(name.c_str())) + if (!isIntrincis(name)) continue; void* ptr = call.pointerDetailCallsFrom.first; @@ -123,14 +125,15 @@ void createInterfacesForOutCalls(FuncInfo* func) } } -static bool changeIfHasStarRange(SgExpression* arrayDecl) +static bool changeIfHasStarRange(SgExpression* arrayDecl, bool doReplace = false) { SgExpression* list = arrayDecl->lhs(); - bool has = false; + bool has = doReplace; while (list) { - if (list->lhs()->variant() == STAR_RANGE) + const int var = list->lhs()->variant(); + if (var == STAR_RANGE) has = true; list = list->rhs(); } @@ -148,6 +151,43 @@ static bool changeIfHasStarRange(SgExpression* arrayDecl) return has; } +static void removeExternalStat(SgStatement* func, const set& addedInterfaceFor) +{ + vector toRem; + for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) + { + if (isSgExecutableStatement(st)) + break; + if (st->variant() == CONTAINS_STMT) + break; + + if (st->variant() == EXTERN_STAT) + { + vector list; + SgExpression* ex = st->expr(0); + int count = 0; + while (ex) + { + if (addedInterfaceFor.find(ex->lhs()->symbol()->identifier()) == addedInterfaceFor.end()) + list.push_back(ex->lhs()); + count++; + ex = ex->rhs(); + } + + if (count == list.size()) + continue; + + if (list.size() == 0) + toRem.push_back(st); + else + st->setExpression(0, makeExprList(list, false)); + } + } + + for (auto& rem : toRem) + rem->deleteStmt(); +} + void createInterfacesForAssumedSize(const map>& allFuncInfo) { set hasAssumedSizeArrays; @@ -163,6 +203,8 @@ void createInterfacesForAssumedSize(const map>& allFun if (prog == NULL) continue; + vector arrayRefs; + bool hasRefs = false; for (int z = 0; z < func->funcParams.countOfPars; ++z) { if (func->funcParams.parametersT[z] == ARRAY_T) @@ -181,7 +223,12 @@ void createInterfacesForAssumedSize(const map>& allFun if (list->lhs() && list->lhs()->symbol()->identifier() == name) { if (changeIfHasStarRange(list->lhs())) + { + hasRefs = true; hasAssumedSizeArrays.insert(func); + } + else + arrayRefs.push_back(list->lhs()); break; } list = list->rhs(); @@ -189,6 +236,10 @@ void createInterfacesForAssumedSize(const map>& allFun } } } + + if (hasRefs) + for (auto& ref : arrayRefs) + changeIfHasStarRange(ref, true); } } @@ -202,6 +253,11 @@ void createInterfacesForAssumedSize(const map>& allFun for (auto& func : funcByFile.second) { + SgProgHedrStmt* prog = isSgProgHedrStmt(func->funcPointer->GetOriginal()); + if (prog == NULL) + continue; + + set addedInterfaceFor; for (auto& elem : func->callsFromV) { auto it = hasAssumedSizeArrays.find(elem); @@ -209,10 +265,13 @@ void createInterfacesForAssumedSize(const map>& allFun { auto callFrom = *it; DvmhRegionInserter::createInterfaceBlockForOutCall(func, callFrom); + addedInterfaceFor.insert(callFrom->funcName); } } - } + if (addedInterfaceFor.size()) + removeExternalStat(prog, addedInterfaceFor); + } } } @@ -1703,3 +1762,321 @@ void moduleTransfer(const map>& allFuncInfo) for (auto& func : funcForInterfaceAdd) createInterfaceBlockForToCalls(func); } + +static bool isIntrincis(const string& name) +{ + static set intrinsicF; + if (intrinsicF.size() == 0) + { + intrinsicF.insert(string("abs")); + intrinsicF.insert(string("adjustl")); + intrinsicF.insert(string("and")); + intrinsicF.insert(string("any")); + intrinsicF.insert(string("associated")); + intrinsicF.insert(string("allocated")); + intrinsicF.insert(string("amod")); + intrinsicF.insert(string("aimax0")); + intrinsicF.insert(string("ajmax0")); + intrinsicF.insert(string("akmax0")); + intrinsicF.insert(string("aimin0")); + intrinsicF.insert(string("ajmin0")); + intrinsicF.insert(string("akmin0")); + intrinsicF.insert(string("amax1")); + intrinsicF.insert(string("amax0")); + intrinsicF.insert(string("amin1")); + intrinsicF.insert(string("amin0")); + intrinsicF.insert(string("aimag")); + intrinsicF.insert(string("alog")); + intrinsicF.insert(string("alog10")); + intrinsicF.insert(string("asin")); + intrinsicF.insert(string("asind")); + intrinsicF.insert(string("asinh")); + intrinsicF.insert(string("acos")); + intrinsicF.insert(string("acosd")); + intrinsicF.insert(string("acosh")); + intrinsicF.insert(string("atan")); + intrinsicF.insert(string("atand")); + intrinsicF.insert(string("atanh")); + intrinsicF.insert(string("atan2")); + intrinsicF.insert(string("atan2d")); + intrinsicF.insert(string("aint")); + intrinsicF.insert(string("anint")); + intrinsicF.insert(string("achar")); + intrinsicF.insert(string("babs")); + intrinsicF.insert(string("bbits")); + intrinsicF.insert(string("bbset")); + intrinsicF.insert(string("bdim")); + intrinsicF.insert(string("biand")); + intrinsicF.insert(string("bieor")); + intrinsicF.insert(string("bior")); + intrinsicF.insert(string("bixor")); + intrinsicF.insert(string("btest")); + intrinsicF.insert(string("bbtest")); + intrinsicF.insert(string("bbclr")); + intrinsicF.insert(string("bitest")); + intrinsicF.insert(string("bjtest")); + intrinsicF.insert(string("bktest")); + intrinsicF.insert(string("bessel_j0")); + intrinsicF.insert(string("bessel_j1")); + intrinsicF.insert(string("bessel_jn")); + intrinsicF.insert(string("bessel_y0")); + intrinsicF.insert(string("bessel_y1")); + intrinsicF.insert(string("bessel_yn")); + intrinsicF.insert(string("bmod")); + intrinsicF.insert(string("bnot")); + intrinsicF.insert(string("bshft")); + intrinsicF.insert(string("bshftc")); + intrinsicF.insert(string("bsign")); + intrinsicF.insert(string("cos")); + intrinsicF.insert(string("ccos")); + intrinsicF.insert(string("cdcos")); + intrinsicF.insert(string("cosd")); + intrinsicF.insert(string("cosh")); + intrinsicF.insert(string("cotan")); + intrinsicF.insert(string("cotand")); + intrinsicF.insert(string("ceiling")); + intrinsicF.insert(string("cexp")); + intrinsicF.insert(string("conjg")); + intrinsicF.insert(string("csqrt")); + intrinsicF.insert(string("clog")); + intrinsicF.insert(string("clog10")); + intrinsicF.insert(string("cdlog")); + intrinsicF.insert(string("cdlog10")); + intrinsicF.insert(string("csin")); + intrinsicF.insert(string("cabs")); + intrinsicF.insert(string("cdabs")); + intrinsicF.insert(string("cdexp")); + intrinsicF.insert(string("cdsin")); + intrinsicF.insert(string("cdsqrt")); + intrinsicF.insert(string("cdtan")); + intrinsicF.insert(string("cmplx")); + intrinsicF.insert(string("char")); + intrinsicF.insert(string("ctan")); + intrinsicF.insert(string("cpu_time")); + intrinsicF.insert(string("dim")); + intrinsicF.insert(string("ddim")); + intrinsicF.insert(string("dble")); + intrinsicF.insert(string("dfloat")); + intrinsicF.insert(string("dfloti")); + intrinsicF.insert(string("dflotj")); + intrinsicF.insert(string("dflotk")); + intrinsicF.insert(string("dint")); + intrinsicF.insert(string("dmax1")); + intrinsicF.insert(string("dmin1")); + intrinsicF.insert(string("dmod")); + intrinsicF.insert(string("dprod")); + intrinsicF.insert(string("dreal")); + intrinsicF.insert(string("dsign")); + intrinsicF.insert(string("dshiftl")); + intrinsicF.insert(string("dshiftr")); + intrinsicF.insert(string("dabs")); + intrinsicF.insert(string("dsqrt")); + intrinsicF.insert(string("dexp")); + intrinsicF.insert(string("dlog")); + intrinsicF.insert(string("dlog10")); + intrinsicF.insert(string("dsin")); + intrinsicF.insert(string("dcos")); + intrinsicF.insert(string("dcosd")); + intrinsicF.insert(string("dtan")); + intrinsicF.insert(string("dtand")); + intrinsicF.insert(string("dasin")); + intrinsicF.insert(string("dasind")); + intrinsicF.insert(string("dasinh")); + intrinsicF.insert(string("dacos")); + intrinsicF.insert(string("dacosd")); + intrinsicF.insert(string("dacosh")); + intrinsicF.insert(string("datan")); + intrinsicF.insert(string("datand")); + intrinsicF.insert(string("datanh")); + intrinsicF.insert(string("datan2")); + intrinsicF.insert(string("datan2d")); + intrinsicF.insert(string("derf")); + intrinsicF.insert(string("derfc")); + intrinsicF.insert(string("dsind")); + intrinsicF.insert(string("dsinh")); + intrinsicF.insert(string("dcosh")); + intrinsicF.insert(string("dcotan")); + intrinsicF.insert(string("dcotand")); + intrinsicF.insert(string("dtanh")); + intrinsicF.insert(string("dnint")); + intrinsicF.insert(string("dcmplx")); + intrinsicF.insert(string("dconjg")); + intrinsicF.insert(string("dimag")); + intrinsicF.insert(string("exp")); + intrinsicF.insert(string("erf")); + intrinsicF.insert(string("erfc")); + intrinsicF.insert(string("erfc_scaled")); + intrinsicF.insert(string("etime")); + intrinsicF.insert(string("float")); + intrinsicF.insert(string("floati")); + intrinsicF.insert(string("floatj")); + intrinsicF.insert(string("floatk")); + intrinsicF.insert(string("floor")); + intrinsicF.insert(string("flush")); + intrinsicF.insert(string("gamma")); + intrinsicF.insert(string("habs")); + intrinsicF.insert(string("hbclr")); + intrinsicF.insert(string("hbits")); + intrinsicF.insert(string("hbset")); + intrinsicF.insert(string("hdim")); + intrinsicF.insert(string("hiand")); + intrinsicF.insert(string("hieor")); + intrinsicF.insert(string("hior")); + intrinsicF.insert(string("hixor")); + intrinsicF.insert(string("hmod")); + intrinsicF.insert(string("hnot")); + intrinsicF.insert(string("hshft")); + intrinsicF.insert(string("hshftc")); + intrinsicF.insert(string("hsign")); + intrinsicF.insert(string("htest")); + intrinsicF.insert(string("huge")); + intrinsicF.insert(string("hypot")); + intrinsicF.insert(string("iiabs")); + intrinsicF.insert(string("iargc")); + intrinsicF.insert(string("iiand")); + intrinsicF.insert(string("iibclr")); + intrinsicF.insert(string("iibits")); + intrinsicF.insert(string("iibset")); + intrinsicF.insert(string("iidim")); + intrinsicF.insert(string("iieor")); + intrinsicF.insert(string("iior")); + intrinsicF.insert(string("iishft")); + intrinsicF.insert(string("iishftc")); + intrinsicF.insert(string("iisign")); + intrinsicF.insert(string("iixor")); + intrinsicF.insert(string("int")); + intrinsicF.insert(string("idint")); + intrinsicF.insert(string("ifix")); + intrinsicF.insert(string("idim")); + intrinsicF.insert(string("isign")); + intrinsicF.insert(string("index")); + intrinsicF.insert(string("iabs")); + intrinsicF.insert(string("ibits")); + intrinsicF.insert(string("idnint")); + intrinsicF.insert(string("ichar")); + intrinsicF.insert(string("iachar")); + intrinsicF.insert(string("isnan")); + intrinsicF.insert(string("iand")); + intrinsicF.insert(string("ior")); + intrinsicF.insert(string("ibset")); + intrinsicF.insert(string("ibclr")); + intrinsicF.insert(string("ibchng")); + intrinsicF.insert(string("ieor")); + intrinsicF.insert(string("ilen")); + intrinsicF.insert(string("imag")); + intrinsicF.insert(string("imax0")); + intrinsicF.insert(string("imax1")); + intrinsicF.insert(string("imin0")); + intrinsicF.insert(string("imin1")); + intrinsicF.insert(string("imod")); + intrinsicF.insert(string("inot")); + intrinsicF.insert(string("isha")); + intrinsicF.insert(string("ishc")); + intrinsicF.insert(string("ishft")); + intrinsicF.insert(string("ishftc")); + intrinsicF.insert(string("ishl")); + intrinsicF.insert(string("ixor")); + intrinsicF.insert(string("jiabs")); + intrinsicF.insert(string("jiand")); + intrinsicF.insert(string("jibclr")); + intrinsicF.insert(string("jibits")); + intrinsicF.insert(string("jibset")); + intrinsicF.insert(string("jidim")); + intrinsicF.insert(string("jieor")); + intrinsicF.insert(string("jior")); + intrinsicF.insert(string("jishft")); + intrinsicF.insert(string("jishftc")); + intrinsicF.insert(string("jisign")); + intrinsicF.insert(string("jixor")); + intrinsicF.insert(string("jmax0")); + intrinsicF.insert(string("jmax1")); + intrinsicF.insert(string("jmin0")); + intrinsicF.insert(string("jmin1")); + intrinsicF.insert(string("jmod")); + intrinsicF.insert(string("jnot")); + intrinsicF.insert(string("kiabs")); + intrinsicF.insert(string("kiand")); + intrinsicF.insert(string("kibclr")); + intrinsicF.insert(string("kibits")); + intrinsicF.insert(string("kibset")); + intrinsicF.insert(string("kidim")); + intrinsicF.insert(string("kieor")); + intrinsicF.insert(string("kior")); + intrinsicF.insert(string("kishft")); + intrinsicF.insert(string("kishftc")); + intrinsicF.insert(string("kisign")); + intrinsicF.insert(string("kmax0")); + intrinsicF.insert(string("kmax1")); + intrinsicF.insert(string("kmin0")); + intrinsicF.insert(string("kmin1")); + intrinsicF.insert(string("kmod")); + intrinsicF.insert(string("knot")); + intrinsicF.insert(string("len")); + intrinsicF.insert(string("len_trim")); + intrinsicF.insert(string("lge")); + intrinsicF.insert(string("lgt")); + intrinsicF.insert(string("lle")); + intrinsicF.insert(string("llt")); + intrinsicF.insert(string("log_gamma")); + intrinsicF.insert(string("log")); + intrinsicF.insert(string("log10")); + intrinsicF.insert(string("lshft")); + intrinsicF.insert(string("lshift")); + intrinsicF.insert(string("max")); + intrinsicF.insert(string("max0")); + intrinsicF.insert(string("max1")); + intrinsicF.insert(string("merge_bits")); + intrinsicF.insert(string("min")); + intrinsicF.insert(string("minval")); + intrinsicF.insert(string("maxval")); + intrinsicF.insert(string("min0")); + intrinsicF.insert(string("min1")); + intrinsicF.insert(string("mod")); + intrinsicF.insert(string("modulo")); + intrinsicF.insert(string("not")); + intrinsicF.insert(string("nint")); + intrinsicF.insert(string("null")); + intrinsicF.insert(string("or")); + intrinsicF.insert(string("popcnt")); + intrinsicF.insert(string("poppar")); + intrinsicF.insert(string("random_number")); + intrinsicF.insert(string("real")); + intrinsicF.insert(string("reshape")); + intrinsicF.insert(string("present")); + intrinsicF.insert(string("repeat")); + intrinsicF.insert(string("rshft")); + intrinsicF.insert(string("rshift")); + intrinsicF.insert(string("sign")); + intrinsicF.insert(string("size")); + intrinsicF.insert(string("scan")); + intrinsicF.insert(string("sizeof")); + intrinsicF.insert(string("sngl")); + intrinsicF.insert(string("sqrt")); + intrinsicF.insert(string("sin")); + intrinsicF.insert(string("sind")); + intrinsicF.insert(string("sinh")); + intrinsicF.insert(string("shifta")); + intrinsicF.insert(string("shiftl")); + intrinsicF.insert(string("shiftr")); + intrinsicF.insert(string("sum")); + intrinsicF.insert(string("tan")); + intrinsicF.insert(string("tand")); + intrinsicF.insert(string("tanh")); + intrinsicF.insert(string("tiny")); + intrinsicF.insert(string("trailz")); + intrinsicF.insert(string("trim")); + intrinsicF.insert(string("xor")); + intrinsicF.insert(string("wtime")); + intrinsicF.insert(string("zabs")); + intrinsicF.insert(string("zcos")); + intrinsicF.insert(string("zexp")); + intrinsicF.insert(string("zlog")); + intrinsicF.insert(string("zsin")); + intrinsicF.insert(string("zsqrt")); + intrinsicF.insert(string("ztan")); + } + + if (intrinsicF.find(name) != intrinsicF.end()) + return true; + return false; +} \ 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 4b1bd72..d767411 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 "2327" +#define VERSION_SPF "2329"