Home | History | Annotate | Download | only in Utils
      1 //===- InstructionNamer.cpp - Give anonymous instructions names -----------===//
      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 is a little utility pass that gives instructions names, this is mostly
     11 // useful when diffing the effect of an optimization because deleting an
     12 // unnamed instruction can change all other instruction numbering, making the
     13 // diff very noisy.
     14 //
     15 //===----------------------------------------------------------------------===//
     16 
     17 #include "llvm/Transforms/Scalar.h"
     18 #include "llvm/IR/Function.h"
     19 #include "llvm/IR/Type.h"
     20 #include "llvm/Pass.h"
     21 using namespace llvm;
     22 
     23 namespace {
     24   struct InstNamer : public FunctionPass {
     25     static char ID; // Pass identification, replacement for typeid
     26     InstNamer() : FunctionPass(ID) {
     27       initializeInstNamerPass(*PassRegistry::getPassRegistry());
     28     }
     29 
     30     void getAnalysisUsage(AnalysisUsage &Info) const override {
     31       Info.setPreservesAll();
     32     }
     33 
     34     bool runOnFunction(Function &F) override {
     35       for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end();
     36            AI != AE; ++AI)
     37         if (!AI->hasName() && !AI->getType()->isVoidTy())
     38           AI->setName("arg");
     39 
     40       for (BasicBlock &BB : F) {
     41         if (!BB.hasName())
     42           BB.setName("bb");
     43 
     44         for (Instruction &I : BB)
     45           if (!I.hasName() && !I.getType()->isVoidTy())
     46             I.setName("tmp");
     47       }
     48       return true;
     49     }
     50   };
     51 
     52   char InstNamer::ID = 0;
     53 }
     54 
     55 INITIALIZE_PASS(InstNamer, "instnamer",
     56                 "Assign names to anonymous instructions", false, false)
     57 char &llvm::InstructionNamerID = InstNamer::ID;
     58 //===----------------------------------------------------------------------===//
     59 //
     60 // InstructionNamer - Give any unnamed non-void instructions "tmp" names.
     61 //
     62 FunctionPass *llvm::createInstructionNamerPass() {
     63   return new InstNamer();
     64 }
     65