static SymbolicVal GetDefaultBlockSize(const CompSlice* slice) { AstInterface& fa = LoopTransformInterface::getAstInterface(); LoopTransformOptions* opt = LoopTransformOptions::GetInstance(); if (!opt->DoDynamicTuning()) { return opt->GetDefaultBlockSize(); } else { int dt = opt->GetDynamicTuningIndex(); AstInterface::AstNodeList l; l.push_back(fa.CreateConstInt(dt)); CompSlice::ConstLoopIterator iter = slice->GetConstLoopIterator(); LoopTreeNode *loop = iter.Current(); SymbolicBound b = loop->GetLoopInfo()->GetBound(); SymbolicVal size = b.ub - b.lb + 1; l.push_back(fa.CreateConstInt(1)); l.push_back(size.CodeGen(fa)); AstNodePtr init = fa.CreateFunctionCall("getTuningValue", l); return SymbolicVar(fa.NewVar(fa.GetType("int"), "",true,AST_NULL, init),AST_NULL); } }
bool ParameterizeCopyArray:: CanBeBlocked( DepCompCopyArrayCollect::CopyArrayUnit& unit, int copydim) { if (copydim == 0) return false; int k = 0; /* number of sweeping loop dimensions */ for (int i = 0; i < copydim; ++i) { bool sweeping = false; /*QY: any sweeping loops*/ for (DepCompCopyArrayCollect::CopyArrayUnit::NodeSet::const_iterator p = unit.refs.begin(); !p.ReachEnd(); ++p) { int j = 0; /*number of sweeping loop dimensions per array dimension*/ for (LoopTreeNode* loop = (*p)->GetInfo().stmt->EnclosingLoop(); loop!=0 && loop != unit.root; loop = loop->EnclosingLoop()) { AstNodePtr ref = (*p)->GetInfo().orig; if (!ReferenceDimension(ref, loop->GetLoopInfo()->GetVar().GetVarName(),i)) { ++j; sweeping=true; break; } } if (j > 1) return false; /*QY: multiple loops sweeping a dimension*/ } if (sweeping) ++k; } if (k == 0) return false; /* QY: no sweeping dimensions*/ return true; }