xref: /llvm-project/mlir/unittests/IR/InterfaceTest.cpp (revision e95e94adc6bb748de015ac3053e7f0786b65f351)
173440ca9SMarkus Böck //===- InterfaceTest.cpp - Test interfaces --------------------------------===//
273440ca9SMarkus Böck //
373440ca9SMarkus Böck // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473440ca9SMarkus Böck // See https://llvm.org/LICENSE.txt for license information.
573440ca9SMarkus Böck // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673440ca9SMarkus Böck //
773440ca9SMarkus Böck //===----------------------------------------------------------------------===//
873440ca9SMarkus Böck 
973440ca9SMarkus Böck #include "mlir/IR/BuiltinAttributes.h"
1073440ca9SMarkus Böck #include "mlir/IR/BuiltinDialect.h"
1173440ca9SMarkus Böck #include "mlir/IR/BuiltinOps.h"
1273440ca9SMarkus Böck #include "mlir/IR/BuiltinTypes.h"
1373440ca9SMarkus Böck #include "mlir/IR/OwningOpRef.h"
1473440ca9SMarkus Böck #include "gtest/gtest.h"
1573440ca9SMarkus Böck 
1673440ca9SMarkus Böck #include "../../test/lib/Dialect/Test/TestAttributes.h"
1773440ca9SMarkus Böck #include "../../test/lib/Dialect/Test/TestDialect.h"
18*e95e94adSJeff Niu #include "../../test/lib/Dialect/Test/TestOps.h"
1973440ca9SMarkus Böck #include "../../test/lib/Dialect/Test/TestTypes.h"
2073440ca9SMarkus Böck 
2173440ca9SMarkus Böck using namespace mlir;
2273440ca9SMarkus Böck using namespace test;
2373440ca9SMarkus Böck 
TEST(InterfaceTest,OpInterfaceDenseMapKey)2473440ca9SMarkus Böck TEST(InterfaceTest, OpInterfaceDenseMapKey) {
2573440ca9SMarkus Böck   MLIRContext context;
2673440ca9SMarkus Böck   context.loadDialect<test::TestDialect>();
2773440ca9SMarkus Böck 
2873440ca9SMarkus Böck   OwningOpRef<ModuleOp> module = ModuleOp::create(UnknownLoc::get(&context));
2973440ca9SMarkus Böck   OpBuilder builder(module->getBody(), module->getBody()->begin());
3073440ca9SMarkus Böck   auto op1 = builder.create<test::SideEffectOp>(builder.getUnknownLoc(),
3173440ca9SMarkus Böck                                                 builder.getI32Type());
3273440ca9SMarkus Böck   auto op2 = builder.create<test::SideEffectOp>(builder.getUnknownLoc(),
3373440ca9SMarkus Böck                                                 builder.getI32Type());
3473440ca9SMarkus Böck   auto op3 = builder.create<test::SideEffectOp>(builder.getUnknownLoc(),
3573440ca9SMarkus Böck                                                 builder.getI32Type());
3673440ca9SMarkus Böck   DenseSet<MemoryEffectOpInterface> opSet;
3773440ca9SMarkus Böck   opSet.insert(op1);
3873440ca9SMarkus Böck   opSet.insert(op2);
3973440ca9SMarkus Böck   opSet.erase(op1);
4073440ca9SMarkus Böck   EXPECT_FALSE(opSet.contains(op1));
4173440ca9SMarkus Böck   EXPECT_TRUE(opSet.contains(op2));
4273440ca9SMarkus Böck   EXPECT_FALSE(opSet.contains(op3));
4373440ca9SMarkus Böck }
4473440ca9SMarkus Böck 
TEST(InterfaceTest,TypeInterfaceDenseMapKey)4573440ca9SMarkus Böck TEST(InterfaceTest, TypeInterfaceDenseMapKey) {
4673440ca9SMarkus Böck   MLIRContext context;
4773440ca9SMarkus Böck   context.loadDialect<test::TestDialect>();
4873440ca9SMarkus Böck 
4973440ca9SMarkus Böck   OpBuilder builder(&context);
5073440ca9SMarkus Böck   DenseSet<DataLayoutTypeInterface> typeSet;
5173440ca9SMarkus Böck   auto type1 = builder.getType<test::TestTypeWithLayoutType>(1);
5273440ca9SMarkus Böck   auto type2 = builder.getType<test::TestTypeWithLayoutType>(2);
5373440ca9SMarkus Böck   auto type3 = builder.getType<test::TestTypeWithLayoutType>(3);
5473440ca9SMarkus Böck   typeSet.insert(type1);
5573440ca9SMarkus Böck   typeSet.insert(type2);
5673440ca9SMarkus Böck   typeSet.erase(type1);
5773440ca9SMarkus Böck   EXPECT_FALSE(typeSet.contains(type1));
5873440ca9SMarkus Böck   EXPECT_TRUE(typeSet.contains(type2));
5973440ca9SMarkus Böck   EXPECT_FALSE(typeSet.contains(type3));
6073440ca9SMarkus Böck }
61edae8f6cSMarkus Böck 
TEST(InterfaceTest,TestCustomClassOf)62edae8f6cSMarkus Böck TEST(InterfaceTest, TestCustomClassOf) {
63edae8f6cSMarkus Böck   MLIRContext context;
64edae8f6cSMarkus Böck   context.loadDialect<test::TestDialect>();
65edae8f6cSMarkus Böck 
66edae8f6cSMarkus Böck   OpBuilder builder(&context);
67edae8f6cSMarkus Böck   auto op = builder.create<TestOpOptionallyImplementingInterface>(
68edae8f6cSMarkus Böck       builder.getUnknownLoc(), /*implementsInterface=*/true);
69edae8f6cSMarkus Böck   EXPECT_TRUE(isa<TestOptionallyImplementedOpInterface>(*op));
70edae8f6cSMarkus Böck   op.setImplementsInterface(false);
71edae8f6cSMarkus Böck   EXPECT_FALSE(isa<TestOptionallyImplementedOpInterface>(*op));
7242db67c3SChristian Sigg   op.erase();
73edae8f6cSMarkus Böck }
74cedeb31eSMarkus Böck 
TEST(InterfaceTest,TestImplicitConversion)75cedeb31eSMarkus Böck TEST(InterfaceTest, TestImplicitConversion) {
76cedeb31eSMarkus Böck   MLIRContext context;
77cedeb31eSMarkus Böck   context.loadDialect<test::TestDialect>();
78cedeb31eSMarkus Böck 
79cedeb31eSMarkus Böck   TestBaseTypeInterfacePrintTypeB typeB;
80cedeb31eSMarkus Böck   TestBaseTypeInterfacePrintTypeA typeA = typeB;
81cedeb31eSMarkus Böck   EXPECT_EQ(typeA, nullptr);
82cedeb31eSMarkus Böck 
83cedeb31eSMarkus Böck   typeB = TestType::get(&context);
84cedeb31eSMarkus Böck   typeA = typeB;
85cedeb31eSMarkus Böck   EXPECT_EQ(typeA, typeB);
86cedeb31eSMarkus Böck }
87