diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 8efc6f124a55d..cf2bc499fe5d6 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2213,7 +2213,11 @@ findPrologueEndLoc(const MachineFunction *MF) { -> std::optional> { // Is this instruction trivial data shuffling or frame-setup? bool isCopy = (TII.isCopyInstr(MI) ? true : false); - bool isTrivRemat = TII.isTriviallyReMaterializable(MI); + bool isTrivRemat = + TII.isTriviallyReMaterializable(MI) && + llvm::all_of(MI.all_uses(), [](const MachineOperand &MO) { + return MO.getReg().isVirtual(); + }); bool isFrameSetup = MI.getFlag(MachineInstr::FrameSetup); if (!isFrameSetup && MI.getDebugLoc()) { diff --git a/llvm/lib/CodeGen/RegAllocScore.cpp b/llvm/lib/CodeGen/RegAllocScore.cpp index b86647dbe0a48..ce1eea3519b71 100644 --- a/llvm/lib/CodeGen/RegAllocScore.cpp +++ b/llvm/lib/CodeGen/RegAllocScore.cpp @@ -79,8 +79,11 @@ llvm::calculateRegAllocScore(const MachineFunction &MF, return MBFI.getBlockFreqRelativeToEntryBlock(&MBB); }, [&](const MachineInstr &MI) { - return MF.getSubtarget().getInstrInfo()->isTriviallyReMaterializable( - MI); + auto *TTI = MF.getSubtarget().getInstrInfo(); + return TTI->isTriviallyReMaterializable(MI) && + llvm::all_of(MI.all_uses(), [](const MachineOperand &MO) { + return MO.getReg().isVirtual(); + }); }); } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp index 08ca20b5eef6e..7591541779884 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp @@ -260,7 +260,10 @@ static void query(const MachineInstr &MI, bool &Read, bool &Write, // Test whether Def is safe and profitable to rematerialize. static bool shouldRematerialize(const MachineInstr &Def, const WebAssemblyInstrInfo *TII) { - return Def.isAsCheapAsAMove() && TII->isTriviallyReMaterializable(Def); + return Def.isAsCheapAsAMove() && TII->isTriviallyReMaterializable(Def) && + llvm::all_of(Def.all_uses(), [](const MachineOperand &MO) { + return MO.getReg().isVirtual(); + }); } // Identify the definition for this register at this point. This is a