120 lines · cpp
1//===- PassGenTest.cpp - TableGen PassGen Tests ---------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir/Pass/Pass.h"10#include "llvm/ADT/STLExtras.h"11 12#include "gmock/gmock.h"13 14static std::unique_ptr<mlir::Pass>15createTestPassWithCustomConstructor(int v = 0);16 17#define GEN_PASS_DECL18#define GEN_PASS_REGISTRATION19#include "PassGenTest.h.inc"20 21#define GEN_PASS_DEF_TESTPASS22#define GEN_PASS_DEF_TESTPASSWITHOPTIONS23#define GEN_PASS_DEF_TESTPASSWITHCUSTOMCONSTRUCTOR24#include "PassGenTest.h.inc"25 26struct TestPass : public impl::TestPassBase<TestPass> {27 using TestPassBase::TestPassBase;28 29 void runOnOperation() override {}30 31 std::unique_ptr<mlir::Pass> clone() const {32 return TestPassBase<TestPass>::clone();33 }34};35 36TEST(PassGenTest, defaultGeneratedConstructor) {37 std::unique_ptr<mlir::Pass> pass = createTestPass();38 EXPECT_TRUE(pass.get() != nullptr);39}40 41TEST(PassGenTest, PassClone) {42 mlir::MLIRContext context;43 44 const auto unwrap = [](const std::unique_ptr<mlir::Pass> &pass) {45 return static_cast<const TestPass *>(pass.get());46 };47 48 const auto origPass = createTestPass();49 const auto clonePass = unwrap(origPass)->clone();50 51 EXPECT_TRUE(clonePass.get() != nullptr);52 EXPECT_TRUE(origPass.get() != clonePass.get());53}54 55struct TestPassWithOptions56 : public impl::TestPassWithOptionsBase<TestPassWithOptions> {57 using TestPassWithOptionsBase::TestPassWithOptionsBase;58 59 void runOnOperation() override {}60 61 std::unique_ptr<mlir::Pass> clone() const {62 return TestPassWithOptionsBase<TestPassWithOptions>::clone();63 }64 65 int getTestOption() const { return testOption; }66 67 llvm::ArrayRef<int64_t> getTestListOption() const { return testListOption; }68};69 70TEST(PassGenTest, PassOptions) {71 mlir::MLIRContext context;72 73 TestPassWithOptionsOptions options;74 options.testOption = 57;75 76 options.testListOption = {1, 2};77 78 const auto unwrap = [](const std::unique_ptr<mlir::Pass> &pass) {79 return static_cast<const TestPassWithOptions *>(pass.get());80 };81 82 const auto pass = createTestPassWithOptions(options);83 84 EXPECT_EQ(unwrap(pass)->getTestOption(), 57);85 EXPECT_EQ(unwrap(pass)->getTestListOption()[0], 1);86 EXPECT_EQ(unwrap(pass)->getTestListOption()[1], 2);87}88 89struct TestPassWithCustomConstructor90 : public impl::TestPassWithCustomConstructorBase<91 TestPassWithCustomConstructor> {92 explicit TestPassWithCustomConstructor(int v) : extraVal(v) {}93 94 void runOnOperation() override {}95 96 std::unique_ptr<mlir::Pass> clone() const {97 return TestPassWithCustomConstructorBase<98 TestPassWithCustomConstructor>::clone();99 }100 101 unsigned int extraVal = 23;102};103 104std::unique_ptr<mlir::Pass> createTestPassWithCustomConstructor(int v) {105 return std::make_unique<TestPassWithCustomConstructor>(v);106}107 108TEST(PassGenTest, PassCloneWithCustomConstructor) {109 mlir::MLIRContext context;110 111 const auto unwrap = [](const std::unique_ptr<mlir::Pass> &pass) {112 return static_cast<const TestPassWithCustomConstructor *>(pass.get());113 };114 115 const auto origPass = createTestPassWithCustomConstructor(10);116 const auto clonePass = unwrap(origPass)->clone();117 118 EXPECT_EQ(unwrap(origPass)->extraVal, unwrap(clonePass)->extraVal);119}120