MLIR  20.0.0git
ValueBoundsOpInterfaceImpl.cpp
Go to the documentation of this file.
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 
10 
14 
15 using namespace mlir;
16 
17 namespace mlir::vector {
18 namespace {
19 
20 struct 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>(&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(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 
46  DialectRegistry &registry) {
47  registry.addExtension(+[](MLIRContext *ctx, vector::VectorDialect *dialect) {
48  vector::VectorScaleOp::attachInterface<vector::VectorScaleOpInterface>(
49  *ctx);
50  });
51 }
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
bool addExtension(TypeID extensionID, std::unique_ptr< DialectExtensionBase > extension)
Add the given extension to the registry.
MLIRContext is the top-level object for a collection of MLIR operations.
Definition: MLIRContext.h:60
Operation is the basic unit of execution within MLIR.
Definition: Operation.h:88
A helper class to be used with ValueBoundsOpInterface.
AffineExpr getExpr(Value value, std::optional< int64_t > dim=std::nullopt)
Return an expression that represents the given index-typed value or shaped value dimension.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition: Value.h:96
void registerValueBoundsOpInterfaceExternalModels(DialectRegistry &registry)
Include the generated interface declarations.