xref: /llvm-project/mlir/test/lib/IR/TestBuiltinDistinctAttributes.cpp (revision 728a8d5a81f35f24492fcd31928ef95e597a66af)
1*728a8d5aSTobias Gysi //===- TestBuiltinDistinctAttributes.cpp - Test DistinctAttributes --------===//
2*728a8d5aSTobias Gysi //
3*728a8d5aSTobias Gysi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*728a8d5aSTobias Gysi // See https://llvm.org/LICENSE.txt for license information.
5*728a8d5aSTobias Gysi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*728a8d5aSTobias Gysi //
7*728a8d5aSTobias Gysi //===----------------------------------------------------------------------===//
8*728a8d5aSTobias Gysi 
9*728a8d5aSTobias Gysi #include "TestDialect.h"
10*728a8d5aSTobias Gysi #include "mlir/IR/BuiltinAttributes.h"
11*728a8d5aSTobias Gysi #include "mlir/Pass/Pass.h"
12*728a8d5aSTobias Gysi 
13*728a8d5aSTobias Gysi using namespace mlir;
14*728a8d5aSTobias Gysi 
15*728a8d5aSTobias Gysi namespace {
16*728a8d5aSTobias Gysi /// This is a distinct attribute test pass that tests if distinct attributes can
17*728a8d5aSTobias Gysi /// be created in parallel in a deterministic way.
18*728a8d5aSTobias Gysi struct DistinctAttributesPass
19*728a8d5aSTobias Gysi     : public PassWrapper<DistinctAttributesPass, OperationPass<func::FuncOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon2fd4c7550111::DistinctAttributesPass20*728a8d5aSTobias Gysi   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(DistinctAttributesPass)
21*728a8d5aSTobias Gysi 
22*728a8d5aSTobias Gysi   StringRef getArgument() const final { return "test-distinct-attrs"; }
getDescription__anon2fd4c7550111::DistinctAttributesPass23*728a8d5aSTobias Gysi   StringRef getDescription() const final {
24*728a8d5aSTobias Gysi     return "Test parallel creation of distinct attributes";
25*728a8d5aSTobias Gysi   }
26*728a8d5aSTobias Gysi 
runOnOperation__anon2fd4c7550111::DistinctAttributesPass27*728a8d5aSTobias Gysi   void runOnOperation() override {
28*728a8d5aSTobias Gysi     auto funcOp = getOperation();
29*728a8d5aSTobias Gysi 
30*728a8d5aSTobias Gysi     /// Walk all operations and create a distinct output attribute given a
31*728a8d5aSTobias Gysi     /// distinct input attribute.
32*728a8d5aSTobias Gysi     funcOp->walk([](Operation *op) {
33*728a8d5aSTobias Gysi       auto distinctAttr = op->getAttrOfType<DistinctAttr>("distinct.input");
34*728a8d5aSTobias Gysi       if (!distinctAttr)
35*728a8d5aSTobias Gysi         return;
36*728a8d5aSTobias Gysi       op->setAttr("distinct.output",
37*728a8d5aSTobias Gysi                   DistinctAttr::create(distinctAttr.getReferencedAttr()));
38*728a8d5aSTobias Gysi     });
39*728a8d5aSTobias Gysi   }
40*728a8d5aSTobias Gysi };
41*728a8d5aSTobias Gysi } // namespace
42*728a8d5aSTobias Gysi 
43*728a8d5aSTobias Gysi namespace mlir {
44*728a8d5aSTobias Gysi namespace test {
registerTestBuiltinDistinctAttributes()45*728a8d5aSTobias Gysi void registerTestBuiltinDistinctAttributes() {
46*728a8d5aSTobias Gysi   PassRegistration<DistinctAttributesPass>();
47*728a8d5aSTobias Gysi }
48*728a8d5aSTobias Gysi } // namespace test
49*728a8d5aSTobias Gysi } // namespace mlir
50