llvm-project/polly/lib/DeadCodeElimination.cpp

76 lines
2.1 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 Kinds = Dependences::TYPE_RAW | Dependences::TYPE_WAR |
Dependences::TYPE_WAW;
isl_union_map *Deps = D->getDependences(Kinds);
// 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(Deps);
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();
}