[llvm] [CodeGen] Resolve FIXME: Use findPHICopyInsertPoint to find the right place to copy InlineBR blocks (PR #89556)

via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 21 18:16:03 PDT 2024


https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/89556

>From 6f91c0e07b807459c01ec3933b396c75fcb9d467 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Sun, 21 Apr 2024 19:37:19 -0400
Subject: [PATCH] [CodeGen] Resolve FIXME: Use findPHICopyInsertPoint to find
 the right place to copy InlineBR blocks

---
 llvm/include/llvm/CodeGen/TailDuplicator.h |  7 ++++---
 llvm/lib/CodeGen/TailDuplicator.cpp        | 24 ++++++++++++----------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/TailDuplicator.h b/llvm/include/llvm/CodeGen/TailDuplicator.h
index 8fdce301c0ccb1..1e08a791d53804 100644
--- a/llvm/include/llvm/CodeGen/TailDuplicator.h
+++ b/llvm/include/llvm/CodeGen/TailDuplicator.h
@@ -122,9 +122,10 @@ class TailDuplicator {
                      SmallVectorImpl<MachineBasicBlock *> &TDBBs,
                      SmallVectorImpl<MachineInstr *> &Copies,
                      SmallVectorImpl<MachineBasicBlock *> *CandidatePtr);
-  void appendCopies(MachineBasicBlock *MBB,
-                 SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
-                 SmallVectorImpl<MachineInstr *> &Copies);
+  void
+  appendCopies(MachineBasicBlock *MBB, MachineBasicBlock *TailBB,
+               SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
+               SmallVectorImpl<MachineInstr *> &Copies);
 
   void removeDeadBlock(
       MachineBasicBlock *MBB,
diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp
index f5dd21cb927012..7da0e76f5bfd6d 100644
--- a/llvm/lib/CodeGen/TailDuplicator.cpp
+++ b/llvm/lib/CodeGen/TailDuplicator.cpp
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/TailDuplicator.h"
+#include "PHIEliminationUtils.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/STLExtras.h"
@@ -655,8 +656,6 @@ bool TailDuplicator::shouldTailDuplicate(bool IsSimple,
     // TailDuplicator::appendCopies will erroneously place COPYs after
     // INLINEASM_BR instructions after 4b0aa5724fea, which demonstrates the same
     // bug that was fixed in f7a53d82c090.
-    // FIXME: Use findPHICopyInsertPoint() to find the correct insertion point
-    //        for the COPY when replacing PHIs.
     if (MI.getOpcode() == TargetOpcode::INLINEASM_BR)
       return false;
 
@@ -913,7 +912,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
         duplicateInstruction(&MI, TailBB, PredBB, LocalVRMap, UsedByPhi);
       }
     }
-    appendCopies(PredBB, CopyInfos, Copies);
+    appendCopies(PredBB, TailBB, CopyInfos, Copies);
 
     NumTailDupAdded += TailBB->size() - 1; // subtract one for removed branch
 
@@ -981,7 +980,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
           duplicateInstruction(MI, TailBB, PrevBB, LocalVRMap, UsedByPhi);
           MI->eraseFromParent();
         }
-        appendCopies(PrevBB, CopyInfos, Copies);
+        appendCopies(PrevBB, TailBB, CopyInfos, Copies);
       } else {
         TII->removeBranch(*PrevBB);
         // No PHIs to worry about, just splice the instructions over.
@@ -1045,7 +1044,7 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
       // from PredBB.
       processPHI(&MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, false);
     }
-    appendCopies(PredBB, CopyInfos, Copies);
+    appendCopies(PredBB, TailBB, CopyInfos, Copies);
   }
 
   return Changed;
@@ -1053,14 +1052,17 @@ bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
 
 /// At the end of the block \p MBB generate COPY instructions between registers
 /// described by \p CopyInfos. Append resulting instructions to \p Copies.
-void TailDuplicator::appendCopies(MachineBasicBlock *MBB,
-      SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
-      SmallVectorImpl<MachineInstr*> &Copies) {
-  MachineBasicBlock::iterator Loc = MBB->getFirstTerminator();
+void TailDuplicator::appendCopies(
+    MachineBasicBlock *MBB, MachineBasicBlock *TailBB,
+    SmallVectorImpl<std::pair<Register, RegSubRegPair>> &CopyInfos,
+    SmallVectorImpl<MachineInstr *> &Copies) {
   const MCInstrDesc &CopyD = TII->get(TargetOpcode::COPY);
+
   for (auto &CI : CopyInfos) {
-    auto C = BuildMI(*MBB, Loc, DebugLoc(), CopyD, CI.first)
-                .addReg(CI.second.Reg, 0, CI.second.SubReg);
+    MachineBasicBlock::iterator InsertPos =
+        findPHICopyInsertPoint(MBB, TailBB, CI.second.Reg);
+    auto C = BuildMI(*MBB, InsertPos, DebugLoc(), CopyD, CI.first)
+                 .addReg(CI.second.Reg, 0, CI.second.SubReg);
     Copies.push_back(C);
   }
 }



More information about the llvm-commits mailing list