Cloning.h revision d4fd3978056928b156bc51bff7cd4eb825bffb1a
184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//===- Cloning.h - Clone various parts of LLVM programs ---------*- C++ -*-===//
284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//
384bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// This file defines various functions that are used to clone chunks of LLVM
484bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// code for various purposes.  This varies from copying whole modules into new
584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// modules, to cloning functions with different arguments, to inlining
684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// functions, to copying basic blocks to support loop unrolling or superblock
784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// formation, etc.
884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//
984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//===----------------------------------------------------------------------===//
1084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner
1184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#ifndef LLVM_TRANSFORMS_UTIlS_CLONING_H
1284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#define LLVM_TRANSFORMS_UTIlS_CLONING_H
1384bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner
1484bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#include <vector>
15d18015599cbe09dd327b5f73501581a865bf27daChris Lattner#include <map>
1684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass Module;
1784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass Function;
1884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass BasicBlock;
1984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass Value;
2084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass CallInst;
211c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattnerclass ReturnInst;
2284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner
23d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// CloneModule - Return an exact copy of the specified module
24d18015599cbe09dd327b5f73501581a865bf27daChris Lattner///
25d4fd3978056928b156bc51bff7cd4eb825bffb1aChris LattnerModule *CloneModule(const Module *M);
26d18015599cbe09dd327b5f73501581a865bf27daChris Lattner
27d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// CloneFunction - Return a copy of the specified function, but without
28d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// embedding the function into another module.  Also, any references specified
29d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// in the ValueMap are changed to refer to their mapped value instead of the
30d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// original one.  If any of the arguments to the function are in the ValueMap,
31d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// the arguments are deleted from the resultant function.  The ValueMap is
32d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// updated to include mappings from all of the instructions and basicblocks in
33d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// the function from their old to new values.
34d18015599cbe09dd327b5f73501581a865bf27daChris Lattner///
35d18015599cbe09dd327b5f73501581a865bf27daChris LattnerFunction *CloneFunction(const Function *F,
36d18015599cbe09dd327b5f73501581a865bf27daChris Lattner                        std::map<const Value*, Value*> &ValueMap);
37d18015599cbe09dd327b5f73501581a865bf27daChris Lattner
38d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// CloneFunction - Version of the function that doesn't need the ValueMap.
39d18015599cbe09dd327b5f73501581a865bf27daChris Lattner///
40d18015599cbe09dd327b5f73501581a865bf27daChris Lattnerinline Function *CloneFunction(const Function *F) {
41d18015599cbe09dd327b5f73501581a865bf27daChris Lattner  std::map<const Value*, Value*> ValueMap;
42d18015599cbe09dd327b5f73501581a865bf27daChris Lattner  return CloneFunction(F, ValueMap);
43d18015599cbe09dd327b5f73501581a865bf27daChris Lattner}
44d18015599cbe09dd327b5f73501581a865bf27daChris Lattner
4584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// Clone OldFunc into NewFunc, transforming the old arguments into references to
4684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// ArgMap values.  Note that if NewFunc already has basic blocks, the ones
471c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner// cloned into it will be added to the end of the function.  This function fills
481c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner// in a list of return instructions, and can optionally append the specified
491c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner// suffix to all values cloned.
5084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//
5184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnervoid CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
52d18015599cbe09dd327b5f73501581a865bf27daChris Lattner                       std::map<const Value*, Value*> &ValueMap,
531c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner                       std::vector<ReturnInst*> &Returns,
541c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner                       const char *NameSuffix = "");
5584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner
5684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner
5784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// InlineFunction - This function forcibly inlines the called function into the
5884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// basic block of the caller.  This returns true if it is not possible to inline
5984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// this call.  The program is still in a well defined state if this occurs
6084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// though.
6184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//
6284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// Note that this only does one level of inlining.  For example, if the
6384bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now
6484bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// exists in the instruction stream.  Similiarly this will inline a recursive
6584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// function by one level.
6684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//
6784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerbool InlineFunction(CallInst *C);
6884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner
6984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#endif
70