diff options
author | Chris Lattner <sabre@nondot.org> | 2007-01-09 23:29:37 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-01-09 23:29:37 +0000 |
commit | 39ff1e2afc07acf4c29af48853b09e15c41875d2 (patch) | |
tree | 20d0538dc641a01c796c82dfbeb6f64a16587168 /lib/Transforms/IPO/GlobalOpt.cpp | |
parent | 19b569fc08dbd968ce96149dac87857e4f336918 (diff) |
Fix a bug in heap-sra that caused compilation failure of office-ispell.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33043 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO/GlobalOpt.cpp')
-rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index e17ded82d9..f25621eb78 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -1016,9 +1016,25 @@ static GlobalVariable *PerformHeapAllocSRoA(GlobalVariable *GV, MallocInst *MI){ // loads, and all uses of those loads are simple. Rewrite them to use loads // of the per-field globals instead. while (!GV->use_empty()) { - LoadInst *LI = cast<LoadInst>(GV->use_back()); - RewriteUsesOfLoadForHeapSRoA(LI, FieldGlobals); - LI->eraseFromParent(); + if (LoadInst *LI = dyn_cast<LoadInst>(GV->use_back())) { + RewriteUsesOfLoadForHeapSRoA(LI, FieldGlobals); + LI->eraseFromParent(); + } else { + // Must be a store of null. + StoreInst *SI = cast<StoreInst>(GV->use_back()); + assert(isa<Constant>(SI->getOperand(0)) && + cast<Constant>(SI->getOperand(0))->isNullValue() && + "Unexpected heap-sra user!"); + + // Insert a store of null into each global. + for (unsigned i = 0, e = FieldGlobals.size(); i != e; ++i) { + Constant *Null = + Constant::getNullValue(FieldGlobals[i]->getType()->getElementType()); + new StoreInst(Null, FieldGlobals[i], SI); + } + // Erase the original store. + SI->eraseFromParent(); + } } // The old global is now dead, remove it. |