@@ -1329,6 +1329,53 @@ findAssociatedValue(Value privateVar, llvm::IRBuilderBase &builder,
1329
1329
return moduleTranslation.lookupValue (privateVar);
1330
1330
}
1331
1331
1332
+ // / Initialize a single (first)private variable. You probably want to use
1333
+ // / allocateAndInitPrivateVars instead of this.
1334
+ static llvm::Error
1335
+ initPrivateVar (llvm::IRBuilderBase &builder,
1336
+ LLVM::ModuleTranslation &moduleTranslation,
1337
+ omp::PrivateClauseOp &privDecl, Value mlirPrivVar,
1338
+ BlockArgument &blockArg, llvm::Value *llvmPrivateVar,
1339
+ llvm::SmallVectorImpl<llvm::Value *> &llvmPrivateVars,
1340
+ llvm::BasicBlock *privInitBlock,
1341
+ llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
1342
+ Region &initRegion = privDecl.getInitRegion ();
1343
+ if (initRegion.empty ()) {
1344
+ moduleTranslation.mapValue (blockArg, llvmPrivateVar);
1345
+ llvmPrivateVars.push_back (llvmPrivateVar);
1346
+ return llvm::Error::success ();
1347
+ }
1348
+
1349
+ // map initialization region block arguments
1350
+ llvm::Value *nonPrivateVar = findAssociatedValue (
1351
+ mlirPrivVar, builder, moduleTranslation, mappedPrivateVars);
1352
+ assert (nonPrivateVar);
1353
+ moduleTranslation.mapValue (privDecl.getInitMoldArg (), nonPrivateVar);
1354
+ moduleTranslation.mapValue (privDecl.getInitPrivateArg (), llvmPrivateVar);
1355
+
1356
+ // in-place convert the private initialization region
1357
+ SmallVector<llvm::Value *, 1 > phis;
1358
+ builder.SetInsertPoint (privInitBlock->getTerminator ());
1359
+ if (failed (inlineConvertOmpRegions (initRegion, " omp.private.init" , builder,
1360
+ moduleTranslation, &phis)))
1361
+ return llvm::createStringError (
1362
+ " failed to inline `init` region of `omp.private`" );
1363
+
1364
+ assert (phis.size () == 1 && " expected one allocation to be yielded" );
1365
+
1366
+ // prefer the value yielded from the init region to the allocated private
1367
+ // variable in case the region is operating on arguments by-value (e.g.
1368
+ // Fortran character boxes).
1369
+ moduleTranslation.mapValue (blockArg, phis[0 ]);
1370
+ llvmPrivateVars.push_back (phis[0 ]);
1371
+
1372
+ // clear init region block argument mapping in case it needs to be
1373
+ // re-created with a different source for another use of the same
1374
+ // reduction decl
1375
+ moduleTranslation.forgetMapping (initRegion);
1376
+ return llvm::Error::success ();
1377
+ }
1378
+
1332
1379
// / Allocate and initialize delayed private variables. Returns the basic block
1333
1380
// / which comes after all of these allocations. llvm::Value * for each of these
1334
1381
// / private variables are populated in llvmPrivateVars.
@@ -1368,40 +1415,11 @@ static llvm::Expected<llvm::BasicBlock *> allocateAndInitPrivateVars(
1368
1415
llvm::Value *llvmPrivateVar = builder.CreateAlloca (
1369
1416
llvmAllocType, /* ArraySize=*/ nullptr , " omp.private.alloc" );
1370
1417
1371
- Region &initRegion = privDecl.getInitRegion ();
1372
- if (initRegion.empty ()) {
1373
- moduleTranslation.mapValue (blockArg, llvmPrivateVar);
1374
- llvmPrivateVars.push_back (llvmPrivateVar);
1375
- continue ;
1376
- }
1377
-
1378
- // map initialization region block arguments
1379
- llvm::Value *nonPrivateVar = findAssociatedValue (
1380
- mlirPrivVar, builder, moduleTranslation, mappedPrivateVars);
1381
- assert (nonPrivateVar);
1382
- moduleTranslation.mapValue (privDecl.getInitMoldArg (), nonPrivateVar);
1383
- moduleTranslation.mapValue (privDecl.getInitPrivateArg (), llvmPrivateVar);
1384
-
1385
- // in-place convert the private initialization region
1386
- SmallVector<llvm::Value *, 1 > phis;
1387
- builder.SetInsertPoint (privInitBlock->getTerminator ());
1388
- if (failed (inlineConvertOmpRegions (initRegion, " omp.private.init" , builder,
1389
- moduleTranslation, &phis)))
1390
- return llvm::createStringError (
1391
- " failed to inline `init` region of `omp.private`" );
1392
-
1393
- assert (phis.size () == 1 && " expected one allocation to be yielded" );
1394
-
1395
- // prefer the value yielded from the init region to the allocated private
1396
- // variable in case the region is operating on arguments by-value (e.g.
1397
- // Fortran character boxes).
1398
- moduleTranslation.mapValue (blockArg, phis[0 ]);
1399
- llvmPrivateVars.push_back (phis[0 ]);
1400
-
1401
- // clear init region block argument mapping in case it needs to be
1402
- // re-created with a different source for another use of the same
1403
- // reduction decl
1404
- moduleTranslation.forgetMapping (initRegion);
1418
+ llvm::Error err = initPrivateVar (
1419
+ builder, moduleTranslation, privDecl, mlirPrivVar, blockArg,
1420
+ llvmPrivateVar, llvmPrivateVars, privInitBlock, mappedPrivateVars);
1421
+ if (err)
1422
+ return err;
1405
1423
}
1406
1424
return afterAllocas;
1407
1425
}
0 commit comments