AstNodePtr SymbolicFunction :: CodeGen( AstInterface &_fa) const { AstInterface::AstNodeList l; for (const_iterator i = args.begin(); i != args.end(); ++i) { SymbolicVal cur = *i; AstNodePtr curast = cur.CodeGen(_fa); l.push_back(curast); } if (t == AstInterface::OP_NONE) { return _fa.CreateFunctionCall( op, l); } else if (t == AstInterface::OP_ARRAY_ACCESS) { AstNodePtr arr = l.front(); l.pop_front(); return _fa.CreateArrayAccess(arr, l); } else if (t == AstInterface::OP_ASSIGN && l.size() == 2) { return _fa.CreateAssignment(l.front(), l.back()); } else if (l.size() == 2) return _fa.CreateBinaryOP( t, l.front(), l.back()); else { assert(l.size() == 1); return _fa.CreateUnaryOP( t, l.front()); } }
bool LoopTransformInterface:: IsDynamicFusionConfig( const AstNodePtr& n, AstNodePtr* configvar, int* configID, AstInterface::AstNodeList* params) { assert(fa != 0); AstNodePtr invoc; if (!fa->IsAssignment(n, configvar, &invoc)) return false; AstInterface::AstNodeList args; std::string sig; AstNodePtr f; if (!fa->IsFunctionCall(invoc, &f, &args) || !fa->IsVarRef(f, 0, &sig) ) return false; if (sig == "DynamicFusionConfig") { if (configID != 0) { AstNodePtr idnode = args.front(); bool isconst = fa->IsConstInt( idnode, configID); assert(isconst); } if (params != 0) { *params = args; params->erase(params->begin()); params->erase(params->begin()); } return true; } return false; }