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" 20using namespace llvm; 21 22namespace { 23// Hoisting the alloca instructions in the non-entry blocks to the entry 24// block. 25class NVPTXAllocaHoisting : public FunctionPass { 26public: 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 43bool 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 61char NVPTXAllocaHoisting::ID = 0; 62 63namespace llvm { 64void initializeNVPTXAllocaHoistingPass(PassRegistry &); 65} 66 67INITIALIZE_PASS( 68 NVPTXAllocaHoisting, "alloca-hoisting", 69 "Hoisting alloca instructions in non-entry blocks to the entry block", 70 false, false) 71 72FunctionPass *llvm::createAllocaHoisting() { return new NVPTXAllocaHoisting; } 73