CodeExtractor.cpp revision d7f2a6cb3fbc012763adb42fd967f6fefbb22a37
1e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//===- CodeExtractor.cpp - Pull code region into a new function -----------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//                     The LLVM Compiler Infrastructure
4e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//===----------------------------------------------------------------------===//
9e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//
10e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman// This file implements the interface to tear out a code region, such as an
11e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman// individual loop or a parallel section, into a new function, replacing it with
12e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman// a call to the new function.
13e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//
14e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman//===----------------------------------------------------------------------===//
15e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
1633e197b7778c92acc732c3255dc8fbb99923e8ccChris Lattner#include "llvm/Transforms/Utils/FunctionUtils.h"
17e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/Constants.h"
18e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/DerivedTypes.h"
19e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/Instructions.h"
20bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner#include "llvm/Intrinsics.h"
210a205a459884ec745df1c529396dd921f029dafdOwen Anderson#include "llvm/LLVMContext.h"
22e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/Module.h"
23e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/Pass.h"
24b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner#include "llvm/Analysis/Dominators.h"
25e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/Analysis/LoopInfo.h"
26ffada9327301094411146627cf6bc16cd517585dChris Lattner#include "llvm/Analysis/Verifier.h"
27e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include "llvm/Transforms/Utils/BasicBlockUtils.h"
28551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
299133fe28954d498fc4de13064c7d65bd811de02cReid Spencer#include "llvm/Support/Compiler.h"
30551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/Debug.h"
317d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h"
32551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/StringExtras.h"
33e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman#include <algorithm>
340e06674287b15696f66a65f20f2ba99137b29213Chris Lattner#include <set>
35e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukmanusing namespace llvm;
36e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
3722108fac63eac53d1a23b781a9963fab99700135Misha Brukman// Provide a command-line option to aggregate function arguments into a struct
38a4a83c314c5997ff2b5eadae8e711fec6501121dMisha Brukman// for functions produced by the code extractor. This is useful when converting
3922108fac63eac53d1a23b781a9963fab99700135Misha Brukman// extracted functions to pthread-based code, as only one argument (void*) can
4022108fac63eac53d1a23b781a9963fab99700135Misha Brukman// be passed in to pthread_create().
4122108fac63eac53d1a23b781a9963fab99700135Misha Brukmanstatic cl::opt<bool>
4222108fac63eac53d1a23b781a9963fab99700135Misha BrukmanAggregateArgsOpt("aggregate-extracted-args", cl::Hidden,
4322108fac63eac53d1a23b781a9963fab99700135Misha Brukman                 cl::desc("Aggregate arguments to code-extracted functions"));
4422108fac63eac53d1a23b781a9963fab99700135Misha Brukman
45e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukmannamespace {
469133fe28954d498fc4de13064c7d65bd811de02cReid Spencer  class VISIBILITY_HIDDEN CodeExtractor {
47e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    typedef std::vector<Value*> Values;
480e06674287b15696f66a65f20f2ba99137b29213Chris Lattner    std::set<BasicBlock*> BlocksToExtract;
49c6fcf29e81f54b68146fb8d375c347d2c689566dOwen Anderson    DominatorTree* DT;
5022108fac63eac53d1a23b781a9963fab99700135Misha Brukman    bool AggregateArgs;
51346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    unsigned NumExitBlocks;
52346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    const Type *RetTy;
53e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  public:
544b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel    CodeExtractor(DominatorTree* dt = 0, bool AggArgs = false)
554b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel      : DT(dt), AggregateArgs(AggArgs||AggregateArgsOpt), NumExitBlocks(~0U) {}
56b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner
57e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    Function *ExtractCodeRegion(const std::vector<BasicBlock*> &code);
58e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
5922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    bool isEligible(const std::vector<BasicBlock*> &code);
6022108fac63eac53d1a23b781a9963fab99700135Misha Brukman
61e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  private:
62bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    /// definedInRegion - Return true if the specified value is defined in the
63bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    /// extracted region.
64bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    bool definedInRegion(Value *V) const {
65bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      if (Instruction *I = dyn_cast<Instruction>(V))
66bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner        if (BlocksToExtract.count(I->getParent()))
67bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner          return true;
68bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      return false;
69bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    }
70fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
71bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    /// definedInCaller - Return true if the specified value is defined in the
72bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    /// function being code extracted, but not in the region being extracted.
73bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    /// These values must be passed in as live-ins to the function.
74bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    bool definedInCaller(Value *V) const {
75bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      if (isa<Argument>(V)) return true;
76bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      if (Instruction *I = dyn_cast<Instruction>(V))
77bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner        if (!BlocksToExtract.count(I->getParent()))
78bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner          return true;
79bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      return false;
80bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    }
81bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
82bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    void severSplitPHINodes(BasicBlock *&Header);
83d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner    void splitReturnBlocks();
84bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    void findInputsOutputs(Values &inputs, Values &outputs);
85e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
86e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    Function *constructFunction(const Values &inputs,
87e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                const Values &outputs,
885cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner                                BasicBlock *header,
89e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                BasicBlock *newRootNode, BasicBlock *newHeader,
90e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                Function *oldFunction, Module *M);
91e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
920e06674287b15696f66a65f20f2ba99137b29213Chris Lattner    void moveCodeToFunction(Function *newFunction);
93e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
94e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    void emitCallAndSwitchStatement(Function *newFunction,
95e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                    BasicBlock *newHeader,
96e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                    Values &inputs,
97e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                    Values &outputs);
98e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
99e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  };
100e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman}
101e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
102bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner/// severSplitPHINodes - If a PHI node has multiple inputs from outside of the
103bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner/// region, we need to split the entry block of the region so that the PHI node
104bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner/// is easier to deal with.
105bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattnervoid CodeExtractor::severSplitPHINodes(BasicBlock *&Header) {
106e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  bool HasPredsFromRegion = false;
107e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  unsigned NumPredsOutsideRegion = 0;
108e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
109ecb7a77885b174cf4d001a9b48533b3979e7810dDan Gohman  if (Header != &Header->getParent()->getEntryBlock()) {
110e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    PHINode *PN = dyn_cast<PHINode>(Header->begin());
111e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    if (!PN) return;  // No PHI nodes.
112e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
113e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // If the header node contains any PHI nodes, check to see if there is more
114e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // than one entry from outside the region.  If so, we need to sever the
115e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // header block into two.
116e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
117e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      if (BlocksToExtract.count(PN->getIncomingBlock(i)))
118e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner        HasPredsFromRegion = true;
119e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      else
120e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner        ++NumPredsOutsideRegion;
121e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
122e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // If there is one (or fewer) predecessor from outside the region, we don't
123e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // need to do anything special.
124e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    if (NumPredsOutsideRegion <= 1) return;
125e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  }
126bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
127e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // Otherwise, we need to split the header block into two pieces: one
128e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // containing PHI nodes merging values from outside of the region, and a
129e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // second that contains all of the code for the block and merges back any
130e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // incoming values from inside of the region.
13102dea8b39f3acad5de1df36273444d149145e7fcDan Gohman  BasicBlock::iterator AfterPHIs = Header->getFirstNonPHI();
132e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  BasicBlock *NewBB = Header->splitBasicBlock(AfterPHIs,
133e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner                                              Header->getName()+".ce");
134e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
135e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // We only want to code extract the second block now, and it becomes the new
136e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // header of the region.
137e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  BasicBlock *OldPred = Header;
138e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  BlocksToExtract.erase(OldPred);
139e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  BlocksToExtract.insert(NewBB);
140e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  Header = NewBB;
141e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
142e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // Okay, update dominator sets. The blocks that dominate the new one are the
143e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // blocks that dominate TIBB plus the new block itself.
1440e7f728ad1ac25b0ed450fe0f8b86a38d3c2a93aDevang Patel  if (DT)
1450e7f728ad1ac25b0ed450fe0f8b86a38d3c2a93aDevang Patel    DT->splitBlock(NewBB);
146bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
147e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // Okay, now we need to adjust the PHI nodes and any branches from within the
148e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // region to go to the new header block instead of the old header block.
149e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  if (HasPredsFromRegion) {
150e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    PHINode *PN = cast<PHINode>(OldPred->begin());
151e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // Loop over all of the predecessors of OldPred that are in the region,
152e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // changing them to branch to NewBB instead.
153e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
154e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      if (BlocksToExtract.count(PN->getIncomingBlock(i))) {
155e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner        TerminatorInst *TI = PN->getIncomingBlock(i)->getTerminator();
156e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner        TI->replaceUsesOfWith(OldPred, NewBB);
157e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      }
158e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
159e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // Okay, everthing within the region is now branching to the right block, we
160e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    // just have to update the PHI nodes now, inserting PHI nodes into NewBB.
1612da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer    for (AfterPHIs = OldPred->begin(); isa<PHINode>(AfterPHIs); ++AfterPHIs) {
1622da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer      PHINode *PN = cast<PHINode>(AfterPHIs);
163e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      // Create a new PHI node in the new region, which has an incoming value
164e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      // from OldPred of PN.
165051a950000e21935165db56695e35bade668193bGabor Greif      PHINode *NewPN = PHINode::Create(PN->getType(), PN->getName()+".ce",
166051a950000e21935165db56695e35bade668193bGabor Greif                                       NewBB->begin());
167e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      NewPN->addIncoming(PN, OldPred);
168e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
169e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      // Loop over all of the incoming value in PN, moving them to NewPN if they
170e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      // are from the extracted region.
171e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      for (unsigned i = 0; i != PN->getNumIncomingValues(); ++i) {
172e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner        if (BlocksToExtract.count(PN->getIncomingBlock(i))) {
173e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner          NewPN->addIncoming(PN->getIncomingValue(i), PN->getIncomingBlock(i));
174e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner          PN->removeIncomingValue(i);
175e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner          --i;
176e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner        }
177e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner      }
178e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner    }
179e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  }
180d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner}
181e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
182d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattnervoid CodeExtractor::splitReturnBlocks() {
183d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner  for (std::set<BasicBlock*>::iterator I = BlocksToExtract.begin(),
184d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner         E = BlocksToExtract.end(); I != E; ++I)
185d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner    if (ReturnInst *RI = dyn_cast<ReturnInst>((*I)->getTerminator()))
186d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner      (*I)->splitBasicBlock(RI, (*I)->getName()+".ret");
187bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner}
188bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
189bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner// findInputsOutputs - Find inputs to, outputs from the code region.
190bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner//
191bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattnervoid CodeExtractor::findInputsOutputs(Values &inputs, Values &outputs) {
192346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  std::set<BasicBlock*> ExitBlocks;
193fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  for (std::set<BasicBlock*>::const_iterator ci = BlocksToExtract.begin(),
1940e06674287b15696f66a65f20f2ba99137b29213Chris Lattner       ce = BlocksToExtract.end(); ci != ce; ++ci) {
195e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    BasicBlock *BB = *ci;
196bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
1970de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner    for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
1980de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner      // If a used value is defined outside the region, it's an input.  If an
1990de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner      // instruction is used outside the region, it's an output.
200bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      for (User::op_iterator O = I->op_begin(), E = I->op_end(); O != E; ++O)
201bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner        if (definedInCaller(*O))
202bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner          inputs.push_back(*O);
203fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
204bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      // Consider uses of this instruction (outputs).
2050de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner      for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
2060de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner           UI != E; ++UI)
207bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner        if (!definedInRegion(*UI)) {
208b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner          outputs.push_back(I);
209b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner          break;
210b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner        }
2110de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner    } // for: insts
212346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner
213bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    // Keep track of the exit blocks from the region.
214346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    TerminatorInst *TI = BB->getTerminator();
215346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
216346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner      if (!BlocksToExtract.count(TI->getSuccessor(i)))
217346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner        ExitBlocks.insert(TI->getSuccessor(i));
2180de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner  } // for: basic blocks
219346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner
220346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  NumExitBlocks = ExitBlocks.size();
221587992721c3112c94000722941748cf46cd0bce6Chris Lattner
222587992721c3112c94000722941748cf46cd0bce6Chris Lattner  // Eliminate duplicates.
223587992721c3112c94000722941748cf46cd0bce6Chris Lattner  std::sort(inputs.begin(), inputs.end());
224587992721c3112c94000722941748cf46cd0bce6Chris Lattner  inputs.erase(std::unique(inputs.begin(), inputs.end()), inputs.end());
225587992721c3112c94000722941748cf46cd0bce6Chris Lattner  std::sort(outputs.begin(), outputs.end());
226587992721c3112c94000722941748cf46cd0bce6Chris Lattner  outputs.erase(std::unique(outputs.begin(), outputs.end()), outputs.end());
227e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman}
228e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
229e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// constructFunction - make a function based on inputs and outputs, as follows:
230e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// f(in0, ..., inN, out0, ..., outN)
231e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
232e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha BrukmanFunction *CodeExtractor::constructFunction(const Values &inputs,
233e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                           const Values &outputs,
2345cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner                                           BasicBlock *header,
235e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                           BasicBlock *newRootNode,
236e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman                                           BasicBlock *newHeader,
2375cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner                                           Function *oldFunction,
2385cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner                                           Module *M) {
2390d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling  DOUT << "inputs: " << inputs.size() << "\n";
2400d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling  DOUT << "outputs: " << outputs.size() << "\n";
241e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
242e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // This function returns unsigned, outputs will go back by reference.
243346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  switch (NumExitBlocks) {
244346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  case 0:
245346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  case 1: RetTy = Type::VoidTy; break;
2464fe16d607d11e29d742208894909733f5ad01f8fReid Spencer  case 2: RetTy = Type::Int1Ty; break;
247c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  default: RetTy = Type::Int16Ty; break;
248346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  }
249346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner
250e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  std::vector<const Type*> paramTy;
251e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
252e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // Add the types of the input values to the function's argument list
253e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  for (Values::const_iterator i = inputs.begin(),
254e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman         e = inputs.end(); i != e; ++i) {
255e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    const Value *value = *i;
2560d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling    DOUT << "value used in func: " << *value << "\n";
257e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    paramTy.push_back(value->getType());
258e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  }
259e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
260b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner  // Add the types of the output values to the function's argument list.
261b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner  for (Values::const_iterator I = outputs.begin(), E = outputs.end();
262b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner       I != E; ++I) {
2630d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling    DOUT << "instr used in func: " << **I << "\n";
26422108fac63eac53d1a23b781a9963fab99700135Misha Brukman    if (AggregateArgs)
26522108fac63eac53d1a23b781a9963fab99700135Misha Brukman      paramTy.push_back((*I)->getType());
26622108fac63eac53d1a23b781a9963fab99700135Misha Brukman    else
267debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson      paramTy.push_back(PointerType::getUnqual((*I)->getType()));
268e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  }
269e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
2700d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling  DOUT << "Function type: " << *RetTy << " f(";
2710d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling  for (std::vector<const Type*>::iterator i = paramTy.begin(),
2720d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling         e = paramTy.end(); i != e; ++i)
2730d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling    DOUT << **i << ", ";
2740d45a096cff7de5b487f7f7aac17684945dd0b93Bill Wendling  DOUT << ")\n";
275e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
27622108fac63eac53d1a23b781a9963fab99700135Misha Brukman  if (AggregateArgs && (inputs.size() + outputs.size() > 0)) {
2770a205a459884ec745df1c529396dd921f029dafdOwen Anderson    PointerType *StructPtr =
278d7f2a6cb3fbc012763adb42fd967f6fefbb22a37Owen Anderson           PointerType::getUnqual(StructType::get(M->getContext(), paramTy));
27922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    paramTy.clear();
28022108fac63eac53d1a23b781a9963fab99700135Misha Brukman    paramTy.push_back(StructPtr);
28122108fac63eac53d1a23b781a9963fab99700135Misha Brukman  }
2820a205a459884ec745df1c529396dd921f029dafdOwen Anderson  const FunctionType *funcType =
283debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson                  FunctionType::get(RetTy, paramTy, false);
284e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
285e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // Create the new function
286051a950000e21935165db56695e35bade668193bGabor Greif  Function *newFunction = Function::Create(funcType,
287051a950000e21935165db56695e35bade668193bGabor Greif                                           GlobalValue::InternalLinkage,
288051a950000e21935165db56695e35bade668193bGabor Greif                                           oldFunction->getName() + "_" +
289051a950000e21935165db56695e35bade668193bGabor Greif                                           header->getName(), M);
29031535f1f04853974ec53dfc61d90e8dc4a09b456Chris Lattner  // If the old function is no-throw, so is the new one.
29131535f1f04853974ec53dfc61d90e8dc4a09b456Chris Lattner  if (oldFunction->doesNotThrow())
29231535f1f04853974ec53dfc61d90e8dc4a09b456Chris Lattner    newFunction->setDoesNotThrow(true);
29331535f1f04853974ec53dfc61d90e8dc4a09b456Chris Lattner
294e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  newFunction->getBasicBlockList().push_back(newRootNode);
295e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
296b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner  // Create an iterator to name all of the arguments we inserted.
297e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner  Function::arg_iterator AI = newFunction->arg_begin();
298b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner
299b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner  // Rewrite all users of the inputs in the extracted region to use the
30022108fac63eac53d1a23b781a9963fab99700135Misha Brukman  // arguments (or appropriate addressing into struct) instead.
30122108fac63eac53d1a23b781a9963fab99700135Misha Brukman  for (unsigned i = 0, e = inputs.size(); i != e; ++i) {
30222108fac63eac53d1a23b781a9963fab99700135Misha Brukman    Value *RewriteVal;
30322108fac63eac53d1a23b781a9963fab99700135Misha Brukman    if (AggregateArgs) {
304b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene      Value *Idx[2];
305a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson      Idx[0] = Constant::getNullValue(Type::Int32Ty);
306eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson      Idx[1] = ConstantInt::get(Type::Int32Ty, i);
30722108fac63eac53d1a23b781a9963fab99700135Misha Brukman      TerminatorInst *TI = newFunction->begin()->getTerminator();
308f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar      GetElementPtrInst *GEP =
309f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar        GetElementPtrInst::Create(AI, Idx, Idx+2,
310f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar                                  "gep_" + inputs[i]->getName(), TI);
311f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar      RewriteVal = new LoadInst(GEP, "loadgep_" + inputs[i]->getName(), TI);
31222108fac63eac53d1a23b781a9963fab99700135Misha Brukman    } else
31322108fac63eac53d1a23b781a9963fab99700135Misha Brukman      RewriteVal = AI++;
31422108fac63eac53d1a23b781a9963fab99700135Misha Brukman
315e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    std::vector<User*> Users(inputs[i]->use_begin(), inputs[i]->use_end());
316e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    for (std::vector<User*>::iterator use = Users.begin(), useE = Users.end();
317ffada9327301094411146627cf6bc16cd517585dChris Lattner         use != useE; ++use)
318ffada9327301094411146627cf6bc16cd517585dChris Lattner      if (Instruction* inst = dyn_cast<Instruction>(*use))
3190e06674287b15696f66a65f20f2ba99137b29213Chris Lattner        if (BlocksToExtract.count(inst->getParent()))
32022108fac63eac53d1a23b781a9963fab99700135Misha Brukman          inst->replaceUsesOfWith(inputs[i], RewriteVal);
321e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  }
322e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
32322108fac63eac53d1a23b781a9963fab99700135Misha Brukman  // Set names for input and output arguments.
32422108fac63eac53d1a23b781a9963fab99700135Misha Brukman  if (!AggregateArgs) {
325e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner    AI = newFunction->arg_begin();
32622108fac63eac53d1a23b781a9963fab99700135Misha Brukman    for (unsigned i = 0, e = inputs.size(); i != e; ++i, ++AI)
3276bc41e8a74d1756da0003641bfebd02a3d6d9586Owen Anderson      AI->setName(inputs[i]->getName());
32822108fac63eac53d1a23b781a9963fab99700135Misha Brukman    for (unsigned i = 0, e = outputs.size(); i != e; ++i, ++AI)
329fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman      AI->setName(outputs[i]->getName()+".out");
33022108fac63eac53d1a23b781a9963fab99700135Misha Brukman  }
331b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner
332e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // Rewrite branches to basic blocks outside of the loop to new dummy blocks
333e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // within the new function. This must be done before we lose track of which
334e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // blocks were originally in the code region.
335e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  std::vector<User*> Users(header->use_begin(), header->use_end());
3365cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner  for (unsigned i = 0, e = Users.size(); i != e; ++i)
3375cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner    // The BasicBlock which contains the branch is not in the region
3385cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner    // modify the branch target to a new block
3395cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner    if (TerminatorInst *TI = dyn_cast<TerminatorInst>(Users[i]))
3405cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner      if (!BlocksToExtract.count(TI->getParent()) &&
3415cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner          TI->getParent()->getParent() == oldFunction)
3425cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner        TI->replaceUsesOfWith(header, newHeader);
343e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
344e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  return newFunction;
345e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman}
346e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
347bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner/// emitCallAndSwitchStatement - This method sets up the caller side by adding
348bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner/// the call instruction, splitting any PHI nodes in the header block as
349bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner/// necessary.
350bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattnervoid CodeExtractor::
351bf749367cb2aef7072ee36a9eb681b35aab51921Chris LattneremitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
352bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner                           Values &inputs, Values &outputs) {
353bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  // Emit a call to the new function, passing in: *pointer to struct (if
354bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  // aggregating parameters), or plan inputs and allocated memory for outputs
35522108fac63eac53d1a23b781a9963fab99700135Misha Brukman  std::vector<Value*> params, StructValues, ReloadOutputs;
35622108fac63eac53d1a23b781a9963fab99700135Misha Brukman
35722108fac63eac53d1a23b781a9963fab99700135Misha Brukman  // Add inputs as params, or to be filled into the struct
35822108fac63eac53d1a23b781a9963fab99700135Misha Brukman  for (Values::iterator i = inputs.begin(), e = inputs.end(); i != e; ++i)
35922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    if (AggregateArgs)
36022108fac63eac53d1a23b781a9963fab99700135Misha Brukman      StructValues.push_back(*i);
36122108fac63eac53d1a23b781a9963fab99700135Misha Brukman    else
36222108fac63eac53d1a23b781a9963fab99700135Misha Brukman      params.push_back(*i);
36322108fac63eac53d1a23b781a9963fab99700135Misha Brukman
36422108fac63eac53d1a23b781a9963fab99700135Misha Brukman  // Create allocas for the outputs
36522108fac63eac53d1a23b781a9963fab99700135Misha Brukman  for (Values::iterator i = outputs.begin(), e = outputs.end(); i != e; ++i) {
36622108fac63eac53d1a23b781a9963fab99700135Misha Brukman    if (AggregateArgs) {
36722108fac63eac53d1a23b781a9963fab99700135Misha Brukman      StructValues.push_back(*i);
36822108fac63eac53d1a23b781a9963fab99700135Misha Brukman    } else {
36922108fac63eac53d1a23b781a9963fab99700135Misha Brukman      AllocaInst *alloca =
37050dead06ffc107edb7e84857baaeeb09039c631cOwen Anderson        new AllocaInst((*i)->getType(), 0, (*i)->getName()+".loc",
37122108fac63eac53d1a23b781a9963fab99700135Misha Brukman                       codeReplacer->getParent()->begin()->begin());
37222108fac63eac53d1a23b781a9963fab99700135Misha Brukman      ReloadOutputs.push_back(alloca);
37322108fac63eac53d1a23b781a9963fab99700135Misha Brukman      params.push_back(alloca);
37422108fac63eac53d1a23b781a9963fab99700135Misha Brukman    }
37522108fac63eac53d1a23b781a9963fab99700135Misha Brukman  }
37622108fac63eac53d1a23b781a9963fab99700135Misha Brukman
37722108fac63eac53d1a23b781a9963fab99700135Misha Brukman  AllocaInst *Struct = 0;
37822108fac63eac53d1a23b781a9963fab99700135Misha Brukman  if (AggregateArgs && (inputs.size() + outputs.size() > 0)) {
37922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    std::vector<const Type*> ArgTypes;
38022108fac63eac53d1a23b781a9963fab99700135Misha Brukman    for (Values::iterator v = StructValues.begin(),
38122108fac63eac53d1a23b781a9963fab99700135Misha Brukman           ve = StructValues.end(); v != ve; ++v)
38222108fac63eac53d1a23b781a9963fab99700135Misha Brukman      ArgTypes.push_back((*v)->getType());
38322108fac63eac53d1a23b781a9963fab99700135Misha Brukman
38422108fac63eac53d1a23b781a9963fab99700135Misha Brukman    // Allocate a struct at the beginning of this function
385d7f2a6cb3fbc012763adb42fd967f6fefbb22a37Owen Anderson    Type *StructArgTy = StructType::get(newFunction->getContext(), ArgTypes);
386fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman    Struct =
38750dead06ffc107edb7e84857baaeeb09039c631cOwen Anderson      new AllocaInst(StructArgTy, 0, "structArg",
38822108fac63eac53d1a23b781a9963fab99700135Misha Brukman                     codeReplacer->getParent()->begin()->begin());
38922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    params.push_back(Struct);
39022108fac63eac53d1a23b781a9963fab99700135Misha Brukman
39122108fac63eac53d1a23b781a9963fab99700135Misha Brukman    for (unsigned i = 0, e = inputs.size(); i != e; ++i) {
392b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene      Value *Idx[2];
393a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson      Idx[0] = Constant::getNullValue(Type::Int32Ty);
394eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson      Idx[1] = ConstantInt::get(Type::Int32Ty, i);
39522108fac63eac53d1a23b781a9963fab99700135Misha Brukman      GetElementPtrInst *GEP =
396051a950000e21935165db56695e35bade668193bGabor Greif        GetElementPtrInst::Create(Struct, Idx, Idx + 2,
397051a950000e21935165db56695e35bade668193bGabor Greif                                  "gep_" + StructValues[i]->getName());
39822108fac63eac53d1a23b781a9963fab99700135Misha Brukman      codeReplacer->getInstList().push_back(GEP);
39922108fac63eac53d1a23b781a9963fab99700135Misha Brukman      StoreInst *SI = new StoreInst(StructValues[i], GEP);
40022108fac63eac53d1a23b781a9963fab99700135Misha Brukman      codeReplacer->getInstList().push_back(SI);
40122108fac63eac53d1a23b781a9963fab99700135Misha Brukman    }
402fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  }
40322108fac63eac53d1a23b781a9963fab99700135Misha Brukman
40422108fac63eac53d1a23b781a9963fab99700135Misha Brukman  // Emit the call to the function
405051a950000e21935165db56695e35bade668193bGabor Greif  CallInst *call = CallInst::Create(newFunction, params.begin(), params.end(),
406051a950000e21935165db56695e35bade668193bGabor Greif                                    NumExitBlocks > 1 ? "targetBlock" : "");
40722108fac63eac53d1a23b781a9963fab99700135Misha Brukman  codeReplacer->getInstList().push_back(call);
40822108fac63eac53d1a23b781a9963fab99700135Misha Brukman
409e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner  Function::arg_iterator OutputArgBegin = newFunction->arg_begin();
41022108fac63eac53d1a23b781a9963fab99700135Misha Brukman  unsigned FirstOut = inputs.size();
41122108fac63eac53d1a23b781a9963fab99700135Misha Brukman  if (!AggregateArgs)
41222108fac63eac53d1a23b781a9963fab99700135Misha Brukman    std::advance(OutputArgBegin, inputs.size());
41304229c192bc153210e8ee8a18eb28d7f1ec21bfeChris Lattner
41422108fac63eac53d1a23b781a9963fab99700135Misha Brukman  // Reload the outputs passed in by reference
415b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner  for (unsigned i = 0, e = outputs.size(); i != e; ++i) {
41622108fac63eac53d1a23b781a9963fab99700135Misha Brukman    Value *Output = 0;
41722108fac63eac53d1a23b781a9963fab99700135Misha Brukman    if (AggregateArgs) {
418b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene      Value *Idx[2];
419a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson      Idx[0] = Constant::getNullValue(Type::Int32Ty);
420eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson      Idx[1] = ConstantInt::get(Type::Int32Ty, FirstOut + i);
421fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman      GetElementPtrInst *GEP
422051a950000e21935165db56695e35bade668193bGabor Greif        = GetElementPtrInst::Create(Struct, Idx, Idx + 2,
423051a950000e21935165db56695e35bade668193bGabor Greif                                    "gep_reload_" + outputs[i]->getName());
42422108fac63eac53d1a23b781a9963fab99700135Misha Brukman      codeReplacer->getInstList().push_back(GEP);
42522108fac63eac53d1a23b781a9963fab99700135Misha Brukman      Output = GEP;
42622108fac63eac53d1a23b781a9963fab99700135Misha Brukman    } else {
42722108fac63eac53d1a23b781a9963fab99700135Misha Brukman      Output = ReloadOutputs[i];
42822108fac63eac53d1a23b781a9963fab99700135Misha Brukman    }
42922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    LoadInst *load = new LoadInst(Output, outputs[i]->getName()+".reload");
430b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner    codeReplacer->getInstList().push_back(load);
431b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner    std::vector<User*> Users(outputs[i]->use_begin(), outputs[i]->use_end());
432b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner    for (unsigned u = 0, e = Users.size(); u != e; ++u) {
433b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner      Instruction *inst = cast<Instruction>(Users[u]);
434b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner      if (!BlocksToExtract.count(inst->getParent()))
435b5c1dbf50388c4efe26c9e7ba81e514a109c65d7Chris Lattner        inst->replaceUsesOfWith(outputs[i], load);
436e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman    }
437e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  }
43812f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner
439e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // Now we can emit a switch statement using the call as a value.
440346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  SwitchInst *TheSwitch =
441a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson      SwitchInst::Create(Constant::getNullValue(Type::Int16Ty),
442051a950000e21935165db56695e35bade668193bGabor Greif                         codeReplacer, 0, codeReplacer);
443e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
444e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // Since there may be multiple exits from the original region, make the new
44512f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner  // function return an unsigned, switch on that number.  This loop iterates
44612f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner  // over all of the blocks in the extracted region, updating any terminator
44712f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner  // instructions in the to-be-extracted region that branch to blocks that are
44812f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner  // not in the region to be extracted.
44912f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner  std::map<BasicBlock*, BasicBlock*> ExitBlockMap;
45012f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner
451e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  unsigned switchVal = 0;
4520e06674287b15696f66a65f20f2ba99137b29213Chris Lattner  for (std::set<BasicBlock*>::const_iterator i = BlocksToExtract.begin(),
4530e06674287b15696f66a65f20f2ba99137b29213Chris Lattner         e = BlocksToExtract.end(); i != e; ++i) {
45412f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner    TerminatorInst *TI = (*i)->getTerminator();
45512f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner    for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
45612f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner      if (!BlocksToExtract.count(TI->getSuccessor(i))) {
45712f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner        BasicBlock *OldTarget = TI->getSuccessor(i);
45812f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner        // add a new basic block which returns the appropriate value
45912f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner        BasicBlock *&NewTarget = ExitBlockMap[OldTarget];
46012f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner        if (!NewTarget) {
46112f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner          // If we don't already have an exit stub for this non-extracted
46212f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner          // destination, create one now!
463051a950000e21935165db56695e35bade668193bGabor Greif          NewTarget = BasicBlock::Create(OldTarget->getName() + ".exitStub",
464051a950000e21935165db56695e35bade668193bGabor Greif                                         newFunction);
465346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          unsigned SuccNum = switchVal++;
466346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner
467346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          Value *brVal = 0;
468346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          switch (NumExitBlocks) {
469346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          case 0:
470346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          case 1: break;  // No value needed.
471346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          case 2:         // Conditional branch, return a bool
472eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson            brVal = ConstantInt::get(Type::Int1Ty, !SuccNum);
473346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner            break;
474346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          default:
475eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson            brVal = ConstantInt::get(Type::Int16Ty, SuccNum);
476346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner            break;
477346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner          }
47812f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner
479051a950000e21935165db56695e35bade668193bGabor Greif          ReturnInst *NTRet = ReturnInst::Create(brVal, NewTarget);
48012f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner
48112f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner          // Update the switch instruction.
482eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson          TheSwitch->addCase(ConstantInt::get(Type::Int16Ty, SuccNum),
483346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner                             OldTarget);
48412f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner
48512f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner          // Restore values just before we exit
486e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner          Function::arg_iterator OAI = OutputArgBegin;
48722108fac63eac53d1a23b781a9963fab99700135Misha Brukman          for (unsigned out = 0, e = outputs.size(); out != e; ++out) {
48822108fac63eac53d1a23b781a9963fab99700135Misha Brukman            // For an invoke, the normal destination is the only one that is
48922108fac63eac53d1a23b781a9963fab99700135Misha Brukman            // dominated by the result of the invocation
49022108fac63eac53d1a23b781a9963fab99700135Misha Brukman            BasicBlock *DefBlock = cast<Instruction>(outputs[out])->getParent();
4919ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner
4929ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner            bool DominatesDef = true;
4939ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner
49468c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner            if (InvokeInst *Invoke = dyn_cast<InvokeInst>(outputs[out])) {
49522108fac63eac53d1a23b781a9963fab99700135Misha Brukman              DefBlock = Invoke->getNormalDest();
49668c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner
49768c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner              // Make sure we are looking at the original successor block, not
49868c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner              // at a newly inserted exit block, which won't be in the dominator
49968c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner              // info.
50068c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner              for (std::map<BasicBlock*, BasicBlock*>::iterator I =
50168c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner                     ExitBlockMap.begin(), E = ExitBlockMap.end(); I != E; ++I)
50268c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner                if (DefBlock == I->second) {
50368c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner                  DefBlock = I->first;
50468c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner                  break;
50568c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner                }
5069ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner
5079ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner              // In the extract block case, if the block we are extracting ends
5089ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner              // with an invoke instruction, make sure that we don't emit a
5099ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner              // store of the invoke value for the unwind block.
5104b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel              if (!DT && DefBlock != OldTarget)
5119ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner                DominatesDef = false;
51268c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner            }
51368c311aac64ca3bc50f48f4f1b4fd4c21fe0c4dfChris Lattner
5144b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel            if (DT)
5154b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel              DominatesDef = DT->dominates(DefBlock, OldTarget);
5169ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner
5179ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner            if (DominatesDef) {
51822108fac63eac53d1a23b781a9963fab99700135Misha Brukman              if (AggregateArgs) {
519b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene                Value *Idx[2];
520a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson                Idx[0] = Constant::getNullValue(Type::Int32Ty);
521eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson                Idx[1] = ConstantInt::get(Type::Int32Ty,FirstOut+out);
52222108fac63eac53d1a23b781a9963fab99700135Misha Brukman                GetElementPtrInst *GEP =
523051a950000e21935165db56695e35bade668193bGabor Greif                  GetElementPtrInst::Create(OAI, Idx, Idx + 2,
524051a950000e21935165db56695e35bade668193bGabor Greif                                            "gep_" + outputs[out]->getName(),
525051a950000e21935165db56695e35bade668193bGabor Greif                                            NTRet);
52622108fac63eac53d1a23b781a9963fab99700135Misha Brukman                new StoreInst(outputs[out], GEP, NTRet);
5279ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner              } else {
52822108fac63eac53d1a23b781a9963fab99700135Misha Brukman                new StoreInst(outputs[out], OAI, NTRet);
5299ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner              }
5309ecc0461841ad2fb44996a965f30ab3931efbf70Chris Lattner            }
53122108fac63eac53d1a23b781a9963fab99700135Misha Brukman            // Advance output iterator even if we don't emit a store
53222108fac63eac53d1a23b781a9963fab99700135Misha Brukman            if (!AggregateArgs) ++OAI;
53322108fac63eac53d1a23b781a9963fab99700135Misha Brukman          }
534e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman        }
5350e06674287b15696f66a65f20f2ba99137b29213Chris Lattner
53612f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner        // rewrite the original branch instruction with this new target
53712f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner        TI->setSuccessor(i, NewTarget);
53812f390e9c03d5439fd84c26d7cbd451cda80601aChris Lattner      }
539e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  }
54065826bf435620824763af926270cf0efdc82ea5aChris Lattner
5415b01e298ed42d5ce6aaf7634618b5e1769766b21Chris Lattner  // Now that we've done the deed, simplify the switch instruction.
542b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner  const Type *OldFnRetTy = TheSwitch->getParent()->getParent()->getReturnType();
543346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  switch (NumExitBlocks) {
544346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  case 0:
545b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner    // There are no successors (the block containing the switch itself), which
54622108fac63eac53d1a23b781a9963fab99700135Misha Brukman    // means that previously this was the last part of the function, and hence
54722108fac63eac53d1a23b781a9963fab99700135Misha Brukman    // this should be rewritten as a `ret'
548fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
54922108fac63eac53d1a23b781a9963fab99700135Misha Brukman    // Check if the function should return a value
550b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner    if (OldFnRetTy == Type::VoidTy) {
551051a950000e21935165db56695e35bade668193bGabor Greif      ReturnInst::Create(0, TheSwitch);  // Return void
552b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner    } else if (OldFnRetTy == TheSwitch->getCondition()->getType()) {
55322108fac63eac53d1a23b781a9963fab99700135Misha Brukman      // return what we have
554051a950000e21935165db56695e35bade668193bGabor Greif      ReturnInst::Create(TheSwitch->getCondition(), TheSwitch);
555b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner    } else {
556b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner      // Otherwise we must have code extracted an unwind or something, just
557b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner      // return whatever we want.
558a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson      ReturnInst::Create(Constant::getNullValue(OldFnRetTy), TheSwitch);
559b519efbafedb356a30a04a32c15a6b406779a997Chris Lattner    }
56022108fac63eac53d1a23b781a9963fab99700135Misha Brukman
5611adec83ae84031bfa9f0bf209c5ee6c64906a1ffDan Gohman    TheSwitch->eraseFromParent();
562346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    break;
563346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  case 1:
564346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    // Only a single destination, change the switch into an unconditional
565346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    // branch.
566051a950000e21935165db56695e35bade668193bGabor Greif    BranchInst::Create(TheSwitch->getSuccessor(1), TheSwitch);
5671adec83ae84031bfa9f0bf209c5ee6c64906a1ffDan Gohman    TheSwitch->eraseFromParent();
568346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    break;
569346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  case 2:
570051a950000e21935165db56695e35bade668193bGabor Greif    BranchInst::Create(TheSwitch->getSuccessor(1), TheSwitch->getSuccessor(2),
571051a950000e21935165db56695e35bade668193bGabor Greif                       call, TheSwitch);
5721adec83ae84031bfa9f0bf209c5ee6c64906a1ffDan Gohman    TheSwitch->eraseFromParent();
573346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    break;
574346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner  default:
575346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    // Otherwise, make the default destination of the switch instruction be one
576346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    // of the other successors.
577346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    TheSwitch->setOperand(0, call);
578346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    TheSwitch->setSuccessor(0, TheSwitch->getSuccessor(NumExitBlocks));
579346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    TheSwitch->removeCase(NumExitBlocks);  // Remove redundant case
580346be7f5bc1bab5768b9fa0a01a015d2fdca19c5Chris Lattner    break;
58165826bf435620824763af926270cf0efdc82ea5aChris Lattner  }
582e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman}
583e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
584bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattnervoid CodeExtractor::moveCodeToFunction(Function *newFunction) {
585bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  Function *oldFunc = (*BlocksToExtract.begin())->getParent();
586bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  Function::BasicBlockListType &oldBlocks = oldFunc->getBasicBlockList();
587bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  Function::BasicBlockListType &newBlocks = newFunction->getBasicBlockList();
588bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
589bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  for (std::set<BasicBlock*>::const_iterator i = BlocksToExtract.begin(),
590bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner         e = BlocksToExtract.end(); i != e; ++i) {
591bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    // Delete the basic block from the old function, and the list of blocks
592bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    oldBlocks.remove(*i);
593bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
594bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    // Insert this basic block into the new function
595bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner    newBlocks.push_back(*i);
596bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  }
597bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner}
598e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
599e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// ExtractRegion - Removes a loop from a function, replaces it with a call to
600e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// new function. Returns pointer to the new function.
601e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
602e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// algorithm:
603e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
604e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// find inputs and outputs for the region
605e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
606fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman/// for inputs: add to function as args, map input instr* to arg#
607fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman/// for outputs: add allocas for scalars,
608e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///             add to func as args, map output instr* to arg#
609e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
610e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// rewrite func to use argument #s instead of instr*
611e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
612fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman/// for each scalar output in the function: at every exit, store intermediate
613e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman/// computed result back into memory.
614e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman///
615b519efbafedb356a30a04a32c15a6b406779a997Chris LattnerFunction *CodeExtractor::
616b519efbafedb356a30a04a32c15a6b406779a997Chris LattnerExtractCodeRegion(const std::vector<BasicBlock*> &code) {
61722108fac63eac53d1a23b781a9963fab99700135Misha Brukman  if (!isEligible(code))
61822108fac63eac53d1a23b781a9963fab99700135Misha Brukman    return 0;
61922108fac63eac53d1a23b781a9963fab99700135Misha Brukman
620e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // 1) Find inputs, outputs
621e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // 2) Construct new function
622e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  //  * Add allocas for defs, pass as args by reference
623e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  //  * Pass in uses as args
624e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // 3) Move code region, add call instr to func
6250e06674287b15696f66a65f20f2ba99137b29213Chris Lattner  //
6260e06674287b15696f66a65f20f2ba99137b29213Chris Lattner  BlocksToExtract.insert(code.begin(), code.end());
627e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
628e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  Values inputs, outputs;
629e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
630e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // Assumption: this is a single-entry code region, and the header is the first
6310de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner  // block in the region.
632e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  BasicBlock *header = code[0];
633bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
6340de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner  for (unsigned i = 1, e = code.size(); i != e; ++i)
6350de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner    for (pred_iterator PI = pred_begin(code[i]), E = pred_end(code[i]);
6360de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner         PI != E; ++PI)
6370de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner      assert(BlocksToExtract.count(*PI) &&
6380de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner             "No blocks in this region may have entries from outside the region"
6390de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner             " except for the first block!");
640fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
641d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner  // If we have to split PHI nodes or the entry block, do so now.
642e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  severSplitPHINodes(header);
643e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
644d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner  // If we have any return instructions in the region, split those blocks so
645d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner  // that the return is not in the region.
646d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner  splitReturnBlocks();
647d99e1d3afbe664694ee04a5db5e4a7a8104858a1Chris Lattner
648e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  Function *oldFunction = header->getParent();
649e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
650e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // This takes place of the original loop
651b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif  BasicBlock *codeReplacer = BasicBlock::Create("codeRepl", oldFunction,
652b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif                                                header);
653e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
654e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  // The new function needs a root node because other nodes can branch to the
655bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  // head of the region, but the entry node of a function cannot have preds.
656051a950000e21935165db56695e35bade668193bGabor Greif  BasicBlock *newFuncRoot = BasicBlock::Create("newFuncRoot");
657051a950000e21935165db56695e35bade668193bGabor Greif  newFuncRoot->getInstList().push_back(BranchInst::Create(header));
658e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
659bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  // Find inputs to, outputs from the code region.
660bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  findInputsOutputs(inputs, outputs);
661bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner
662bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  // Construct new function based on inputs/outputs & add allocas for all defs.
663e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  Function *newFunction = constructFunction(inputs, outputs, header,
664fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman                                            newFuncRoot,
6650de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner                                            codeReplacer, oldFunction,
6660de632bfaedf07b5ae6fd616864716bd5427cb17Chris Lattner                                            oldFunction->getParent());
667e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
6680e06674287b15696f66a65f20f2ba99137b29213Chris Lattner  emitCallAndSwitchStatement(newFunction, codeReplacer, inputs, outputs);
669e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
6700e06674287b15696f66a65f20f2ba99137b29213Chris Lattner  moveCodeToFunction(newFunction);
671e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
672e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  // Loop over all of the PHI nodes in the header block, and change any
6735cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner  // references to the old incoming edge to be the new incoming edge.
6742da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer  for (BasicBlock::iterator I = header->begin(); isa<PHINode>(I); ++I) {
6752da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer    PHINode *PN = cast<PHINode>(I);
6765cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
6775cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner      if (!BlocksToExtract.count(PN->getIncomingBlock(i)))
6785cc8ca642095e5d6af377ce0709fa29512c40ad5Chris Lattner        PN->setIncomingBlock(i, newFuncRoot);
6792da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer  }
680fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
681d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner  // Look at all successors of the codeReplacer block.  If any of these blocks
682d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner  // had PHI nodes in them, we need to update the "from" block to be the code
683d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner  // replacer, not the original block in the extracted region.
684d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner  std::vector<BasicBlock*> Succs(succ_begin(codeReplacer),
685d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner                                 succ_end(codeReplacer));
686d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner  for (unsigned i = 0, e = Succs.size(); i != e; ++i)
6872da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer    for (BasicBlock::iterator I = Succs[i]->begin(); isa<PHINode>(I); ++I) {
6882da5c3dda6f5b9c4ec6d55008d33327764364bd4Reid Spencer      PHINode *PN = cast<PHINode>(I);
689a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner      std::set<BasicBlock*> ProcessedPreds;
690d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner      for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
69107e6e56f57e8781a8d7bc601cc9034a3741d84c2Anton Korobeynikov        if (BlocksToExtract.count(PN->getIncomingBlock(i))) {
692a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner          if (ProcessedPreds.insert(PN->getIncomingBlock(i)).second)
693a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner            PN->setIncomingBlock(i, codeReplacer);
694a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner          else {
695a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner            // There were multiple entries in the PHI for this block, now there
696a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner            // is only one, so remove the duplicated entries.
697a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner            PN->removeIncomingValue(i, false);
698a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner            --i; --e;
699a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner          }
70007e6e56f57e8781a8d7bc601cc9034a3741d84c2Anton Korobeynikov        }
701a670c684a637e9922be87d8b459d2e052675f0e4Chris Lattner    }
702fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
703e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  //cerr << "NEW FUNCTION: " << *newFunction;
704e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  //  verifyFunction(*newFunction);
705e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner
706e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  //  cerr << "OLD FUNCTION: " << *oldFunction;
707e746ad512efc447f352f9580a82c808c2d32ab26Chris Lattner  //  verifyFunction(*oldFunction);
708d07f89969166750f96c0e3055e387ec82bba88c5Chris Lattner
7097d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin  DEBUG(if (verifyFunction(*newFunction))
7107d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin        llvm_report_error("verifyFunction failed!"));
711e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman  return newFunction;
712e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman}
713e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
71422108fac63eac53d1a23b781a9963fab99700135Misha Brukmanbool CodeExtractor::isEligible(const std::vector<BasicBlock*> &code) {
715bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner  // Deny code region if it contains allocas or vastarts.
71622108fac63eac53d1a23b781a9963fab99700135Misha Brukman  for (std::vector<BasicBlock*>::const_iterator BB = code.begin(), e=code.end();
71722108fac63eac53d1a23b781a9963fab99700135Misha Brukman       BB != e; ++BB)
71822108fac63eac53d1a23b781a9963fab99700135Misha Brukman    for (BasicBlock::const_iterator I = (*BB)->begin(), Ie = (*BB)->end();
71922108fac63eac53d1a23b781a9963fab99700135Misha Brukman         I != Ie; ++I)
72022108fac63eac53d1a23b781a9963fab99700135Misha Brukman      if (isa<AllocaInst>(*I))
72122108fac63eac53d1a23b781a9963fab99700135Misha Brukman        return false;
722bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner      else if (const CallInst *CI = dyn_cast<CallInst>(I))
723bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner        if (const Function *F = CI->getCalledFunction())
724bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner          if (F->getIntrinsicID() == Intrinsic::vastart)
725bf749367cb2aef7072ee36a9eb681b35aab51921Chris Lattner            return false;
72622108fac63eac53d1a23b781a9963fab99700135Misha Brukman  return true;
72722108fac63eac53d1a23b781a9963fab99700135Misha Brukman}
72822108fac63eac53d1a23b781a9963fab99700135Misha Brukman
72922108fac63eac53d1a23b781a9963fab99700135Misha Brukman
7300256e4bbf9d8108912d3015634bc1a6f78366d16Misha Brukman/// ExtractCodeRegion - slurp a sequence of basic blocks into a brand new
7310256e4bbf9d8108912d3015634bc1a6f78366d16Misha Brukman/// function
7320256e4bbf9d8108912d3015634bc1a6f78366d16Misha Brukman///
7334b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang PatelFunction* llvm::ExtractCodeRegion(DominatorTree &DT,
73422108fac63eac53d1a23b781a9963fab99700135Misha Brukman                                  const std::vector<BasicBlock*> &code,
73522108fac63eac53d1a23b781a9963fab99700135Misha Brukman                                  bool AggregateArgs) {
7364b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel  return CodeExtractor(&DT, AggregateArgs).ExtractCodeRegion(code);
7370256e4bbf9d8108912d3015634bc1a6f78366d16Misha Brukman}
7380256e4bbf9d8108912d3015634bc1a6f78366d16Misha Brukman
739b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman/// ExtractBasicBlock - slurp a natural loop into a brand new function
740b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman///
7414b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang PatelFunction* llvm::ExtractLoop(DominatorTree &DT, Loop *L, bool AggregateArgs) {
7424b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel  return CodeExtractor(&DT, AggregateArgs).ExtractCodeRegion(L->getBlocks());
743e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman}
744e6336031b8b85a438e2fcaa9e56e7392afbbb7dcMisha Brukman
745b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman/// ExtractBasicBlock - slurp a basic block into a brand new function
746b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman///
74722108fac63eac53d1a23b781a9963fab99700135Misha BrukmanFunction* llvm::ExtractBasicBlock(BasicBlock *BB, bool AggregateArgs) {
748b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman  std::vector<BasicBlock*> Blocks;
749b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman  Blocks.push_back(BB);
7504b90e3a276c0bb1bd4d90289e27aa3c4f890b5afDevang Patel  return CodeExtractor(0, AggregateArgs).ExtractCodeRegion(Blocks);
751b97fce52528eb5d9a6e86c3c0e92a73a07341c83Misha Brukman}
752