diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 | 
| commit | 30815c536baacc07e925f0aef23a5395883173dc (patch) | |
| tree | 2cbcf22585e99f8a87d12d5ff94f392c0d266819 /lib/Transforms/Utils/CodeExtractor.cpp | |
| parent | 411bd29eea3c360d5b48a18a17b5e87f5671af0e (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils/CodeExtractor.cpp')
| -rw-r--r-- | lib/Transforms/Utils/CodeExtractor.cpp | 45 | 
1 files changed, 23 insertions, 22 deletions
diff --git a/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp index 081352358b958..5f47ebb782021 100644 --- a/lib/Transforms/Utils/CodeExtractor.cpp +++ b/lib/Transforms/Utils/CodeExtractor.cpp @@ -50,14 +50,14 @@ namespace {      DominatorTree* DT;      bool AggregateArgs;      unsigned NumExitBlocks; -    const Type *RetTy; +    Type *RetTy;    public:      CodeExtractor(DominatorTree* dt = 0, bool AggArgs = false)        : DT(dt), AggregateArgs(AggArgs||AggregateArgsOpt), NumExitBlocks(~0U) {} -    Function *ExtractCodeRegion(const std::vector<BasicBlock*> &code); +    Function *ExtractCodeRegion(ArrayRef<BasicBlock*> code); -    bool isEligible(const std::vector<BasicBlock*> &code); +    bool isEligible(ArrayRef<BasicBlock*> code);    private:      /// definedInRegion - Return true if the specified value is defined in the @@ -290,7 +290,7 @@ Function *CodeExtractor::constructFunction(const Values &inputs,      paramTy.clear();      paramTy.push_back(StructPtr);    } -  const FunctionType *funcType = +  FunctionType *funcType =                    FunctionType::get(RetTy, paramTy, false);    // Create the new function @@ -317,8 +317,7 @@ Function *CodeExtractor::constructFunction(const Values &inputs,        Idx[1] = ConstantInt::get(Type::getInt32Ty(header->getContext()), i);        TerminatorInst *TI = newFunction->begin()->getTerminator();        GetElementPtrInst *GEP =  -        GetElementPtrInst::Create(AI, Idx, Idx+2,  -                                  "gep_" + inputs[i]->getName(), TI); +        GetElementPtrInst::Create(AI, Idx, "gep_" + inputs[i]->getName(), TI);        RewriteVal = new LoadInst(GEP, "loadgep_" + inputs[i]->getName(), TI);      } else        RewriteVal = AI++; @@ -420,7 +419,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,        Idx[0] = Constant::getNullValue(Type::getInt32Ty(Context));        Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), i);        GetElementPtrInst *GEP = -        GetElementPtrInst::Create(Struct, Idx, Idx + 2, +        GetElementPtrInst::Create(Struct, Idx,                                    "gep_" + StructValues[i]->getName());        codeReplacer->getInstList().push_back(GEP);        StoreInst *SI = new StoreInst(StructValues[i], GEP); @@ -446,7 +445,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,        Idx[0] = Constant::getNullValue(Type::getInt32Ty(Context));        Idx[1] = ConstantInt::get(Type::getInt32Ty(Context), FirstOut + i);        GetElementPtrInst *GEP -        = GetElementPtrInst::Create(Struct, Idx, Idx + 2, +        = GetElementPtrInst::Create(Struct, Idx,                                      "gep_reload_" + outputs[i]->getName());        codeReplacer->getInstList().push_back(GEP);        Output = GEP; @@ -561,7 +560,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,                  Idx[1] = ConstantInt::get(Type::getInt32Ty(Context),                                            FirstOut+out);                  GetElementPtrInst *GEP = -                  GetElementPtrInst::Create(OAI, Idx, Idx + 2, +                  GetElementPtrInst::Create(OAI, Idx,                                              "gep_" + outputs[out]->getName(),                                              NTRet);                  new StoreInst(outputs[out], GEP, NTRet); @@ -580,7 +579,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,    }    // Now that we've done the deed, simplify the switch instruction. -  const Type *OldFnRetTy = TheSwitch->getParent()->getParent()->getReturnType(); +  Type *OldFnRetTy = TheSwitch->getParent()->getParent()->getReturnType();    switch (NumExitBlocks) {    case 0:      // There are no successors (the block containing the switch itself), which @@ -655,7 +654,7 @@ void CodeExtractor::moveCodeToFunction(Function *newFunction) {  /// computed result back into memory.  ///  Function *CodeExtractor:: -ExtractCodeRegion(const std::vector<BasicBlock*> &code) { +ExtractCodeRegion(ArrayRef<BasicBlock*> code) {    if (!isEligible(code))      return 0; @@ -755,9 +754,13 @@ ExtractCodeRegion(const std::vector<BasicBlock*> &code) {    return newFunction;  } -bool CodeExtractor::isEligible(const std::vector<BasicBlock*> &code) { +bool CodeExtractor::isEligible(ArrayRef<BasicBlock*> code) { +  // Deny a single basic block that's a landing pad block. +  if (code.size() == 1 && code[0]->isLandingPad()) +    return false; +    // Deny code region if it contains allocas or vastarts. -  for (std::vector<BasicBlock*>::const_iterator BB = code.begin(), e=code.end(); +  for (ArrayRef<BasicBlock*>::iterator BB = code.begin(), e=code.end();         BB != e; ++BB)      for (BasicBlock::const_iterator I = (*BB)->begin(), Ie = (*BB)->end();           I != Ie; ++I) @@ -771,25 +774,23 @@ bool CodeExtractor::isEligible(const std::vector<BasicBlock*> &code) {  } -/// ExtractCodeRegion - slurp a sequence of basic blocks into a brand new -/// function +/// ExtractCodeRegion - Slurp a sequence of basic blocks into a brand new +/// function.  ///  Function* llvm::ExtractCodeRegion(DominatorTree &DT, -                                  const std::vector<BasicBlock*> &code, +                                  ArrayRef<BasicBlock*> code,                                    bool AggregateArgs) {    return CodeExtractor(&DT, AggregateArgs).ExtractCodeRegion(code);  } -/// ExtractBasicBlock - slurp a natural loop into a brand new function +/// ExtractLoop - Slurp a natural loop into a brand new function.  ///  Function* llvm::ExtractLoop(DominatorTree &DT, Loop *L, bool AggregateArgs) {    return CodeExtractor(&DT, AggregateArgs).ExtractCodeRegion(L->getBlocks());  } -/// ExtractBasicBlock - slurp a basic block into a brand new function +/// ExtractBasicBlock - Slurp a basic block into a brand new function.  /// -Function* llvm::ExtractBasicBlock(BasicBlock *BB, bool AggregateArgs) { -  std::vector<BasicBlock*> Blocks; -  Blocks.push_back(BB); -  return CodeExtractor(0, AggregateArgs).ExtractCodeRegion(Blocks); +Function* llvm::ExtractBasicBlock(ArrayRef<BasicBlock*> BBs, bool AggregateArgs){ +  return CodeExtractor(0, AggregateArgs).ExtractCodeRegion(BBs);  }  | 
