diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp index fbe79d0e45e5a0..d54715d3fa3f56 100644 --- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp +++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp @@ -248,6 +248,11 @@ mlir::Value fir::FirOpBuilder::allocateLocal( /// Get the block for adding Allocas. mlir::Block *fir::FirOpBuilder::getAllocaBlock() { + if (auto accComputeRegionIface = + getRegion().getParentOfType()) { + return accComputeRegionIface.getAllocaBlock(); + } + if (auto ompOutlineableIface = getRegion() .getParentOfType()) { diff --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90 index fa910e79bd7663..0d2594c86a6eba 100644 --- a/flang/test/Lower/OpenACC/acc-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-loop.f90 @@ -317,10 +317,10 @@ subroutine sub1(i, j, k) end subroutine ! CHECK: func.func @_QPsub1 +! CHECK: acc.parallel ! CHECK: %[[DC_K:.*]] = fir.alloca i32 {bindc_name = "k"} ! CHECK: %[[DC_J:.*]] = fir.alloca i32 {bindc_name = "j"} ! CHECK: %[[DC_I:.*]] = fir.alloca i32 {bindc_name = "i"} -! CHECK: acc.parallel ! CHECK: %[[P_I:.*]] = acc.private varPtr(%[[DC_I]] : !fir.ref) -> !fir.ref {implicit = true, name = ""} ! CHECK: %[[P_J:.*]] = acc.private varPtr(%[[DC_J]] : !fir.ref) -> !fir.ref {implicit = true, name = ""} ! CHECK: %[[P_K:.*]] = acc.private varPtr(%[[DC_K]] : !fir.ref) -> !fir.ref {implicit = true, name = ""} diff --git a/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt b/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt index 2aa4b1828e0ad7..66b1e89a9881dc 100644 --- a/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt +++ b/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt @@ -21,9 +21,10 @@ mlir_tablegen(OpenACCOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=a add_public_tablegen_target(MLIROpenACCAttributesIncGen) add_dependencies(mlir-headers MLIROpenACCAttributesIncGen) +add_mlir_interface(OpenACCOpsInterfaces) + set(LLVM_TARGET_DEFINITIONS OpenACCTypeInterfaces.td) mlir_tablegen(OpenACCTypeInterfaces.h.inc -gen-type-interface-decls) mlir_tablegen(OpenACCTypeInterfaces.cpp.inc -gen-type-interface-defs) add_public_tablegen_target(MLIROpenACCTypeInterfacesIncGen) add_dependencies(mlir-headers MLIROpenACCTypeInterfacesIncGen) - diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACC.h b/mlir/include/mlir/Dialect/OpenACC/OpenACC.h index 8239367fdd3e78..ca96ce62ae404e 100644 --- a/mlir/include/mlir/Dialect/OpenACC/OpenACC.h +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACC.h @@ -22,6 +22,7 @@ #include "mlir/Bytecode/BytecodeOpInterface.h" #include "mlir/Dialect/OpenACC/OpenACCOpsDialect.h.inc" #include "mlir/Dialect/OpenACC/OpenACCOpsEnums.h.inc" +#include "mlir/Dialect/OpenACC/OpenACCOpsInterfaces.h.inc" #include "mlir/Dialect/OpenACC/OpenACCTypeInterfaces.h.inc" #include "mlir/Dialect/OpenACCMPCommon/Interfaces/AtomicInterfaces.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td index 148bed62aa8f2b..d9f38259c0ace0 100644 --- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td @@ -22,6 +22,7 @@ include "mlir/IR/OpBase.td" include "mlir/IR/SymbolInterfaces.td" include "mlir/Dialect/OpenACC/OpenACCBase.td" include "mlir/Dialect/OpenACC/OpenACCOpsTypes.td" +include "mlir/Dialect/OpenACC/OpenACCOpsInterfaces.td" include "mlir/Dialect/OpenACC/OpenACCTypeInterfaces.td" include "mlir/Dialect/OpenACCMPCommon/Interfaces/AtomicInterfaces.td" include "mlir/Dialect/OpenACCMPCommon/Interfaces/OpenACCMPOpsInterfaces.td" @@ -1067,7 +1068,9 @@ def OpenACC_ReductionRecipeOp : OpenACC_Op<"reduction.recipe", //===----------------------------------------------------------------------===// def OpenACC_ParallelOp : OpenACC_Op<"parallel", - [AttrSizedOperandSegments, RecursiveMemoryEffects, + [AttrSizedOperandSegments, AutomaticAllocationScope, + RecursiveMemoryEffects, + DeclareOpInterfaceMethods, MemoryEffects<[MemWrite, MemRead]>]> { let summary = "parallel construct"; @@ -1231,7 +1234,9 @@ def OpenACC_ParallelOp : OpenACC_Op<"parallel", //===----------------------------------------------------------------------===// def OpenACC_SerialOp : OpenACC_Op<"serial", - [AttrSizedOperandSegments, RecursiveMemoryEffects, + [AttrSizedOperandSegments, AutomaticAllocationScope, + RecursiveMemoryEffects, + DeclareOpInterfaceMethods, MemoryEffects<[MemWrite, MemRead]>]> { let summary = "serial construct"; @@ -1347,7 +1352,9 @@ def OpenACC_SerialOp : OpenACC_Op<"serial", //===----------------------------------------------------------------------===// def OpenACC_KernelsOp : OpenACC_Op<"kernels", - [AttrSizedOperandSegments, RecursiveMemoryEffects, + [AttrSizedOperandSegments, AutomaticAllocationScope, + RecursiveMemoryEffects, + DeclareOpInterfaceMethods, MemoryEffects<[MemWrite, MemRead]>]> { let summary = "kernels construct"; @@ -1737,9 +1744,11 @@ def OpenACC_HostDataOp : OpenACC_Op<"host_data", //===----------------------------------------------------------------------===// def OpenACC_LoopOp : OpenACC_Op<"loop", - [AttrSizedOperandSegments, RecursiveMemoryEffects, - MemoryEffects<[MemWrite]>, - DeclareOpInterfaceMethods]> { + [AttrSizedOperandSegments, AutomaticAllocationScope, + RecursiveMemoryEffects, + DeclareOpInterfaceMethods, + DeclareOpInterfaceMethods, + MemoryEffects<[MemWrite]>]> { let summary = "loop construct"; let description = [{ diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOpsInterfaces.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOpsInterfaces.td new file mode 100644 index 00000000000000..6fb9a950489f8e --- /dev/null +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOpsInterfaces.td @@ -0,0 +1,29 @@ +//===-- OpenACCOpsInterfaces.td - OpenACC type interfaces ---*- tablegen -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef OPENACC_OPS_INTERFACES +#define OPENACC_OPS_INTERFACES + +include "mlir/IR/OpBase.td" + +def ComputeRegionOpInterface : OpInterface<"ComputeRegionOpInterface"> { + let cppNamespace = "::mlir::acc"; + + let description = [{ + An interface for compute and loop construct operations. + }]; + + let methods = [ + InterfaceMethod<"Get alloca block", "::mlir::Block*", "getAllocaBlock", + (ins), [{ + return &$_op.getRegion().front(); + }]>, + ]; +} + +#endif // OPENACC_OPS_INTERFACES diff --git a/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt b/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt index 387a6903b9d8b9..ed7425bd525259 100644 --- a/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt +++ b/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt @@ -9,6 +9,7 @@ add_mlir_dialect_library(MLIROpenACCDialect MLIROpenACCEnumsIncGen MLIROpenACCAttributesIncGen MLIROpenACCMPOpsInterfacesIncGen + MLIROpenACCOpsInterfacesIncGen MLIROpenACCTypeInterfacesIncGen LINK_LIBS PUBLIC diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp index c3c6dffd5ae49a..b4da50443c6cc9 100644 --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -24,6 +24,7 @@ using namespace acc; #include "mlir/Dialect/OpenACC/OpenACCOpsDialect.cpp.inc" #include "mlir/Dialect/OpenACC/OpenACCOpsEnums.cpp.inc" +#include "mlir/Dialect/OpenACC/OpenACCOpsInterfaces.cpp.inc" #include "mlir/Dialect/OpenACC/OpenACCTypeInterfaces.cpp.inc" #include "mlir/Dialect/OpenACCMPCommon/Interfaces/OpenACCMPOpsInterfaces.cpp.inc" diff --git a/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt b/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt index 2a29bd1c9cfa92..41ba7f8f53d367 100644 --- a/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt +++ b/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt @@ -10,6 +10,7 @@ add_mlir_dialect_library(MLIROpenACCTransforms MLIROpenACCEnumsIncGen MLIROpenACCAttributesIncGen MLIROpenACCMPOpsInterfacesIncGen + MLIROpenACCOpsInterfacesIncGen MLIROpenACCTypeInterfacesIncGen LINK_LIBS PUBLIC