xref: /llvm-project/mlir/unittests/Transforms/DialectConversion.cpp (revision 5e118f933b6590cecd7f1afb30845a1594bc4a5d)
1c6828e0cSCaitlyn Cano //===- DialectConversion.cpp - Dialect conversion unit tests --------------===//
2c6828e0cSCaitlyn Cano //
3c6828e0cSCaitlyn Cano // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c6828e0cSCaitlyn Cano // See https://llvm.org/LICENSE.txt for license information.
5c6828e0cSCaitlyn Cano // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c6828e0cSCaitlyn Cano //
7c6828e0cSCaitlyn Cano //===----------------------------------------------------------------------===//
8c6828e0cSCaitlyn Cano 
9c6828e0cSCaitlyn Cano #include "mlir/Transforms/DialectConversion.h"
10c6828e0cSCaitlyn Cano #include "gtest/gtest.h"
11c6828e0cSCaitlyn Cano 
12c6828e0cSCaitlyn Cano using namespace mlir;
13c6828e0cSCaitlyn Cano 
createOp(MLIRContext * context)14c6828e0cSCaitlyn Cano static Operation *createOp(MLIRContext *context) {
15c6828e0cSCaitlyn Cano   context->allowUnregisteredDialects();
16*5e118f93SMehdi Amini   return Operation::create(
17*5e118f93SMehdi Amini       UnknownLoc::get(context), OperationName("foo.bar", context), std::nullopt,
18*5e118f93SMehdi Amini       std::nullopt, std::nullopt, /*properties=*/nullptr, std::nullopt, 0);
19c6828e0cSCaitlyn Cano }
20c6828e0cSCaitlyn Cano 
21c6828e0cSCaitlyn Cano namespace {
22c6828e0cSCaitlyn Cano struct DummyOp {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonf30c54920111::DummyOp235e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(DummyOp)
245e50dd04SRiver Riddle 
25c6828e0cSCaitlyn Cano   static StringRef getOperationName() { return "foo.bar"; }
26c6828e0cSCaitlyn Cano };
27c6828e0cSCaitlyn Cano 
TEST(DialectConversionTest,DynamicallyLegalOpCallbackOrder)28c6828e0cSCaitlyn Cano TEST(DialectConversionTest, DynamicallyLegalOpCallbackOrder) {
29c6828e0cSCaitlyn Cano   MLIRContext context;
30c6828e0cSCaitlyn Cano   ConversionTarget target(context);
31c6828e0cSCaitlyn Cano 
32c6828e0cSCaitlyn Cano   int index = 0;
33c6828e0cSCaitlyn Cano   int callbackCalled1 = 0;
34c6828e0cSCaitlyn Cano   target.addDynamicallyLegalOp<DummyOp>([&](Operation *) {
35c6828e0cSCaitlyn Cano     callbackCalled1 = ++index;
36c6828e0cSCaitlyn Cano     return true;
37c6828e0cSCaitlyn Cano   });
38c6828e0cSCaitlyn Cano 
39c6828e0cSCaitlyn Cano   int callbackCalled2 = 0;
400de16fafSRamkumar Ramachandra   target.addDynamicallyLegalOp<DummyOp>(
410de16fafSRamkumar Ramachandra       [&](Operation *) -> std::optional<bool> {
42c6828e0cSCaitlyn Cano         callbackCalled2 = ++index;
433a77eb66SKazu Hirata         return std::nullopt;
44c6828e0cSCaitlyn Cano       });
45c6828e0cSCaitlyn Cano 
46c6828e0cSCaitlyn Cano   auto *op = createOp(&context);
47c6828e0cSCaitlyn Cano   EXPECT_TRUE(target.isLegal(op));
48c6828e0cSCaitlyn Cano   EXPECT_EQ(2, callbackCalled1);
49c6828e0cSCaitlyn Cano   EXPECT_EQ(1, callbackCalled2);
502a3878eaSButygin   EXPECT_FALSE(target.isIllegal(op));
512a3878eaSButygin   EXPECT_EQ(4, callbackCalled1);
522a3878eaSButygin   EXPECT_EQ(3, callbackCalled2);
53c6828e0cSCaitlyn Cano   op->destroy();
54c6828e0cSCaitlyn Cano }
55c6828e0cSCaitlyn Cano 
TEST(DialectConversionTest,DynamicallyLegalOpCallbackSkip)56c6828e0cSCaitlyn Cano TEST(DialectConversionTest, DynamicallyLegalOpCallbackSkip) {
57c6828e0cSCaitlyn Cano   MLIRContext context;
58c6828e0cSCaitlyn Cano   ConversionTarget target(context);
59c6828e0cSCaitlyn Cano 
60c6828e0cSCaitlyn Cano   int index = 0;
61c6828e0cSCaitlyn Cano   int callbackCalled = 0;
620de16fafSRamkumar Ramachandra   target.addDynamicallyLegalOp<DummyOp>(
630de16fafSRamkumar Ramachandra       [&](Operation *) -> std::optional<bool> {
64c6828e0cSCaitlyn Cano         callbackCalled = ++index;
653a77eb66SKazu Hirata         return std::nullopt;
66c6828e0cSCaitlyn Cano       });
67c6828e0cSCaitlyn Cano 
68c6828e0cSCaitlyn Cano   auto *op = createOp(&context);
69c6828e0cSCaitlyn Cano   EXPECT_FALSE(target.isLegal(op));
70c6828e0cSCaitlyn Cano   EXPECT_EQ(1, callbackCalled);
712a3878eaSButygin   EXPECT_FALSE(target.isIllegal(op));
722a3878eaSButygin   EXPECT_EQ(2, callbackCalled);
73c6828e0cSCaitlyn Cano   op->destroy();
74c6828e0cSCaitlyn Cano }
75c6828e0cSCaitlyn Cano 
TEST(DialectConversionTest,DynamicallyLegalUnknownOpCallbackOrder)76c6828e0cSCaitlyn Cano TEST(DialectConversionTest, DynamicallyLegalUnknownOpCallbackOrder) {
77c6828e0cSCaitlyn Cano   MLIRContext context;
78c6828e0cSCaitlyn Cano   ConversionTarget target(context);
79c6828e0cSCaitlyn Cano 
80c6828e0cSCaitlyn Cano   int index = 0;
81c6828e0cSCaitlyn Cano   int callbackCalled1 = 0;
82c6828e0cSCaitlyn Cano   target.markUnknownOpDynamicallyLegal([&](Operation *) {
83c6828e0cSCaitlyn Cano     callbackCalled1 = ++index;
84c6828e0cSCaitlyn Cano     return true;
85c6828e0cSCaitlyn Cano   });
86c6828e0cSCaitlyn Cano 
87c6828e0cSCaitlyn Cano   int callbackCalled2 = 0;
880de16fafSRamkumar Ramachandra   target.markUnknownOpDynamicallyLegal([&](Operation *) -> std::optional<bool> {
89c6828e0cSCaitlyn Cano     callbackCalled2 = ++index;
903a77eb66SKazu Hirata     return std::nullopt;
91c6828e0cSCaitlyn Cano   });
92c6828e0cSCaitlyn Cano 
93c6828e0cSCaitlyn Cano   auto *op = createOp(&context);
94c6828e0cSCaitlyn Cano   EXPECT_TRUE(target.isLegal(op));
95c6828e0cSCaitlyn Cano   EXPECT_EQ(2, callbackCalled1);
96c6828e0cSCaitlyn Cano   EXPECT_EQ(1, callbackCalled2);
972a3878eaSButygin   EXPECT_FALSE(target.isIllegal(op));
982a3878eaSButygin   EXPECT_EQ(4, callbackCalled1);
992a3878eaSButygin   EXPECT_EQ(3, callbackCalled2);
1002a3878eaSButygin   op->destroy();
1012a3878eaSButygin }
1022a3878eaSButygin 
TEST(DialectConversionTest,DynamicallyLegalReturnNone)1032a3878eaSButygin TEST(DialectConversionTest, DynamicallyLegalReturnNone) {
1042a3878eaSButygin   MLIRContext context;
1052a3878eaSButygin   ConversionTarget target(context);
1062a3878eaSButygin 
1072a3878eaSButygin   target.addDynamicallyLegalOp<DummyOp>(
1080de16fafSRamkumar Ramachandra       [&](Operation *) -> std::optional<bool> { return std::nullopt; });
1092a3878eaSButygin 
1102a3878eaSButygin   auto *op = createOp(&context);
1112a3878eaSButygin   EXPECT_FALSE(target.isLegal(op));
1122a3878eaSButygin   EXPECT_FALSE(target.isIllegal(op));
1132a3878eaSButygin 
1142a3878eaSButygin   EXPECT_TRUE(succeeded(applyPartialConversion(op, target, {})));
1152a3878eaSButygin   EXPECT_TRUE(failed(applyFullConversion(op, target, {})));
1162a3878eaSButygin 
1172a3878eaSButygin   op->destroy();
1182a3878eaSButygin }
1192a3878eaSButygin 
TEST(DialectConversionTest,DynamicallyLegalUnknownReturnNone)1202a3878eaSButygin TEST(DialectConversionTest, DynamicallyLegalUnknownReturnNone) {
1212a3878eaSButygin   MLIRContext context;
1222a3878eaSButygin   ConversionTarget target(context);
1232a3878eaSButygin 
1242a3878eaSButygin   target.markUnknownOpDynamicallyLegal(
1250de16fafSRamkumar Ramachandra       [&](Operation *) -> std::optional<bool> { return std::nullopt; });
1262a3878eaSButygin 
1272a3878eaSButygin   auto *op = createOp(&context);
1282a3878eaSButygin   EXPECT_FALSE(target.isLegal(op));
1292a3878eaSButygin   EXPECT_FALSE(target.isIllegal(op));
1302a3878eaSButygin 
1312a3878eaSButygin   EXPECT_TRUE(succeeded(applyPartialConversion(op, target, {})));
1322a3878eaSButygin   EXPECT_TRUE(failed(applyFullConversion(op, target, {})));
1332a3878eaSButygin 
134c6828e0cSCaitlyn Cano   op->destroy();
135c6828e0cSCaitlyn Cano }
136c6828e0cSCaitlyn Cano } // namespace
137