mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-02 16:54:58 +00:00
Go back to allocating memory for each constant separately. Since SPARCs do not
allow unaligned loads, that is probably the problem I've been seeing in numerous SPARC test cases failing. X86, on the other hand, just slows down unaligned accesses, since it must make 2 aligned accesses for each unaligned one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10266 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
043b9722f5
commit
91de352796
@ -187,28 +187,13 @@ void Emitter::finishFunction(MachineFunction &F) {
|
||||
|
||||
void Emitter::emitConstantPool(MachineConstantPool *MCP) {
|
||||
const std::vector<Constant*> &Constants = MCP->getConstants();
|
||||
if (Constants.size() == 0) return;
|
||||
|
||||
std::vector<unsigned> ConstantSizes;
|
||||
unsigned TotalSize = 0;
|
||||
// Calculate how much space we will need for all the constants
|
||||
for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
|
||||
// For now we just allocate some memory on the heap, this can be
|
||||
// dramatically improved.
|
||||
const Type *Ty = ((Value*)Constants[i])->getType();
|
||||
unsigned TySize = TheVM->getTargetData().getTypeSize(Ty);
|
||||
ConstantSizes.push_back(TySize);
|
||||
TotalSize += TySize;
|
||||
}
|
||||
// Allocate a 'pool' of memory just once
|
||||
void *ConstPool = malloc(TotalSize);
|
||||
if (!ConstPool) {
|
||||
perror("malloc");
|
||||
abort();
|
||||
}
|
||||
// Initialize each slot in the 'pool' appropriately
|
||||
for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
|
||||
TheVM->InitializeMemory(Constants[i], ConstPool);
|
||||
ConstantPoolAddresses.push_back(ConstPool);
|
||||
ConstPool = (void*) ((intptr_t)ConstPool + ConstantSizes[i]);
|
||||
void *Addr = malloc(TheVM->getTargetData().getTypeSize(Ty));
|
||||
TheVM->InitializeMemory(Constants[i], Addr);
|
||||
ConstantPoolAddresses.push_back(Addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user