mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-17 08:36:52 +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 llvm-svn: 91917
This commit is contained in:
parent
0fbb62fcc5
commit
4a7bce50b8
@ -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