Home | History | Annotate | Download | only in NVPTX
      1 //===-- AllocaHoisting.cpp - Hoist allocas to the entry block --*- C++ -*-===//
      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 // Hoist the alloca instructions in the non-entry blocks to the entry blocks.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "NVPTXAllocaHoisting.h"
     15 #include "llvm/CodeGen/MachineFunctionAnalysis.h"
     16 #include "llvm/CodeGen/StackProtector.h"
     17 #include "llvm/IR/Constants.h"
     18 #include "llvm/IR/Function.h"
     19 #include "llvm/IR/Instructions.h"
     20 using namespace llvm;
     21 
     22 namespace {
     23 // Hoisting the alloca instructions in the non-entry blocks to the entry
     24 // block.
     25 class NVPTXAllocaHoisting : public FunctionPass {
     26 public:
     27   static char ID; // Pass ID
     28   NVPTXAllocaHoisting() : FunctionPass(ID) {}
     29 
     30   void getAnalysisUsage(AnalysisUsage &AU) const override {
     31     AU.addPreserved<MachineFunctionAnalysis>();
     32     AU.addPreserved<StackProtector>();
     33   }
     34 
     35   const char *getPassName() const override {
     36     return "NVPTX specific alloca hoisting";
     37   }
     38 
     39   bool runOnFunction(Function &function) override;
     40 };
     41 } // namespace
     42 
     43 bool NVPTXAllocaHoisting::runOnFunction(Function &function) {
     44   bool functionModified = false;
     45   Function::iterator I = function.begin();
     46   TerminatorInst *firstTerminatorInst = (I++)->getTerminator();
     47 
     48   for (Function::iterator E = function.end(); I != E; ++I) {
     49     for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE;) {
     50       AllocaInst *allocaInst = dyn_cast<AllocaInst>(BI++);
     51       if (allocaInst && isa<ConstantInt>(allocaInst->getArraySize())) {
     52         allocaInst->moveBefore(firstTerminatorInst);
     53         functionModified = true;
     54       }
     55     }
     56   }
     57 
     58   return functionModified;
     59 }
     60 
     61 char NVPTXAllocaHoisting::ID = 0;
     62 
     63 namespace llvm {
     64 void initializeNVPTXAllocaHoistingPass(PassRegistry &);
     65 }
     66 
     67 INITIALIZE_PASS(
     68     NVPTXAllocaHoisting, "alloca-hoisting",
     69     "Hoisting alloca instructions in non-entry blocks to the entry block",
     70     false, false)
     71 
     72 FunctionPass *llvm::createAllocaHoisting() { return new NVPTXAllocaHoisting; }
     73