]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / lib / Target / NVPTX / NVPTXAllocaHoisting.cpp
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>
41 X("alloca-hoisting", "Hoisting alloca instructions in non-entry "
42                      "blocks to the entry block");
43
44 FunctionPass *createAllocaHoisting() { return new NVPTXAllocaHoisting(); }
45
46 } // end namespace llvm