52 lines · cpp
1//===- TestOperationEquals.cpp - Passes to test OperationEquivalence ------===//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/IR/BuiltinOps.h"10#include "mlir/Pass/Pass.h"11 12using namespace mlir;13 14namespace {15/// This pass illustrates the IR def-use chains through printing.16struct TestOperationEqualPass17 : public PassWrapper<TestOperationEqualPass, OperationPass<ModuleOp>> {18 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestOperationEqualPass)19 20 StringRef getArgument() const final { return "test-operations-equality"; }21 StringRef getDescription() const final { return "Test operations equality."; }22 void runOnOperation() override {23 ModuleOp module = getOperation();24 // Expects two operations at the top-level:25 int opCount = module.getBody()->getOperations().size();26 if (opCount != 2) {27 module.emitError() << "expected 2 top-level ops in the module, got "28 << opCount;29 return signalPassFailure();30 }31 32 Operation *first = &module.getBody()->front();33 llvm::outs() << first->getName().getStringRef() << " with attr "34 << first->getDiscardableAttrDictionary();35 OperationEquivalence::Flags flags{};36 if (!first->hasAttr("strict_loc_check"))37 flags |= OperationEquivalence::IgnoreLocations;38 if (OperationEquivalence::isEquivalentTo(first, &module.getBody()->back(),39 flags))40 llvm::outs() << " compares equals.\n";41 else42 llvm::outs() << " compares NOT equals!\n";43 }44};45} // namespace46 47namespace mlir {48void registerTestOperationEqualPass() {49 PassRegistration<TestOperationEqualPass>();50}51} // namespace mlir52