//===- 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 { void populateBoundsForIndexValue(Operation *op, Value value, ValueBoundsConstraintSet &cstr) const { auto addIOp = cast(op); assert(value == addIOp.getResult() && "invalid value"); cstr.bound(value) == cstr.getExpr(addIOp.getLhs()) + cstr.getExpr(addIOp.getRhs()); } }; struct ConstantOpInterface : public ValueBoundsOpInterface::ExternalModel { void populateBoundsForIndexValue(Operation *op, Value value, ValueBoundsConstraintSet &cstr) const { auto constantOp = cast(op); assert(value == constantOp.getResult() && "invalid value"); if (auto attr = llvm::dyn_cast(constantOp.getValue())) cstr.bound(value) == attr.getInt(); } }; struct SubIOpInterface : public ValueBoundsOpInterface::ExternalModel { void populateBoundsForIndexValue(Operation *op, Value value, ValueBoundsConstraintSet &cstr) const { auto subIOp = cast(op); assert(value == subIOp.getResult() && "invalid value"); cstr.bound(value) == cstr.getExpr(subIOp.getLhs()) - cstr.getExpr(subIOp.getRhs()); } }; struct MulIOpInterface : public ValueBoundsOpInterface::ExternalModel { void populateBoundsForIndexValue(Operation *op, Value value, ValueBoundsConstraintSet &cstr) const { auto mulIOp = cast(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(*ctx); arith::ConstantOp::attachInterface(*ctx); arith::SubIOp::attachInterface(*ctx); arith::MulIOp::attachInterface(*ctx); }); }