aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-08-11 23:55:53 +0000
committerChris Lattner <sabre@nondot.org>2006-08-11 23:55:53 +0000
commit7ed9ea81f8b4ec26c27da73ea9ad0e84337a3e4a (patch)
treeacdfd2cbea293d34ad59af91a277f73039af1faf /lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp
parentf42d1ddb18132ff3be2e7fbff24dace5415216da (diff)
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
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp24
1 files changed, 9 insertions, 15 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp
index 6fc6a48b1e..0a02333522 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGCSEMap.cpp
@@ -105,21 +105,15 @@ void SelectionDAGCSEMap::NodeID::AddPointer(const void *Ptr) {
// on the host. It doesn't matter however, because hashing on pointer values
// in inherently unstable. Nothing in the SelectionDAG should depend on the
// ordering of nodes in the CSEMap.
- union {
- intptr_t PtrI;
- unsigned char PtrA[sizeof(intptr_t)];
- };
- PtrI = (intptr_t)Ptr;
- Bits.append(PtrA, PtrA+sizeof(intptr_t));
+ intptr_t PtrI = (intptr_t)Ptr;
+ Bits.push_back(unsigned(PtrI));
+ if (sizeof(intptr_t) > sizeof(unsigned))
+ Bits.push_back(unsigned(uint64_t(PtrI) >> 32));
}
void SelectionDAGCSEMap::NodeID::AddOperand(SDOperand Op) {
AddPointer(Op.Val);
- // 2 bytes of resno might be too small, three should certainly be enough. :)
- 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);
+ Bits.push_back(Op.ResNo);
}
void SelectionDAGCSEMap::NodeID::SetOperands(const SDOperand *Ops,
@@ -135,13 +129,13 @@ unsigned SelectionDAGCSEMap::NodeID::ComputeHash() const {
// FIXME: this hash function sucks.
unsigned Hash = 0;
for (unsigned i = 0, e = Bits.size(); i != e; ++i)
- Hash += Bits[i];
+ Hash = Hash+Bits[i];
return Hash;
}
bool SelectionDAGCSEMap::NodeID::operator==(const NodeID &RHS) const {
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) {
- assert(NextInBucketPtr >= Buckets && NextInBucketPtr < Buckets+NumBuckets &&
- "NextInBucketPtr is not a bucket ptr");
+ //assert(NextInBucketPtr >= Buckets && NextInBucketPtr < Buckets+NumBuckets &&
+ // "NextInBucketPtr is not a bucket ptr");
return static_cast<void**>(NextInBucketPtr);
}