[Mlir-commits] [llvm] [mlir] [mlir] `HasParallelRegion` means region may be parallel (PR #231372)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Oct 12 22:59:21 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Matthias Springer (matthias-springer)
<details>
<summary>Changes</summary>
Clarify the documentation of `HasParallelRegion`. The presence of the trait means that the op may have parallel semantics. This trait could be turned into an op interface in the future. Also add the trait to some operations where it was missing.
Assisted-by: Codex
---
Full diff: https://github.com/llvm/llvm-project/pull/231372.diff
12 Files Affected:
- (modified) mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h (+1)
- (modified) mlir/include/mlir/Dialect/GPU/IR/GPUOps.td (+2-1)
- (modified) mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td (+1-1)
- (modified) mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td (+3-3)
- (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h (+1)
- (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td (+22-19)
- (modified) mlir/include/mlir/Interfaces/LoopLikeInterface.h (+6-4)
- (modified) mlir/include/mlir/Interfaces/LoopLikeInterface.td (+1-1)
- (modified) mlir/lib/Dialect/GPU/CMakeLists.txt (+1)
- (modified) mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt (+1)
- (modified) mlir/test/Dialect/Bufferization/Transforms/buffer-loop-hoisting.mlir (+64)
- (modified) utils/bazel/llvm-project-overlay/mlir/BUILD.bazel (+4)
``````````diff
diff --git a/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h b/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h
index 038f7e8763ee0..0d6ea9024c842 100644
--- a/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h
+++ b/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h
@@ -28,6 +28,7 @@
#include "mlir/Interfaces/FunctionInterfaces.h"
#include "mlir/Interfaces/InferIntRangeInterface.h"
#include "mlir/Interfaces/InferTypeOpInterface.h"
+#include "mlir/Interfaces/LoopLikeInterface.h"
#include "mlir/Interfaces/SideEffectInterfaces.h"
#include "llvm/ADT/STLExtras.h"
diff --git a/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td b/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td
index 1b6c4ec26ab68..ab5c9e0f47660 100644
--- a/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td
+++ b/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td
@@ -29,6 +29,7 @@ include "mlir/IR/OpAsmInterface.td"
include "mlir/Interfaces/FunctionInterfaces.td"
include "mlir/Interfaces/InferIntRangeInterface.td"
include "mlir/Interfaces/InferTypeOpInterface.td"
+include "mlir/Interfaces/LoopLikeInterface.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
//===----------------------------------------------------------------------===//
@@ -811,7 +812,7 @@ def GPU_LaunchFuncOp :GPU_Op<"launch_func", [
def GPU_LaunchOp : GPU_Op<"launch", [
AffineScope, AutomaticAllocationScope, AttrSizedOperandSegments,
DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRanges"]>,
- GPU_AsyncOpInterface, RecursiveMemoryEffects]>,
+ GPU_AsyncOpInterface, HasParallelRegion, RecursiveMemoryEffects]>,
Arguments<(ins Variadic<GPU_AsyncToken>:$asyncDependencies,
Index:$gridSizeX, Index:$gridSizeY, Index:$gridSizeZ,
Index:$blockSizeX, Index:$blockSizeY, Index:$blockSizeZ,
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
index 11efab595106e..077c1b7a0db17 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
@@ -559,7 +559,7 @@ def OpenACC_GPUAsyncTokenType : Type<
def OpenACC_ComputeRegionOp
: OpenACC_Op<"compute_region",
[OffloadRegionOpInterface, AffineScope,
- RecursiveMemoryEffects,
+ HasParallelRegion, RecursiveMemoryEffects,
SingleBlockImplicitTerminator<"YieldOp">,
IsolatedFromAbove, AttrSizedOperandSegments]> {
let summary = "Compute region for GPU execution";
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 70f8ee5c38172..b90abbe61dc09 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -1783,7 +1783,7 @@ def OpenACC_ReductionRecipeOp
def OpenACC_ParallelOp
: OpenACC_Op<"parallel",
[AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
+ HasParallelRegion, RecursiveMemoryEffects,
DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
DeclareOpInterfaceMethods<RegionBranchOpInterface,
["getSuccessorInputs"]>,
@@ -2144,7 +2144,7 @@ def OpenACC_SerialOp
def OpenACC_KernelsOp
: OpenACC_Op<"kernels",
[AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
+ HasParallelRegion, RecursiveMemoryEffects,
DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
DeclareOpInterfaceMethods<RegionBranchOpInterface,
["getSuccessorInputs"]>,
@@ -2665,7 +2665,7 @@ def OpenACC_HostDataOp
def OpenACC_LoopOp
: OpenACC_Op<
"loop", [AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
+ HasParallelRegion, RecursiveMemoryEffects,
DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
DeclareOpInterfaceMethods<LoopLikeOpInterface>,
DeclareOpInterfaceMethods<RegionBranchOpInterface,
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h b/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h
index a6854752f75b6..6aed702a2da34 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPDialect.h
@@ -23,6 +23,7 @@
#include "mlir/IR/PatternMatch.h"
#include "mlir/IR/SymbolTable.h"
#include "mlir/Interfaces/ControlFlowInterfaces.h"
+#include "mlir/Interfaces/LoopLikeInterface.h"
#include "mlir/Interfaces/SideEffectInterfaces.h"
#include "llvm/Frontend/OpenMP/OMPConstants.h"
#include "llvm/Frontend/OpenMP/OMPDeviceConstants.h"
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
index 6bc99cf765699..576f67765073a 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -20,6 +20,7 @@ include "mlir/Dialect/OpenACCMPCommon/Interfaces/OpenACCMPOpsInterfaces.td"
include "mlir/Dialect/OpenMP/OpenMPClauses.td"
include "mlir/Dialect/OpenMP/OpenMPOpBase.td"
include "mlir/Interfaces/ControlFlowInterfaces.td"
+include "mlir/Interfaces/LoopLikeInterface.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
include "mlir/IR/EnumAttr.td"
include "mlir/IR/OpAsmInterface.td"
@@ -192,7 +193,7 @@ def PrivateClauseOp
//===----------------------------------------------------------------------===//
def ParallelOp : OpenMP_Op<"parallel", traits = [
- AttrSizedOperandSegments, AutomaticAllocationScope,
+ AttrSizedOperandSegments, AutomaticAllocationScope, HasParallelRegion,
DeclareOpInterfaceMethods<ComposableOpInterface>,
DeclareOpInterfaceMethods<OutlineableOpenMPOpInterface>,
RecursiveMemoryEffects
@@ -242,7 +243,7 @@ def TerminatorOp : OpenMP_Op<"terminator", [Terminator, Pure]> {
//===----------------------------------------------------------------------===//
def TeamsOp : OpenMP_Op<"teams", traits = [
AttrSizedOperandSegments, DeclareOpInterfaceMethods<ComposableOpInterface>,
- RecursiveMemoryEffects, OutlineableOpenMPOpInterface
+ HasParallelRegion, RecursiveMemoryEffects, OutlineableOpenMPOpInterface
], clauses = [
OpenMP_AllocateClause, OpenMP_DynGroupprivateClause, OpenMP_IfClause,
OpenMP_NumTeamsClause, OpenMP_PrivateClause, OpenMP_ReductionClause,
@@ -298,7 +299,8 @@ def SectionOp : OpenMP_Op<"section", traits = [
}
def SectionsOp : OpenMP_Op<"sections", traits = [
- AttrSizedOperandSegments, DeclareOpInterfaceMethods<ComposableOpInterface>
+ AttrSizedOperandSegments, DeclareOpInterfaceMethods<ComposableOpInterface>,
+ HasParallelRegion
], clauses = [
OpenMP_AllocateClause, OpenMP_NowaitClause, OpenMP_PrivateClause,
OpenMP_ReductionClause
@@ -682,7 +684,8 @@ def FuseOp
//===----------------------------------------------------------------------===//
def WorkshareOp : OpenMP_Op<"workshare", traits = [
- DeclareOpInterfaceMethods<ComposableOpInterface>, RecursiveMemoryEffects
+ DeclareOpInterfaceMethods<ComposableOpInterface>, HasParallelRegion,
+ RecursiveMemoryEffects
], clauses = [
OpenMP_NowaitClause,
], singleRegion = true> {
@@ -706,7 +709,7 @@ def WorkshareOp : OpenMP_Op<"workshare", traits = [
def WorkshareLoopWrapperOp : OpenMP_Op<"workshare.loop_wrapper", traits = [
DeclareOpInterfaceMethods<LoopWrapperInterface>, HasAncestor<"WorkshareOp">,
- NoTerminator, RecursiveMemoryEffects, SingleBlock
+ HasParallelRegion, NoTerminator, RecursiveMemoryEffects, SingleBlock
], singleRegion = true> {
let summary = "contains loop nests to be parallelized by workshare";
let description = [{
@@ -726,7 +729,7 @@ def WorkshareLoopWrapperOp : OpenMP_Op<"workshare.loop_wrapper", traits = [
//===----------------------------------------------------------------------===//
def LoopNestOp : OpenMP_Op<"loop_nest", traits = [
- RecursiveMemoryEffects, SameVariadicOperandSize
+ HasParallelRegion, RecursiveMemoryEffects, SameVariadicOperandSize
], clauses = [
OpenMP_CollapseClause,
OpenMP_LoopRelatedClause,
@@ -797,7 +800,7 @@ def LoopNestOp : OpenMP_Op<"loop_nest", traits = [
def LoopOp : OpenMP_Op<"loop", traits = [
AttrSizedOperandSegments, DeclareOpInterfaceMethods<LoopWrapperInterface>,
- NoTerminator, SingleBlock
+ HasParallelRegion, NoTerminator, SingleBlock
], clauses = [
OpenMP_BindClause, OpenMP_PrivateClause, OpenMP_OrderClause,
OpenMP_ReductionClause
@@ -845,8 +848,8 @@ def LoopOp : OpenMP_Op<"loop", traits = [
def WsloopOp : OpenMP_Op<"wsloop", traits = [
AttrSizedOperandSegments, DeclareOpInterfaceMethods<ComposableOpInterface>,
- DeclareOpInterfaceMethods<LoopWrapperInterface>, NoTerminator,
- RecursiveMemoryEffects, SingleBlock
+ DeclareOpInterfaceMethods<LoopWrapperInterface>, HasParallelRegion,
+ NoTerminator, RecursiveMemoryEffects, SingleBlock
], clauses = [
OpenMP_AllocateClause, OpenMP_LinearClause, OpenMP_NowaitClause,
OpenMP_OrderClause, OpenMP_OrderedClause, OpenMP_PrivateClause,
@@ -897,8 +900,8 @@ def WsloopOp : OpenMP_Op<"wsloop", traits = [
def SimdOp : OpenMP_Op<"simd", traits = [
AttrSizedOperandSegments, DeclareOpInterfaceMethods<ComposableOpInterface>,
- DeclareOpInterfaceMethods<LoopWrapperInterface>, NoTerminator,
- RecursiveMemoryEffects, SingleBlock
+ DeclareOpInterfaceMethods<LoopWrapperInterface>, HasParallelRegion,
+ NoTerminator, RecursiveMemoryEffects, SingleBlock
], clauses = [
OpenMP_AlignedClause, OpenMP_IfClause, OpenMP_LinearClause,
OpenMP_NontemporalClause, OpenMP_OrderClause, OpenMP_PrivateClause,
@@ -972,8 +975,8 @@ def YieldOp
//===----------------------------------------------------------------------===//
def DistributeOp : OpenMP_Op<"distribute", traits = [
AttrSizedOperandSegments, DeclareOpInterfaceMethods<ComposableOpInterface>,
- DeclareOpInterfaceMethods<LoopWrapperInterface>, NoTerminator,
- RecursiveMemoryEffects, SingleBlock
+ DeclareOpInterfaceMethods<LoopWrapperInterface>, HasParallelRegion,
+ NoTerminator, RecursiveMemoryEffects, SingleBlock
], clauses = [
OpenMP_AllocateClause, OpenMP_DistScheduleClause, OpenMP_OrderClause,
OpenMP_PrivateClause
@@ -1075,7 +1078,7 @@ def TaskOp : OpenMP_Op<"task", traits = [
// SingleBlock restriction is just to ease implementation. It would be okay to
// relax this.
def TaskloopContextOp : OpenMP_Op<"taskloop.context", traits = [
- AttrSizedOperandSegments, AutomaticAllocationScope,
+ AttrSizedOperandSegments, AutomaticAllocationScope, HasParallelRegion,
RecursiveMemoryEffects, SingleBlock,
DeclareOpInterfaceMethods<ComposableOpInterface>,
DeclareOpInterfaceMethods<OutlineableOpenMPOpInterface>
@@ -1174,8 +1177,8 @@ def TaskloopContextOp : OpenMP_Op<"taskloop.context", traits = [
def TaskloopWrapperOp : OpenMP_Op<"taskloop.wrapper", traits = [
DeclareOpInterfaceMethods<ComposableOpInterface>,
- DeclareOpInterfaceMethods<LoopWrapperInterface>, NoTerminator,
- RecursiveMemoryEffects, SingleBlock
+ DeclareOpInterfaceMethods<LoopWrapperInterface>, HasParallelRegion,
+ NoTerminator, RecursiveMemoryEffects, SingleBlock
], clauses = [
// See taskloop.context, which generates the runtime calls and outlined
// task function.
@@ -1655,8 +1658,8 @@ def TargetUpdateOp: OpenMP_Op<"target_update", traits = [
def TargetOp : OpenMP_Op<"target", traits = [
AttrSizedOperandSegments, BlockArgOpenMPOpInterface,
- DeclareOpInterfaceMethods<ComposableOpInterface>, IsolatedFromAbove,
- OutlineableOpenMPOpInterface
+ DeclareOpInterfaceMethods<ComposableOpInterface>, HasParallelRegion,
+ IsolatedFromAbove, OutlineableOpenMPOpInterface
], clauses = [
// TODO: Complete clause list (defaultmap, uses_allocators).
OpenMP_AllocateClause, OpenMP_DependClause, OpenMP_DeviceClause,
@@ -2654,7 +2657,7 @@ def FreeSharedMemOp : OpenMP_Op<"free_shared_mem", traits = [
//===----------------------------------------------------------------------===//
def WorkdistributeOp : OpenMP_Op<"workdistribute", traits = [
- DeclareOpInterfaceMethods<ComposableOpInterface>
+ DeclareOpInterfaceMethods<ComposableOpInterface>, HasParallelRegion
]> {
let summary = "workdistribute directive";
let description = [{
diff --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.h b/mlir/include/mlir/Interfaces/LoopLikeInterface.h
index 9925fc6ce6ca9..1ccfcef7e21e5 100644
--- a/mlir/include/mlir/Interfaces/LoopLikeInterface.h
+++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.h
@@ -35,10 +35,12 @@ LogicalResult verifyLoopLikeOpInterface(Operation *op);
//===----------------------------------------------------------------------===//
namespace OpTrait {
-// A trait indicating that the single region contained in the operation has
-// parallel execution semantics. This may have implications in a certain pass.
-// For example, buffer hoisting is illegal in parallel loops, and local buffers
-// may be accessed by parallel threads simultaneously.
+// A trait indicating that the single region contained in the operation may have
+// parallel execution semantics. Whether it executes in parallel may depend on
+// the operation's attributes or enclosing context. Transformations must account
+// for possible parallel execution unless they can prove sequential execution.
+// For example, hoisting a buffer allocation out of the region may cause parallel
+// executions to share a buffer that was previously private.
template <typename ConcreteType>
class HasParallelRegion : public TraitBase<ConcreteType, HasParallelRegion> {
public:
diff --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.td b/mlir/include/mlir/Interfaces/LoopLikeInterface.td
index 0bb82c1e4638e..15ec7ab87438e 100644
--- a/mlir/include/mlir/Interfaces/LoopLikeInterface.td
+++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.td
@@ -487,7 +487,7 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> {
// Traits
//===----------------------------------------------------------------------===//
-// Op contains a region with parallel execution semantics
+// Op contains a region that may have parallel execution semantics.
def HasParallelRegion : NativeOpTrait<"HasParallelRegion">;
#endif // MLIR_INTERFACES_LOOPLIKEINTERFACE
diff --git a/mlir/lib/Dialect/GPU/CMakeLists.txt b/mlir/lib/Dialect/GPU/CMakeLists.txt
index 6726bf0cab1d2..ae7ed6f4257b5 100644
--- a/mlir/lib/Dialect/GPU/CMakeLists.txt
+++ b/mlir/lib/Dialect/GPU/CMakeLists.txt
@@ -24,6 +24,7 @@ add_mlir_dialect_library(MLIRGPUDialect
MLIRFunctionInterfaces
MLIRInferIntRangeInterface
MLIRIR
+ MLIRLoopLikeInterface
MLIRMathDialect
MLIRMemRefDialect
MLIRSideEffectInterfaces
diff --git a/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt b/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt
index 1beea2098d3bb..5edb7581feb76 100644
--- a/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt
@@ -17,5 +17,6 @@ add_mlir_dialect_library(MLIROpenMPDialect
MLIRIR
MLIRLLVMDialect
MLIRFuncDialect
+ MLIRLoopLikeInterface
MLIROpenACCMPCommon
)
diff --git a/mlir/test/Dialect/Bufferization/Transforms/buffer-loop-hoisting.mlir b/mlir/test/Dialect/Bufferization/Transforms/buffer-loop-hoisting.mlir
index 7498f7af8c5d1..7e4e5540bc483 100644
--- a/mlir/test/Dialect/Bufferization/Transforms/buffer-loop-hoisting.mlir
+++ b/mlir/test/Dialect/Bufferization/Transforms/buffer-loop-hoisting.mlir
@@ -546,6 +546,70 @@ func.func @hoist_alloca(
// -----
+// Each parallel OpenACC iteration must retain its own allocation.
+// CHECK-LABEL: func @no_hoist_acc_parallel_loop(
+// CHECK-NOT: memref.alloc
+// CHECK: acc.parallel
+// CHECK-NOT: memref.alloc
+// CHECK: acc.loop gang vector
+// CHECK-NEXT: %[[ALLOC:.*]] = memref.alloc()
+// CHECK-NEXT: memref.store {{.*}}, %[[ALLOC]]
+// CHECK-NEXT: %[[VALUE:.*]] = memref.load %[[ALLOC]]
+// CHECK-NEXT: memref.store %[[VALUE]]
+func.func @no_hoist_acc_parallel_loop(%out: memref<2xindex>) {
+ %c0 = arith.constant 0 : index
+ %c1 = arith.constant 1 : index
+ %c2 = arith.constant 2 : index
+ acc.parallel {
+ acc.loop gang vector control(%i : index) = (%c0 : index)
+ to (%c2 : index) step (%c1 : index) {
+ %buffer = memref.alloc() : memref<1xindex>
+ memref.store %i, %buffer[%c0] : memref<1xindex>
+ %value = memref.load %buffer[%c0] : memref<1xindex>
+ memref.store %value, %out[%i] : memref<2xindex>
+ acc.yield
+ } independent
+ acc.yield
+ }
+ return
+}
+
+// -----
+
+// Hoist out of an inner sequential loop, but keep the allocation private to
+// each parallel OpenACC iteration.
+// CHECK-LABEL: func @hoist_within_acc_parallel_loop(
+// CHECK-NOT: memref.alloc
+// CHECK: acc.parallel
+// CHECK-NOT: memref.alloc
+// CHECK: acc.loop gang vector
+// CHECK-NEXT: %[[ALLOC:.*]] = memref.alloc()
+// CHECK-NEXT: scf.for
+// CHECK-NEXT: memref.store {{.*}}, %[[ALLOC]]
+// CHECK-NEXT: %[[VALUE:.*]] = memref.load %[[ALLOC]]
+// CHECK-NEXT: memref.store %[[VALUE]]
+func.func @hoist_within_acc_parallel_loop(%out: memref<2x2xindex>) {
+ %c0 = arith.constant 0 : index
+ %c1 = arith.constant 1 : index
+ %c2 = arith.constant 2 : index
+ acc.parallel {
+ acc.loop gang vector control(%i : index) = (%c0 : index)
+ to (%c2 : index) step (%c1 : index) {
+ scf.for %j = %c0 to %c2 step %c1 {
+ %buffer = memref.alloc() : memref<1xindex>
+ memref.store %j, %buffer[%c0] : memref<1xindex>
+ %value = memref.load %buffer[%c0] : memref<1xindex>
+ memref.store %value, %out[%i, %j] : memref<2x2xindex>
+ }
+ acc.yield
+ } independent
+ acc.yield
+ }
+ return
+}
+
+// -----
+
// A nested entry block can be reachable even when its enclosing block is not.
// CHECK-LABEL: func @loop_unreachable_parent(
// CHECK: return
diff --git a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
index be52547a9da73..61b2fb788defa 100644
--- a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
@@ -5713,6 +5713,7 @@ td_library(
":FunctionInterfacesTdFiles",
":InferIntRangeInterfaceTdFiles",
":LLVMOpsTdFiles",
+ ":LoopLikeInterfaceTdFiles",
":OpBaseTdFiles",
":SCFTdFiles",
":SideEffectInterfacesTdFiles",
@@ -5806,6 +5807,7 @@ cc_library(
":InferIntRangeInterface",
":InferTypeOpInterface",
":InliningUtils",
+ ":LoopLikeInterface",
":MathDialect",
":MemRefDialect",
":SCFDialect",
@@ -10966,6 +10968,7 @@ td_library(
deps = [
":AtomicInterfacesTdFiles",
":LLVMOpsTdFiles",
+ ":LoopLikeInterfaceTdFiles",
":OpBaseTdFiles",
],
)
@@ -11060,6 +11063,7 @@ cc_library(
":FuncDialect",
":IR",
":LLVMDialect",
+ ":LoopLikeInterface",
":OpenACCMPOpsInterfacesIncGen",
":OpenMPInterfacesIncGen",
":OpenMPOpsIncGen",
``````````
</details>
https://github.com/llvm/llvm-project/pull/231372
More information about the Mlir-commits
mailing list