Revision a0fc7fafeee3a6678887d8c8e86c47def4572526 authored by Alexander Root on 04 February 2021, 01:13:53 UTC, committed by GitHub on 04 February 2021, 01:13:53 UTC
* add fixes to overflow analysis in bounds inference Co-authored-by: Steven Johnson <srj@google.com>
1 parent dadbcbf
StrictifyFloat.cpp
#include "StrictifyFloat.h"
#include "Function.h"
#include "IRMutator.h"
#include "IROperator.h"
namespace Halide {
namespace Internal {
namespace {
class StrictifyFloat : public IRMutator {
enum Strictness {
FastMath,
StrictFloat,
} strictness;
using IRMutator::visit;
Expr visit(const Call *call) override {
Strictness new_strictness = strictness;
if (call->is_intrinsic(Call::strict_float)) {
new_strictness = StrictFloat;
any_strict_float |= true;
}
ScopedValue<Strictness> save_strictness(strictness, new_strictness);
return IRMutator::visit(call);
}
using IRMutator::mutate;
Expr mutate(const Expr &expr) override {
if (!expr.defined()) {
return expr;
}
Expr e = IRMutator::mutate(expr);
if (e.type().is_float()) {
switch (strictness) {
case FastMath:
return e;
case StrictFloat:
return strict_float(e);
}
}
return e;
}
public:
enum StrictnessMode {
Allowed,
Forced
};
bool any_strict_float{false};
StrictifyFloat(StrictnessMode mode)
: strictness((mode == Forced) ? StrictFloat : FastMath) {
any_strict_float |= (mode == Forced);
}
};
} // namespace
bool strictify_float(std::map<std::string, Function> &env, const Target &t) {
bool any_strict_float = false;
for (auto &iter : env) {
Function &func = iter.second;
StrictifyFloat::StrictnessMode mode = StrictifyFloat::Allowed;
if (t.has_feature(Target::StrictFloat)) {
mode = StrictifyFloat::Forced;
}
// TODO(zalman): Some targets don't allow strict float and we can provide errors for these.
StrictifyFloat strictify(mode);
func.mutate(&strictify);
any_strict_float |= strictify.any_strict_float;
}
return any_strict_float;
}
} // namespace Internal
} // namespace Halide
Computing file changes ...