1*3fef2d26SRiver Riddle //===- TestDataLayoutQuery.cpp - Test Data Layout Queries -----------------===// 2*3fef2d26SRiver Riddle // 3*3fef2d26SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*3fef2d26SRiver Riddle // See https://llvm.org/LICENSE.txt for license information. 5*3fef2d26SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*3fef2d26SRiver Riddle // 7*3fef2d26SRiver Riddle //===----------------------------------------------------------------------===// 8*3fef2d26SRiver Riddle 9*3fef2d26SRiver Riddle #include "TestDialect.h" 10*3fef2d26SRiver Riddle #include "mlir/Dialect/DLTI/DLTI.h" 11*3fef2d26SRiver Riddle #include "mlir/IR/BuiltinAttributes.h" 12*3fef2d26SRiver Riddle #include "mlir/Pass/Pass.h" 13*3fef2d26SRiver Riddle 14*3fef2d26SRiver Riddle using namespace mlir; 15*3fef2d26SRiver Riddle 16*3fef2d26SRiver Riddle namespace { 17*3fef2d26SRiver Riddle 18*3fef2d26SRiver Riddle /// A pass that finds "test.data_layout_query" operations and attaches to them 19*3fef2d26SRiver Riddle /// attributes containing the results of data layout queries for operation 20*3fef2d26SRiver Riddle /// result types. 21*3fef2d26SRiver Riddle struct TestDataLayoutQuery 22*3fef2d26SRiver Riddle : public PassWrapper<TestDataLayoutQuery, FunctionPass> { 23*3fef2d26SRiver Riddle void runOnFunction() override { 24*3fef2d26SRiver Riddle FuncOp func = getFunction(); 25*3fef2d26SRiver Riddle Builder builder(func.getContext()); 26*3fef2d26SRiver Riddle DenseMap<Operation *, DataLayout> layouts; 27*3fef2d26SRiver Riddle 28*3fef2d26SRiver Riddle func.walk([&](test::DataLayoutQueryOp op) { 29*3fef2d26SRiver Riddle // Skip the ops with already processed in a deeper call. 30*3fef2d26SRiver Riddle if (op->getAttr("size")) 31*3fef2d26SRiver Riddle return; 32*3fef2d26SRiver Riddle 33*3fef2d26SRiver Riddle auto scope = op->getParentOfType<test::OpWithDataLayoutOp>(); 34*3fef2d26SRiver Riddle if (!layouts.count(scope)) { 35*3fef2d26SRiver Riddle layouts.try_emplace( 36*3fef2d26SRiver Riddle scope, scope ? cast<DataLayoutOpInterface>(scope.getOperation()) 37*3fef2d26SRiver Riddle : nullptr); 38*3fef2d26SRiver Riddle } 39*3fef2d26SRiver Riddle auto module = op->getParentOfType<ModuleOp>(); 40*3fef2d26SRiver Riddle if (!layouts.count(module)) 41*3fef2d26SRiver Riddle layouts.try_emplace(module, module); 42*3fef2d26SRiver Riddle 43*3fef2d26SRiver Riddle Operation *closest = (scope && module && module->isProperAncestor(scope)) 44*3fef2d26SRiver Riddle ? scope.getOperation() 45*3fef2d26SRiver Riddle : module.getOperation(); 46*3fef2d26SRiver Riddle 47*3fef2d26SRiver Riddle const DataLayout &layout = layouts.find(closest)->getSecond(); 48*3fef2d26SRiver Riddle unsigned size = layout.getTypeSize(op.getType()); 49*3fef2d26SRiver Riddle unsigned bitsize = layout.getTypeSizeInBits(op.getType()); 50*3fef2d26SRiver Riddle unsigned alignment = layout.getTypeABIAlignment(op.getType()); 51*3fef2d26SRiver Riddle unsigned preferred = layout.getTypePreferredAlignment(op.getType()); 52*3fef2d26SRiver Riddle op->setAttrs( 53*3fef2d26SRiver Riddle {builder.getNamedAttr("size", builder.getIndexAttr(size)), 54*3fef2d26SRiver Riddle builder.getNamedAttr("bitsize", builder.getIndexAttr(bitsize)), 55*3fef2d26SRiver Riddle builder.getNamedAttr("alignment", builder.getIndexAttr(alignment)), 56*3fef2d26SRiver Riddle builder.getNamedAttr("preferred", builder.getIndexAttr(preferred))}); 57*3fef2d26SRiver Riddle }); 58*3fef2d26SRiver Riddle } 59*3fef2d26SRiver Riddle }; 60*3fef2d26SRiver Riddle } // namespace 61*3fef2d26SRiver Riddle 62*3fef2d26SRiver Riddle namespace mlir { 63*3fef2d26SRiver Riddle namespace test { 64*3fef2d26SRiver Riddle void registerTestDataLayoutQuery() { 65*3fef2d26SRiver Riddle PassRegistration<TestDataLayoutQuery>("test-data-layout-query", 66*3fef2d26SRiver Riddle "Test data layout queries"); 67*3fef2d26SRiver Riddle } 68*3fef2d26SRiver Riddle } // namespace test 69*3fef2d26SRiver Riddle } // namespace mlir 70