forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- DeadCodeElimination.cpp - Eliminate dead iteration  ----------------===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// If values calculated within an iteration are not used later on the iteration
 | 
						|
// can be removed entirely. This pass removes such iterations.
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "polly/Dependences.h"
 | 
						|
#include "polly/LinkAllPasses.h"
 | 
						|
#include "polly/ScopInfo.h"
 | 
						|
 | 
						|
#include "isl/union_map.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
using namespace polly;
 | 
						|
 | 
						|
namespace {
 | 
						|
 | 
						|
  class DeadCodeElim : public ScopPass {
 | 
						|
 | 
						|
  public:
 | 
						|
    static char ID;
 | 
						|
    explicit DeadCodeElim() : ScopPass(ID) {}
 | 
						|
 | 
						|
    virtual bool runOnScop(Scop &S);
 | 
						|
    void printScop(llvm::raw_ostream &OS) const;
 | 
						|
    void getAnalysisUsage(AnalysisUsage &AU) const;
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
char DeadCodeElim::ID = 0;
 | 
						|
 | 
						|
bool DeadCodeElim::runOnScop(Scop &S) {
 | 
						|
  Dependences *D = &getAnalysis<Dependences>();
 | 
						|
 | 
						|
  int dependencyKinds = Dependences::TYPE_RAW
 | 
						|
                          | Dependences::TYPE_WAR
 | 
						|
                          | Dependences::TYPE_WAW;
 | 
						|
 | 
						|
  isl_union_map *dependences = D->getDependences(dependencyKinds);
 | 
						|
 | 
						|
  // The idea of this pass is to loop over all statments and remove statement
 | 
						|
  // iterations that do not calculate any value that is read later on. We need
 | 
						|
  // to make sure to forward RAR and WAR dependences.
 | 
						|
  //
 | 
						|
  // A case where this pass might be useful is
 | 
						|
  // http://llvm.org/bugs/show_bug.cgi?id=5117
 | 
						|
  isl_union_map_free(dependences);
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
void DeadCodeElim::printScop(raw_ostream &OS) const {
 | 
						|
}
 | 
						|
 | 
						|
void DeadCodeElim::getAnalysisUsage(AnalysisUsage &AU) const {
 | 
						|
  ScopPass::getAnalysisUsage(AU);
 | 
						|
  AU.addRequired<Dependences>();
 | 
						|
}
 | 
						|
 | 
						|
INITIALIZE_PASS_BEGIN(DeadCodeElim, "polly-dce",
 | 
						|
                      "Polly - Remove dead iterations", false, false)
 | 
						|
INITIALIZE_PASS_DEPENDENCY(Dependences)
 | 
						|
INITIALIZE_PASS_DEPENDENCY(ScopInfo)
 | 
						|
INITIALIZE_PASS_END(DeadCodeElim, "polly-dce",
 | 
						|
                      "Polly - Remove dead iterations", false, false)
 | 
						|
 | 
						|
Pass* polly::createDeadCodeElimPass() {
 | 
						|
  return new DeadCodeElim();
 | 
						|
}
 |