1*01a0d212SRazvan Lupusoru //===- TestOpenACCInterfaces.cpp ------------------------------------------===// 2*01a0d212SRazvan Lupusoru // 3*01a0d212SRazvan Lupusoru // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*01a0d212SRazvan Lupusoru // See https://llvm.org/LICENSE.txt for license information. 5*01a0d212SRazvan Lupusoru // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*01a0d212SRazvan Lupusoru // 7*01a0d212SRazvan Lupusoru //===----------------------------------------------------------------------===// 8*01a0d212SRazvan Lupusoru 9*01a0d212SRazvan Lupusoru #include "mlir/Dialect/OpenACC/OpenACC.h" 10*01a0d212SRazvan Lupusoru #include "mlir/IR/Builders.h" 11*01a0d212SRazvan Lupusoru #include "mlir/IR/BuiltinOps.h" 12*01a0d212SRazvan Lupusoru #include "mlir/Pass/Pass.h" 13*01a0d212SRazvan Lupusoru #include "mlir/Support/LLVM.h" 14*01a0d212SRazvan Lupusoru #include "flang/Optimizer/Support/DataLayout.h" 15*01a0d212SRazvan Lupusoru 16*01a0d212SRazvan Lupusoru using namespace mlir; 17*01a0d212SRazvan Lupusoru 18*01a0d212SRazvan Lupusoru namespace { 19*01a0d212SRazvan Lupusoru 20*01a0d212SRazvan Lupusoru struct TestFIROpenACCInterfaces 21*01a0d212SRazvan Lupusoru : public PassWrapper<TestFIROpenACCInterfaces, OperationPass<ModuleOp>> { 22*01a0d212SRazvan Lupusoru MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestFIROpenACCInterfaces) 23*01a0d212SRazvan Lupusoru 24*01a0d212SRazvan Lupusoru StringRef getArgument() const final { return "test-fir-openacc-interfaces"; } 25*01a0d212SRazvan Lupusoru StringRef getDescription() const final { 26*01a0d212SRazvan Lupusoru return "Test FIR implementation of the OpenACC interfaces."; 27*01a0d212SRazvan Lupusoru } 28*01a0d212SRazvan Lupusoru void runOnOperation() override { 29*01a0d212SRazvan Lupusoru mlir::ModuleOp mod = getOperation(); 30*01a0d212SRazvan Lupusoru auto datalayout = 31*01a0d212SRazvan Lupusoru fir::support::getOrSetDataLayout(mod, /*allowDefaultLayout=*/true); 32*01a0d212SRazvan Lupusoru mlir::OpBuilder builder(mod); 33*01a0d212SRazvan Lupusoru getOperation().walk([&](Operation *op) { 34*01a0d212SRazvan Lupusoru if (isa<ACC_DATA_ENTRY_OPS>(op)) { 35*01a0d212SRazvan Lupusoru Type typeOfVar = acc::getVar(op).getType(); 36*01a0d212SRazvan Lupusoru llvm::errs() << "Visiting: " << *op << "\n"; 37*01a0d212SRazvan Lupusoru auto mappableTy = dyn_cast_if_present<acc::MappableType>(typeOfVar); 38*01a0d212SRazvan Lupusoru if (!mappableTy) { 39*01a0d212SRazvan Lupusoru mappableTy = 40*01a0d212SRazvan Lupusoru dyn_cast_if_present<acc::MappableType>(acc::getVarType(op)); 41*01a0d212SRazvan Lupusoru } 42*01a0d212SRazvan Lupusoru if (mappableTy) { 43*01a0d212SRazvan Lupusoru llvm::errs() << "\tMappable: " << mappableTy << "\n"; 44*01a0d212SRazvan Lupusoru if (datalayout.has_value()) { 45*01a0d212SRazvan Lupusoru auto size = mappableTy.getSizeInBytes( 46*01a0d212SRazvan Lupusoru acc::getVar(op), acc::getBounds(op), datalayout.value()); 47*01a0d212SRazvan Lupusoru if (size) { 48*01a0d212SRazvan Lupusoru llvm::errs() << "\t\tSize: " << size.value() << "\n"; 49*01a0d212SRazvan Lupusoru } 50*01a0d212SRazvan Lupusoru auto offset = mappableTy.getOffsetInBytes( 51*01a0d212SRazvan Lupusoru acc::getVar(op), acc::getBounds(op), datalayout.value()); 52*01a0d212SRazvan Lupusoru if (offset) { 53*01a0d212SRazvan Lupusoru llvm::errs() << "\t\tOffset: " << offset.value() << "\n"; 54*01a0d212SRazvan Lupusoru } 55*01a0d212SRazvan Lupusoru } 56*01a0d212SRazvan Lupusoru 57*01a0d212SRazvan Lupusoru builder.setInsertionPoint(op); 58*01a0d212SRazvan Lupusoru auto bounds = mappableTy.generateAccBounds(acc::getVar(op), builder); 59*01a0d212SRazvan Lupusoru if (!bounds.empty()) { 60*01a0d212SRazvan Lupusoru for (auto [idx, bound] : llvm::enumerate(bounds)) { 61*01a0d212SRazvan Lupusoru llvm::errs() << "\t\tBound[" << idx << "]: " << bound << "\n"; 62*01a0d212SRazvan Lupusoru } 63*01a0d212SRazvan Lupusoru } 64*01a0d212SRazvan Lupusoru } else { 65*01a0d212SRazvan Lupusoru assert(acc::isPointerLikeType(typeOfVar) && 66*01a0d212SRazvan Lupusoru "expected to be pointer-like"); 67*01a0d212SRazvan Lupusoru llvm::errs() << "\tPointer-like: " << typeOfVar << "\n"; 68*01a0d212SRazvan Lupusoru } 69*01a0d212SRazvan Lupusoru } 70*01a0d212SRazvan Lupusoru }); 71*01a0d212SRazvan Lupusoru } 72*01a0d212SRazvan Lupusoru }; 73*01a0d212SRazvan Lupusoru } // namespace 74*01a0d212SRazvan Lupusoru 75*01a0d212SRazvan Lupusoru //===----------------------------------------------------------------------===// 76*01a0d212SRazvan Lupusoru // Pass Registration 77*01a0d212SRazvan Lupusoru //===----------------------------------------------------------------------===// 78*01a0d212SRazvan Lupusoru 79*01a0d212SRazvan Lupusoru namespace fir { 80*01a0d212SRazvan Lupusoru namespace test { 81*01a0d212SRazvan Lupusoru void registerTestFIROpenACCInterfacesPass() { 82*01a0d212SRazvan Lupusoru PassRegistration<TestFIROpenACCInterfaces>(); 83*01a0d212SRazvan Lupusoru } 84*01a0d212SRazvan Lupusoru } // namespace test 85*01a0d212SRazvan Lupusoru } // namespace fir 86