mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
b2442fc760
It was added in 2007 as the first cut at supporting no-inline attributes, but we didn't have function attributes of any form at the time. However, it was added without any mention in the LangRef or other documentation. Later on, in 2008, Devang added function notes for 'inline=never' and then turned them into proper function attributes. From that point onward, as far as I can tell, the world moved on, and no one has touched 'llvm.noinline' in any meaningful way since. It's time has now come. We have had better mechanisms for doing this for a long time, all the frontends I'm aware of use them, and this is just holding back progress. Given that it was never a documented feature of the IR, I've provided no auto-upgrade support. If people know of real, in-the-wild bitcode that relies on this, yell at me and I'll add it, but I *seriously* doubt anyone cares. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152904 91177308-0d34-0410-b5e6-96231b3b80d8
81 lines
2.5 KiB
C++
81 lines
2.5 KiB
C++
//===- InlineSimple.cpp - Code to perform simple function inlining --------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements bottom-up inlining of functions into callees.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#define DEBUG_TYPE "inline"
|
|
#include "llvm/CallingConv.h"
|
|
#include "llvm/Instructions.h"
|
|
#include "llvm/IntrinsicInst.h"
|
|
#include "llvm/Module.h"
|
|
#include "llvm/Type.h"
|
|
#include "llvm/Analysis/CallGraph.h"
|
|
#include "llvm/Analysis/InlineCost.h"
|
|
#include "llvm/Support/CallSite.h"
|
|
#include "llvm/Transforms/IPO.h"
|
|
#include "llvm/Transforms/IPO/InlinerPass.h"
|
|
#include "llvm/Target/TargetData.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
class SimpleInliner : public Inliner {
|
|
InlineCostAnalyzer CA;
|
|
public:
|
|
SimpleInliner() : Inliner(ID) {
|
|
initializeSimpleInlinerPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
SimpleInliner(int Threshold) : Inliner(ID, Threshold,
|
|
/*InsertLifetime*/true) {
|
|
initializeSimpleInlinerPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
static char ID; // Pass identification, replacement for typeid
|
|
InlineCost getInlineCost(CallSite CS) {
|
|
return CA.getInlineCost(CS);
|
|
}
|
|
float getInlineFudgeFactor(CallSite CS) {
|
|
return CA.getInlineFudgeFactor(CS);
|
|
}
|
|
void resetCachedCostInfo(Function *Caller) {
|
|
CA.resetCachedCostInfo(Caller);
|
|
}
|
|
void growCachedCostInfo(Function* Caller, Function* Callee) {
|
|
CA.growCachedCostInfo(Caller, Callee);
|
|
}
|
|
virtual bool doInitialization(CallGraph &CG);
|
|
void releaseMemory() {
|
|
CA.clear();
|
|
}
|
|
};
|
|
}
|
|
|
|
char SimpleInliner::ID = 0;
|
|
INITIALIZE_PASS_BEGIN(SimpleInliner, "inline",
|
|
"Function Integration/Inlining", false, false)
|
|
INITIALIZE_AG_DEPENDENCY(CallGraph)
|
|
INITIALIZE_PASS_END(SimpleInliner, "inline",
|
|
"Function Integration/Inlining", false, false)
|
|
|
|
Pass *llvm::createFunctionInliningPass() { return new SimpleInliner(); }
|
|
|
|
Pass *llvm::createFunctionInliningPass(int Threshold) {
|
|
return new SimpleInliner(Threshold);
|
|
}
|
|
|
|
// doInitialization - Initializes the vector of functions that have been
|
|
// annotated with the noinline attribute.
|
|
bool SimpleInliner::doInitialization(CallGraph &CG) {
|
|
CA.setTargetData(getAnalysisIfAvailable<TargetData>());
|
|
return false;
|
|
}
|
|
|