119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===- InstructionNamer.cpp - Give anonymous instructions names -----------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This is a little utility pass that gives instructions names, this is mostly
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// useful when diffing the effect of an optimization because deleting an
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// unnamed instruction can change all other instruction numbering, making the
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// diff very noisy.
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Transforms/Scalar.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Function.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Pass.h"
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Type.h"
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace {
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  struct InstNamer : public FunctionPass {
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    static char ID; // Pass identification, replacement for typeid
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    InstNamer() : FunctionPass(ID) {
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      initializeInstNamerPass(*PassRegistry::getPassRegistry());
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    void getAnalysisUsage(AnalysisUsage &Info) const {
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Info.setPreservesAll();
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    bool runOnFunction(Function &F) {
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end();
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman           AI != AE; ++AI)
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (!AI->hasName() && !AI->getType()->isVoidTy())
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          AI->setName("arg");
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (!BB->hasName())
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          BB->setName("bb");
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          if (!I->hasName() && !I->getType()->isVoidTy())
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            I->setName("tmp");
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  };
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  char InstNamer::ID = 0;
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(InstNamer, "instnamer",
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Assign names to anonymous instructions", false, false)
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar &llvm::InstructionNamerID = InstNamer::ID;
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// InstructionNamer - Give any unnamed non-void instructions "tmp" names.
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createInstructionNamerPass() {
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new InstNamer();
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
65