//===- TestOpDefs.cpp - MLIR Test Dialect Operation Hooks -----------------===// // // 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 "TestDialect.h" #include "TestOps.h" #include "mlir/Dialect/Tensor/IR/Tensor.h" #include "mlir/IR/Verifier.h" #include "mlir/Interfaces/FunctionImplementation.h" #include "mlir/Interfaces/MemorySlotInterfaces.h" usingnamespacemlir; usingnamespacetest; //===----------------------------------------------------------------------===// // TestBranchOp //===----------------------------------------------------------------------===// SuccessorOperands TestBranchOp::getSuccessorOperands(unsigned index) { … } //===----------------------------------------------------------------------===// // TestProducingBranchOp //===----------------------------------------------------------------------===// SuccessorOperands TestProducingBranchOp::getSuccessorOperands(unsigned index) { … } //===----------------------------------------------------------------------===// // TestInternalBranchOp //===----------------------------------------------------------------------===// SuccessorOperands TestInternalBranchOp::getSuccessorOperands(unsigned index) { … } //===----------------------------------------------------------------------===// // TestCallOp //===----------------------------------------------------------------------===// LogicalResult TestCallOp::verifySymbolUses(SymbolTableCollection &symbolTable) { … } //===----------------------------------------------------------------------===// // FoldToCallOp //===----------------------------------------------------------------------===// namespace { struct FoldToCallOpPattern : public OpRewritePattern<FoldToCallOp> { … }; } // namespace void FoldToCallOp::getCanonicalizationPatterns(RewritePatternSet &results, MLIRContext *context) { … } //===----------------------------------------------------------------------===// // IsolatedRegionOp - test parsing passthrough operands //===----------------------------------------------------------------------===// ParseResult IsolatedRegionOp::parse(OpAsmParser &parser, OperationState &result) { … } void IsolatedRegionOp::print(OpAsmPrinter &p) { … } //===----------------------------------------------------------------------===// // SSACFGRegionOp //===----------------------------------------------------------------------===// RegionKind SSACFGRegionOp::getRegionKind(unsigned index) { … } //===----------------------------------------------------------------------===// // GraphRegionOp //===----------------------------------------------------------------------===// RegionKind GraphRegionOp::getRegionKind(unsigned index) { … } //===----------------------------------------------------------------------===// // IsolatedGraphRegionOp //===----------------------------------------------------------------------===// RegionKind IsolatedGraphRegionOp::getRegionKind(unsigned index) { … } //===----------------------------------------------------------------------===// // AffineScopeOp //===----------------------------------------------------------------------===// ParseResult AffineScopeOp::parse(OpAsmParser &parser, OperationState &result) { … } void AffineScopeOp::print(OpAsmPrinter &p) { … } //===----------------------------------------------------------------------===// // TestRemoveOpWithInnerOps //===----------------------------------------------------------------------===// namespace { struct TestRemoveOpWithInnerOps : public OpRewritePattern<TestOpWithRegionPattern> { … }; } // namespace //===----------------------------------------------------------------------===// // TestOpWithRegionPattern //===----------------------------------------------------------------------===// void TestOpWithRegionPattern::getCanonicalizationPatterns( RewritePatternSet &results, MLIRContext *context) { … } //===----------------------------------------------------------------------===// // TestOpWithRegionFold //===----------------------------------------------------------------------===// OpFoldResult TestOpWithRegionFold::fold(FoldAdaptor adaptor) { … } //===----------------------------------------------------------------------===// // TestOpConstant //===----------------------------------------------------------------------===// OpFoldResult TestOpConstant::fold(FoldAdaptor adaptor) { … } //===----------------------------------------------------------------------===// // TestOpWithVariadicResultsAndFolder //===----------------------------------------------------------------------===// LogicalResult TestOpWithVariadicResultsAndFolder::fold( FoldAdaptor adaptor, SmallVectorImpl<OpFoldResult> &results) { … } //===----------------------------------------------------------------------===// // TestOpInPlaceFold //===----------------------------------------------------------------------===// OpFoldResult TestOpInPlaceFold::fold(FoldAdaptor adaptor) { … } //===----------------------------------------------------------------------===// // OpWithInferTypeInterfaceOp //===----------------------------------------------------------------------===// LogicalResult OpWithInferTypeInterfaceOp::inferReturnTypes( MLIRContext *, std::optional<Location> location, ValueRange operands, DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, SmallVectorImpl<Type> &inferredReturnTypes) { … } //===----------------------------------------------------------------------===// // OpWithShapedTypeInferTypeInterfaceOp //===----------------------------------------------------------------------===// LogicalResult OpWithShapedTypeInferTypeInterfaceOp::inferReturnTypeComponents( MLIRContext *context, std::optional<Location> location, ValueShapeRange operands, DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, SmallVectorImpl<ShapedTypeComponents> &inferredReturnShapes) { … } LogicalResult OpWithShapedTypeInferTypeInterfaceOp::reifyReturnTypeShapes( OpBuilder &builder, ValueRange operands, llvm::SmallVectorImpl<Value> &shapes) { … } //===----------------------------------------------------------------------===// // OpWithResultShapeInterfaceOp //===----------------------------------------------------------------------===// LogicalResult OpWithResultShapeInterfaceOp::reifyReturnTypeShapes( OpBuilder &builder, ValueRange operands, llvm::SmallVectorImpl<Value> &shapes) { … } //===----------------------------------------------------------------------===// // OpWithResultShapePerDimInterfaceOp //===----------------------------------------------------------------------===// LogicalResult OpWithResultShapePerDimInterfaceOp::reifyResultShapes( OpBuilder &builder, ReifiedRankedShapedTypeDims &shapes) { … } //===----------------------------------------------------------------------===// // SideEffectOp //===----------------------------------------------------------------------===// namespace { /// A test resource for side effects. struct TestResource : public SideEffects::Resource::Base<TestResource> { … }; } // namespace void SideEffectOp::getEffects( SmallVectorImpl<MemoryEffects::EffectInstance> &effects) { … } void SideEffectOp::getEffects( SmallVectorImpl<TestEffects::EffectInstance> &effects) { … } void SideEffectWithRegionOp::getEffects( SmallVectorImpl<MemoryEffects::EffectInstance> &effects) { … } void SideEffectWithRegionOp::getEffects( SmallVectorImpl<TestEffects::EffectInstance> &effects) { … } //===----------------------------------------------------------------------===// // StringAttrPrettyNameOp //===----------------------------------------------------------------------===// // This op has fancy handling of its SSA result name. ParseResult StringAttrPrettyNameOp::parse(OpAsmParser &parser, OperationState &result) { … } void StringAttrPrettyNameOp::print(OpAsmPrinter &p) { … } // We set the SSA name in the asm syntax to the contents of the name // attribute. void StringAttrPrettyNameOp::getAsmResultNames( function_ref<void(Value, StringRef)> setNameFn) { … } //===----------------------------------------------------------------------===// // CustomResultsNameOp //===----------------------------------------------------------------------===// void CustomResultsNameOp::getAsmResultNames( function_ref<void(Value, StringRef)> setNameFn) { … } //===----------------------------------------------------------------------===// // ResultTypeWithTraitOp //===----------------------------------------------------------------------===// LogicalResult ResultTypeWithTraitOp::verify() { … } //===----------------------------------------------------------------------===// // AttrWithTraitOp //===----------------------------------------------------------------------===// LogicalResult AttrWithTraitOp::verify() { … } //===----------------------------------------------------------------------===// // RegionIfOp //===----------------------------------------------------------------------===// void RegionIfOp::print(OpAsmPrinter &p) { … } ParseResult RegionIfOp::parse(OpAsmParser &parser, OperationState &result) { … } OperandRange RegionIfOp::getEntrySuccessorOperands(RegionBranchPoint point) { … } void RegionIfOp::getSuccessorRegions( RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) { … } void RegionIfOp::getRegionInvocationBounds( ArrayRef<Attribute> operands, SmallVectorImpl<InvocationBounds> &invocationBounds) { … } //===----------------------------------------------------------------------===// // AnyCondOp //===----------------------------------------------------------------------===// void AnyCondOp::getSuccessorRegions(RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) { … } void AnyCondOp::getRegionInvocationBounds( ArrayRef<Attribute> operands, SmallVectorImpl<InvocationBounds> &invocationBounds) { … } //===----------------------------------------------------------------------===// // SingleBlockImplicitTerminatorOp //===----------------------------------------------------------------------===// /// Testing the correctness of some traits. static_assert …; static_assert …; //===----------------------------------------------------------------------===// // SingleNoTerminatorCustomAsmOp //===----------------------------------------------------------------------===// ParseResult SingleNoTerminatorCustomAsmOp::parse(OpAsmParser &parser, OperationState &state) { … } void SingleNoTerminatorCustomAsmOp::print(OpAsmPrinter &printer) { … } //===----------------------------------------------------------------------===// // TestVerifiersOp //===----------------------------------------------------------------------===// LogicalResult TestVerifiersOp::verify() { … } LogicalResult TestVerifiersOp::verifyRegions() { … } //===----------------------------------------------------------------------===// // Test InferIntRangeInterface //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // TestWithBoundsOp void TestWithBoundsOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges, SetIntRangeFn setResultRanges) { … } //===----------------------------------------------------------------------===// // TestWithBoundsRegionOp ParseResult TestWithBoundsRegionOp::parse(OpAsmParser &parser, OperationState &result) { … } void TestWithBoundsRegionOp::print(OpAsmPrinter &p) { … } void TestWithBoundsRegionOp::inferResultRanges( ArrayRef<ConstantIntRanges> argRanges, SetIntRangeFn setResultRanges) { … } //===----------------------------------------------------------------------===// // TestIncrementOp void TestIncrementOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges, SetIntRangeFn setResultRanges) { … } //===----------------------------------------------------------------------===// // TestReflectBoundsOp void TestReflectBoundsOp::inferResultRanges( ArrayRef<ConstantIntRanges> argRanges, SetIntRangeFn setResultRanges) { … } //===----------------------------------------------------------------------===// // ConversionFuncOp //===----------------------------------------------------------------------===// ParseResult ConversionFuncOp::parse(OpAsmParser &parser, OperationState &result) { … } void ConversionFuncOp::print(OpAsmPrinter &p) { … } //===----------------------------------------------------------------------===// // ReifyBoundOp //===----------------------------------------------------------------------===// mlir::presburger::BoundType ReifyBoundOp::getBoundType() { … } LogicalResult ReifyBoundOp::verify() { … } ValueBoundsConstraintSet::Variable ReifyBoundOp::getVariable() { … } //===----------------------------------------------------------------------===// // CompareOp //===----------------------------------------------------------------------===// ValueBoundsConstraintSet::ComparisonOperator CompareOp::getComparisonOperator() { … } mlir::ValueBoundsConstraintSet::Variable CompareOp::getLhs() { … } mlir::ValueBoundsConstraintSet::Variable CompareOp::getRhs() { … } LogicalResult CompareOp::verify() { … } //===----------------------------------------------------------------------===// // TestOpInPlaceSelfFold //===----------------------------------------------------------------------===// OpFoldResult TestOpInPlaceSelfFold::fold(FoldAdaptor adaptor) { … } //===----------------------------------------------------------------------===// // TestOpFoldWithFoldAdaptor //===----------------------------------------------------------------------===// OpFoldResult TestOpFoldWithFoldAdaptor::fold(FoldAdaptor adaptor) { … } //===----------------------------------------------------------------------===// // OpWithInferTypeAdaptorInterfaceOp //===----------------------------------------------------------------------===// LogicalResult OpWithInferTypeAdaptorInterfaceOp::inferReturnTypes( MLIRContext *, std::optional<Location> location, OpWithInferTypeAdaptorInterfaceOp::Adaptor adaptor, SmallVectorImpl<Type> &inferredReturnTypes) { … } //===----------------------------------------------------------------------===// // OpWithRefineTypeInterfaceOp //===----------------------------------------------------------------------===// // TODO: We should be able to only define either inferReturnType or // refineReturnType, currently only refineReturnType can be omitted. LogicalResult OpWithRefineTypeInterfaceOp::inferReturnTypes( MLIRContext *context, std::optional<Location> location, ValueRange operands, DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, SmallVectorImpl<Type> &returnTypes) { … } LogicalResult OpWithRefineTypeInterfaceOp::refineReturnTypes( MLIRContext *, std::optional<Location> location, ValueRange operands, DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, SmallVectorImpl<Type> &returnTypes) { … } //===----------------------------------------------------------------------===// // OpWithShapedTypeInferTypeAdaptorInterfaceOp //===----------------------------------------------------------------------===// LogicalResult OpWithShapedTypeInferTypeAdaptorInterfaceOp::inferReturnTypeComponents( MLIRContext *context, std::optional<Location> location, OpWithShapedTypeInferTypeAdaptorInterfaceOp::Adaptor adaptor, SmallVectorImpl<ShapedTypeComponents> &inferredReturnShapes) { … } LogicalResult OpWithShapedTypeInferTypeAdaptorInterfaceOp::reifyReturnTypeShapes( OpBuilder &builder, ValueRange operands, llvm::SmallVectorImpl<Value> &shapes) { … } //===----------------------------------------------------------------------===// // TestOpWithPropertiesAndInferredType //===----------------------------------------------------------------------===// LogicalResult TestOpWithPropertiesAndInferredType::inferReturnTypes( MLIRContext *context, std::optional<Location>, ValueRange operands, DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, SmallVectorImpl<Type> &inferredReturnTypes) { … } //===----------------------------------------------------------------------===// // LoopBlockOp //===----------------------------------------------------------------------===// void LoopBlockOp::getSuccessorRegions( RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) { … } OperandRange LoopBlockOp::getEntrySuccessorOperands(RegionBranchPoint point) { … } //===----------------------------------------------------------------------===// // LoopBlockTerminatorOp //===----------------------------------------------------------------------===// MutableOperandRange LoopBlockTerminatorOp::getMutableSuccessorOperands(RegionBranchPoint point) { … } //===----------------------------------------------------------------------===// // SwitchWithNoBreakOp //===----------------------------------------------------------------------===// void TestNoTerminatorOp::getSuccessorRegions( RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) { … } //===----------------------------------------------------------------------===// // Test InferIntRangeInterface //===----------------------------------------------------------------------===// OpFoldResult ManualCppOpWithFold::fold(ArrayRef<Attribute> attributes) { … } //===----------------------------------------------------------------------===// // Tensor/Buffer Ops //===----------------------------------------------------------------------===// void ReadBufferOp::getEffects( SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>> &effects) { … } //===----------------------------------------------------------------------===// // Test Dataflow //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // TestCallAndStoreOp CallInterfaceCallable TestCallAndStoreOp::getCallableForCallee() { … } void TestCallAndStoreOp::setCalleeFromCallable(CallInterfaceCallable callee) { … } Operation::operand_range TestCallAndStoreOp::getArgOperands() { … } MutableOperandRange TestCallAndStoreOp::getArgOperandsMutable() { … } //===----------------------------------------------------------------------===// // TestCallOnDeviceOp CallInterfaceCallable TestCallOnDeviceOp::getCallableForCallee() { … } void TestCallOnDeviceOp::setCalleeFromCallable(CallInterfaceCallable callee) { … } Operation::operand_range TestCallOnDeviceOp::getArgOperands() { … } MutableOperandRange TestCallOnDeviceOp::getArgOperandsMutable() { … } //===----------------------------------------------------------------------===// // TestStoreWithARegion void TestStoreWithARegion::getSuccessorRegions( RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) { … } //===----------------------------------------------------------------------===// // TestStoreWithALoopRegion void TestStoreWithALoopRegion::getSuccessorRegions( RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) { … } //===----------------------------------------------------------------------===// // TestVersionedOpA //===----------------------------------------------------------------------===// LogicalResult TestVersionedOpA::readProperties(mlir::DialectBytecodeReader &reader, mlir::OperationState &state) { … } void TestVersionedOpA::writeProperties(mlir::DialectBytecodeWriter &writer) { … } //===----------------------------------------------------------------------===// // TestOpWithVersionedProperties //===----------------------------------------------------------------------===// llvm::LogicalResult TestOpWithVersionedProperties::readFromMlirBytecode( mlir::DialectBytecodeReader &reader, test::VersionedProperties &prop) { … } void TestOpWithVersionedProperties::writeToMlirBytecode( mlir::DialectBytecodeWriter &writer, const test::VersionedProperties &prop) { … } //===----------------------------------------------------------------------===// // TestMultiSlotAlloca //===----------------------------------------------------------------------===// llvm::SmallVector<MemorySlot> TestMultiSlotAlloca::getPromotableSlots() { … } Value TestMultiSlotAlloca::getDefaultValue(const MemorySlot &slot, OpBuilder &builder) { … } void TestMultiSlotAlloca::handleBlockArgument(const MemorySlot &slot, BlockArgument argument, OpBuilder &builder) { … } /// Creates a new TestMultiSlotAlloca operation, just without the `slot`. static std::optional<TestMultiSlotAlloca> createNewMultiAllocaWithoutSlot(const MemorySlot &slot, OpBuilder &builder, TestMultiSlotAlloca oldOp) { … } std::optional<PromotableAllocationOpInterface> TestMultiSlotAlloca::handlePromotionComplete(const MemorySlot &slot, Value defaultValue, OpBuilder &builder) { … } SmallVector<DestructurableMemorySlot> TestMultiSlotAlloca::getDestructurableSlots() { … } DenseMap<Attribute, MemorySlot> TestMultiSlotAlloca::destructure( const DestructurableMemorySlot &slot, const SmallPtrSetImpl<Attribute> &usedIndices, OpBuilder &builder, SmallVectorImpl<DestructurableAllocationOpInterface> &newAllocators) { … } std::optional<DestructurableAllocationOpInterface> TestMultiSlotAlloca::handleDestructuringComplete( const DestructurableMemorySlot &slot, OpBuilder &builder) { … }