blob: 04a2b71403122175119a9becdd1bd30d928c8233 [file]
// Copyright 2021 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/compiler/Dialect/Util/Analysis/Attributes/Range.h"
#include "iree/compiler/Dialect/Util/Analysis/DFX/Solver.h"
#include "iree/compiler/Dialect/Util/Analysis/DFX/State.h"
#include "iree/compiler/Dialect/Util/Analysis/Explorer.h"
#include "iree/compiler/Dialect/Util/Transforms/Passes.h"
namespace mlir::iree_compiler::IREE::Util {
#define GEN_PASS_DEF_TESTFLOATRANGEANALYSISPASS
#include "iree/compiler/Dialect/Util/Transforms/Passes.h.inc"
namespace {
class TestFloatRangeAnalysisPass
: public impl::TestFloatRangeAnalysisPassBase<TestFloatRangeAnalysisPass> {
public:
void runOnOperation() override {
Explorer explorer(getOperation(), TraversalAction::SHALLOW);
llvm::BumpPtrAllocator allocator;
DFX::Solver solver(explorer, allocator);
// Collect all probe points.
SmallVector<std::pair<Operation *, const FloatRangeValueElement *>>
queryOps;
getOperation()->walk([&](Operation *op) {
if (op->getName().getStringRef() == "iree_unregistered.test_fprange" &&
op->getNumOperands() == 1) {
Value operand = op->getOperands().front();
const FloatRangeValueElement &element =
solver.getOrCreateElementFor<FloatRangeValueElement>(
Position::forValue(operand));
queryOps.emplace_back(op, &element);
}
});
// Solve.
if (failed(solver.run())) {
return signalPassFailure();
}
// Update.
for (auto &it : queryOps) {
it.first->setAttr("analysis", StringAttr::get(&getContext(),
it.second->getAsStr(
solver.getAsmState())));
}
}
};
} // namespace
} // namespace mlir::iree_compiler::IREE::Util