forked from OSchip/llvm-project
Cache subregister relationships in a set in TargetRegisterInfo to allow faster lookups.
This speeds up LiveVariables from 0.6279s to 0.6165s on kimwitu++. llvm-svn: 52818
This commit is contained in:
parent
dc3f946137
commit
4f024862f6
|
@ -21,6 +21,7 @@
|
|||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include <cassert>
|
||||
#include <functional>
|
||||
#include <set>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
|
@ -285,6 +286,7 @@ private:
|
|||
regclass_iterator RegClassBegin, RegClassEnd; // List of regclasses
|
||||
|
||||
int CallFrameSetupOpcode, CallFrameDestroyOpcode;
|
||||
std::set<std::pair<unsigned, unsigned> > Subregs;
|
||||
protected:
|
||||
TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
|
||||
regclass_iterator RegClassBegin,
|
||||
|
@ -419,9 +421,7 @@ public:
|
|||
/// isSubRegister - Returns true if regB is a sub-register of regA.
|
||||
///
|
||||
bool isSubRegister(unsigned regA, unsigned regB) const {
|
||||
for (const unsigned *SR = getSubRegisters(regA); *SR; ++SR)
|
||||
if (*SR == regB) return true;
|
||||
return false;
|
||||
return Subregs.count(std::make_pair(regA, regB));
|
||||
}
|
||||
|
||||
/// isSuperRegister - Returns true if regB is a super-register of regA.
|
||||
|
|
|
@ -29,6 +29,16 @@ TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
|
|||
|
||||
CallFrameSetupOpcode = CFSO;
|
||||
CallFrameDestroyOpcode = CFDO;
|
||||
|
||||
for (unsigned i = 0; i < NumRegs; ++i) {
|
||||
const TargetRegisterDesc* CurrReg = Desc + i;
|
||||
|
||||
// Initialize the Subregs set, which stores pairs (a, b) where
|
||||
// b is a subreg of a.
|
||||
if (CurrReg->SubRegs)
|
||||
for (const unsigned* CurrSR = CurrReg->SubRegs; *CurrSR; ++CurrSR)
|
||||
Subregs.insert(std::make_pair(i, *CurrSR));
|
||||
}
|
||||
}
|
||||
|
||||
TargetRegisterInfo::~TargetRegisterInfo() {}
|
||||
|
|
Loading…
Reference in New Issue