#include "Halide.h"
namespace {
class CleanupOnError : public Halide::Generator<CleanupOnError> {
public:
Func build() {
Var x;
// This allocation is going to succeed
Func f;
f(x) = x;
f.compute_root();
Target target = get_target();
if (target.has_gpu_feature()) {
Var xo, xi;
f.gpu_tile(x, xo, xi, 16);
}
// This one is going to fail (because we'll override
// halide_malloc to make it fail). The first allocation should
// be cleaned up when the second one fails.
Func g;
g(x) = f(2*x) + f(2*x+1);
g.compute_root();
Func h;
h(x) = g(x) + 1;
return h;
}
};
Halide::RegisterGenerator<CleanupOnError> register_my_gen{"cleanup_on_error"};
} // namespace