@@ -566,6 +566,7 @@ struct LoopInterchange {
566
566
const DenseMap<const Loop *, unsigned > &CostMap) {
567
567
Loop *OuterLoop = LoopList[OuterLoopId];
568
568
Loop *InnerLoop = LoopList[InnerLoopId];
569
+ MDNode *LoopID = OuterLoop->getLoopID ();
569
570
LLVM_DEBUG (dbgs () << " Processing InnerLoopId = " << InnerLoopId
570
571
<< " and OuterLoopId = " << OuterLoopId << " \n " );
571
572
if (findMetadata (OuterLoop) == false || findMetadata (InnerLoop) == false ) {
@@ -607,6 +608,34 @@ struct LoopInterchange {
607
608
LLVM_DEBUG (dbgs () << " Dependency matrix after interchange:\n " ;
608
609
printDepMatrix (DependencyMatrix));
609
610
611
+ // The next outer loop, or nullptr if TargetLoop is the outermost one.
612
+ Loop *NextOuterLoop = nullptr ;
613
+ if (0 < OuterLoopId)
614
+ NextOuterLoop = LoopList[OuterLoopId - 1 ];
615
+
616
+ // Update the metadata.
617
+ std::optional<MDNode *> MDNextOuterLoopID =
618
+ makeFollowupLoopID (LoopID, {LLVMLoopInterchangeFollowupAll,
619
+ LLVMLoopInterchangeFollowupNextOuter});
620
+ std::optional<MDNode *> MDOuterLoopID =
621
+ makeFollowupLoopID (LoopID, {LLVMLoopInterchangeFollowupAll,
622
+ LLVMLoopInterchangeFollowupOuter});
623
+ std::optional<MDNode *> MDInnerLoopID =
624
+ makeFollowupLoopID (LoopID, {LLVMLoopInterchangeFollowupAll,
625
+ LLVMLoopInterchangeFollowupInner});
626
+ if (MDNextOuterLoopID) {
627
+ if (NextOuterLoop) {
628
+ NextOuterLoop->setLoopID (*MDNextOuterLoopID);
629
+ } else {
630
+ LLVM_DEBUG (
631
+ dbgs () << " New metadata for the next outer loop is ignored.\n " );
632
+ }
633
+ }
634
+ if (MDOuterLoopID)
635
+ OuterLoop->setLoopID (*MDOuterLoopID);
636
+ if (MDInnerLoopID)
637
+ InnerLoop->setLoopID (*MDInnerLoopID);
638
+
610
639
return true ;
611
640
}
612
641
@@ -687,7 +716,6 @@ struct LoopInterchange {
687
716
});
688
717
break ;
689
718
}
690
- MDNode *LoopID = TargetLoop->getLoopID ();
691
719
bool Interchanged = processLoop (LoopList, InnerLoopId, OuterLoopId,
692
720
DependencyMatrix, CostMap);
693
721
if (!Interchanged) {
@@ -710,29 +738,6 @@ struct LoopInterchange {
710
738
Loop2Index[OuterLoop] = OuterLoopId;
711
739
Loop2Index[InnerLoop] = InnerLoopId;
712
740
713
- // Update the metadata.
714
- std::optional<MDNode *> MDNextOuterLoopID =
715
- makeFollowupLoopID (LoopID, {LLVMLoopInterchangeFollowupAll,
716
- LLVMLoopInterchangeFollowupNextOuter});
717
- std::optional<MDNode *> MDOuterLoopID =
718
- makeFollowupLoopID (LoopID, {LLVMLoopInterchangeFollowupAll,
719
- LLVMLoopInterchangeFollowupOuter});
720
- std::optional<MDNode *> MDInnerLoopID =
721
- makeFollowupLoopID (LoopID, {LLVMLoopInterchangeFollowupAll,
722
- LLVMLoopInterchangeFollowupInner});
723
- if (MDNextOuterLoopID) {
724
- if (NextOuterLoop) {
725
- NextOuterLoop->setLoopID (*MDNextOuterLoopID);
726
- } else {
727
- LLVM_DEBUG (dbgs ()
728
- << " New metadata for the next outer loop is ignored.\n " );
729
- }
730
- }
731
- if (MDOuterLoopID)
732
- OuterLoop->setLoopID (*MDOuterLoopID);
733
- if (MDInnerLoopID)
734
- InnerLoop->setLoopID (*MDInnerLoopID);
735
-
736
741
// Add new elements, paying attention to the order.
737
742
bool Valid = true ;
738
743
if (NextOuterLoop)
0 commit comments