//===- TestPasses.cpp - "buggy" passes used to test bugpoint --------------===// | |
// | |
// The LLVM Compiler Infrastructure | |
// | |
// This file is distributed under the University of Illinois Open Source | |
// License. See LICENSE.TXT for details. | |
// | |
//===----------------------------------------------------------------------===// | |
// | |
// This file contains "buggy" passes that are used to test bugpoint, to check | |
// that it is narrowing down testcases correctly. | |
// | |
//===----------------------------------------------------------------------===// | |
#include "llvm/BasicBlock.h" | |
#include "llvm/Constant.h" | |
#include "llvm/Instructions.h" | |
#include "llvm/Pass.h" | |
#include "llvm/Type.h" | |
#include "llvm/Support/InstVisitor.h" | |
using namespace llvm; | |
namespace { | |
/// CrashOnCalls - This pass is used to test bugpoint. It intentionally | |
/// crashes on any call instructions. | |
class CrashOnCalls : public BasicBlockPass { | |
public: | |
static char ID; // Pass ID, replacement for typeid | |
CrashOnCalls() : BasicBlockPass(ID) {} | |
private: | |
virtual void getAnalysisUsage(AnalysisUsage &AU) const { | |
AU.setPreservesAll(); | |
} | |
bool runOnBasicBlock(BasicBlock &BB) { | |
for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) | |
if (isa<CallInst>(*I)) | |
abort(); | |
return false; | |
} | |
}; | |
} | |
char CrashOnCalls::ID = 0; | |
static RegisterPass<CrashOnCalls> | |
X("bugpoint-crashcalls", | |
"BugPoint Test Pass - Intentionally crash on CallInsts"); | |
namespace { | |
/// DeleteCalls - This pass is used to test bugpoint. It intentionally | |
/// deletes some call instructions, "misoptimizing" the program. | |
class DeleteCalls : public BasicBlockPass { | |
public: | |
static char ID; // Pass ID, replacement for typeid | |
DeleteCalls() : BasicBlockPass(ID) {} | |
private: | |
bool runOnBasicBlock(BasicBlock &BB) { | |
for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) | |
if (CallInst *CI = dyn_cast<CallInst>(I)) { | |
if (!CI->use_empty()) | |
CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); | |
CI->getParent()->getInstList().erase(CI); | |
break; | |
} | |
return false; | |
} | |
}; | |
} | |
char DeleteCalls::ID = 0; | |
static RegisterPass<DeleteCalls> | |
Y("bugpoint-deletecalls", | |
"BugPoint Test Pass - Intentionally 'misoptimize' CallInsts"); |