Skip to content

[MLIR][OpenMP] Split region-associated op verification #112355

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ def PrivateClauseOp : OpenMP_Op<"private", [IsolatedFromAbove, RecipeInterface]>
}
}];

let hasVerifier = 1;
let hasRegionVerifier = 1;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -175,6 +175,7 @@ def ParallelOp : OpenMP_Op<"parallel", traits = [
}];

let hasVerifier = 1;
let hasRegionVerifier = 1;
}

def TerminatorOp : OpenMP_Op<"terminator", [Terminator, Pure]> {
Expand Down Expand Up @@ -426,6 +427,7 @@ def WsloopOp : OpenMP_Op<"wsloop", traits = [
}];

let hasVerifier = 1;
let hasRegionVerifier = 1;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -479,6 +481,7 @@ def SimdOp : OpenMP_Op<"simd", traits = [
}];

let hasVerifier = 1;
let hasRegionVerifier = 1;
}


Expand Down Expand Up @@ -556,6 +559,7 @@ def DistributeOp : OpenMP_Op<"distribute", traits = [
}];

let hasVerifier = 1;
let hasRegionVerifier = 1;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -693,6 +697,7 @@ def TaskloopOp : OpenMP_Op<"taskloop", traits = [
}] # clausesExtraClassDeclaration;

let hasVerifier = 1;
let hasRegionVerifier = 1;
}

def TaskgroupOp : OpenMP_Op<"taskgroup", traits = [
Expand Down
1 change: 1 addition & 0 deletions mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td
Original file line number Diff line number Diff line change
Expand Up @@ -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"> {
Expand Down
51 changes: 35 additions & 16 deletions mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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();
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -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());

Expand All @@ -2000,8 +2008,7 @@ LogicalResult WsloopOp::verify() {
<< "'omp.composite' attribute missing from composite wrapper";
}

return verifyReductionVarList(*this, getReductionSyms(), getReductionVars(),
getReductionByref());
return success();
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -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());

Expand All @@ -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]
//===----------------------------------------------------------------------===//
Expand All @@ -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()
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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,
Expand Down
12 changes: 7 additions & 5 deletions mlir/test/Dialect/OpenMP/invalid.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -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}
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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}
}

Expand Down
Loading