Home | History | Annotate | Download | only in R600
      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"
     18 #include "llvm/Transforms/Utils/Cloning.h"
     19 
     20 using namespace llvm;
     21 
     22 namespace {
     23 
     24 class AMDGPUAlwaysInline : public ModulePass {
     25 
     26   static char ID;
     27 
     28 public:
     29   AMDGPUAlwaysInline() : ModulePass(ID) { }
     30   bool runOnModule(Module &M) override;
     31   const char *getPassName() const override { return "AMDGPU Always Inline Pass"; }
     32 };
     33 
     34 } // End anonymous namespace
     35 
     36 char AMDGPUAlwaysInline::ID = 0;
     37 
     38 bool AMDGPUAlwaysInline::runOnModule(Module &M) {
     39 
     40   std::vector<Function*> FuncsToClone;
     41   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
     42     Function &F = *I;
     43     if (!F.hasLocalLinkage() && !F.isDeclaration() && !F.use_empty())
     44       FuncsToClone.push_back(&F);
     45   }
     46 
     47   for (Function *F : FuncsToClone) {
     48     ValueToValueMapTy VMap;
     49     Function *NewFunc = CloneFunction(F, VMap, false);
     50     NewFunc->setLinkage(GlobalValue::InternalLinkage);
     51     F->getParent()->getFunctionList().push_back(NewFunc);
     52     F->replaceAllUsesWith(NewFunc);
     53   }
     54 
     55   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
     56     Function &F = *I;
     57     if (F.hasLocalLinkage()) {
     58       F.addFnAttr(Attribute::AlwaysInline);
     59     }
     60   }
     61   return false;
     62 }
     63 
     64 ModulePass *llvm::createAMDGPUAlwaysInlinePass() {
     65   return new AMDGPUAlwaysInline();
     66 }
     67