LiveRangeEdit.cpp revision a17768f5822ab62bc18608e5ba473187bf726b84
1//===--- LiveRangeEdit.cpp - Basic tools for editing a register live range --===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// The LiveRangeEdit class represents changes done to a virtual register when it 11// is spilled or split. 12//===----------------------------------------------------------------------===// 13 14#include "LiveRangeEdit.h" 15#include "VirtRegMap.h" 16#include "llvm/CodeGen/LiveIntervalAnalysis.h" 17#include "llvm/CodeGen/MachineRegisterInfo.h" 18 19using namespace llvm; 20 21LiveInterval &LiveRangeEdit::create(MachineRegisterInfo &mri, 22 LiveIntervals &lis, 23 VirtRegMap &vrm) { 24 const TargetRegisterClass *RC = mri.getRegClass(parent_.reg); 25 unsigned VReg = mri.createVirtualRegister(RC); 26 vrm.grow(); 27 LiveInterval &li = lis.getOrCreateInterval(VReg); 28 newRegs_.push_back(&li); 29 return li; 30} 31 32/// allUsesAvailableAt - Return true if all registers used by OrigMI at 33/// OrigIdx are also available with the same value at UseIdx. 34bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI, 35 SlotIndex OrigIdx, 36 SlotIndex UseIdx, 37 LiveIntervals &lis) { 38 OrigIdx = OrigIdx.getUseIndex(); 39 UseIdx = UseIdx.getUseIndex(); 40 for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) { 41 const MachineOperand &MO = OrigMI->getOperand(i); 42 if (!MO.isReg() || !MO.getReg() || MO.getReg() == getReg()) 43 continue; 44 // Reserved registers are OK. 45 if (MO.isUndef() || !lis.hasInterval(MO.getReg())) 46 continue; 47 // We don't want to move any defs. 48 if (MO.isDef()) 49 return false; 50 // We cannot depend on virtual registers in uselessRegs_. 51 for (unsigned ui = 0, ue = uselessRegs_.size(); ui != ue; ++ui) 52 if (uselessRegs_[ui]->reg == MO.getReg()) 53 return false; 54 55 LiveInterval &li = lis.getInterval(MO.getReg()); 56 const VNInfo *OVNI = li.getVNInfoAt(OrigIdx); 57 if (!OVNI) 58 continue; 59 if (OVNI != li.getVNInfoAt(UseIdx)) 60 return false; 61 } 62 return true; 63} 64 65