@@ -625,6 +625,12 @@ void SplitAsyncPass::compactifySpills(
625
625
auto * M = Info.begin ()->first ->getParent ();
626
626
auto & C = M->getContext ();
627
627
628
+ auto getDT = [](FuncInfo& FI, Function* F) {
629
+ if (!FI.DT )
630
+ FI.DT = std::make_unique<DominatorTree>(*F);
631
+ return FI.DT .get ();
632
+ };
633
+
628
634
RTBuilder RTB (C, *m_CGCtx);
629
635
630
636
// 1. add an entry block to place the fills
@@ -693,11 +699,7 @@ void SplitAsyncPass::compactifySpills(
693
699
}
694
700
695
701
if (NeedsUpdate)
696
- {
697
- if (!FI.DT )
698
- FI.DT = std::make_unique<DominatorTree>(*F);
699
- Updater.RewriteAllUses (FI.DT .get ());
700
- }
702
+ Updater.RewriteAllUses (getDT (FI, F));
701
703
702
704
for (auto & [Idx, Fills] : FI.Fills )
703
705
{
@@ -725,8 +727,18 @@ void SplitAsyncPass::compactifySpills(
725
727
auto & ChildFI = Info.find (CurChild)->second ;
726
728
for (auto & [Idx, Fills] : ChildFI.Fills )
727
729
{
728
- if (FI.Spills .count (Idx) != 0 )
729
- continue ;
730
+ auto SpillI = FI.Spills .find (Idx);
731
+ if (SpillI != FI.Spills .end ())
732
+ {
733
+ auto & Spills = SpillI->second ;
734
+ auto * DT = getDT (FI, F);
735
+ if (llvm::all_of (Spills, [=](SpillValueIntrinsic* SI) {
736
+ return DT->dominates (SI, CHLI);
737
+ }))
738
+ {
739
+ continue ;
740
+ }
741
+ }
730
742
731
743
if (FI.Fills .count (Idx) == 0 )
732
744
{
@@ -800,11 +812,7 @@ void SplitAsyncPass::compactifySpills(
800
812
}
801
813
802
814
if (NeedsUpdate)
803
- {
804
- if (!FI.DT )
805
- FI.DT = std::make_unique<DominatorTree>(*F);
806
- Updater.RewriteAllUses (FI.DT .get ());
807
- }
815
+ Updater.RewriteAllUses (getDT (FI, F));
808
816
809
817
for (auto * CHLI : FI.ContinuationPoints )
810
818
updateOffsets (RTB, *CHLI->getParent ());
0 commit comments