xref: /llvm-project/flang/test/lib/OpenACC/TestOpenACCInterfaces.cpp (revision 01a0d212a64919205734706d929db37e503c35ce)
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