[llvm-commits] CVS: llvm/lib/Transforms/IPO/GlobalOpt.cpp
Chris Lattner
lattner at cs.uiuc.edu
Wed Dec 1 22:26:12 PST 2004
Changes in directory llvm/lib/Transforms/IPO:
GlobalOpt.cpp updated: 1.27 -> 1.28
---
Log message:
Fix a minor bug where we set a var to initialized on malloc, not on store.
This doesn't fix anything that I'm aware of, just noticed it by inspection
---
Diffs of the changes: (+17 -10)
Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp
diff -u llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.27 llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.28
--- llvm/lib/Transforms/IPO/GlobalOpt.cpp:1.27 Sun Nov 14 14:50:30 2004
+++ llvm/lib/Transforms/IPO/GlobalOpt.cpp Thu Dec 2 00:25:58 2004
@@ -670,9 +670,13 @@
// If there is a comparison against null, we will insert a global bool to
// keep track of whether the global was initialized yet or not.
- GlobalVariable *InitBool = 0;
+ GlobalVariable *InitBool =
+ new GlobalVariable(Type::BoolTy, false, GlobalValue::InternalLinkage,
+ ConstantBool::False, GV->getName()+".init");
+ bool InitBoolUsed = false;
// Loop over all uses of GV, processing them in turn.
+ std::vector<StoreInst*> Stores;
while (!GV->use_empty())
if (LoadInst *LI = dyn_cast<LoadInst>(GV->use_back())) {
while (!LI->use_empty()) {
@@ -681,18 +685,10 @@
if (!isa<SetCondInst>(LoadUse.getUser()))
LoadUse = RepValue;
else {
- if (InitBool == 0) {
- InitBool = new GlobalVariable(Type::BoolTy, false,
- GlobalValue::InternalLinkage,
- ConstantBool::False,
- GV->getName()+".init");
- GV->getParent()->getGlobalList().insert(GV, InitBool);
- // The global is initialized when the malloc is run.
- new StoreInst(ConstantBool::True, InitBool, MI);
- }
// Replace the setcc X, 0 with a use of the bool value.
SetCondInst *SCI = cast<SetCondInst>(LoadUse.getUser());
Value *LV = new LoadInst(InitBool, InitBool->getName()+".val", SCI);
+ InitBoolUsed = true;
switch (SCI->getOpcode()) {
default: assert(0 && "Unknown opcode!");
case Instruction::SetLT:
@@ -714,9 +710,20 @@
LI->eraseFromParent();
} else {
StoreInst *SI = cast<StoreInst>(GV->use_back());
+ // The global is initialized when the store to it occurs.
+ new StoreInst(ConstantBool::True, InitBool, SI);
SI->eraseFromParent();
}
+ // If the initialization boolean was used, insert it, otherwise delete it.
+ if (!InitBoolUsed) {
+ while (!InitBool->use_empty()) // Delete initializations
+ cast<Instruction>(InitBool->use_back())->eraseFromParent();
+ delete InitBool;
+ } else
+ GV->getParent()->getGlobalList().insert(GV, InitBool);
+
+
// Now the GV is dead, nuke it and the malloc.
GV->eraseFromParent();
MI->eraseFromParent();
More information about the llvm-commits
mailing list