void visit(const Variable *v) { string var_name = v->name; expr = v; if (internal.contains(var_name)) { // Don't capture internally defined vars return; } if (v->reduction_domain.defined()) { if (explicit_rdom) { if (v->reduction_domain.same_as(rdom.domain())) { // This variable belongs to the explicit reduction domain, so // skip it. return; } else { // This should be converted to a pure variable and // added to the free vars list. var_name = unique_name('v'); expr = Variable::make(v->type, var_name); } } else { if (!rdom.defined()) { // We're looking for a reduction domain, and this variable // has one. Capture it. rdom = RDom(v->reduction_domain); return; } else if (!rdom.domain().same_as(v->reduction_domain)) { // We were looking for a reduction domain, and already // found one. This one is different! user_error << "Inline reduction \"" << name << "\" refers to reduction variables from multiple reduction domains: " << v->name << ", " << rdom.x.name() << "\n"; } else { // Recapturing an already-known reduction domain return; } } } if (v->param.defined()) { // Skip parameters return; } for (size_t i = 0; i < free_vars.size(); i++) { if (var_name == free_vars[i].name()) return; } free_vars.push_back(Var(var_name)); call_args.push_back(v); }