Skip to content

Commit

Permalink
[PM] Port PartialInlining to the new PM
Browse files Browse the repository at this point in the history
Differential revision: http://reviews.llvm.org/D21699

llvm-svn: 273894
  • Loading branch information
Easwaran Raman committed Jun 27, 2016
1 parent 2621dea commit 1832bf6
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 23 deletions.
2 changes: 1 addition & 1 deletion llvm/include/llvm/InitializePasses.h
Expand Up @@ -246,7 +246,7 @@ void initializePGOInstrumentationGenLegacyPassPass(PassRegistry&);
void initializePGOInstrumentationUseLegacyPassPass(PassRegistry&);
void initializePHIEliminationPass(PassRegistry&);
void initializePhysicalRegisterUsageInfoPass(PassRegistry &);
void initializePartialInlinerPass(PassRegistry&);
void initializePartialInlinerLegacyPassPass(PassRegistry &);
void initializePartiallyInlineLibCallsLegacyPassPass(PassRegistry &);
void initializePatchableFunctionPass(PassRegistry &);
void initializePeepholeOptimizerPass(PassRegistry&);
Expand Down
32 changes: 32 additions & 0 deletions llvm/include/llvm/Transforms/IPO/PartialInlining.h
@@ -0,0 +1,32 @@
//===- PartialInlining.h - Inline parts of functions --------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This pass performs partial inlining, typically by inlining an if statement
// that surrounds the body of the function.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TRANSFORMS_IPO_PARTIALINLINING_H
#define LLVM_TRANSFORMS_IPO_PARTIALINLINING_H

#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"

namespace llvm {

/// Pass to remove unused function declarations.
class PartialInlinerPass : public PassInfoMixin<PartialInlinerPass> {
public:
PreservedAnalyses run(Module &M, ModuleAnalysisManager &);

private:
Function *unswitchFunction(Function *F);
};
}
#endif // LLVM_TRANSFORMS_IPO_PARTIALINLINING_H
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Expand Up @@ -62,6 +62,7 @@
#include "llvm/Transforms/IPO/GlobalOpt.h"
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
#include "llvm/Transforms/IPO/Internalize.h"
#include "llvm/Transforms/IPO/PartialInlining.h"
#include "llvm/Transforms/IPO/SCCP.h"
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
#include "llvm/Transforms/IPO/WholeProgramDevirt.h"
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassRegistry.def
Expand Up @@ -50,6 +50,7 @@ MODULE_PASS("internalize", InternalizePass())
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
MODULE_PASS("ipsccp", IPSCCPPass())
MODULE_PASS("no-op-module", NoOpModulePass())
MODULE_PASS("partial-inliner", PartialInlinerPass())
MODULE_PASS("pgo-icall-prom", PGOIndirectCallPromotion())
MODULE_PASS("pgo-instr-gen", PGOInstrumentationGen())
MODULE_PASS("pgo-instr-use", PGOInstrumentationUse())
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/IPO.cpp
Expand Up @@ -41,7 +41,7 @@ void llvm::initializeIPO(PassRegistry &Registry) {
initializeSingleLoopExtractorPass(Registry);
initializeLowerTypeTestsPass(Registry);
initializeMergeFunctionsPass(Registry);
initializePartialInlinerPass(Registry);
initializePartialInlinerLegacyPassPass(Registry);
initializePostOrderFunctionAttrsLegacyPassPass(Registry);
initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
initializePruneEHPass(Registry);
Expand Down
49 changes: 28 additions & 21 deletions llvm/lib/Transforms/IPO/PartialInlining.cpp
Expand Up @@ -12,13 +12,14 @@
//
//===----------------------------------------------------------------------===//

#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/IPO/PartialInlining.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/CodeExtractor.h"
using namespace llvm;
Expand All @@ -28,27 +29,34 @@ using namespace llvm;
STATISTIC(NumPartialInlined, "Number of functions partially inlined");

namespace {
struct PartialInliner : public ModulePass {
void getAnalysisUsage(AnalysisUsage &AU) const override { }
static char ID; // Pass identification, replacement for typeid
PartialInliner() : ModulePass(ID) {
initializePartialInlinerPass(*PassRegistry::getPassRegistry());
}
struct PartialInlinerLegacyPass : public ModulePass {
static char ID; // Pass identification, replacement for typeid
PartialInlinerLegacyPass() : ModulePass(ID) {
initializePartialInlinerLegacyPassPass(*PassRegistry::getPassRegistry());
}

bool runOnModule(Module& M) override;
bool runOnModule(Module &M) override {
if (skipModule(M))
return false;
ModuleAnalysisManager DummyMAM;
auto PA = Impl.run(M, DummyMAM);
return !PA.areAllPreserved();
}

private:
Function* unswitchFunction(Function* F);
private:
PartialInlinerPass Impl;
};
}

char PartialInliner::ID = 0;
INITIALIZE_PASS(PartialInliner, "partial-inliner",
"Partial Inliner", false, false)
char PartialInlinerLegacyPass::ID = 0;
INITIALIZE_PASS(PartialInlinerLegacyPass, "partial-inliner", "Partial Inliner",
false, false)

ModulePass* llvm::createPartialInliningPass() { return new PartialInliner(); }
ModulePass *llvm::createPartialInliningPass() {
return new PartialInlinerLegacyPass();
}

Function* PartialInliner::unswitchFunction(Function* F) {
Function *PartialInlinerPass::unswitchFunction(Function *F) {
// First, verify that this function is an unswitching candidate...
BasicBlock *entryBlock = &F->front();
BranchInst *BR = dyn_cast<BranchInst>(entryBlock->getTerminator());
Expand Down Expand Up @@ -144,10 +152,7 @@ Function* PartialInliner::unswitchFunction(Function* F) {
return extractedFunction;
}

bool PartialInliner::runOnModule(Module& M) {
if (skipModule(M))
return false;

PreservedAnalyses PartialInlinerPass::run(Module &M, ModuleAnalysisManager &) {
std::vector<Function*> worklist;
worklist.reserve(M.size());
for (Function &F : M)
Expand Down Expand Up @@ -177,6 +182,8 @@ bool PartialInliner::runOnModule(Module& M) {
}

}

return changed;

if (changed)
return PreservedAnalyses::none();
return PreservedAnalyses::all();
}
1 change: 1 addition & 0 deletions llvm/test/Transforms/Inline/PR4909.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -partial-inliner -disable-output
; RUN: opt < %s -passes=partial-inliner -disable-output

define i32 @f() {
entry:
Expand Down

0 comments on commit 1832bf6

Please sign in to comment.