Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -27,6 +27,7 @@ #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineModuleInfoImpls.h" +#include "llvm/CodeGen/MachineOperand.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Mangler.h" @@ -625,6 +626,7 @@ static void emitComments(const MachineInstr &MI, raw_ostream &CommentOS) { const MachineFunction *MF = MI.getParent()->getParent(); const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo(); + const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo(); // Check for spills and reloads int FI; @@ -655,6 +657,23 @@ // Check for spill-induced copies if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse)) CommentOS << " Reload Reuse\n"; + + if (MI.isCall()) { + const uint32_t *CalleeRegMask; + CommentOS << "Call Preserved Registers: "; + + for (const MachineOperand &MO : MI.operands()) + if (MO.isRegMask()) { + CalleeRegMask = MO.getRegMask(); + break; + } + + for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) { + if (!MachineOperand::clobbersPhysReg(CalleeRegMask, PReg)) + CommentOS << TRI->getName(PReg) << " "; + } + CommentOS << "\n"; + } } /// emitImplicitDef - This method emits the specified machine instruction Index: lib/CodeGen/RegUsageInfoCollector.cpp =================================================================== --- lib/CodeGen/RegUsageInfoCollector.cpp +++ lib/CodeGen/RegUsageInfoCollector.cpp @@ -86,8 +86,7 @@ bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) { MachineRegisterInfo *MRI = &MF.getRegInfo(); - TargetRegisterInfo *TRI = - (TargetRegisterInfo *)MF.getSubtarget().getRegisterInfo(); + const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); const TargetMachine &TM = MF.getTarget(); DEBUG(dbgs() << " -------------------- " << getPassName() @@ -107,17 +106,31 @@ PRUI->setTargetMachine(&TM); DEBUG(dbgs() << "Clobbered Registers: "); - for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) { + for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) if (!MRI->reg_nodbg_empty(PReg) && MRI->isPhysRegUsed(PReg)) markRegClobbered(TRI, &RegMask[0], PReg); - } const uint32_t *CallPreservedMask = TRI->getCallPreservedMask(MF, MF.getFunction()->getCallingConv()); // Set callee saved register as preserved. - for (unsigned index = 0; index < regMaskSize; index++) { + for (unsigned index = 0; index < regMaskSize; index++) RegMask[index] = RegMask[index] | CallPreservedMask[index]; + + for (MachineBasicBlock &MBB : MF) { + for (MachineInstr &MI : MBB) { + if (!MI.isCall()) + continue; + for (MachineOperand &MO : MI.operands()) { + if (MO.isRegMask()) { + const uint32_t *CalleeRegMask = MO.getRegMask(); + for (unsigned index = 0; index < regMaskSize; index++) + RegMask[index] = RegMask[index] & CalleeRegMask[index]; + break; + } + } + } } + for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) { if (MachineOperand::clobbersPhysReg(&(RegMask[0]), PReg)) DEBUG(dbgs() << TRI->getName(PReg) << " ");