//===- TestOneToNTypeConversionPass.cpp - Test pass 1:N type conv. utils --===// // // 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/Func/Transforms/OneToNFuncConversions.h" #include "mlir/Dialect/SCF/Transforms/Patterns.h" #include "mlir/Pass/Pass.h" #include "mlir/Transforms/OneToNTypeConversion.h" usingnamespacemlir; namespace { /// Test pass that exercises the (poor-man's) 1:N type conversion mechanisms /// in `applyPartialOneToNConversion` by converting built-in tuples to the /// elements they consist of as well as some dummy ops operating on these /// tuples. struct TestOneToNTypeConversionPass : public PassWrapper<TestOneToNTypeConversionPass, OperationPass<ModuleOp>> { … }; } // namespace namespace mlir { namespace test { void registerTestOneToNTypeConversionPass() { … } } // namespace test } // namespace mlir namespace { /// Test pattern on for the `make_tuple` op from the test dialect that converts /// this kind of op into it's "decomposed" form, i.e., the elements of the tuple /// that is being produced by `test.make_tuple`, which are really just the /// operands of this op. class ConvertMakeTupleOp : public OneToNOpConversionPattern<::test::MakeTupleOp> { … }; /// Test pattern on for the `get_tuple_element` op from the test dialect that /// converts this kind of op into it's "decomposed" form, i.e., instead of /// "physically" extracting one element from the tuple, we forward the one /// element of the decomposed form that is being extracted (or the several /// elements in case that element is a nested tuple). class ConvertGetTupleElementOp : public OneToNOpConversionPattern<::test::GetTupleElementOp> { … }; } // namespace static void populateDecomposeTuplesTestPatterns(const TypeConverter &typeConverter, RewritePatternSet &patterns) { … } /// Creates a sequence of `test.get_tuple_element` ops for all elements of a /// given tuple value. If some tuple elements are, in turn, tuples, the elements /// of those are extracted recursively such that the returned values have the /// same types as `resultTypes.getFlattenedTypes()`. /// /// This function has been copied (with small adaptions) from /// TestDecomposeCallGraphTypes.cpp. static std::optional<SmallVector<Value>> buildGetTupleElementOps(OpBuilder &builder, TypeRange resultTypes, Value input, Location loc) { … } /// Creates a `test.make_tuple` op out of the given inputs building a tuple of /// type `resultType`. If that type is nested, each nested tuple is built /// recursively with another `test.make_tuple` op. /// /// This function has been copied (with small adaptions) from /// TestDecomposeCallGraphTypes.cpp. static std::optional<Value> buildMakeTupleOp(OpBuilder &builder, TupleType resultType, ValueRange inputs, Location loc) { … } void TestOneToNTypeConversionPass::runOnOperation() { … }