forked from OSchip/llvm-project
[PM] Port EliminateAvailableExternally pass to the new pass manager.
llvm-svn: 268599
This commit is contained in:
parent
ca16c104c6
commit
344e838fea
|
@ -136,7 +136,7 @@ void initializeDataFlowSanitizerPass(PassRegistry&);
|
|||
void initializeEfficiencySanitizerPass(PassRegistry&);
|
||||
void initializeScalarizerPass(PassRegistry&);
|
||||
void initializeEarlyCSELegacyPassPass(PassRegistry &);
|
||||
void initializeEliminateAvailableExternallyPass(PassRegistry&);
|
||||
void initializeEliminateAvailableExternallyLegacyPassPass(PassRegistry &);
|
||||
void initializeExpandISelPseudosPass(PassRegistry&);
|
||||
void initializeForceFunctionAttrsLegacyPassPass(PassRegistry&);
|
||||
void initializeGCMachineCodeAnalysisPass(PassRegistry&);
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
//===- ElimAvailExtern.h - Optimize Global Variables ------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This transform is designed to eliminate available external global
|
||||
// definitions from the program, turning them into declarations.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_IPO_ELIMAVAILEXTERN_H
|
||||
#define LLVM_TRANSFORMS_IPO_ELIMAVAILEXTERN_H
|
||||
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// A pass that transforms external global definitions into declarations.
|
||||
class EliminateAvailableExternallyPass
|
||||
: public PassInfoMixin<EliminateAvailableExternallyPass> {
|
||||
public:
|
||||
PreservedAnalyses run(Module &M);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // LLVM_TRANSFORMS_IPO_ELIMAVAILEXTERN_H
|
|
@ -46,6 +46,7 @@
|
|||
#include "llvm/Support/Regex.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Transforms/IPO/ConstantMerge.h"
|
||||
#include "llvm/Transforms/IPO/ElimAvailExtern.h"
|
||||
#include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
|
||||
#include "llvm/Transforms/IPO/FunctionAttrs.h"
|
||||
#include "llvm/Transforms/IPO/GlobalDCE.h"
|
||||
|
|
|
@ -36,6 +36,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", GlobalsAA())
|
|||
#define MODULE_PASS(NAME, CREATE_PASS)
|
||||
#endif
|
||||
MODULE_PASS("constmerge", ConstantMergePass())
|
||||
MODULE_PASS("elim-avail-extern", EliminateAvailableExternallyPass())
|
||||
MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
|
||||
MODULE_PASS("globaldce", GlobalDCEPass())
|
||||
MODULE_PASS("globalopt", GlobalOptPass())
|
||||
|
|
|
@ -13,10 +13,11 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Transforms/IPO.h"
|
||||
#include "llvm/Transforms/IPO/ElimAvailExtern.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/Transforms/IPO.h"
|
||||
#include "llvm/Transforms/Utils/GlobalStatus.h"
|
||||
#include "llvm/Pass.h"
|
||||
using namespace llvm;
|
||||
|
@ -26,33 +27,7 @@ using namespace llvm;
|
|||
STATISTIC(NumFunctions, "Number of functions removed");
|
||||
STATISTIC(NumVariables, "Number of global variables removed");
|
||||
|
||||
namespace {
|
||||
struct EliminateAvailableExternally : public ModulePass {
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
EliminateAvailableExternally() : ModulePass(ID) {
|
||||
initializeEliminateAvailableExternallyPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
// run - Do the EliminateAvailableExternally pass on the specified module,
|
||||
// optionally updating the specified callgraph to reflect the changes.
|
||||
//
|
||||
bool runOnModule(Module &M) override;
|
||||
};
|
||||
}
|
||||
|
||||
char EliminateAvailableExternally::ID = 0;
|
||||
INITIALIZE_PASS(EliminateAvailableExternally, "elim-avail-extern",
|
||||
"Eliminate Available Externally Globals", false, false)
|
||||
|
||||
ModulePass *llvm::createEliminateAvailableExternallyPass() {
|
||||
return new EliminateAvailableExternally();
|
||||
}
|
||||
|
||||
bool EliminateAvailableExternally::runOnModule(Module &M) {
|
||||
if (skipModule(M))
|
||||
return false;
|
||||
|
||||
static bool eliminateAvailableExternally(Module &M) {
|
||||
bool Changed = false;
|
||||
|
||||
// Drop initializers of available externally global variables.
|
||||
|
@ -85,3 +60,36 @@ bool EliminateAvailableExternally::runOnModule(Module &M) {
|
|||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
PreservedAnalyses EliminateAvailableExternallyPass::run(Module &M) {
|
||||
if (!eliminateAvailableExternally(M))
|
||||
return PreservedAnalyses::all();
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct EliminateAvailableExternallyLegacyPass : public ModulePass {
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
EliminateAvailableExternallyLegacyPass() : ModulePass(ID) {
|
||||
initializeEliminateAvailableExternallyLegacyPassPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
// run - Do the EliminateAvailableExternally pass on the specified module,
|
||||
// optionally updating the specified callgraph to reflect the changes.
|
||||
//
|
||||
bool runOnModule(Module &M) {
|
||||
if (skipModule(M))
|
||||
return false;
|
||||
return eliminateAvailableExternally(M);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
char EliminateAvailableExternallyLegacyPass::ID = 0;
|
||||
INITIALIZE_PASS(EliminateAvailableExternallyLegacyPass, "elim-avail-extern",
|
||||
"Eliminate Available Externally Globals", false, false)
|
||||
|
||||
ModulePass *llvm::createEliminateAvailableExternallyPass() {
|
||||
return new EliminateAvailableExternallyLegacyPass();
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ void llvm::initializeIPO(PassRegistry &Registry) {
|
|||
initializeStripDeadDebugInfoPass(Registry);
|
||||
initializeStripNonDebugSymbolsPass(Registry);
|
||||
initializeBarrierNoopPass(Registry);
|
||||
initializeEliminateAvailableExternallyPass(Registry);
|
||||
initializeEliminateAvailableExternallyLegacyPassPass(Registry);
|
||||
initializeSampleProfileLoaderPass(Registry);
|
||||
initializeFunctionImportPassPass(Registry);
|
||||
initializeWholeProgramDevirtPass(Registry);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt -elim-avail-extern -S < %s | FileCheck %s
|
||||
; RUN: opt -passes=elim-avail-extern -S < %s | FileCheck %s
|
||||
|
||||
; CHECK: declare hidden void @f()
|
||||
define available_externally hidden void @f() {
|
||||
|
|
Loading…
Reference in New Issue