[llvm-commits] CVS: llvm/lib/Transforms/IPO/GlobalOpt.cpp
Chris Lattner
sabre at nondot.org
Tue Jan 9 15:29:55 PST 2007
Changes in directory llvm/lib/Transforms/IPO:
GlobalOpt.cpp updated: 1.82 -> 1.83
---
Log message:
Fix a bug in heap-sra that caused compilation failure of office-ispell.
---
Diffs of the changes: (+19 -3)
GlobalOpt.cpp | 22 +++++++++++++++++++---
1 files changed, 19 insertions(+), 3 deletions(-)
Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp
diff -u llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.82 llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.83
--- llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.82 Sat Dec 30 23:48:39 2006
+++ llvm/lib/Transforms/IPO/GlobalOpt.cpp Tue Jan 9 17:29:37 2007
@@ -1016,9 +1016,25 @@
// 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.
More information about the llvm-commits
mailing list