LLVM  4.0.0
AMDGPUAlwaysInlinePass.cpp
Go to the documentation of this file.
1 //===-- AMDGPUAlwaysInlinePass.cpp - Promote Allocas ----------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// This pass marks all internal functions as always_inline and creates
12 /// duplicates of all other functions a marks the duplicates as always_inline.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "AMDGPU.h"
17 #include "llvm/IR/Module.h"
19 
20 using namespace llvm;
21 
22 namespace {
23 
24 class AMDGPUAlwaysInline : public ModulePass {
25  static char ID;
26 
27 public:
28  AMDGPUAlwaysInline() : ModulePass(ID) { }
29  bool runOnModule(Module &M) override;
30  StringRef getPassName() const override { return "AMDGPU Always Inline Pass"; }
31 };
32 
33 } // End anonymous namespace
34 
35 char AMDGPUAlwaysInline::ID = 0;
36 
37 bool AMDGPUAlwaysInline::runOnModule(Module &M) {
38  std::vector<GlobalAlias*> AliasesToRemove;
39  std::vector<Function *> FuncsToClone;
40 
41  for (GlobalAlias &A : M.aliases()) {
42  if (Function* F = dyn_cast<Function>(A.getAliasee())) {
43  A.replaceAllUsesWith(F);
44  AliasesToRemove.push_back(&A);
45  }
46  }
47 
48  for (GlobalAlias* A : AliasesToRemove) {
49  A->eraseFromParent();
50  }
51 
52  for (Function &F : M) {
53  if (!F.hasLocalLinkage() && !F.isDeclaration() && !F.use_empty() &&
54  !F.hasFnAttribute(Attribute::NoInline))
55  FuncsToClone.push_back(&F);
56  }
57 
58  for (Function *F : FuncsToClone) {
59  ValueToValueMapTy VMap;
60  Function *NewFunc = CloneFunction(F, VMap);
62  F->replaceAllUsesWith(NewFunc);
63  }
64 
65  for (Function &F : M) {
66  if (F.hasLocalLinkage() && !F.hasFnAttribute(Attribute::NoInline)) {
67  F.addFnAttr(Attribute::AlwaysInline);
68  }
69  }
70  return false;
71 }
72 
74  return new AMDGPUAlwaysInline();
75 }
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:52
Function * CloneFunction(Function *F, ValueToValueMapTy &VMap, ClonedCodeInfo *CodeInfo=nullptr)
CloneFunction - Return a copy of the specified function and add it to that function's module...
#define F(x, y, z)
Definition: MD5.cpp:51
ModulePass * createAMDGPUAlwaysInlinePass()
Module.h This file contains the declarations for the Module class.
void setLinkage(LinkageTypes LT)
Definition: GlobalValue.h:424
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition: Pass.h:235
Rename collisions when linking (static functions).
Definition: GlobalValue.h:56
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:47
static GCRegistry::Add< ErlangGC > A("erlang","erlang-compatible garbage collector")
iterator_range< alias_iterator > aliases()
Definition: Module.h:564