mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-27 17:31:33 +00:00
Switch NodeID to track 32-bit chunks instead of 8-bit chunks, for a 2.5%
speedup in isel time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29640 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f42d1ddb18
commit
7ed9ea81f8
@ -63,7 +63,7 @@ namespace llvm {
|
|||||||
class NodeID {
|
class NodeID {
|
||||||
/// Use a SmallVector to avoid a heap allocation in the common case.
|
/// Use a SmallVector to avoid a heap allocation in the common case.
|
||||||
///
|
///
|
||||||
SmallVector<unsigned char, 256> Bits;
|
SmallVector<unsigned, 32> Bits;
|
||||||
public:
|
public:
|
||||||
NodeID() {}
|
NodeID() {}
|
||||||
NodeID(SDNode *N);
|
NodeID(SDNode *N);
|
||||||
@ -77,13 +77,13 @@ namespace llvm {
|
|||||||
const SDOperand *OpList, unsigned N);
|
const SDOperand *OpList, unsigned N);
|
||||||
|
|
||||||
void SetOpcode(unsigned short ID) {
|
void SetOpcode(unsigned short ID) {
|
||||||
Bits.push_back(ID & 0xFF);
|
Bits.push_back(ID);
|
||||||
Bits.push_back(ID >> 8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getOpcode - If the opcode has been set for this NodeID, return it.
|
/// getOpcode - Return the opcode that has been set for this NodeID.
|
||||||
|
///
|
||||||
unsigned getOpcode() const {
|
unsigned getOpcode() const {
|
||||||
return Bits[0] + (Bits[1] << 8);
|
return Bits[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetValueTypes(const void *VTList) { AddPointer(VTList); }
|
void SetValueTypes(const void *VTList) { AddPointer(VTList); }
|
||||||
@ -99,21 +99,14 @@ namespace llvm {
|
|||||||
void AddOperand(SDOperand Op);
|
void AddOperand(SDOperand Op);
|
||||||
void AddPointer(const void *Ptr);
|
void AddPointer(const void *Ptr);
|
||||||
void AddInteger(signed I) {
|
void AddInteger(signed I) {
|
||||||
Bits.push_back((I >> 0) & 0xFF);
|
Bits.push_back(I);
|
||||||
Bits.push_back((I >> 8) & 0xFF);
|
|
||||||
Bits.push_back((I >> 16) & 0xFF);
|
|
||||||
Bits.push_back((I >> 24) & 0xFF);
|
|
||||||
}
|
}
|
||||||
void AddInteger(unsigned I) {
|
void AddInteger(unsigned I) {
|
||||||
AddInteger((signed)I);
|
Bits.push_back(I);
|
||||||
}
|
}
|
||||||
void AddInteger(uint64_t I) {
|
void AddInteger(uint64_t I) {
|
||||||
union {
|
Bits.push_back(unsigned(I));
|
||||||
uint64_t x;
|
Bits.push_back(unsigned(I >> 32));
|
||||||
unsigned char A[8];
|
|
||||||
};
|
|
||||||
x = I;
|
|
||||||
Bits.append(A, A+8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned ComputeHash() const;
|
unsigned ComputeHash() const;
|
||||||
|
@ -105,21 +105,15 @@ void SelectionDAGCSEMap::NodeID::AddPointer(const void *Ptr) {
|
|||||||
// on the host. It doesn't matter however, because hashing on pointer values
|
// on the host. It doesn't matter however, because hashing on pointer values
|
||||||
// in inherently unstable. Nothing in the SelectionDAG should depend on the
|
// in inherently unstable. Nothing in the SelectionDAG should depend on the
|
||||||
// ordering of nodes in the CSEMap.
|
// ordering of nodes in the CSEMap.
|
||||||
union {
|
intptr_t PtrI = (intptr_t)Ptr;
|
||||||
intptr_t PtrI;
|
Bits.push_back(unsigned(PtrI));
|
||||||
unsigned char PtrA[sizeof(intptr_t)];
|
if (sizeof(intptr_t) > sizeof(unsigned))
|
||||||
};
|
Bits.push_back(unsigned(uint64_t(PtrI) >> 32));
|
||||||
PtrI = (intptr_t)Ptr;
|
|
||||||
Bits.append(PtrA, PtrA+sizeof(intptr_t));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionDAGCSEMap::NodeID::AddOperand(SDOperand Op) {
|
void SelectionDAGCSEMap::NodeID::AddOperand(SDOperand Op) {
|
||||||
AddPointer(Op.Val);
|
AddPointer(Op.Val);
|
||||||
// 2 bytes of resno might be too small, three should certainly be enough. :)
|
Bits.push_back(Op.ResNo);
|
||||||
assert(Op.ResNo < (1 << 24) && "ResNo too large for CSE Map to handle!");
|
|
||||||
Bits.push_back((Op.ResNo >> 0) & 0xFF);
|
|
||||||
Bits.push_back((Op.ResNo >> 8) & 0xFF);
|
|
||||||
Bits.push_back((Op.ResNo >> 16) & 0xFF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionDAGCSEMap::NodeID::SetOperands(const SDOperand *Ops,
|
void SelectionDAGCSEMap::NodeID::SetOperands(const SDOperand *Ops,
|
||||||
@ -135,13 +129,13 @@ unsigned SelectionDAGCSEMap::NodeID::ComputeHash() const {
|
|||||||
// FIXME: this hash function sucks.
|
// FIXME: this hash function sucks.
|
||||||
unsigned Hash = 0;
|
unsigned Hash = 0;
|
||||||
for (unsigned i = 0, e = Bits.size(); i != e; ++i)
|
for (unsigned i = 0, e = Bits.size(); i != e; ++i)
|
||||||
Hash += Bits[i];
|
Hash = Hash+Bits[i];
|
||||||
return Hash;
|
return Hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SelectionDAGCSEMap::NodeID::operator==(const NodeID &RHS) const {
|
bool SelectionDAGCSEMap::NodeID::operator==(const NodeID &RHS) const {
|
||||||
if (Bits.size() != RHS.Bits.size()) return false;
|
if (Bits.size() != RHS.Bits.size()) return false;
|
||||||
return memcmp(&Bits[0], &RHS.Bits[0], Bits.size()) == 0;
|
return memcmp(&Bits[0], &RHS.Bits[0], Bits.size()*sizeof(Bits[0])) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -169,8 +163,8 @@ SDNode *SelectionDAGCSEMap::GetNextPtr(void *NextInBucketPtr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void **SelectionDAGCSEMap::GetBucketPtr(void *NextInBucketPtr) {
|
void **SelectionDAGCSEMap::GetBucketPtr(void *NextInBucketPtr) {
|
||||||
assert(NextInBucketPtr >= Buckets && NextInBucketPtr < Buckets+NumBuckets &&
|
//assert(NextInBucketPtr >= Buckets && NextInBucketPtr < Buckets+NumBuckets &&
|
||||||
"NextInBucketPtr is not a bucket ptr");
|
// "NextInBucketPtr is not a bucket ptr");
|
||||||
return static_cast<void**>(NextInBucketPtr);
|
return static_cast<void**>(NextInBucketPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user