This source file includes following definitions.
- visit
- visit
- visit
- found_buffer_ref
- visit
- visit
- visit
- visit
#include "Closure.h"
#include "Debug.h"
namespace Halide {
namespace Internal {
using std::string;
using std::map;
using std::vector;
using std::pair;
Closure::Closure(Stmt s, const string &loop_variable) {
if (!loop_variable.empty()) {
ignore.push(loop_variable, 0);
}
s.accept(this);
}
void Closure::visit(const Let *op) {
op->value.accept(this);
ignore.push(op->name, 0);
op->body.accept(this);
ignore.pop(op->name);
}
void Closure::visit(const LetStmt *op) {
op->value.accept(this);
ignore.push(op->name, 0);
op->body.accept(this);
ignore.pop(op->name);
}
void Closure::visit(const For *op) {
ignore.push(op->name, 0);
op->min.accept(this);
op->extent.accept(this);
op->body.accept(this);
ignore.pop(op->name);
}
void Closure::found_buffer_ref(const string &name, Type type,
bool read, bool written, Halide::Buffer<> image) {
if (!ignore.contains(name)) {
debug(3) << "Adding buffer " << name << " to closure\n";
Buffer &ref = buffers[name];
ref.type = type.element_of();
ref.read = read;
ref.write = written;
if (image.defined()) {
ref.size = image.size_in_bytes();
ref.dimensions = image.dimensions();
}
} else {
debug(3) << "Not adding " << name << " to closure\n";
}
}
void Closure::visit(const Load *op) {
op->predicate.accept(this);
op->index.accept(this);
found_buffer_ref(op->name, op->type, true, false, op->image);
}
void Closure::visit(const Store *op) {
op->predicate.accept(this);
op->index.accept(this);
op->value.accept(this);
found_buffer_ref(op->name, op->value.type(), false, true, Halide::Buffer<>());
}
void Closure::visit(const Allocate *op) {
if (op->new_expr.defined()) {
op->new_expr.accept(this);
}
ignore.push(op->name, 0);
for (size_t i = 0; i < op->extents.size(); i++) {
op->extents[i].accept(this);
}
op->body.accept(this);
ignore.pop(op->name);
}
void Closure::visit(const Variable *op) {
if (ignore.contains(op->name)) {
debug(3) << "Not adding " << op->name << " to closure\n";
} else {
debug(3) << "Adding " << op->name << " to closure\n";
vars[op->name] = op->type;
}
}
}
}