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