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 Gysivoid registerTestBuiltinDistinctAttributes() { 46*728a8d5aSTobias Gysi PassRegistration<DistinctAttributesPass>(); 47*728a8d5aSTobias Gysi } 48*728a8d5aSTobias Gysi } // namespace test 49*728a8d5aSTobias Gysi } // namespace mlir 50