int count_host_alignment_asserts(Func f, std::map<string, int> m) { Target t = get_jit_target_from_environment(); t.set_feature(Target::NoBoundsQuery); f.compute_root(); Stmt s = Internal::lower({f.function()}, f.name(), t); CountHostAlignmentAsserts c(m); s.accept(&c); return c.count; }
int count_interleaves(Func f) { Target t = get_jit_target_from_environment(); t.set_feature(Target::NoBoundsQuery); t.set_feature(Target::NoAsserts); Stmt s = Internal::lower(f.function(), t); CountInterleaves i; s.accept(&i); return i.result; }
bool uses_branches(Func f) { Target t = get_jit_target_from_environment(); t.set_feature(Target::NoBoundsQuery); t.set_feature(Target::NoAsserts); Stmt s = Internal::lower(f.function(), t); ContainsBranches b; s.accept(&b); return b.result; }
void apply_schedule(const schedule_map &schedules, Func root) { // TODO: this should be encapsulated in a find_all_calls helper // extract all the functions called transitively from root, by name Function f = root.function(); map<string, Function> functions = find_transitive_calls(f); // add the root function into the environment, too functions[f.name()] = f; // for each function named in the schedule_map, apply the schedule to the // Function object by overwriting its schedule field by reference. for (schedule_map::const_iterator it = schedules.begin(); it != schedules.end(); ++it) { fprintf(stderr, "Apply schedule to %s\n", it->first.c_str()); assert(functions.count(it->first)); functions[it->first].schedule() = it->second[0]; for (size_t r = 0; r < functions[it->first].reductions().size(); r++) { functions[it->first].reduction_schedule(r) = it->second[r+1]; } } }
LoopLevel::LoopLevel(Func f, VarOrRVar v) : LoopLevel(f.function().name(), v.name(), v.is_rvar) {}