blob: ea643e9096b76c564080a42d266db599087ca9c6 [file] [log] [blame]
//===- OptimizeChecks.cpp - Optimize SAFECode Run-time Checks -----*- C++ -*--//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This pass optimizes some of the SAFECode run-time checks.
//
//===----------------------------------------------------------------------===//
#ifndef SAFECODE_OPTIMIZECHECKS_H
#define SAFECODE_OPTIMIZECHECKS_H
#include "llvm/ADT/DenseSet.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
#include "safecode/CheckInfo.h"
#include "safecode/AllocatorInfo.h"
namespace llvm {
//
// Pass: OptimizeChecks
//
// Description:
// This pass examines the run-time checks that SAFECode has inserted into a
// program and attempts to remove checks that are unnecessary.
//
struct OptimizeChecks : public ModulePass {
private:
// Private methods
bool processFunction (Module & M, const struct CheckInfo & Info);
bool onlyUsedInCompares (Value * Val);
public:
static char ID;
OptimizeChecks() : ModulePass(ID) {}
virtual bool runOnModule (Module & M);
const char *getPassName() const {
return "Optimize SAFECode Run-time Checks";
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
}
};
//
// Pass: GlobalRegisterOpt
//
// Description:
// This pass looks for global variables that are never used in run-time checks
// that perform lookups. Such global variables do not need to be registered
// with pool_register_global(), so we remove such registrations.
//
struct GlobalRegisterOpt : public ModulePass {
private:
public:
static char ID;
GlobalRegisterOpt() : ModulePass(ID) {}
virtual bool runOnModule (Module & M);
const char *getPassName() const {
return "Optimize SAFECode Global Object Registration";
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
}
};
}
#endif