[llvm] [CodeGen] Notify delegate before erasing folded instruction (PR #222919)

via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 11 06:03:50 PDT 2026


https://github.com/GongJianxiang-Ben updated https://github.com/llvm/llvm-project/pull/222919

>From afe85ca4ac23a76bddb371b592080573889d7edc Mon Sep 17 00:00:00 2001
From: Gong Jianxiang <3247276791 at qq.com>
Date: Fri, 11 Sep 2026 18:50:20 +0800
Subject: [PATCH 1/2] [CodeGen] Notify delegate before erasing folded
 instruction

---
 llvm/lib/CodeGen/LiveRangeEdit.cpp | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/llvm/lib/CodeGen/LiveRangeEdit.cpp b/llvm/lib/CodeGen/LiveRangeEdit.cpp
index 1d6b835f16468..3059b4f583724 100644
--- a/llvm/lib/CodeGen/LiveRangeEdit.cpp
+++ b/llvm/lib/CodeGen/LiveRangeEdit.cpp
@@ -24,12 +24,12 @@ using namespace llvm;
 
 #define DEBUG_TYPE "regalloc"
 
-STATISTIC(NumDCEDeleted,        "Number of instructions deleted by DCE");
-STATISTIC(NumDCEFoldedLoads,    "Number of single use loads folded after DCE");
-STATISTIC(NumFracRanges,        "Number of live ranges fractured by DCE");
+STATISTIC(NumDCEDeleted, "Number of instructions deleted by DCE");
+STATISTIC(NumDCEFoldedLoads, "Number of single use loads folded after DCE");
+STATISTIC(NumFracRanges, "Number of live ranges fractured by DCE");
 STATISTIC(NumReMaterialization, "Number of instructions rematerialized");
 
-void LiveRangeEdit::Delegate::anchor() { }
+void LiveRangeEdit::Delegate::anchor() {}
 
 LiveInterval &LiveRangeEdit::createEmptyIntervalFrom(Register OldReg,
                                                      bool createSubRanges) {
@@ -108,7 +108,7 @@ void LiveRangeEdit::eraseVirtReg(Register Reg) {
 }
 
 bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
-                               SmallVectorImpl<MachineInstr*> &Dead) {
+                               SmallVectorImpl<MachineInstr *> &Dead) {
   MachineInstr *DefMI = nullptr, *UseMI = nullptr;
 
   // Check that there is a single def and a single use.
@@ -161,6 +161,8 @@ bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
   // Update the call info.
   if (UseMI->shouldUpdateAdditionalCallInfo())
     UseMI->getMF()->moveAdditionalCallInfo(UseMI, FoldMI);
+  if (TheDelegate)
+    TheDelegate->LRE_WillEraseInstruction(UseMI);
   UseMI->eraseFromParent();
   DefMI->addRegisterDead(LI->reg(), nullptr);
   Dead.push_back(DefMI);
@@ -339,10 +341,10 @@ void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink) {
     MI->setDesc(TII.get(TargetOpcode::KILL));
     // Remove all operands that aren't physregs.
     for (unsigned i = MI->getNumOperands(); i; --i) {
-      const MachineOperand &MO = MI->getOperand(i-1);
+      const MachineOperand &MO = MI->getOperand(i - 1);
       if (MO.isReg() && MO.getReg().isPhysical())
         continue;
-      MI->removeOperand(i-1);
+      MI->removeOperand(i - 1);
     }
     MI->dropMemRefs(*MI->getMF());
     LLVM_DEBUG(dbgs() << "Converted physregs to:\t" << *MI);
@@ -395,7 +397,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,
 
     // LI may have been separated, create new intervals.
     LI->RenumberValues();
-    SmallVector<LiveInterval*, 8> SplitLIs;
+    SmallVector<LiveInterval *, 8> SplitLIs;
     LIS.splitSeparateComponents(*LI, SplitLIs);
     if (!SplitLIs.empty())
       ++NumFracRanges;
@@ -415,8 +417,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,
 
 // Keep track of new virtual registers created via
 // MachineRegisterInfo::createVirtualRegister.
-void
-LiveRangeEdit::MRI_NoteNewVirtualRegister(Register VReg) {
+void LiveRangeEdit::MRI_NoteNewVirtualRegister(Register VReg) {
   if (VRM)
     VRM->grow();
 

>From 45afaa06b7248cedaea596e6f7310f377f0c03d2 Mon Sep 17 00:00:00 2001
From: Gong Jianxiang <3247276791 at qq.com>
Date: Fri, 11 Sep 2026 20:02:40 +0800
Subject: [PATCH 2/2] Revert some formatting changes

---
 llvm/lib/CodeGen/LiveRangeEdit.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/llvm/lib/CodeGen/LiveRangeEdit.cpp b/llvm/lib/CodeGen/LiveRangeEdit.cpp
index 3059b4f583724..71b1dda6edd8c 100644
--- a/llvm/lib/CodeGen/LiveRangeEdit.cpp
+++ b/llvm/lib/CodeGen/LiveRangeEdit.cpp
@@ -24,12 +24,12 @@ using namespace llvm;
 
 #define DEBUG_TYPE "regalloc"
 
-STATISTIC(NumDCEDeleted, "Number of instructions deleted by DCE");
-STATISTIC(NumDCEFoldedLoads, "Number of single use loads folded after DCE");
-STATISTIC(NumFracRanges, "Number of live ranges fractured by DCE");
+STATISTIC(NumDCEDeleted,        "Number of instructions deleted by DCE");
+STATISTIC(NumDCEFoldedLoads,    "Number of single use loads folded after DCE");
+STATISTIC(NumFracRanges,        "Number of live ranges fractured by DCE");
 STATISTIC(NumReMaterialization, "Number of instructions rematerialized");
 
-void LiveRangeEdit::Delegate::anchor() {}
+void LiveRangeEdit::Delegate::anchor() { }
 
 LiveInterval &LiveRangeEdit::createEmptyIntervalFrom(Register OldReg,
                                                      bool createSubRanges) {
@@ -108,7 +108,7 @@ void LiveRangeEdit::eraseVirtReg(Register Reg) {
 }
 
 bool LiveRangeEdit::foldAsLoad(LiveInterval *LI,
-                               SmallVectorImpl<MachineInstr *> &Dead) {
+                               SmallVectorImpl<MachineInstr*> &Dead) {
   MachineInstr *DefMI = nullptr, *UseMI = nullptr;
 
   // Check that there is a single def and a single use.
@@ -341,10 +341,10 @@ void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink) {
     MI->setDesc(TII.get(TargetOpcode::KILL));
     // Remove all operands that aren't physregs.
     for (unsigned i = MI->getNumOperands(); i; --i) {
-      const MachineOperand &MO = MI->getOperand(i - 1);
+      const MachineOperand &MO = MI->getOperand(i-1);
       if (MO.isReg() && MO.getReg().isPhysical())
         continue;
-      MI->removeOperand(i - 1);
+      MI->removeOperand(i-1);
     }
     MI->dropMemRefs(*MI->getMF());
     LLVM_DEBUG(dbgs() << "Converted physregs to:\t" << *MI);
@@ -397,7 +397,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,
 
     // LI may have been separated, create new intervals.
     LI->RenumberValues();
-    SmallVector<LiveInterval *, 8> SplitLIs;
+    SmallVector<LiveInterval*, 8> SplitLIs;
     LIS.splitSeparateComponents(*LI, SplitLIs);
     if (!SplitLIs.empty())
       ++NumFracRanges;



More information about the llvm-commits mailing list