Skip to content

Commit

Permalink
Partial mapping of private var block args.
Browse files Browse the repository at this point in the history
  • Loading branch information
ergawy committed Jan 30, 2024
1 parent 7ff7b4b commit 0b423d3
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
25 changes: 17 additions & 8 deletions flang/lib/Lower/OpenMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,7 @@ void DataSharingProcessor::collectDefaultSymbols() {

void DataSharingProcessor::privatize(
llvm::SetVector<mlir::omp::PrivateClauseOp> *privateInitializers) {
auto *op = firOpBuilder.getInsertionBlock()->getParentOp();

for (const Fortran::semantics::Symbol *sym : privatizedSymbols) {

Expand All @@ -516,9 +517,10 @@ void DataSharingProcessor::privatize(
Fortran::lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol(*sym);
assert(hsb && "Host symbol box not found");

auto symType = hsb.getAddr().getType();
auto symLoc = hsb.getAddr().getLoc();
auto privatizerOp = firOpBuilder.create<mlir::omp::PrivateClauseOp>(
hsb.getAddr().getLoc(), hsb.getAddr().getType(),
sym->name().ToString());
symLoc, symType, sym->name().ToString());
firOpBuilder.setInsertionPointToEnd(&privatizerOp.getBody().front());

converter.getLocalSymbols()->pushScope();
Expand All @@ -536,13 +538,18 @@ void DataSharingProcessor::privatize(
converter.getLocalSymbols()->popScope();
converter.getLocalSymbols()->popScope();
firOpBuilder.restoreInsertionPoint(ip);
}

// TODO: This will eventually be an else to the `if` above it. For now, I
// emit both the outlined privatizer AND directly emitted cloning and
// copying ops while I am testing.
cloneSymbol(sym);
copyFirstPrivateSymbol(sym);
privateInitializers->insert(privatizerOp);
auto blockArg = op->getRegion(0).front().addArgument(symType, symLoc);
converter.bindSymbol(*sym, blockArg);
} else {

// TODO: This will eventually be an else to the `if` above it. For now,
// I emit both the outlined privatizer AND directly emitted cloning and
// copying ops while I am testing.
cloneSymbol(sym);
copyFirstPrivateSymbol(sym);
}
}
}
}
Expand Down Expand Up @@ -2376,8 +2383,10 @@ static void createBodyOfOp(
firOpBuilder.setInsertionPointToEnd(&op.getRegion().back());
auto *temp = Fortran::lower::genOpenMPTerminator(firOpBuilder,
op.getOperation(), loc);

firOpBuilder.setInsertionPointAfter(marker);
genNestedEvaluations(converter, eval);

temp->erase();
}

Expand Down
4 changes: 2 additions & 2 deletions flang/test/Lower/OpenMP/FIR/delayed_privatization.f90
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
subroutine private_clause_allocatable()
integer :: xxx
integer :: yyy

!$OMP PARALLEL FIRSTPRIVATE(xxx, yyy)
!$OMP PARALLEL FIRSTPRIVATE(xxx)
xxx = xxx + 2
!$OMP END PARALLEL

end subroutine
Expand Down
3 changes: 1 addition & 2 deletions mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1604,8 +1604,7 @@ void PrivateClauseOp::build(OpBuilder &odsBuilder, OperationState &odsState,
build(odsBuilder, odsState, privatizerName, initializerType);

mlir::Block &block = odsState.regions.front()->emplaceBlock();
block.addArguments({privateVarType},
SmallVector<Location>(1, odsState.location));
block.addArgument(privateVarType, odsState.location);
}

static ParseResult parsePrivateVarList(
Expand Down

0 comments on commit 0b423d3

Please sign in to comment.