Skip to content

Commit

Permalink
[MLIR][OpenMP] Updated fix for intermixed TargetDataOp and TargetOp
Browse files Browse the repository at this point in the history
  • Loading branch information
jsjodin committed Mar 26, 2024
1 parent 25d3695 commit 13ea203
Showing 1 changed file with 15 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ static LogicalResult inlineConvertOmpRegions(
// Special case for single-block regions that don't create additional blocks:
// insert operations without creating additional blocks.
if (llvm::hasSingleElement(region)) {

llvm::Instruction *potentialTerminator =
builder.GetInsertBlock()->empty() ? nullptr
: &builder.GetInsertBlock()->back();
Expand Down Expand Up @@ -2515,8 +2516,12 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
argIndex++;
}

bodyGenStatus = inlineConvertOmpRegions(region, "omp.data.region",
builder, moduleTranslation);
SmallVector<llvm::PHINode *> phis;
llvm::BasicBlock *continuationBlock =
convertOmpOpRegions(region, "omp.data.region", builder,
moduleTranslation, bodyGenStatus, &phis);
builder.SetInsertPoint(continuationBlock,
continuationBlock->getFirstInsertionPt());
}
break;
case BodyGenTy::DupNoPriv:
Expand All @@ -2525,8 +2530,12 @@ convertOmpTargetData(Operation *op, llvm::IRBuilderBase &builder,
// If device info is available then region has already been generated
if (info.DevicePtrInfoMap.empty()) {
builder.restoreIP(codeGenIP);
bodyGenStatus = inlineConvertOmpRegions(region, "omp.data.region",
builder, moduleTranslation);
SmallVector<llvm::PHINode *> phis;
llvm::BasicBlock *continuationBlock =
convertOmpOpRegions(region, "omp.data.region", builder,
moduleTranslation, bodyGenStatus, &phis);
builder.SetInsertPoint(continuationBlock,
continuationBlock->getFirstInsertionPt());
}
break;
}
Expand Down Expand Up @@ -3543,6 +3552,8 @@ convertTopLevelTargetOp(Operation *op, llvm::IRBuilderBase &builder,
LLVM::ModuleTranslation &moduleTranslation) {
if (isa<omp::TargetOp>(op))
return convertOmpTarget(*op, builder, moduleTranslation);
if (isa<omp::TargetDataOp>(op))
return convertOmpTargetData(op, builder, moduleTranslation);
bool interrupted =
op->walk<WalkOrder::PreOrder>([&](omp::TargetOp targetOp) {
if (failed(convertOmpTarget(*targetOp, builder, moduleTranslation)))
Expand Down

0 comments on commit 13ea203

Please sign in to comment.