1 //===-- AllocaHoisting.cpp - Hoist allocas to the entry block --*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Hoist the alloca instructions in the non-entry blocks to the entry blocks. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "NVPTXAllocaHoisting.h" 14 #include "NVPTX.h" 15 #include "llvm/CodeGen/StackProtector.h" 16 #include "llvm/IR/Constants.h" 17 #include "llvm/IR/Function.h" 18 #include "llvm/IR/Instructions.h" 19 using namespace llvm; 20 21 namespace { 22 // Hoisting the alloca instructions in the non-entry blocks to the entry 23 // block. 24 class NVPTXAllocaHoisting : public FunctionPass { 25 public: 26 static char ID; // Pass ID NVPTXAllocaHoisting()27 NVPTXAllocaHoisting() : FunctionPass(ID) {} 28 getAnalysisUsage(AnalysisUsage & AU) const29 void getAnalysisUsage(AnalysisUsage &AU) const override { 30 AU.addPreserved<StackProtector>(); 31 } 32 getPassName() const33 StringRef getPassName() const override { 34 return "NVPTX specific alloca hoisting"; 35 } 36 37 bool runOnFunction(Function &function) override; 38 }; 39 } // namespace 40 runOnFunction(Function & function)41bool NVPTXAllocaHoisting::runOnFunction(Function &function) { 42 bool functionModified = false; 43 Function::iterator I = function.begin(); 44 Instruction *firstTerminatorInst = (I++)->getTerminator(); 45 46 for (Function::iterator E = function.end(); I != E; ++I) { 47 for (BasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE;) { 48 AllocaInst *allocaInst = dyn_cast<AllocaInst>(BI++); 49 if (allocaInst && isa<ConstantInt>(allocaInst->getArraySize())) { 50 allocaInst->moveBefore(firstTerminatorInst->getIterator()); 51 functionModified = true; 52 } 53 } 54 } 55 56 return functionModified; 57 } 58 59 char NVPTXAllocaHoisting::ID = 0; 60 61 INITIALIZE_PASS( 62 NVPTXAllocaHoisting, "alloca-hoisting", 63 "Hoisting alloca instructions in non-entry blocks to the entry block", 64 false, false) 65 createAllocaHoisting()66FunctionPass *llvm::createAllocaHoisting() { return new NVPTXAllocaHoisting; } 67