13 MemFinder(
const Def* to_search)
14 : to_search({to_search}) {}
15 MemFinder(
DefVec&& to_search)
16 : to_search(std::move(to_search)) {}
18 using IsaMem = Axm::IsA<mem::M, mim::App>;
26MemFinder::IsaMem MemFinder::next_mem() {
27 while (!to_search.empty()) {
28 auto cur = to_search.back();
30 if (cur->isa<Sigma>())
31 for (
auto op : cur->ops())
32 to_search.push_back(op);
33 else if (
auto mem = Axm::isa<mem::M>(cur))
43 auto kernel =
launch->decurry()->decurry()->arg();
44 auto kernel_args =
launch->decurry()->arg();
45 auto kernel_args_t = kernel_args->type();
47 MemFinder mem_finder(kernel_args_t);
48 if (mem_finder.next_mem()) {
49 fe::throwf(
"You may not pass any %mem.M across device boundaries: passing {} : {} from host to kernel '{}'",
50 kernel_args, kernel_args_t, kernel);
53 return Super::rewrite_imm_App(app);
57 auto lam = def->isa<
Lam>();
58 if (lam && lam->sym().str() ==
"main") {
59 MemFinder intype_mem_finder(lam->type()->dom());
60 while (
auto mem = intype_mem_finder.next_mem()) {
61 auto addr_space =
mem->arg();
63 fe::throwf(
"The main function may not take %mem.M n with a non-zero n as an argument");
66 MemFinder outtype_mem_finder(lam->type()->ret_dom());
67 while (
auto mem = outtype_mem_finder.next_mem()) {
68 auto addr_space =
mem->arg();
69 if (
Lit::as(addr_space) != 0) fe::throwf(
"The main function may not return any %mem.M n with a non-zero n");
virtual void rewrite_external(Def *)
static auto isa(const Def *def)
static T as(const Def *def)
const Def * rewrite_imm_App(const App *) final
void rewrite_external(Def *) final
Vector< const Def * > DefVec