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/IR/Constants.h"
     16 #include "llvm/IR/Function.h"
     17 #include "llvm/IR/Instructions.h"
     18 
     19 namespace llvm {
     20 
     21 bool NVPTXAllocaHoisting::runOnFunction(Function &function) {
     22   bool               functionModified    = false;
     23   Function::iterator I                   = function.begin();
     24   TerminatorInst    *firstTerminatorInst = (I++)->getTerminator();
     25 
     26   for (Function::iterator E = function.end(); I != E; ++I) {
     27     for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE;) {
     28       AllocaInst *allocaInst = dyn_cast<AllocaInst>(BI++);
     29       if (allocaInst && isa<ConstantInt>(allocaInst->getArraySize())) {
     30         allocaInst->moveBefore(firstTerminatorInst);
     31         functionModified = true;
     32       }
     33     }
     34   }
     35 
     36   return functionModified;
     37 }
     38 
     39 char NVPTXAllocaHoisting::ID = 1;
     40 RegisterPass<NVPTXAllocaHoisting> X("alloca-hoisting",
     41                                     "Hoisting alloca instructions in non-entry "
     42                                     "blocks to the entry block");
     43 
     44 FunctionPass *createAllocaHoisting() {
     45   return new NVPTXAllocaHoisting();
     46 }
     47 
     48 } // end namespace llvm
     49