Home | History | Annotate | Download | only in bugpoint-passes
      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/BasicBlock.h"
     16 #include "llvm/Constant.h"
     17 #include "llvm/Instructions.h"
     18 #include "llvm/Pass.h"
     19 #include "llvm/Type.h"
     20 #include "llvm/Support/InstVisitor.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     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
     33       AU.setPreservesAll();
     34     }
     35 
     36     bool runOnBasicBlock(BasicBlock &BB) {
     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) {
     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");
     76