//===- DataStructureOpt.cpp - Data Structure Analysis Based Optimizations -===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
//
// This pass uses DSA to a series of simple optimizations, like marking
// unwritten global variables 'constant'.
#include "llvm/Module.h"
#include "llvm/Constant.h"
#include "Support/Statistic.h"
+using namespace llvm;
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;
RegisterOpt<DSOpt> X("ds-opt", "DSA-based simple optimizations");
}
-
/// OptimizeGlobals - This method uses information taken from DSA to optimize
/// global variables.
///
// 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.