[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