forked from OSchip/llvm-project
Use an IndexedMap for LiveOutRegInfo to hide its dependence on TargetRegisterInfo::FirstVirtualRegister.
llvm-svn: 123096
This commit is contained in:
parent
a50dd46ee8
commit
793d7b7626
|
@ -65,6 +65,10 @@ namespace llvm {
|
|||
storage_.resize(NewSize, nullVal_);
|
||||
}
|
||||
|
||||
bool inBounds(IndexT n) const {
|
||||
return toIndex_(n) < storage_.size();
|
||||
}
|
||||
|
||||
typename StorageT::size_type size() const {
|
||||
return storage_.size();
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "llvm/Instructions.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/IndexedMap.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#ifndef NDEBUG
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
|
@ -27,6 +28,7 @@
|
|||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/Support/CallSite.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
|
@ -104,9 +106,8 @@ public:
|
|||
LiveOutInfo() : NumSignBits(0), KnownOne(1, 0), KnownZero(1, 0) {}
|
||||
};
|
||||
|
||||
/// LiveOutRegInfo - Information about live out vregs, indexed by their
|
||||
/// register number offset by 'FirstVirtualRegister'.
|
||||
std::vector<LiveOutInfo> LiveOutRegInfo;
|
||||
/// LiveOutRegInfo - Information about live out vregs.
|
||||
IndexedMap<LiveOutInfo, VirtReg2IndexFunctor> LiveOutRegInfo;
|
||||
|
||||
/// PHINodesToUpdate - A list of phi instructions whose operand list will
|
||||
/// be updated after processing the current basic block.
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/Analysis/DebugInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetFrameInfo.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
|
@ -642,14 +641,12 @@ SDValue RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
|
|||
// If the source register was virtual and if we know something about it,
|
||||
// add an assert node.
|
||||
if (!TargetRegisterInfo::isVirtualRegister(Regs[Part+i]) ||
|
||||
!RegisterVT.isInteger() || RegisterVT.isVector())
|
||||
!RegisterVT.isInteger() || RegisterVT.isVector() ||
|
||||
!FuncInfo.LiveOutRegInfo.inBounds(Regs[Part+i]))
|
||||
continue;
|
||||
|
||||
unsigned SlotNo = Regs[Part+i]-TargetRegisterInfo::FirstVirtualRegister;
|
||||
if (SlotNo >= FuncInfo.LiveOutRegInfo.size()) continue;
|
||||
|
||||
const FunctionLoweringInfo::LiveOutInfo &LOI =
|
||||
FuncInfo.LiveOutRegInfo[SlotNo];
|
||||
FuncInfo.LiveOutRegInfo[Regs[Part+i]];
|
||||
|
||||
unsigned RegSize = RegisterVT.getSizeInBits();
|
||||
unsigned NumSignBits = LOI.NumSignBits;
|
||||
|
|
|
@ -482,9 +482,7 @@ void SelectionDAGISel::ComputeLiveOutVRegInfo() {
|
|||
|
||||
// Only install this information if it tells us something.
|
||||
if (NumSignBits != 1 || KnownZero != 0 || KnownOne != 0) {
|
||||
DestReg -= TargetRegisterInfo::FirstVirtualRegister;
|
||||
if (DestReg >= FuncInfo->LiveOutRegInfo.size())
|
||||
FuncInfo->LiveOutRegInfo.resize(DestReg+1);
|
||||
FuncInfo->LiveOutRegInfo.grow(DestReg);
|
||||
FunctionLoweringInfo::LiveOutInfo &LOI =
|
||||
FuncInfo->LiveOutRegInfo[DestReg];
|
||||
LOI.NumSignBits = NumSignBits;
|
||||
|
|
Loading…
Reference in New Issue