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
22using namespace llvm;
23
24namespace {
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
46char CrashOnCalls::ID = 0;
47static RegisterPass<CrashOnCalls>
48  X("bugpoint-crashcalls",
49    "BugPoint Test Pass - Intentionally crash on CallInsts");
50
51namespace {
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
72char DeleteCalls::ID = 0;
73static RegisterPass<DeleteCalls>
74  Y("bugpoint-deletecalls",
75    "BugPoint Test Pass - Intentionally 'misoptimize' CallInsts");
76