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