Ignore instructions that are in trivially dead functions. This allows us
authorChris Lattner <sabre@nondot.org>
Tue, 20 Jul 2004 03:58:07 +0000 (03:58 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 20 Jul 2004 03:58:07 +0000 (03:58 +0000)
to constify 14 globals instead of 4 in a trivial C++ testcase.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15027 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/GlobalOpt.cpp

index 6f01f25f507478a2851383c202fbb9e93aa246f8..97518a34fabf6a95630ee94994d6d6af31709ba3 100644 (file)
@@ -39,6 +39,16 @@ namespace {
 
 Pass *llvm::createGlobalConstifierPass() { return new Constifier(); }
 
+/// A lot of global constants are stored only in trivially dead setter
+/// functions.  Because we don't want to cycle between globaldce and this pass,
+/// just do a simple check to catch the common case.
+static bool ContainingFunctionIsTriviallyDead(Instruction *I) {
+  Function *F = I->getParent()->getParent();
+  if (!F->hasInternalLinkage()) return false;
+  F->removeDeadConstantUsers();
+  return F->use_empty();
+}
+
 /// isStoredThrough - Return false if the specified pointer is provably never
 /// stored through.  If we can't tell, we must conservatively assume it might.
 ///
@@ -48,10 +58,13 @@ static bool isStoredThrough(Value *V) {
       if (isStoredThrough(CE))
         return true;
     } else if (Instruction *I = dyn_cast<Instruction>(*UI)) {
-      if (I->getOpcode() == Instruction::GetElementPtr) {
-        if (isStoredThrough(I)) return true;
-      } else if (!isa<LoadInst>(*UI) && !isa<SetCondInst>(*UI))
-        return true;  // Any other non-load instruction might store!
+      if (!ContainingFunctionIsTriviallyDead(I)) {
+        if (I->getOpcode() == Instruction::GetElementPtr) {
+          if (isStoredThrough(I)) return true;
+        } else if (!isa<LoadInst>(*UI) && !isa<SetCondInst>(*UI)) {
+          return true;  // Any other non-load instruction might store!
+        }
+      }
     } else {
       // Otherwise must be a global or some other user.
       return true;