xref: /llvm-project/mlir/test/lib/IR/TestBuiltinAttributeInterfaces.cpp (revision a5757c5b65f1894de16f549212b1c37793312703)
1d80d3a35SRiver Riddle //===- TestBuiltinAttributeInterfaces.cpp ---------------------------------===//
2d80d3a35SRiver Riddle //
3d80d3a35SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d80d3a35SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5d80d3a35SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d80d3a35SRiver Riddle //
7d80d3a35SRiver Riddle //===----------------------------------------------------------------------===//
8d80d3a35SRiver Riddle 
9d80d3a35SRiver Riddle #include "TestAttributes.h"
1036d3efeaSRiver Riddle #include "mlir/IR/BuiltinOps.h"
11d80d3a35SRiver Riddle #include "mlir/Pass/Pass.h"
12444683a9SJeff Niu #include "llvm/ADT/TypeSwitch.h"
13d80d3a35SRiver Riddle #include "llvm/Support/FormatVariadic.h"
14d80d3a35SRiver Riddle 
15d80d3a35SRiver Riddle using namespace mlir;
16d80d3a35SRiver Riddle using namespace test;
17d80d3a35SRiver Riddle 
187faf75bbSMehdi Amini // Helper to print one scalar value, force int8_t to print as integer instead of
197faf75bbSMehdi Amini // char.
207faf75bbSMehdi Amini template <typename T>
printOneElement(InFlightDiagnostic & os,T value)217faf75bbSMehdi Amini static void printOneElement(InFlightDiagnostic &os, T value) {
227faf75bbSMehdi Amini   os << llvm::formatv("{0}", value).str();
237faf75bbSMehdi Amini }
247faf75bbSMehdi Amini 
25d80d3a35SRiver Riddle namespace {
26d80d3a35SRiver Riddle struct TestElementsAttrInterface
27d80d3a35SRiver Riddle     : public PassWrapper<TestElementsAttrInterface, OperationPass<ModuleOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon4358a8840111::TestElementsAttrInterface285e50dd04SRiver Riddle   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestElementsAttrInterface)
295e50dd04SRiver Riddle 
30d80d3a35SRiver Riddle   StringRef getArgument() const final { return "test-elements-attr-interface"; }
getDescription__anon4358a8840111::TestElementsAttrInterface31d80d3a35SRiver Riddle   StringRef getDescription() const final {
32d80d3a35SRiver Riddle     return "Test ElementsAttr interface support.";
33d80d3a35SRiver Riddle   }
runOnOperation__anon4358a8840111::TestElementsAttrInterface34d80d3a35SRiver Riddle   void runOnOperation() override {
35d80d3a35SRiver Riddle     getOperation().walk([&](Operation *op) {
36d80d3a35SRiver Riddle       for (NamedAttribute attr : op->getAttrs()) {
375550c821STres Popp         auto elementsAttr = dyn_cast<ElementsAttr>(attr.getValue());
38d80d3a35SRiver Riddle         if (!elementsAttr)
39d80d3a35SRiver Riddle           continue;
407faf75bbSMehdi Amini         testElementsAttrIteration<int64_t>(op, elementsAttr, "int64_t");
41d80d3a35SRiver Riddle         testElementsAttrIteration<uint64_t>(op, elementsAttr, "uint64_t");
42d80d3a35SRiver Riddle         testElementsAttrIteration<APInt>(op, elementsAttr, "APInt");
43d80d3a35SRiver Riddle         testElementsAttrIteration<IntegerAttr>(op, elementsAttr, "IntegerAttr");
44d80d3a35SRiver Riddle       }
45d80d3a35SRiver Riddle     });
46d80d3a35SRiver Riddle   }
47d80d3a35SRiver Riddle 
48d80d3a35SRiver Riddle   template <typename T>
testElementsAttrIteration__anon4358a8840111::TestElementsAttrInterface49d80d3a35SRiver Riddle   void testElementsAttrIteration(Operation *op, ElementsAttr attr,
50d80d3a35SRiver Riddle                                  StringRef type) {
51d80d3a35SRiver Riddle     InFlightDiagnostic diag = op->emitError()
52d80d3a35SRiver Riddle                               << "Test iterating `" << type << "`: ";
53d80d3a35SRiver Riddle 
54*a5757c5bSChristian Sigg     if (!isa<mlir::IntegerType>(attr.getElementType())) {
55c836b4adSRik Huijzer       diag << "expected element type to be an integer type";
56c836b4adSRik Huijzer       return;
57c836b4adSRik Huijzer     }
58c836b4adSRik Huijzer 
59d80d3a35SRiver Riddle     auto values = attr.tryGetValues<T>();
60d80d3a35SRiver Riddle     if (!values) {
61d80d3a35SRiver Riddle       diag << "unable to iterate type";
62d80d3a35SRiver Riddle       return;
63d80d3a35SRiver Riddle     }
64d80d3a35SRiver Riddle 
657faf75bbSMehdi Amini     llvm::interleaveComma(*values, diag,
667faf75bbSMehdi Amini                           [&](T value) { printOneElement(diag, value); });
67d80d3a35SRiver Riddle   }
68d80d3a35SRiver Riddle };
69be0a7e9fSMehdi Amini } // namespace
70d80d3a35SRiver Riddle 
71d80d3a35SRiver Riddle namespace mlir {
72d80d3a35SRiver Riddle namespace test {
registerTestBuiltinAttributeInterfaces()73d80d3a35SRiver Riddle void registerTestBuiltinAttributeInterfaces() {
74d80d3a35SRiver Riddle   PassRegistration<TestElementsAttrInterface>();
75d80d3a35SRiver Riddle }
76d80d3a35SRiver Riddle } // namespace test
77d80d3a35SRiver Riddle } // namespace mlir
78