mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
Rearrange operands of the BranchInst, to be able to
access each with a fixed negative index from op_end(). This has two important implications: - getUser() will work faster, because there are less iterations for the waymarking algorithm to perform. This is important when running various analyses that want to determine callers of basic blocks. - getSuccessor() now runs faster, because the indirection via OperandList is not necessary: Uses corresponding to the successors are at fixed offset to "this". The price we pay is the slightly more complicated logic in the operator User::delete, as it has to pick up the information whether it has to free the memory of an original unconditional BranchInst or a BranchInst that was originally conditional, but has been shortened to unconditional. I was not able to come up with a nicer solution to this problem. (And rest assured, I tried *a lot*). Similar reorderings will follow for InvokeInst and CallInst. After that some optimizations to pred_iterator and CallSite will fall out naturally. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66815 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -163,4 +163,71 @@ Use *User::allocHungoffUses(unsigned N) const {
|
||||
return Use::initTags(Begin, End);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// User operator new Implementations
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void *User::operator new(size_t s, unsigned Us) {
|
||||
void *Storage = ::operator new(s + sizeof(Use) * Us);
|
||||
Use *Start = static_cast<Use*>(Storage);
|
||||
Use *End = Start + Us;
|
||||
User *Obj = reinterpret_cast<User*>(End);
|
||||
Obj->OperandList = Start;
|
||||
Obj->NumOperands = Us;
|
||||
Use::initTags(Start, End);
|
||||
return Obj;
|
||||
}
|
||||
|
||||
/// Prefixed allocation - just before the first Use, allocate a NULL pointer.
|
||||
/// The destructor can detect its presence and readjust the OperandList
|
||||
/// for deletition.
|
||||
///
|
||||
void *User::operator new(size_t s, unsigned Us, bool Prefix) {
|
||||
// currently prefixed allocation only admissible for
|
||||
// unconditional branch instructions
|
||||
if (!Prefix)
|
||||
return operator new(s, Us);
|
||||
|
||||
assert(Us == 1 && "Other than one Use allocated?");
|
||||
typedef PointerIntPair<void*, 2, Use::PrevPtrTag> TaggedPrefix;
|
||||
void *Raw = ::operator new(s + sizeof(TaggedPrefix) + sizeof(Use) * Us);
|
||||
TaggedPrefix *Pre = static_cast<TaggedPrefix*>(Raw);
|
||||
Pre->setFromOpaqueValue(0);
|
||||
void *Storage = Pre + 1; // skip over prefix
|
||||
Use *Start = static_cast<Use*>(Storage);
|
||||
Use *End = Start + Us;
|
||||
User *Obj = reinterpret_cast<User*>(End);
|
||||
Obj->OperandList = Start;
|
||||
Obj->NumOperands = Us;
|
||||
Use::initTags(Start, End);
|
||||
return Obj;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// User operator delete Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void User::operator delete(void *Usr) {
|
||||
User *Start = static_cast<User*>(Usr);
|
||||
Use *Storage = static_cast<Use*>(Usr) - Start->NumOperands;
|
||||
//
|
||||
// look for a variadic User
|
||||
if (Storage == Start->OperandList) {
|
||||
::operator delete(Storage);
|
||||
return;
|
||||
}
|
||||
//
|
||||
// check for the flag whether the destructor has detected a prefixed
|
||||
// allocation, in which case we remove the flag and delete starting
|
||||
// at OperandList
|
||||
if (reinterpret_cast<intptr_t>(Start->OperandList) & 1) {
|
||||
::operator delete(reinterpret_cast<char*>(Start->OperandList) - 1);
|
||||
return;
|
||||
}
|
||||
//
|
||||
// in all other cases just delete the nullary User (covers hung-off
|
||||
// uses also
|
||||
::operator delete(Usr);
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
Reference in New Issue
Block a user