ed54e9f8dfc76139f4bece68eaa3e453676c99ea
[oota-llvm.git] / tools / bugpoint-passes / TestPasses.cpp
1 //===- TestPasses.cpp - "buggy" passes used to test bugpoint --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains "buggy" passes that are used to test bugpoint, to check
11 // that it is narrowing down testcases correctly.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/IR/BasicBlock.h"
16 #include "llvm/IR/Constant.h"
17 #include "llvm/IR/InstVisitor.h"
18 #include "llvm/IR/Instructions.h"
19 #include "llvm/IR/Type.h"
20 #include "llvm/Pass.h"
21
22 using namespace llvm;
23
24 namespace {
25   /// CrashOnCalls - This pass is used to test bugpoint.  It intentionally
26   /// crashes on any call instructions.
27   class CrashOnCalls : public BasicBlockPass {
28   public:
29     static char ID; // Pass ID, replacement for typeid
30     CrashOnCalls() : BasicBlockPass(ID) {}
31   private:
32     void getAnalysisUsage(AnalysisUsage &AU) const override {
33       AU.setPreservesAll();
34     }
35
36     bool runOnBasicBlock(BasicBlock &BB) override {
37       for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I)
38         if (isa<CallInst>(*I))
39           abort();
40
41       return false;
42     }
43   };
44 }
45
46 char CrashOnCalls::ID = 0;
47 static RegisterPass<CrashOnCalls>
48   X("bugpoint-crashcalls",
49     "BugPoint Test Pass - Intentionally crash on CallInsts");
50
51 namespace {
52   /// DeleteCalls - This pass is used to test bugpoint.  It intentionally
53   /// deletes some call instructions, "misoptimizing" the program.
54   class DeleteCalls : public BasicBlockPass {
55   public:
56     static char ID; // Pass ID, replacement for typeid
57     DeleteCalls() : BasicBlockPass(ID) {}
58   private:
59     bool runOnBasicBlock(BasicBlock &BB) override {
60       for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I)
61         if (CallInst *CI = dyn_cast<CallInst>(I)) {
62           if (!CI->use_empty())
63             CI->replaceAllUsesWith(Constant::getNullValue(CI->getType()));
64           CI->getParent()->getInstList().erase(CI);
65           break;
66         }
67       return false;
68     }
69   };
70 }
71  
72 char DeleteCalls::ID = 0;
73 static RegisterPass<DeleteCalls>
74   Y("bugpoint-deletecalls",
75     "BugPoint Test Pass - Intentionally 'misoptimize' CallInsts");