1 Star 0 Fork 3

xiongying/Halide

forked from Gitee 极速下载/Halide 
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
UnsafePromises.cpp 1.96 KB
一键复制 编辑 原始数据 按行查看 历史
Andrew Adams 提交于 2020-03-17 02:53 +08:00 . Add a promise_clamped intrinsic
#include "UnsafePromises.h"
#include "IRMutator.h"
#include "IROperator.h"
namespace Halide {
namespace Internal {
namespace {
class LowerUnsafePromises : public IRMutator {
using IRMutator::visit;
Expr visit(const Call *op) override {
if (op->is_intrinsic(Call::unsafe_promise_clamped)) {
if (check) {
Expr is_clamped = op->args[0] >= op->args[1] && op->args[0] <= op->args[2];
std::ostringstream promise_expr_text;
promise_expr_text << is_clamped;
Expr cond_as_string = StringImm::make(promise_expr_text.str());
Expr promise_broken_error =
Call::make(Int(32),
"halide_error_requirement_failed",
{cond_as_string, StringImm::make("from unsafe_promise_clamped")},
Call::Extern);
return Call::make(op->args[0].type(),
Call::require,
{mutate(is_clamped), mutate(op->args[0]), promise_broken_error},
Call::PureIntrinsic);
} else {
return mutate(op->args[0]);
}
} else {
return IRMutator::visit(op);
}
}
bool check;
public:
LowerUnsafePromises(bool check)
: check(check) {
}
};
class LowerSafePromises : public IRMutator {
using IRMutator::visit;
Expr visit(const Call *op) override {
if (op->is_intrinsic(Call::promise_clamped)) {
return mutate(op->args[0]);
} else {
return IRMutator::visit(op);
}
}
};
} // namespace
Stmt lower_unsafe_promises(const Stmt &s, const Target &t) {
return LowerUnsafePromises(t.has_feature(Target::CheckUnsafePromises)).mutate(s);
}
Stmt lower_safe_promises(const Stmt &s) {
return LowerSafePromises().mutate(s);
}
} // namespace Internal
} // namespace Halide
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/VisionDeveloper/Halide.git
git@gitee.com:VisionDeveloper/Halide.git
VisionDeveloper
Halide
Halide
main

搜索帮助