@@ -1347,9 +1347,8 @@ static llvm::Expected<llvm::Value *> initPrivateVar(
13471347 llvm::Value *llvmPrivateVar, llvm::BasicBlock *privInitBlock,
13481348 llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
13491349 Region &initRegion = privDecl.getInitRegion ();
1350- if (initRegion.empty ()) {
1350+ if (initRegion.empty ())
13511351 return llvmPrivateVar;
1352- }
13531352
13541353 // map initialization region block arguments
13551354 llvm::Value *nonPrivateVar = findAssociatedValue (
@@ -1399,8 +1398,8 @@ initPrivateVars(llvm::IRBuilderBase &builder,
13991398 builder, moduleTranslation, privDecl, mlirPrivVar, blockArg,
14001399 llvmPrivateVar, privInitBlock, mappedPrivateVars);
14011400
1402- if (auto err = privVarOrErr. takeError () )
1403- return err ;
1401+ if (! privVarOrErr)
1402+ return privVarOrErr. takeError () ;
14041403
14051404 llvmPrivateVar = privVarOrErr.get ();
14061405 moduleTranslation.mapValue (blockArg, llvmPrivateVar);
@@ -2005,13 +2004,15 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
20052004 builder.restoreIP (codegenIP);
20062005
20072006 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
20102012 if (privDecl.readsFromMold ())
2011- // This is handled before the task executes
20122013 continue ;
20132014
2014- auto codegenInsertionPt = builder. saveIP ( );
2015+ llvm::IRBuilderBase::InsertPointGuard guard (builder );
20152016 llvm::Type *llvmAllocType =
20162017 moduleTranslation.convertType (privDecl.getType ());
20172018 builder.SetInsertPoint (allocaIP.getBlock ()->getTerminator ());
@@ -2024,18 +2025,25 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
20242025 if (auto err = privateVarOrError.takeError ())
20252026 return err;
20262027 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;
20282039 }
20292040
20302041 // Find and map the addresses of each variable within the task context
20312042 // 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 ())
20392047 continue ;
20402048 // Fix broken pass-by-value case for Fortran character boxes
20412049 if (!mlir::isa<LLVM::LLVMPointerType>(blockArg.getType ())) {
0 commit comments