13fef2d26SRiver Riddle //===- TestDataLayoutQuery.cpp - Test Data Layout Queries -----------------===// 23fef2d26SRiver Riddle // 33fef2d26SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43fef2d26SRiver Riddle // See https://llvm.org/LICENSE.txt for license information. 53fef2d26SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63fef2d26SRiver Riddle // 73fef2d26SRiver Riddle //===----------------------------------------------------------------------===// 83fef2d26SRiver Riddle 93fef2d26SRiver Riddle #include "TestDialect.h" 10c59ce1f6SAlex Zinenko #include "mlir/Analysis/DataLayoutAnalysis.h" 113fef2d26SRiver Riddle #include "mlir/Dialect/DLTI/DLTI.h" 123fef2d26SRiver Riddle #include "mlir/IR/BuiltinAttributes.h" 133fef2d26SRiver Riddle #include "mlir/Pass/Pass.h" 143fef2d26SRiver Riddle 153fef2d26SRiver Riddle using namespace mlir; 163fef2d26SRiver Riddle 173fef2d26SRiver Riddle namespace { 183fef2d26SRiver Riddle 193fef2d26SRiver Riddle /// A pass that finds "test.data_layout_query" operations and attaches to them 203fef2d26SRiver Riddle /// attributes containing the results of data layout queries for operation 213fef2d26SRiver Riddle /// result types. 223fef2d26SRiver Riddle struct TestDataLayoutQuery 23*58ceae95SRiver Riddle : public PassWrapper<TestDataLayoutQuery, OperationPass<func::FuncOp>> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon89bf08570111::TestDataLayoutQuery245e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestDataLayoutQuery) 255e50dd04SRiver Riddle 26b5e22e6dSMehdi Amini StringRef getArgument() const final { return "test-data-layout-query"; } getDescription__anon89bf08570111::TestDataLayoutQuery27b5e22e6dSMehdi Amini StringRef getDescription() const final { return "Test data layout queries"; } runOnOperation__anon89bf08570111::TestDataLayoutQuery2841574554SRiver Riddle void runOnOperation() override { 29*58ceae95SRiver Riddle func::FuncOp func = getOperation(); 303fef2d26SRiver Riddle Builder builder(func.getContext()); 31c59ce1f6SAlex Zinenko const DataLayoutAnalysis &layouts = getAnalysis<DataLayoutAnalysis>(); 323fef2d26SRiver Riddle 333fef2d26SRiver Riddle func.walk([&](test::DataLayoutQueryOp op) { 343fef2d26SRiver Riddle // Skip the ops with already processed in a deeper call. 353fef2d26SRiver Riddle if (op->getAttr("size")) 363fef2d26SRiver Riddle return; 373fef2d26SRiver Riddle 38c59ce1f6SAlex Zinenko const DataLayout &layout = layouts.getAbove(op); 393fef2d26SRiver Riddle unsigned size = layout.getTypeSize(op.getType()); 403fef2d26SRiver Riddle unsigned bitsize = layout.getTypeSizeInBits(op.getType()); 413fef2d26SRiver Riddle unsigned alignment = layout.getTypeABIAlignment(op.getType()); 423fef2d26SRiver Riddle unsigned preferred = layout.getTypePreferredAlignment(op.getType()); 433fef2d26SRiver Riddle op->setAttrs( 443fef2d26SRiver Riddle {builder.getNamedAttr("size", builder.getIndexAttr(size)), 453fef2d26SRiver Riddle builder.getNamedAttr("bitsize", builder.getIndexAttr(bitsize)), 463fef2d26SRiver Riddle builder.getNamedAttr("alignment", builder.getIndexAttr(alignment)), 473fef2d26SRiver Riddle builder.getNamedAttr("preferred", builder.getIndexAttr(preferred))}); 483fef2d26SRiver Riddle }); 493fef2d26SRiver Riddle } 503fef2d26SRiver Riddle }; 513fef2d26SRiver Riddle } // namespace 523fef2d26SRiver Riddle 533fef2d26SRiver Riddle namespace mlir { 543fef2d26SRiver Riddle namespace test { registerTestDataLayoutQuery()55b5e22e6dSMehdi Aminivoid registerTestDataLayoutQuery() { PassRegistration<TestDataLayoutQuery>(); } 563fef2d26SRiver Riddle } // namespace test 573fef2d26SRiver Riddle } // namespace mlir 58