1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
//===- ValueBoundsOpInterfaceImpl.cpp - Impl. of ValueBoundsOpInterface ---===//
//
// Part of the LLVM Project, 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 "mlir/Dialect/Arith/IR/ValueBoundsOpInterfaceImpl.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Interfaces/ValueBoundsOpInterface.h"
using namespace mlir;
namespace mlir {
namespace arith {
namespace {
struct AddIOpInterface
: public ValueBoundsOpInterface::ExternalModel<AddIOpInterface, AddIOp> {
void populateBoundsForIndexValue(Operation *op, Value value,
ValueBoundsConstraintSet &cstr) const {
auto addIOp = cast<AddIOp>(op);
assert(value == addIOp.getResult() && "invalid value");
cstr.bound(value) ==
cstr.getExpr(addIOp.getLhs()) + cstr.getExpr(addIOp.getRhs());
}
};
struct ConstantOpInterface
: public ValueBoundsOpInterface::ExternalModel<ConstantOpInterface,
ConstantOp> {
void populateBoundsForIndexValue(Operation *op, Value value,
ValueBoundsConstraintSet &cstr) const {
auto constantOp = cast<ConstantOp>(op);
assert(value == constantOp.getResult() && "invalid value");
if (auto attr = llvm::dyn_cast<IntegerAttr>(constantOp.getValue()))
cstr.bound(value) == attr.getInt();
}
};
struct SubIOpInterface
: public ValueBoundsOpInterface::ExternalModel<SubIOpInterface, SubIOp> {
void populateBoundsForIndexValue(Operation *op, Value value,
ValueBoundsConstraintSet &cstr) const {
auto subIOp = cast<SubIOp>(op);
assert(value == subIOp.getResult() && "invalid value");
cstr.bound(value) ==
cstr.getExpr(subIOp.getLhs()) - cstr.getExpr(subIOp.getRhs());
}
};
struct MulIOpInterface
: public ValueBoundsOpInterface::ExternalModel<MulIOpInterface, MulIOp> {
void populateBoundsForIndexValue(Operation *op, Value value,
ValueBoundsConstraintSet &cstr) const {
auto mulIOp = cast<MulIOp>(op);
assert(value == mulIOp.getResult() && "invalid value");
cstr.bound(value) ==
cstr.getExpr(mulIOp.getLhs()) * cstr.getExpr(mulIOp.getRhs());
}
};
} // namespace
} // namespace arith
} // namespace mlir
void mlir::arith::registerValueBoundsOpInterfaceExternalModels(
DialectRegistry ®istry) {
registry.addExtension(+[](MLIRContext *ctx, arith::ArithDialect *dialect) {
arith::AddIOp::attachInterface<arith::AddIOpInterface>(*ctx);
arith::ConstantOp::attachInterface<arith::ConstantOpInterface>(*ctx);
arith::SubIOp::attachInterface<arith::SubIOpInterface>(*ctx);
arith::MulIOp::attachInterface<arith::MulIOpInterface>(*ctx);
});
}
|