diff --git a/include/llvm/CodeGen/MachineFunction.h b/include/llvm/CodeGen/MachineFunction.h index d9afd8d65f4..4810742b073 100644 --- a/include/llvm/CodeGen/MachineFunction.h +++ b/include/llvm/CodeGen/MachineFunction.h @@ -108,7 +108,10 @@ class MachineFunction : private Annotation { /// LiveIns/LiveOuts - Keep track of the physical registers that are /// livein/liveout of the function. Live in values are typically arguments in /// registers, live out values are typically return values in registers. - std::vector LiveIns, LiveOuts; + /// LiveIn values are allowed to have virtual registers associated with them, + /// stored in the second element. + std::vector > LiveIns; + std::vector LiveOuts; public: MachineFunction(const Function *Fn, const TargetMachine &TM); @@ -177,16 +180,20 @@ public: /// addLiveIn/Out - Add the specified register as a live in/out. Note that it /// is an error to add the same register to the same set more than once. - void addLiveIn(unsigned Reg) { LiveIns.push_back(Reg); } + void addLiveIn(unsigned Reg, unsigned vreg = 0) { + LiveIns.push_back(std::make_pair(Reg, vreg)); + } void addLiveOut(unsigned Reg) { LiveOuts.push_back(Reg); } // Iteration support for live in/out sets. These sets are kept in sorted // order by their register number. - typedef std::vector::const_iterator liveinout_iterator; - liveinout_iterator livein_begin() const { return LiveIns.begin(); } - liveinout_iterator livein_end() const { return LiveIns.end(); } - liveinout_iterator liveout_begin() const { return LiveOuts.begin(); } - liveinout_iterator liveout_end() const { return LiveOuts.end(); } + typedef std::vector >::const_iterator + livein_iterator; + typedef std::vector::const_iterator liveout_iterator; + livein_iterator livein_begin() const { return LiveIns.begin(); } + livein_iterator livein_end() const { return LiveIns.end(); } + liveout_iterator liveout_begin() const { return LiveOuts.begin(); } + liveout_iterator liveout_end() const { return LiveOuts.end(); } /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they /// are inserted into the machine function. The block number for a machine diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 405d9ec6504..d75bf3fb0ef 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -95,7 +95,7 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { // beginning of the function that we will pretend "defines" the values. This // is to make the interval analysis simpler by providing a number. if (fn.livein_begin() != fn.livein_end()) { - unsigned FirstLiveIn = *fn.livein_begin(); + unsigned FirstLiveIn = fn.livein_begin()->first; // Find a reg class that contains this live in. const TargetRegisterClass *RC = 0; @@ -128,11 +128,11 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { // Note intervals due to live-in values. if (fn.livein_begin() != fn.livein_end()) { MachineBasicBlock *Entry = fn.begin(); - for (MachineFunction::liveinout_iterator I = fn.livein_begin(), + for (MachineFunction::livein_iterator I = fn.livein_begin(), E = fn.livein_end(); I != E; ++I) { handlePhysicalRegisterDef(Entry, Entry->begin(), - getOrCreateInterval(*I), 0, 0); - for (const unsigned* AS = mri_->getAliasSet(*I); *AS; ++AS) + getOrCreateInterval(I->first), 0, 0); + for (const unsigned* AS = mri_->getAliasSet(I->first); *AS; ++AS) handlePhysicalRegisterDef(Entry, Entry->begin(), getOrCreateInterval(*AS), 0, 0); } diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp index 94380ff542d..c11e00f0c8d 100644 --- a/lib/CodeGen/LiveVariables.cpp +++ b/lib/CodeGen/LiveVariables.cpp @@ -165,11 +165,11 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) { VirtRegInfo.resize(64); // Mark live-in registers as live-in. - for (MachineFunction::liveinout_iterator I = MF.livein_begin(), + for (MachineFunction::livein_iterator I = MF.livein_begin(), E = MF.livein_end(); I != E; ++I) { - assert(MRegisterInfo::isPhysicalRegister(*I) && + assert(MRegisterInfo::isPhysicalRegister(I->first) && "Cannot have a live-in virtual register!"); - HandlePhysRegDef(*I, 0); + HandlePhysRegDef(I->first, 0); } // Calculate live variable information in depth first order on the CFG of the @@ -272,7 +272,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) { // it as using all of the live-out values in the function. if (!MBB->empty() && TII.isReturn(MBB->back().getOpcode())) { MachineInstr *Ret = &MBB->back(); - for (MachineFunction::liveinout_iterator I = MF.liveout_begin(), + for (MachineFunction::liveout_iterator I = MF.liveout_begin(), E = MF.liveout_end(); I != E; ++I) { assert(MRegisterInfo::isPhysicalRegister(*I) && "Cannot have a live-in virtual register!");