mirror of
https://github.com/intel/llvm.git
synced 2026-01-14 03:50:17 +08:00
[MLIR][OpenMP] Split region-associated op verification (#112355)
This patch moves the part of operation verifiers dependent on the contents of their regions to the corresponding `verifyRegions` method. This ensures these are only triggered after the operations in the region have themselved already been verified in advance, avoiding checks based on invalid nested operations. The `LoopWrapperInterface` is also updated so that its verifier runs after operations in the region of ops with this interface have already been verified.
This commit is contained in:
@@ -137,7 +137,7 @@ def PrivateClauseOp : OpenMP_Op<"private", [IsolatedFromAbove, RecipeInterface]>
|
||||
}
|
||||
}];
|
||||
|
||||
let hasVerifier = 1;
|
||||
let hasRegionVerifier = 1;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -175,6 +175,7 @@ def ParallelOp : OpenMP_Op<"parallel", traits = [
|
||||
}];
|
||||
|
||||
let hasVerifier = 1;
|
||||
let hasRegionVerifier = 1;
|
||||
}
|
||||
|
||||
def TerminatorOp : OpenMP_Op<"terminator", [Terminator, Pure]> {
|
||||
@@ -426,6 +427,7 @@ def WsloopOp : OpenMP_Op<"wsloop", traits = [
|
||||
}];
|
||||
|
||||
let hasVerifier = 1;
|
||||
let hasRegionVerifier = 1;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -479,6 +481,7 @@ def SimdOp : OpenMP_Op<"simd", traits = [
|
||||
}];
|
||||
|
||||
let hasVerifier = 1;
|
||||
let hasRegionVerifier = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -556,6 +559,7 @@ def DistributeOp : OpenMP_Op<"distribute", traits = [
|
||||
}];
|
||||
|
||||
let hasVerifier = 1;
|
||||
let hasRegionVerifier = 1;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -693,6 +697,7 @@ def TaskloopOp : OpenMP_Op<"taskloop", traits = [
|
||||
}] # clausesExtraClassDeclaration;
|
||||
|
||||
let hasVerifier = 1;
|
||||
let hasRegionVerifier = 1;
|
||||
}
|
||||
|
||||
def TaskgroupOp : OpenMP_Op<"taskgroup", traits = [
|
||||
|
||||
@@ -258,6 +258,7 @@ def LoopWrapperInterface : OpInterface<"LoopWrapperInterface"> {
|
||||
let verify = [{
|
||||
return ::llvm::cast<::mlir::omp::LoopWrapperInterface>($_op).verifyImpl();
|
||||
}];
|
||||
let verifyWithRegions = 1;
|
||||
}
|
||||
|
||||
def ComposableOpInterface : OpInterface<"ComposableOpInterface"> {
|
||||
|
||||
@@ -1760,6 +1760,18 @@ static LogicalResult verifyPrivateVarList(OpType &op) {
|
||||
}
|
||||
|
||||
LogicalResult ParallelOp::verify() {
|
||||
if (getAllocateVars().size() != getAllocatorVars().size())
|
||||
return emitError(
|
||||
"expected equal sizes for allocate and allocator variables");
|
||||
|
||||
if (failed(verifyPrivateVarList(*this)))
|
||||
return failure();
|
||||
|
||||
return verifyReductionVarList(*this, getReductionSyms(), getReductionVars(),
|
||||
getReductionByref());
|
||||
}
|
||||
|
||||
LogicalResult ParallelOp::verifyRegions() {
|
||||
auto distributeChildOps = getOps<DistributeOp>();
|
||||
if (!distributeChildOps.empty()) {
|
||||
if (!isComposite())
|
||||
@@ -1780,16 +1792,7 @@ LogicalResult ParallelOp::verify() {
|
||||
return emitError()
|
||||
<< "'omp.composite' attribute present in non-composite operation";
|
||||
}
|
||||
|
||||
if (getAllocateVars().size() != getAllocatorVars().size())
|
||||
return emitError(
|
||||
"expected equal sizes for allocate and allocator variables");
|
||||
|
||||
if (failed(verifyPrivateVarList(*this)))
|
||||
return failure();
|
||||
|
||||
return verifyReductionVarList(*this, getReductionSyms(), getReductionVars(),
|
||||
getReductionByref());
|
||||
return success();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -1979,6 +1982,11 @@ void WsloopOp::build(OpBuilder &builder, OperationState &state,
|
||||
}
|
||||
|
||||
LogicalResult WsloopOp::verify() {
|
||||
return verifyReductionVarList(*this, getReductionSyms(), getReductionVars(),
|
||||
getReductionByref());
|
||||
}
|
||||
|
||||
LogicalResult WsloopOp::verifyRegions() {
|
||||
bool isCompositeChildLeaf =
|
||||
llvm::dyn_cast_if_present<LoopWrapperInterface>((*this)->getParentOp());
|
||||
|
||||
@@ -2000,8 +2008,7 @@ LogicalResult WsloopOp::verify() {
|
||||
<< "'omp.composite' attribute missing from composite wrapper";
|
||||
}
|
||||
|
||||
return verifyReductionVarList(*this, getReductionSyms(), getReductionVars(),
|
||||
getReductionByref());
|
||||
return success();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -2037,9 +2044,6 @@ LogicalResult SimdOp::verify() {
|
||||
if (verifyNontemporalClause(*this, getNontemporalVars()).failed())
|
||||
return failure();
|
||||
|
||||
if (getNestedWrapper())
|
||||
return emitOpError() << "must wrap an 'omp.loop_nest' directly";
|
||||
|
||||
bool isCompositeChildLeaf =
|
||||
llvm::dyn_cast_if_present<LoopWrapperInterface>((*this)->getParentOp());
|
||||
|
||||
@@ -2054,6 +2058,13 @@ LogicalResult SimdOp::verify() {
|
||||
return success();
|
||||
}
|
||||
|
||||
LogicalResult SimdOp::verifyRegions() {
|
||||
if (getNestedWrapper())
|
||||
return emitOpError() << "must wrap an 'omp.loop_nest' directly";
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Distribute construct [2.9.4.1]
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -2076,6 +2087,10 @@ LogicalResult DistributeOp::verify() {
|
||||
return emitError(
|
||||
"expected equal sizes for allocate and allocator variables");
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
LogicalResult DistributeOp::verifyRegions() {
|
||||
if (LoopWrapperInterface nested = getNestedWrapper()) {
|
||||
if (!isComposite())
|
||||
return emitError()
|
||||
@@ -2281,6 +2296,10 @@ LogicalResult TaskloopOp::verify() {
|
||||
"may not appear on the same taskloop directive");
|
||||
}
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
LogicalResult TaskloopOp::verifyRegions() {
|
||||
if (LoopWrapperInterface nested = getNestedWrapper()) {
|
||||
if (!isComposite())
|
||||
return emitError()
|
||||
@@ -2725,7 +2744,7 @@ void PrivateClauseOp::build(OpBuilder &odsBuilder, OperationState &odsState,
|
||||
DataSharingClauseType::Private));
|
||||
}
|
||||
|
||||
LogicalResult PrivateClauseOp::verify() {
|
||||
LogicalResult PrivateClauseOp::verifyRegions() {
|
||||
Type symType = getType();
|
||||
|
||||
auto verifyTerminator = [&](Operation *terminator,
|
||||
|
||||
@@ -136,9 +136,11 @@ func.func @invalid_nested_wrapper(%lb : index, %ub : index, %step : index) {
|
||||
// expected-error @below {{only supported nested wrapper is 'omp.simd'}}
|
||||
omp.wsloop {
|
||||
omp.distribute {
|
||||
omp.loop_nest (%iv) : index = (%lb) to (%ub) step (%step) {
|
||||
omp.yield
|
||||
}
|
||||
omp.simd {
|
||||
omp.loop_nest (%iv) : index = (%lb) to (%ub) step (%step) {
|
||||
omp.yield
|
||||
}
|
||||
} {omp.composite}
|
||||
} {omp.composite}
|
||||
} {omp.composite}
|
||||
}
|
||||
@@ -1975,7 +1977,7 @@ func.func @taskloop(%lb: i32, %ub: i32, %step: i32) {
|
||||
omp.loop_nest (%iv) : i32 = (%lb) to (%ub) step (%step) {
|
||||
omp.yield
|
||||
}
|
||||
} {omp.composite}
|
||||
}
|
||||
} {omp.composite}
|
||||
return
|
||||
}
|
||||
@@ -2188,7 +2190,7 @@ func.func @omp_distribute_nested_wrapper2(%lb: index, %ub: index, %step: index)
|
||||
omp.loop_nest (%iv) : index = (%lb) to (%ub) step (%step) {
|
||||
"omp.yield"() : () -> ()
|
||||
}
|
||||
}) {omp.composite} : () -> ()
|
||||
}) : () -> ()
|
||||
} {omp.composite}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user