aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/DataStructureOpt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Analysis/DataStructure/DataStructureOpt.cpp')
-rw-r--r--lib/Analysis/DataStructure/DataStructureOpt.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/Analysis/DataStructure/DataStructureOpt.cpp b/lib/Analysis/DataStructure/DataStructureOpt.cpp
index ad5b8947ed..297979a72a 100644
--- a/lib/Analysis/DataStructure/DataStructureOpt.cpp
+++ b/lib/Analysis/DataStructure/DataStructureOpt.cpp
@@ -14,6 +14,8 @@
namespace {
Statistic<>
NumGlobalsConstanted("ds-opt", "Number of globals marked constant");
+ Statistic<>
+ NumGlobalsIsolated("ds-opt", "Number of globals with references dropped");
class DSOpt : public Pass {
TDDataStructures *TD;
@@ -60,8 +62,21 @@ bool DSOpt::OptimizeGlobals(Module &M) {
// can delete it. We don't ACTUALLY want to delete the global, just
// remove anything that references the global: later passes will take
// care of nuking it.
- I->replaceAllUsesWith(Constant::getNullValue((Type*)I->getType()));
+ if (!I->use_empty()) {
+ I->replaceAllUsesWith(Constant::getNullValue((Type*)I->getType()));
+ ++NumGlobalsIsolated;
+ }
} else if (GNode && GNode->isComplete()) {
+
+ // If the node has not been read or written, and it is not externally
+ // visible, kill any references to it so it can be DCE'd.
+ if (!GNode->isModified() && !GNode->isRead() &&I->hasInternalLinkage()){
+ if (!I->use_empty()) {
+ I->replaceAllUsesWith(Constant::getNullValue((Type*)I->getType()));
+ ++NumGlobalsIsolated;
+ }
+ }
+
// We expect that there will almost always be a node for this global.
// If there is, and the node doesn't have the M bit set, we can set the
// 'constant' bit on the global.