From 65ab27245466e7bd5eb609206332ccfb0c69067a Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Thu, 25 Sep 2025 12:05:33 -0700 Subject: [PATCH] [RegAlloc] Add additional tracing in InlineSpiller::rematerializeFor We didn't have trace logging for two cases in this routine which makes it sometimes hard to tell what is going on. In addition to debug trace statements, add comments to explain the logic behind the early exits which don't mark the virtual register live. Suggestions on how to word these more precisely very welcome; I'm not clear I understand all the intrinicies of this code myself. --- llvm/lib/CodeGen/InlineSpiller.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/llvm/lib/CodeGen/InlineSpiller.cpp b/llvm/lib/CodeGen/InlineSpiller.cpp index 98c56f739ad4e..0c2b74c907d2a 100644 --- a/llvm/lib/CodeGen/InlineSpiller.cpp +++ b/llvm/lib/CodeGen/InlineSpiller.cpp @@ -642,8 +642,12 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) { SmallVector, 8> Ops; VirtRegInfo RI = AnalyzeVirtRegInBundle(MI, VirtReg.reg(), &Ops); - if (!RI.Reads) + // Defs without reads will be deleted if unused after remat is + // completed for other users of the virtual register. + if (!RI.Reads) { + LLVM_DEBUG(dbgs() << "\tskipping remat of def " << MI); return false; + } SlotIndex UseIdx = LIS.getInstructionIndex(MI).getRegSlot(true); VNInfo *ParentVNI = VirtReg.getVNInfoAt(UseIdx.getBaseIndex()); @@ -657,8 +661,13 @@ bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) { return true; } - if (SnippetCopies.count(&MI)) + // Snippets copies are ignored for remat, and will be deleted if they + // don't feed a live user after rematerialization completes. + if (SnippetCopies.count(&MI)) { + LLVM_DEBUG(dbgs() << "\tskipping remat snippet copy for " << UseIdx << '\t' + << MI); return false; + } LiveInterval &OrigLI = LIS.getInterval(Original); VNInfo *OrigVNI = OrigLI.getVNInfoAt(UseIdx);