mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
Fix the Convert to scalar to not insert dead loads in the store case. The
load is needed when we have a small store into a large alloca (at which point we get a load/insert/store sequence), but when you do a full-sized store, this load ends up being dead. This dead load is bad in really large nasty testcases where the load ends up causing mem2reg to insert large chains of dependent phi nodes which only ADCE can delete. Instead of doing this, just don't insert the dead load. This fixes rdar://6864035 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91917 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
97eee027f9
commit
aadadb3973
@ -1373,11 +1373,16 @@ void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, uint64_t Offset) {
|
||||
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
|
||||
assert(SI->getOperand(0) != Ptr && "Consistency error!");
|
||||
Value *Old = Builder.CreateLoad(NewAI, NewAI->getName()+".in");
|
||||
Instruction *Old = Builder.CreateLoad(NewAI, NewAI->getName()+".in");
|
||||
Value *New = ConvertScalar_InsertValue(SI->getOperand(0), Old, Offset,
|
||||
Builder);
|
||||
Builder.CreateStore(New, NewAI);
|
||||
SI->eraseFromParent();
|
||||
|
||||
// If the load we just inserted is now dead, then the inserted store
|
||||
// overwrote the entire thing.
|
||||
if (Old->use_empty())
|
||||
Old->eraseFromParent();
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1397,11 +1402,16 @@ void SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, uint64_t Offset) {
|
||||
for (unsigned i = 1; i != NumBytes; ++i)
|
||||
APVal |= APVal << 8;
|
||||
|
||||
Value *Old = Builder.CreateLoad(NewAI, NewAI->getName()+".in");
|
||||
Instruction *Old = Builder.CreateLoad(NewAI, NewAI->getName()+".in");
|
||||
Value *New = ConvertScalar_InsertValue(
|
||||
ConstantInt::get(User->getContext(), APVal),
|
||||
Old, Offset, Builder);
|
||||
Builder.CreateStore(New, NewAI);
|
||||
|
||||
// If the load we just inserted is now dead, then the memset overwrote
|
||||
// the entire thing.
|
||||
if (Old->use_empty())
|
||||
Old->eraseFromParent();
|
||||
}
|
||||
MSI->eraseFromParent();
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user