@@ -1512,6 +1512,53 @@ findAssociatedValue(Value privateVar, llvm::IRBuilderBase &builder,
1512
1512
return moduleTranslation.lookupValue (privateVar);
1513
1513
}
1514
1514
1515
+ // / Initialize a single (first)private variable. You probably want to use
1516
+ // / allocateAndInitPrivateVars instead of this.
1517
+ static llvm::Error
1518
+ initPrivateVar (llvm::IRBuilderBase &builder,
1519
+ LLVM::ModuleTranslation &moduleTranslation,
1520
+ omp::PrivateClauseOp &privDecl, Value mlirPrivVar,
1521
+ BlockArgument &blockArg, llvm::Value *llvmPrivateVar,
1522
+ llvm::SmallVectorImpl<llvm::Value *> &llvmPrivateVars,
1523
+ llvm::BasicBlock *privInitBlock,
1524
+ llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
1525
+ Region &initRegion = privDecl.getInitRegion ();
1526
+ if (initRegion.empty ()) {
1527
+ moduleTranslation.mapValue (blockArg, llvmPrivateVar);
1528
+ llvmPrivateVars.push_back (llvmPrivateVar);
1529
+ return llvm::Error::success ();
1530
+ }
1531
+
1532
+ // map initialization region block arguments
1533
+ llvm::Value *nonPrivateVar = findAssociatedValue (
1534
+ mlirPrivVar, builder, moduleTranslation, mappedPrivateVars);
1535
+ assert (nonPrivateVar);
1536
+ moduleTranslation.mapValue (privDecl.getInitMoldArg (), nonPrivateVar);
1537
+ moduleTranslation.mapValue (privDecl.getInitPrivateArg (), llvmPrivateVar);
1538
+
1539
+ // in-place convert the private initialization region
1540
+ SmallVector<llvm::Value *, 1 > phis;
1541
+ builder.SetInsertPoint (privInitBlock->getTerminator ());
1542
+ if (failed (inlineConvertOmpRegions (initRegion, " omp.private.init" , builder,
1543
+ moduleTranslation, &phis)))
1544
+ return llvm::createStringError (
1545
+ " failed to inline `init` region of `omp.private`" );
1546
+
1547
+ assert (phis.size () == 1 && " expected one allocation to be yielded" );
1548
+
1549
+ // prefer the value yielded from the init region to the allocated private
1550
+ // variable in case the region is operating on arguments by-value (e.g.
1551
+ // Fortran character boxes).
1552
+ moduleTranslation.mapValue (blockArg, phis[0 ]);
1553
+ llvmPrivateVars.push_back (phis[0 ]);
1554
+
1555
+ // clear init region block argument mapping in case it needs to be
1556
+ // re-created with a different source for another use of the same
1557
+ // reduction decl
1558
+ moduleTranslation.forgetMapping (initRegion);
1559
+ return llvm::Error::success ();
1560
+ }
1561
+
1515
1562
// / Allocate and initialize delayed private variables. Returns the basic block
1516
1563
// / which comes after all of these allocations. llvm::Value * for each of these
1517
1564
// / private variables are populated in llvmPrivateVars.
@@ -1552,40 +1599,11 @@ static llvm::Expected<llvm::BasicBlock *> allocateAndInitPrivateVars(
1552
1599
llvm::Value *llvmPrivateVar = builder.CreateAlloca (
1553
1600
llvmAllocType, /* ArraySize=*/ nullptr , " omp.private.alloc" );
1554
1601
1555
- Region &initRegion = privDecl.getInitRegion ();
1556
- if (initRegion.empty ()) {
1557
- moduleTranslation.mapValue (blockArg, llvmPrivateVar);
1558
- llvmPrivateVars.push_back (llvmPrivateVar);
1559
- continue ;
1560
- }
1561
-
1562
- // map initialization region block arguments
1563
- llvm::Value *nonPrivateVar = findAssociatedValue (
1564
- mlirPrivVar, builder, moduleTranslation, mappedPrivateVars);
1565
- assert (nonPrivateVar);
1566
- moduleTranslation.mapValue (privDecl.getInitMoldArg (), nonPrivateVar);
1567
- moduleTranslation.mapValue (privDecl.getInitPrivateArg (), llvmPrivateVar);
1568
-
1569
- // in-place convert the private initialization region
1570
- SmallVector<llvm::Value *, 1 > phis;
1571
- builder.SetInsertPoint (privInitBlock->getTerminator ());
1572
- if (failed (inlineConvertOmpRegions (initRegion, " omp.private.init" , builder,
1573
- moduleTranslation, &phis)))
1574
- return llvm::createStringError (
1575
- " failed to inline `init` region of `omp.private`" );
1576
-
1577
- assert (phis.size () == 1 && " expected one allocation to be yielded" );
1578
-
1579
- // prefer the value yielded from the init region to the allocated private
1580
- // variable in case the region is operating on arguments by-value (e.g.
1581
- // Fortran character boxes).
1582
- moduleTranslation.mapValue (blockArg, phis[0 ]);
1583
- llvmPrivateVars.push_back (phis[0 ]);
1584
-
1585
- // clear init region block argument mapping in case it needs to be
1586
- // re-created with a different source for another use of the same
1587
- // reduction decl
1588
- moduleTranslation.forgetMapping (initRegion);
1602
+ llvm::Error err = initPrivateVar (
1603
+ builder, moduleTranslation, privDecl, mlirPrivVar, blockArg,
1604
+ llvmPrivateVar, llvmPrivateVars, privInitBlock, mappedPrivateVars);
1605
+ if (err)
1606
+ return err;
1589
1607
}
1590
1608
return afterAllocas;
1591
1609
}
0 commit comments