forked from OSchip/llvm-project
				
			LoopVectorizer: Move cse code into its own function
llvm-svn: 193895
This commit is contained in:
		
							parent
							
								
									fedfa44922
								
							
						
					
					
						commit
						d0789cdffe
					
				| 
						 | 
				
			
			@ -2055,6 +2055,41 @@ Value *createMinMaxOp(IRBuilder<> &Builder,
 | 
			
		|||
  return Select;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///\brief Perform cse of induction variable instructions.
 | 
			
		||||
static void cse(BasicBlock *BB) {
 | 
			
		||||
  // Perform simple cse.
 | 
			
		||||
  SmallPtrSet<Instruction*, 16> Visited;
 | 
			
		||||
  SmallVector<Instruction*, 16> ToRemove;
 | 
			
		||||
  for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
 | 
			
		||||
      Instruction *In = I;
 | 
			
		||||
 | 
			
		||||
      if (!isa<InsertElementInst>(In) && !isa<ExtractElementInst>(In) &&
 | 
			
		||||
          !isa<ShuffleVectorInst>(In) && !isa<GetElementPtrInst>(In))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      // Check if we can replace this instruction with any of the
 | 
			
		||||
      // visited instructions.
 | 
			
		||||
      for (SmallPtrSet<Instruction*, 16>::iterator v = Visited.begin(),
 | 
			
		||||
           ve = Visited.end(); v != ve; ++v) {
 | 
			
		||||
        if (In->isIdenticalTo(*v)) {
 | 
			
		||||
          In->replaceAllUsesWith(*v);
 | 
			
		||||
          ToRemove.push_back(In);
 | 
			
		||||
          In = 0;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (In)
 | 
			
		||||
        Visited.insert(In);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  // Erase all of the instructions that we RAUWed.
 | 
			
		||||
  for (SmallVectorImpl<Instruction *>::iterator v = ToRemove.begin(),
 | 
			
		||||
       ve = ToRemove.end(); v != ve; ++v) {
 | 
			
		||||
    assert((*v)->getNumUses() == 0 && "Can't remove instructions with uses");
 | 
			
		||||
    (*v)->eraseFromParent();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
InnerLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
 | 
			
		||||
  //===------------------------------------------------===//
 | 
			
		||||
| 
						 | 
				
			
			@ -2275,38 +2310,8 @@ InnerLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
 | 
			
		|||
 | 
			
		||||
  fixLCSSAPHIs();
 | 
			
		||||
 | 
			
		||||
  // Perform simple cse.
 | 
			
		||||
  SmallPtrSet<Instruction*, 16> Visited;
 | 
			
		||||
  SmallVector<Instruction*, 16> ToRemove;
 | 
			
		||||
  for (BasicBlock::iterator I = LoopVectorBody->begin(),
 | 
			
		||||
       E = LoopVectorBody->end(); I != E; ++I) {
 | 
			
		||||
      Instruction *In = I;
 | 
			
		||||
 | 
			
		||||
      if (!isa<InsertElementInst>(In) && !isa<ExtractElementInst>(In) &&
 | 
			
		||||
          !isa<ShuffleVectorInst>(In) && !isa<GetElementPtrInst>(In))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      // Check if we can replace this instruction with any of the
 | 
			
		||||
      // visited instructions.
 | 
			
		||||
      for (SmallPtrSet<Instruction*, 16>::iterator v = Visited.begin(),
 | 
			
		||||
           ve = Visited.end(); v != ve; ++v) {
 | 
			
		||||
        if (In->isIdenticalTo(*v)) {
 | 
			
		||||
          In->replaceAllUsesWith(*v);
 | 
			
		||||
          ToRemove.push_back(In);
 | 
			
		||||
          In = 0;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (In)
 | 
			
		||||
        Visited.insert(In);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  // Erase all of the instructions that we RAUWed.
 | 
			
		||||
  for (SmallVectorImpl<Instruction *>::iterator v = ToRemove.begin(),
 | 
			
		||||
       ve = ToRemove.end(); v != ve; ++v) {
 | 
			
		||||
    assert((*v)->getNumUses() == 0 && "Can't remove instructions with uses");
 | 
			
		||||
    (*v)->eraseFromParent();
 | 
			
		||||
  }
 | 
			
		||||
  // Remove redundant induction instructions.
 | 
			
		||||
  cse(LoopVectorBody);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void InnerLoopVectorizer::fixLCSSAPHIs() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue