@@ -1347,9 +1347,8 @@ static llvm::Expected<llvm::Value *> initPrivateVar(
1347
1347
llvm::Value *llvmPrivateVar, llvm::BasicBlock *privInitBlock,
1348
1348
llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
1349
1349
Region &initRegion = privDecl.getInitRegion ();
1350
- if (initRegion.empty ()) {
1350
+ if (initRegion.empty ())
1351
1351
return llvmPrivateVar;
1352
- }
1353
1352
1354
1353
// map initialization region block arguments
1355
1354
llvm::Value *nonPrivateVar = findAssociatedValue (
@@ -1399,8 +1398,8 @@ initPrivateVars(llvm::IRBuilderBase &builder,
1399
1398
builder, moduleTranslation, privDecl, mlirPrivVar, blockArg,
1400
1399
llvmPrivateVar, privInitBlock, mappedPrivateVars);
1401
1400
1402
- if (auto err = privVarOrErr. takeError () )
1403
- return err ;
1401
+ if (! privVarOrErr)
1402
+ return privVarOrErr. takeError () ;
1404
1403
1405
1404
llvmPrivateVar = privVarOrErr.get ();
1406
1405
moduleTranslation.mapValue (blockArg, llvmPrivateVar);
@@ -2005,13 +2004,15 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
2005
2004
builder.restoreIP (codegenIP);
2006
2005
2007
2006
llvm::BasicBlock *privInitBlock = nullptr ;
2008
- for (auto [blockArg, privDecl, mlirPrivVar] :
2009
- llvm::zip_equal (privateBlockArgs, privateDecls, mlirPrivateVars)) {
2007
+ llvmPrivateVars.resize (privateBlockArgs.size ());
2008
+ for (auto [i, zip] : llvm::enumerate (llvm::zip_equal (
2009
+ privateBlockArgs, privateDecls, mlirPrivateVars))) {
2010
+ auto [blockArg, privDecl, mlirPrivVar] = zip;
2011
+ // This is handled before the task executes
2010
2012
if (privDecl.readsFromMold ())
2011
- // This is handled before the task executes
2012
2013
continue ;
2013
2014
2014
- auto codegenInsertionPt = builder. saveIP ( );
2015
+ llvm::IRBuilderBase::InsertPointGuard guard (builder );
2015
2016
llvm::Type *llvmAllocType =
2016
2017
moduleTranslation.convertType (privDecl.getType ());
2017
2018
builder.SetInsertPoint (allocaIP.getBlock ()->getTerminator ());
@@ -2024,18 +2025,25 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
2024
2025
if (auto err = privateVarOrError.takeError ())
2025
2026
return err;
2026
2027
moduleTranslation.mapValue (blockArg, privateVarOrError.get ());
2027
- builder.restoreIP (codegenInsertionPt);
2028
+ llvmPrivateVars[i] = privateVarOrError.get ();
2029
+ }
2030
+
2031
+ taskStructMgr.createGEPsToPrivateVars ();
2032
+ for (auto [i, llvmPrivVar] :
2033
+ llvm::enumerate (taskStructMgr.getLLVMPrivateVarGEPs ())) {
2034
+ if (!llvmPrivVar) {
2035
+ assert (llvmPrivateVars[i] && " This is added in the loop above" );
2036
+ continue ;
2037
+ }
2038
+ llvmPrivateVars[i] = llvmPrivVar;
2028
2039
}
2029
2040
2030
2041
// Find and map the addresses of each variable within the task context
2031
2042
// structure
2032
- taskStructMgr.createGEPsToPrivateVars ();
2033
- llvm::copy (taskStructMgr.getLLVMPrivateVarGEPs (),
2034
- std::back_inserter (llvmPrivateVars));
2035
- for (auto [blockArg, llvmPrivateVar] :
2036
- llvm::zip_equal (privateBlockArgs, llvmPrivateVars)) {
2037
- if (!llvmPrivateVar)
2038
- // This was handled above
2043
+ for (auto [blockArg, llvmPrivateVar, privateDecl] :
2044
+ llvm::zip_equal (privateBlockArgs, llvmPrivateVars, privateDecls)) {
2045
+ // This was handled above.
2046
+ if (!privateDecl.readsFromMold ())
2039
2047
continue ;
2040
2048
// Fix broken pass-by-value case for Fortran character boxes
2041
2049
if (!mlir::isa<LLVM::LLVMPointerType>(blockArg.getType ())) {
0 commit comments