1afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===- TestPasses.cpp - "buggy" passes used to test bugpoint --------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source 621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 9afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 10afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// This file contains "buggy" passes that are used to test bugpoint, to check 11afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// that it is narrowing down testcases correctly. 12afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 13afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===----------------------------------------------------------------------===// 14afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constant.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/InstVisitor.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 20e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "llvm/Pass.h" 21afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 24afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattnernamespace { 25afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner /// CrashOnCalls - This pass is used to test bugpoint. It intentionally 26afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner /// crashes on any call instructions. 27afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner class CrashOnCalls : public BasicBlockPass { 28794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel public: 291997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; // Pass ID, replacement for typeid 3090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson CrashOnCalls() : BasicBlockPass(ID) {} 31794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel private: 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 33afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner AU.setPreservesAll(); 34afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner } 35afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnBasicBlock(BasicBlock &BB) override { 37afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) 38afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner if (isa<CallInst>(*I)) 39afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner abort(); 40afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 41afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner return false; 42afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner } 43afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner }; 44a2a3bbc668cdebcc87e18e93b4576d59dfab625cDan Gohman} 45afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 46a2a3bbc668cdebcc87e18e93b4576d59dfab625cDan Gohmanchar CrashOnCalls::ID = 0; 47a2a3bbc668cdebcc87e18e93b4576d59dfab625cDan Gohmanstatic RegisterPass<CrashOnCalls> 48afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner X("bugpoint-crashcalls", 49afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner "BugPoint Test Pass - Intentionally crash on CallInsts"); 50afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 51afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattnernamespace { 52afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner /// DeleteCalls - This pass is used to test bugpoint. It intentionally 539d5968dd51c651570c37117cb03117f8526fd62aChris Lattner /// deletes some call instructions, "misoptimizing" the program. 54afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner class DeleteCalls : public BasicBlockPass { 55794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel public: 561997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; // Pass ID, replacement for typeid 5790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson DeleteCalls() : BasicBlockPass(ID) {} 58794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel private: 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnBasicBlock(BasicBlock &BB) override { 60afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) 616e96a99ce383dc859719cc1b9ddb745ad1ae643eChris Lattner if (CallInst *CI = dyn_cast<CallInst>(I)) { 62afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner if (!CI->use_empty()) 63a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); 64afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner CI->getParent()->getInstList().erase(CI); 659d5968dd51c651570c37117cb03117f8526fd62aChris Lattner break; 66afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner } 67afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner return false; 68afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner } 69afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner }; 70a2a3bbc668cdebcc87e18e93b4576d59dfab625cDan Gohman} 71794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 72a2a3bbc668cdebcc87e18e93b4576d59dfab625cDan Gohmanchar DeleteCalls::ID = 0; 73a2a3bbc668cdebcc87e18e93b4576d59dfab625cDan Gohmanstatic RegisterPass<DeleteCalls> 74afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner Y("bugpoint-deletecalls", 75afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner "BugPoint Test Pass - Intentionally 'misoptimize' CallInsts"); 76