@@ -581,15 +581,15 @@ struct OpenMPOpt {
581
581
for (Function *F : OMPInfoCache.ModuleSlice ) {
582
582
for (auto ICV : ICVs) {
583
583
auto ICVInfo = OMPInfoCache.ICVs [ICV];
584
- auto Remark = [&](OptimizationRemark OR ) {
585
- return OR << " OpenMP ICV " << ore::NV (" OpenMPICV" , ICVInfo.Name )
586
- << " Value: "
587
- << (ICVInfo.InitValue
588
- ? ICVInfo.InitValue ->getValue ().toString (10 , true )
589
- : " IMPLEMENTATION_DEFINED" );
584
+ auto Remark = [&](OptimizationRemarkAnalysis ORA ) {
585
+ return ORA << " OpenMP ICV " << ore::NV (" OpenMPICV" , ICVInfo.Name )
586
+ << " Value: "
587
+ << (ICVInfo.InitValue
588
+ ? ICVInfo.InitValue ->getValue ().toString (10 , true )
589
+ : " IMPLEMENTATION_DEFINED" );
590
590
};
591
591
592
- emitRemarkOnFunction (F, " OpenMPICVTracker" , Remark);
592
+ emitRemark<OptimizationRemarkAnalysis> (F, " OpenMPICVTracker" , Remark);
593
593
}
594
594
}
595
595
}
@@ -600,12 +600,12 @@ struct OpenMPOpt {
600
600
if (!OMPInfoCache.Kernels .count (F))
601
601
continue ;
602
602
603
- auto Remark = [&](OptimizationRemark OR ) {
604
- return OR << " OpenMP GPU kernel "
605
- << ore::NV (" OpenMPGPUKernel" , F->getName ()) << " \n " ;
603
+ auto Remark = [&](OptimizationRemarkAnalysis ORA ) {
604
+ return ORA << " OpenMP GPU kernel "
605
+ << ore::NV (" OpenMPGPUKernel" , F->getName ()) << " \n " ;
606
606
};
607
607
608
- emitRemarkOnFunction (F, " OpenMPGPU" , Remark);
608
+ emitRemark<OptimizationRemarkAnalysis> (F, " OpenMPGPU" , Remark);
609
609
}
610
610
}
611
611
@@ -1419,12 +1419,11 @@ struct OpenMPOpt {
1419
1419
continue ;
1420
1420
1421
1421
auto Remark = [&](OptimizationRemark OR) {
1422
- auto newLoc = &*F.getEntryBlock ().getFirstInsertionPt ();
1423
1422
return OR << " OpenMP runtime call "
1424
- << ore::NV (" OpenMPOptRuntime" , RFI.Name ) << " moved to "
1425
- << ore::NV ( " OpenMPRuntimeMoves " , newLoc-> getDebugLoc ()) ;
1423
+ << ore::NV (" OpenMPOptRuntime" , RFI.Name )
1424
+ << " moved to beginning of OpenMP region " ;
1426
1425
};
1427
- emitRemark<OptimizationRemark>(CI , " OpenMPRuntimeCodeMotion" , Remark);
1426
+ emitRemark<OptimizationRemark>(&F , " OpenMPRuntimeCodeMotion" , Remark);
1428
1427
1429
1428
CI->moveBefore (&*F.getEntryBlock ().getFirstInsertionPt ());
1430
1429
ReplVal = CI;
@@ -1457,7 +1456,7 @@ struct OpenMPOpt {
1457
1456
return OR << " OpenMP runtime call "
1458
1457
<< ore::NV (" OpenMPOptRuntime" , RFI.Name ) << " deduplicated" ;
1459
1458
};
1460
- emitRemark<OptimizationRemark>(CI , " OpenMPRuntimeDeduplicated" , Remark);
1459
+ emitRemark<OptimizationRemark>(&F , " OpenMPRuntimeDeduplicated" , Remark);
1461
1460
1462
1461
CGUpdater.removeCallSite (*CI);
1463
1462
CI->replaceAllUsesWith (ReplVal);
@@ -1558,28 +1557,22 @@ struct OpenMPOpt {
1558
1557
// /
1559
1558
// / The remark is built using a callback function provided by the caller that
1560
1559
// / takes a RemarkKind as input and returns a RemarkKind.
1561
- template <typename RemarkKind,
1562
- typename RemarkCallBack = function_ref<RemarkKind(RemarkKind &&)>>
1563
- void emitRemark (Instruction *Inst, StringRef RemarkName,
1560
+ template <typename RemarkKind, typename RemarkCallBack>
1561
+ void emitRemark (Instruction *I, StringRef RemarkName,
1564
1562
RemarkCallBack &&RemarkCB) const {
1565
- Function *F = Inst ->getParent ()->getParent ();
1563
+ Function *F = I ->getParent ()->getParent ();
1566
1564
auto &ORE = OREGetter (F);
1567
1565
1568
- ORE.emit (
1569
- [&]() { return RemarkCB (RemarkKind (DEBUG_TYPE, RemarkName, Inst)); });
1566
+ ORE.emit ([&]() { return RemarkCB (RemarkKind (DEBUG_TYPE, RemarkName, I)); });
1570
1567
}
1571
1568
1572
- // / Emit a remark on a function. Since only OptimizationRemark is supporting
1573
- // / this, it can't be made generic.
1574
- void
1575
- emitRemarkOnFunction (Function *F, StringRef RemarkName,
1576
- function_ref<OptimizationRemark(OptimizationRemark &&)>
1577
- &&RemarkCB) const {
1569
+ // / Emit a remark on a function.
1570
+ template <typename RemarkKind, typename RemarkCallBack>
1571
+ void emitRemark (Function *F, StringRef RemarkName,
1572
+ RemarkCallBack &&RemarkCB) const {
1578
1573
auto &ORE = OREGetter (F);
1579
1574
1580
- ORE.emit ([&]() {
1581
- return RemarkCB (OptimizationRemark (DEBUG_TYPE, RemarkName, F));
1582
- });
1575
+ ORE.emit ([&]() { return RemarkCB (RemarkKind (DEBUG_TYPE, RemarkName, F)); });
1583
1576
}
1584
1577
1585
1578
// / The underlying module.
@@ -1672,10 +1665,11 @@ Kernel OpenMPOpt::getUniqueKernelFor(Function &F) {
1672
1665
if (!F.hasLocalLinkage ()) {
1673
1666
1674
1667
// See https://openmp.llvm.org/remarks/OptimizationRemarks.html
1675
- auto Remark = [&](OptimizationRemark OR) {
1676
- return OR << " [OMP100] Potentially unknown OpenMP target region caller" ;
1668
+ auto Remark = [&](OptimizationRemarkAnalysis ORA) {
1669
+ return ORA
1670
+ << " [OMP100] Potentially unknown OpenMP target region caller" ;
1677
1671
};
1678
- emitRemarkOnFunction (&F, " OMP100" , Remark);
1672
+ emitRemark<OptimizationRemarkAnalysis> (&F, " OMP100" , Remark);
1679
1673
1680
1674
return nullptr ;
1681
1675
}
@@ -1768,15 +1762,16 @@ bool OpenMPOpt::rewriteDeviceCodeStateMachine() {
1768
1762
continue ;
1769
1763
1770
1764
{
1771
- auto Remark = [&](OptimizationRemark OR ) {
1772
- return OR << " Found a parallel region that is called in a target "
1773
- " region but not part of a combined target construct nor "
1774
- " nested inside a target construct without intermediate "
1775
- " code. This can lead to excessive register usage for "
1776
- " unrelated target regions in the same translation unit "
1777
- " due to spurious call edges assumed by ptxas." ;
1765
+ auto Remark = [&](OptimizationRemarkAnalysis ORA ) {
1766
+ return ORA << " Found a parallel region that is called in a target "
1767
+ " region but not part of a combined target construct nor "
1768
+ " nested inside a target construct without intermediate "
1769
+ " code. This can lead to excessive register usage for "
1770
+ " unrelated target regions in the same translation unit "
1771
+ " due to spurious call edges assumed by ptxas." ;
1778
1772
};
1779
- emitRemarkOnFunction (F, " OpenMPParallelRegionInNonSPMD" , Remark);
1773
+ emitRemark<OptimizationRemarkAnalysis>(F, " OpenMPParallelRegionInNonSPMD" ,
1774
+ Remark);
1780
1775
}
1781
1776
1782
1777
// If this ever hits, we should investigate.
@@ -1785,12 +1780,13 @@ bool OpenMPOpt::rewriteDeviceCodeStateMachine() {
1785
1780
if (UnknownUse || NumDirectCalls != 1 ||
1786
1781
ToBeReplacedStateMachineUses.size () != 2 ) {
1787
1782
{
1788
- auto Remark = [&](OptimizationRemark OR ) {
1789
- return OR << " Parallel region is used in "
1790
- << (UnknownUse ? " unknown" : " unexpected" )
1791
- << " ways; will not attempt to rewrite the state machine." ;
1783
+ auto Remark = [&](OptimizationRemarkAnalysis ORA ) {
1784
+ return ORA << " Parallel region is used in "
1785
+ << (UnknownUse ? " unknown" : " unexpected" )
1786
+ << " ways; will not attempt to rewrite the state machine." ;
1792
1787
};
1793
- emitRemarkOnFunction (F, " OpenMPParallelRegionInNonSPMD" , Remark);
1788
+ emitRemark<OptimizationRemarkAnalysis>(
1789
+ F, " OpenMPParallelRegionInNonSPMD" , Remark);
1794
1790
}
1795
1791
continue ;
1796
1792
}
@@ -1800,14 +1796,14 @@ bool OpenMPOpt::rewriteDeviceCodeStateMachine() {
1800
1796
Kernel K = getUniqueKernelFor (*F);
1801
1797
if (!K) {
1802
1798
{
1803
- auto Remark = [&](OptimizationRemark OR ) {
1804
- return OR << " Parallel region is not known to be called from a "
1805
- " unique single target region, maybe the surrounding "
1806
- " function has external linkage?; will not attempt to "
1807
- " rewrite the state machine use." ;
1799
+ auto Remark = [&](OptimizationRemarkAnalysis ORA ) {
1800
+ return ORA << " Parallel region is not known to be called from a "
1801
+ " unique single target region, maybe the surrounding "
1802
+ " function has external linkage?; will not attempt to "
1803
+ " rewrite the state machine use." ;
1808
1804
};
1809
- emitRemarkOnFunction (F, " OpenMPParallelRegionInMultipleKernesl " ,
1810
- Remark);
1805
+ emitRemark<OptimizationRemarkAnalysis>(
1806
+ F, " OpenMPParallelRegionInMultipleKernesl " , Remark);
1811
1807
}
1812
1808
continue ;
1813
1809
}
@@ -1818,25 +1814,26 @@ bool OpenMPOpt::rewriteDeviceCodeStateMachine() {
1818
1814
// ensures only direct calls to the function are left.
1819
1815
1820
1816
{
1821
- auto RemarkParalleRegion = [&](OptimizationRemark OR ) {
1822
- return OR << " Specialize parallel region that is only reached from a "
1823
- " single target region to avoid spurious call edges and "
1824
- " excessive register usage in other target regions. "
1825
- " (parallel region ID: "
1826
- << ore::NV (" OpenMPParallelRegion" , F->getName ())
1827
- << " , kernel ID: "
1828
- << ore::NV (" OpenMPTargetRegion" , K->getName ()) << " )" ;
1817
+ auto RemarkParalleRegion = [&](OptimizationRemarkAnalysis ORA ) {
1818
+ return ORA << " Specialize parallel region that is only reached from a "
1819
+ " single target region to avoid spurious call edges and "
1820
+ " excessive register usage in other target regions. "
1821
+ " (parallel region ID: "
1822
+ << ore::NV (" OpenMPParallelRegion" , F->getName ())
1823
+ << " , kernel ID: "
1824
+ << ore::NV (" OpenMPTargetRegion" , K->getName ()) << " )" ;
1829
1825
};
1830
- emitRemarkOnFunction (F, " OpenMPParallelRegionInNonSPMD" ,
1831
- RemarkParalleRegion);
1832
- auto RemarkKernel = [&](OptimizationRemark OR ) {
1833
- return OR << " Target region containing the parallel region that is "
1834
- " specialized. (parallel region ID: "
1835
- << ore::NV (" OpenMPParallelRegion" , F->getName ())
1836
- << " , kernel ID: "
1837
- << ore::NV (" OpenMPTargetRegion" , K->getName ()) << " )" ;
1826
+ emitRemark<OptimizationRemarkAnalysis> (F, " OpenMPParallelRegionInNonSPMD" ,
1827
+ RemarkParalleRegion);
1828
+ auto RemarkKernel = [&](OptimizationRemarkAnalysis ORA ) {
1829
+ return ORA << " Target region containing the parallel region that is "
1830
+ " specialized. (parallel region ID: "
1831
+ << ore::NV (" OpenMPParallelRegion" , F->getName ())
1832
+ << " , kernel ID: "
1833
+ << ore::NV (" OpenMPTargetRegion" , K->getName ()) << " )" ;
1838
1834
};
1839
- emitRemarkOnFunction (K, " OpenMPParallelRegionInNonSPMD" , RemarkKernel);
1835
+ emitRemark<OptimizationRemarkAnalysis>(K, " OpenMPParallelRegionInNonSPMD" ,
1836
+ RemarkKernel);
1840
1837
}
1841
1838
1842
1839
Module &M = *F->getParent ();
0 commit comments