// // A forall-intents variation on findOuterVars() in createTaskFunctions.cpp: // Find all symbols used in 'block' and defined outside of it. // static void findOuterVars(BlockStmt* block, SymbolMap* uses) { std::vector<SymExpr*> symExprs; collectSymExprsSTL(block, symExprs); for_vector(SymExpr, symExpr, symExprs) { Symbol* sym = symExpr->var; if (toVarSymbol(sym) || toArgSymbol(sym)) if (!isCorrespIndexVar(block, sym) && isOuterVar(sym, block)) uses->put(sym,gNil); }
// // returns true if the symbol is defined in an outer function to fn // third argument not used at call site // static bool isOuterVar(Symbol* sym, FnSymbol* fn, Symbol* parent = NULL) { if (!parent) parent = fn->defPoint->parentSymbol; if (!isFnSymbol(parent)) return false; else if (sym->defPoint->parentSymbol == parent) return true; else return isOuterVar(sym, fn, parent->defPoint->parentSymbol); }
// // finds outer vars directly used in a function // static void findOuterVars(FnSymbol* fn, SymbolMap* uses) { Vec<BaseAST*> asts; collect_asts(fn, asts); forv_Vec(BaseAST, ast, asts) { if (SymExpr* symExpr = toSymExpr(ast)) { Symbol* sym = symExpr->var; if (toVarSymbol(sym) || toArgSymbol(sym)) if (isOuterVar(sym, fn)) uses->put(sym,gNil); } } }
static void findOuterVars(FnSymbol* fn, SymbolMap& uses) { std::vector<BaseAST*> asts; collect_asts(fn, asts); for_vector(BaseAST, ast, asts) { if (SymExpr* symExpr = toSymExpr(ast)) { Symbol* sym = symExpr->symbol(); if (isLcnSymbol(sym)) { if (!isCorrespCoforallIndex(fn, sym) && isOuterVar(sym, fn)) uses.put(sym, markUnspecified); } } } }
// // finds outer vars directly used in a function // static void findOuterVars(FnSymbol* fn, SymbolMap* uses) { std::vector<BaseAST*> asts; collect_asts(fn, asts); for_vector(BaseAST, ast, asts) { if (SymExpr* symExpr = toSymExpr(ast)) { Symbol* sym = symExpr->var; if (isLcnSymbol(sym)) { if (isOuterVar(sym, fn)) uses->put(sym,gNil); } } } }