@@ -1360,9 +1360,8 @@ static llvm::Expected<llvm::Value *> initPrivateVar(
13601360 llvm::Value *llvmPrivateVar, llvm::BasicBlock *privInitBlock,
13611361 llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
13621362 Region &initRegion = privDecl.getInitRegion ();
1363- if (initRegion.empty ()) {
1363+ if (initRegion.empty ())
13641364 return llvmPrivateVar;
1365- }
13661365
13671366 // map initialization region block arguments
13681367 llvm::Value *nonPrivateVar = findAssociatedValue (
@@ -1412,8 +1411,8 @@ initPrivateVars(llvm::IRBuilderBase &builder,
14121411 builder, moduleTranslation, privDecl, mlirPrivVar, blockArg,
14131412 llvmPrivateVar, privInitBlock, mappedPrivateVars);
14141413
1415- if (auto err = privVarOrErr. takeError () )
1416- return err ;
1414+ if (! privVarOrErr)
1415+ return privVarOrErr. takeError () ;
14171416
14181417 llvmPrivateVar = privVarOrErr.get ();
14191418 moduleTranslation.mapValue (blockArg, llvmPrivateVar);
@@ -2017,13 +2016,15 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
20172016 builder.restoreIP (codegenIP);
20182017
20192018 llvm::BasicBlock *privInitBlock = nullptr ;
2020- for (auto [blockArg, privDecl, mlirPrivVar] :
2021- llvm::zip_equal (privateBlockArgs, privateDecls, mlirPrivateVars)) {
2019+ llvmPrivateVars.resize (privateBlockArgs.size ());
2020+ for (auto [i, zip] : llvm::enumerate (llvm::zip_equal (
2021+ privateBlockArgs, privateDecls, mlirPrivateVars))) {
2022+ auto [blockArg, privDecl, mlirPrivVar] = zip;
2023+ // This is handled before the task executes
20222024 if (privDecl.readsFromMold ())
2023- // This is handled before the task executes
20242025 continue ;
20252026
2026- auto codegenInsertionPt = builder. saveIP ( );
2027+ llvm::IRBuilderBase::InsertPointGuard guard (builder );
20272028 llvm::Type *llvmAllocType =
20282029 moduleTranslation.convertType (privDecl.getType ());
20292030 builder.SetInsertPoint (allocaIP.getBlock ()->getTerminator ());
@@ -2036,18 +2037,25 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
20362037 if (auto err = privateVarOrError.takeError ())
20372038 return err;
20382039 moduleTranslation.mapValue (blockArg, privateVarOrError.get ());
2039- builder.restoreIP (codegenInsertionPt);
2040+ llvmPrivateVars[i] = privateVarOrError.get ();
2041+ }
2042+
2043+ taskStructMgr.createGEPsToPrivateVars ();
2044+ for (auto [i, llvmPrivVar] :
2045+ llvm::enumerate (taskStructMgr.getLLVMPrivateVarGEPs ())) {
2046+ if (!llvmPrivVar) {
2047+ assert (llvmPrivateVars[i] && " This is added in the loop above" );
2048+ continue ;
2049+ }
2050+ llvmPrivateVars[i] = llvmPrivVar;
20402051 }
20412052
20422053 // Find and map the addresses of each variable within the task context
20432054 // structure
2044- taskStructMgr.createGEPsToPrivateVars ();
2045- llvm::copy (taskStructMgr.getLLVMPrivateVarGEPs (),
2046- std::back_inserter (llvmPrivateVars));
2047- for (auto [blockArg, llvmPrivateVar] :
2048- llvm::zip_equal (privateBlockArgs, llvmPrivateVars)) {
2049- if (!llvmPrivateVar)
2050- // This was handled above
2055+ for (auto [blockArg, llvmPrivateVar, privateDecl] :
2056+ llvm::zip_equal (privateBlockArgs, llvmPrivateVars, privateDecls)) {
2057+ // This was handled above.
2058+ if (!privateDecl.readsFromMold ())
20512059 continue ;
20522060 // Fix broken pass-by-value case for Fortran character boxes
20532061 if (!mlir::isa<LLVM::LLVMPointerType>(blockArg.getType ())) {
0 commit comments