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