1//===- ValueBoundsOpInterfaceImpl.cpp - Impl. of ValueBoundsOpInterface ---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "mlir/Dialect/Vector/IR/ValueBoundsOpInterfaceImpl.h"
10
11#include "mlir/Dialect/Vector/IR/ScalableValueBoundsConstraintSet.h"
12#include "mlir/Dialect/Vector/IR/VectorOps.h"
13#include "mlir/Interfaces/ValueBoundsOpInterface.h"
14
15using namespace mlir;
16
17namespace mlir::vector {
18namespace {
19
20struct VectorScaleOpInterface
21 : public ValueBoundsOpInterface::ExternalModel<VectorScaleOpInterface,
22 VectorScaleOp> {
23 void populateBoundsForIndexValue(Operation *op, Value value,
24 ValueBoundsConstraintSet &cstr) const {
25 auto *scalableCstr = dyn_cast<ScalableValueBoundsConstraintSet>(Val: &cstr);
26 if (!scalableCstr)
27 return;
28 auto vscaleOp = cast<VectorScaleOp>(op);
29 assert(value == vscaleOp.getResult() && "invalid value");
30 if (auto vscale = scalableCstr->getVscaleValue()) {
31 // All copies of vscale are equivalent.
32 scalableCstr->bound(value) == cstr.getExpr(value: vscale);
33 } else {
34 // We know vscale is confined to [vscaleMin, vscaleMax].
35 scalableCstr->bound(value) >= scalableCstr->getVscaleMin();
36 scalableCstr->bound(value) <= scalableCstr->getVscaleMax();
37 scalableCstr->setVscale(vscaleOp);
38 }
39 }
40};
41
42} // namespace
43} // namespace mlir::vector
44
45void mlir::vector::registerValueBoundsOpInterfaceExternalModels(
46 DialectRegistry &registry) {
47 registry.addExtension(extensionFn: +[](MLIRContext *ctx, vector::VectorDialect *dialect) {
48 vector::VectorScaleOp::attachInterface<vector::VectorScaleOpInterface>(
49 *ctx);
50 });
51}
52

source code of mlir/lib/Dialect/Vector/IR/ValueBoundsOpInterfaceImpl.cpp