aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-12-02 06:25:58 +0000
committerChris Lattner <sabre@nondot.org>2004-12-02 06:25:58 +0000
commitbc965b97ade56092b5fe4251eb68695271f1d82a (patch)
treee9c0d46a40297cd32137cea7d667a69344c7ab8e /lib/Transforms
parentcda35f824b1fc4a22bd796b07426f6e8e44c3d69 (diff)
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18417 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/IPO/GlobalOpt.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index b8edc32f16..db2d0b3535 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/lib/Transforms/IPO/GlobalOpt.cpp
@@ -670,9 +670,13 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
// 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 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
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 @@ static GlobalVariable *OptimizeGlobalAddressOfMalloc(GlobalVariable *GV,
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();