ProfileInfoLoader.cpp revision 2b37d7cf28b1382420b5e4007042feeb66d21ac8
1bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner//===- ProfileInfoLoad.cpp - Load profile information from disk -----------===// 22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 3bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// The LLVM Compiler Infrastructure 4bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 5bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// This file was developed by the LLVM research group and is distributed under 6bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 8bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner//===----------------------------------------------------------------------===// 9bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 10bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// The ProfileInfoLoader class is used to load and represent profiling 11bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// information read in from the dump file. 12bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 13bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner//===----------------------------------------------------------------------===// 14bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 15bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner#include "llvm/Analysis/ProfileInfoLoader.h" 16660ef70b6292e69456239f34eaefa81fd18761fbBrian Gaeke#include "llvm/Analysis/ProfileInfoTypes.h" 17bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner#include "llvm/Module.h" 1801945c17398ec5f2934f4a166a231e3aea17831bChris Lattner#include "llvm/InstrTypes.h" 19bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner#include <cstdio> 20954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer#include <iostream> 21dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner#include <map> 22954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer 23bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnerusing namespace llvm; 24bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 25bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// ByteSwap - Byteswap 'Var' if 'Really' is true. 26bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 27bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnerstatic inline unsigned ByteSwap(unsigned Var, bool Really) { 28bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (!Really) return Var; 292b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman return ((Var & (255<< 0)) << 24) | 302b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman ((Var & (255<< 8)) << 8) | 312b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman ((Var & (255<<16)) >> 8) | 32bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ((Var & (255<<24)) >> 24); 33bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 34bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 35bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnerstatic void ReadProfilingBlock(const char *ToolName, FILE *F, 36bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner bool ShouldByteSwap, 37bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::vector<unsigned> &Data) { 38bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read the number of entries... 39bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned NumEntries; 40bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&NumEntries, sizeof(unsigned), 1, F) != 1) { 41bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::cerr << ToolName << ": data packet truncated!\n"; 42bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 43bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 44bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 45bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner NumEntries = ByteSwap(NumEntries, ShouldByteSwap); 46bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 47bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read the counts... 48bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::vector<unsigned> TempSpace(NumEntries); 49bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 50bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read in the block of data... 51bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&TempSpace[0], sizeof(unsigned)*NumEntries, 1, F) != 1) { 52bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::cerr << ToolName << ": data packet truncated!\n"; 53bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 54bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 55bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 56bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 57bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Make sure we have enough space... 58bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (Data.size() < NumEntries) 59bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner Data.resize(NumEntries); 602b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 61bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Accumulate the data we just read into the data. 62bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (!ShouldByteSwap) { 63bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner for (unsigned i = 0; i != NumEntries; ++i) 64bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner Data[i] += TempSpace[i]; 65bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } else { 66bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner for (unsigned i = 0; i != NumEntries; ++i) 67bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner Data[i] += ByteSwap(TempSpace[i], true); 68bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 69bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 70bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 71bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// ProfileInfoLoader ctor - Read the specified profiling data file, exiting the 72bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// program if the file is invalid or broken. 73bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 74bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris LattnerProfileInfoLoader::ProfileInfoLoader(const char *ToolName, 75bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner const std::string &Filename, 76bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner Module &TheModule) : M(TheModule) { 77bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner FILE *F = fopen(Filename.c_str(), "r"); 78bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (F == 0) { 79c6fca42a66490dc01b3c79350ab288732df4c855Chris Lattner std::cerr << ToolName << ": Error opening '" << Filename << "': "; 80bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 81bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 82bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 83bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 84bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Keep reading packets until we run out of them. 85bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned PacketType; 86bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner while (fread(&PacketType, sizeof(unsigned), 1, F) == 1) { 87bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // If the low eight bits of the packet are zero, we must be dealing with an 88bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // endianness mismatch. Byteswap all words read from the profiling 89bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // information. 90bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner bool ShouldByteSwap = (char)PacketType == 0; 91bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner PacketType = ByteSwap(PacketType, ShouldByteSwap); 92bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 93bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner switch (PacketType) { 94bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner case ArgumentInfo: { 95bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned ArgLength; 96bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&ArgLength, sizeof(unsigned), 1, F) != 1) { 97bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::cerr << ToolName << ": arguments packet truncated!\n"; 98bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 99bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 100bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 101bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ArgLength = ByteSwap(ArgLength, ShouldByteSwap); 102bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 103bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read in the arguments... 104bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::vector<char> Chars(ArgLength+4); 105bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 106bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (ArgLength) 107bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&Chars[0], (ArgLength+3) & ~3, 1, F) != 1) { 108bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::cerr << ToolName << ": arguments packet truncated!\n"; 109bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 110bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 111bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 112bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner CommandLines.push_back(std::string(&Chars[0], &Chars[ArgLength])); 113bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner break; 114bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 1152b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 116bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner case FunctionInfo: 117bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ReadProfilingBlock(ToolName, F, ShouldByteSwap, FunctionCounts); 118bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner break; 1192b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 120bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner case BlockInfo: 121bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ReadProfilingBlock(ToolName, F, ShouldByteSwap, BlockCounts); 122bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner break; 123bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 12401945c17398ec5f2934f4a166a231e3aea17831bChris Lattner case EdgeInfo: 12501945c17398ec5f2934f4a166a231e3aea17831bChris Lattner ReadProfilingBlock(ToolName, F, ShouldByteSwap, EdgeCounts); 12601945c17398ec5f2934f4a166a231e3aea17831bChris Lattner break; 12701945c17398ec5f2934f4a166a231e3aea17831bChris Lattner 128b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke case BBTraceInfo: 129b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke ReadProfilingBlock(ToolName, F, ShouldByteSwap, BBTrace); 130b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke break; 131b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke 132bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner default: 133bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::cerr << ToolName << ": Unknown packet type #" << PacketType << "!\n"; 134bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 135bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 136bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 1372b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 138bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner fclose(F); 139bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 140bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 141bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 142bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// getFunctionCounts - This method is used by consumers of function counting 143bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// information. If we do not directly have function count information, we 144bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// compute it from other, more refined, types of profile information. 145bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 146bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnervoid ProfileInfoLoader::getFunctionCounts(std::vector<std::pair<Function*, 147bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned> > &Counts) { 148bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (FunctionCounts.empty()) { 149dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (hasAccurateBlockCounts()) { 150dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // Synthesize function frequency information from the number of times 151dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // their entry blocks were executed. 152dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner std::vector<std::pair<BasicBlock*, unsigned> > BlockCounts; 153dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner getBlockCounts(BlockCounts); 1542b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 155dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner for (unsigned i = 0, e = BlockCounts.size(); i != e; ++i) 156dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (&BlockCounts[i].first->getParent()->front() == BlockCounts[i].first) 157dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner Counts.push_back(std::make_pair(BlockCounts[i].first->getParent(), 158dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner BlockCounts[i].second)); 159dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } else { 160dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner std::cerr << "Function counts are not available!\n"; 161dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 162bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner return; 163bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 1642b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 165bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned Counter = 0; 166bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner for (Module::iterator I = M.begin(), E = M.end(); 167bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner I != E && Counter != FunctionCounts.size(); ++I) 168bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (!I->isExternal()) 169bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner Counts.push_back(std::make_pair(I, FunctionCounts[Counter++])); 170bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 171bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 172bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// getBlockCounts - This method is used by consumers of block counting 173bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// information. If we do not directly have block count information, we 174bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// compute it from other, more refined, types of profile information. 175bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 176bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnervoid ProfileInfoLoader::getBlockCounts(std::vector<std::pair<BasicBlock*, 177bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned> > &Counts) { 178bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (BlockCounts.empty()) { 179dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (hasAccurateEdgeCounts()) { 180dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // Synthesize block count information from edge frequency information. 181dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // The block execution frequency is equal to the sum of the execution 182dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // frequency of all outgoing edges from a block. 183dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // 184dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // If a block has no successors, this will not be correct, so we have to 185dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // special case it. :( 186dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner std::vector<std::pair<Edge, unsigned> > EdgeCounts; 187dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner getEdgeCounts(EdgeCounts); 188dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner 189dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner std::map<BasicBlock*, unsigned> InEdgeFreqs; 190dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner 191dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner BasicBlock *LastBlock = 0; 192dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner TerminatorInst *TI = 0; 193dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner for (unsigned i = 0, e = EdgeCounts.size(); i != e; ++i) { 194dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (EdgeCounts[i].first.first != LastBlock) { 195dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner LastBlock = EdgeCounts[i].first.first; 196dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner TI = LastBlock->getTerminator(); 197dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner Counts.push_back(std::make_pair(LastBlock, 0)); 198dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 199dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner Counts.back().second += EdgeCounts[i].second; 200dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner unsigned SuccNum = EdgeCounts[i].first.second; 201dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (SuccNum >= TI->getNumSuccessors()) { 202dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner static bool Warned = false; 203dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (!Warned) { 204dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner std::cerr << "WARNING: profile info doesn't seem to match" 205dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner << " the program!\n"; 206dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner Warned = true; 207dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 208dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } else { 209dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // If this successor has no successors of its own, we will never 210dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // compute an execution count for that block. Remember the incoming 211dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // edge frequencies to add later. 212dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner BasicBlock *Succ = TI->getSuccessor(SuccNum); 213dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (Succ->getTerminator()->getNumSuccessors() == 0) 214dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner InEdgeFreqs[Succ] += EdgeCounts[i].second; 215dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 216dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 217dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner 218dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // Now we have to accumulate information for those blocks without 219dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner // successors into our table. 220dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner for (std::map<BasicBlock*, unsigned>::iterator I = InEdgeFreqs.begin(), 221dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner E = InEdgeFreqs.end(); I != E; ++I) { 222dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner unsigned i = 0; 223dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner for (; i != Counts.size() && Counts[i].first != I->first; ++i) 224dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner /*empty*/; 225dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner if (i == Counts.size()) Counts.push_back(std::make_pair(I->first, 0)); 226dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner Counts[i].second += I->second; 227dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 228dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner 229dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } else { 230dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner std::cerr << "Block counts are not available!\n"; 231dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner } 232bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner return; 233bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 234bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 235bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned Counter = 0; 236bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) 237bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { 238bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner Counts.push_back(std::make_pair(BB, BlockCounts[Counter++])); 239bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (Counter == BlockCounts.size()) 240bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner return; 241bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 242bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 24301945c17398ec5f2934f4a166a231e3aea17831bChris Lattner 24401945c17398ec5f2934f4a166a231e3aea17831bChris Lattner// getEdgeCounts - This method is used by consumers of edge counting 24501945c17398ec5f2934f4a166a231e3aea17831bChris Lattner// information. If we do not directly have edge count information, we compute 24601945c17398ec5f2934f4a166a231e3aea17831bChris Lattner// it from other, more refined, types of profile information. 24701945c17398ec5f2934f4a166a231e3aea17831bChris Lattner// 24801945c17398ec5f2934f4a166a231e3aea17831bChris Lattnervoid ProfileInfoLoader::getEdgeCounts(std::vector<std::pair<Edge, 24901945c17398ec5f2934f4a166a231e3aea17831bChris Lattner unsigned> > &Counts) { 25001945c17398ec5f2934f4a166a231e3aea17831bChris Lattner if (EdgeCounts.empty()) { 25101945c17398ec5f2934f4a166a231e3aea17831bChris Lattner std::cerr << "Edge counts not available, and no synthesis " 25201945c17398ec5f2934f4a166a231e3aea17831bChris Lattner << "is implemented yet!\n"; 25301945c17398ec5f2934f4a166a231e3aea17831bChris Lattner return; 25401945c17398ec5f2934f4a166a231e3aea17831bChris Lattner } 25501945c17398ec5f2934f4a166a231e3aea17831bChris Lattner 25601945c17398ec5f2934f4a166a231e3aea17831bChris Lattner unsigned Counter = 0; 25701945c17398ec5f2934f4a166a231e3aea17831bChris Lattner for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) 25801945c17398ec5f2934f4a166a231e3aea17831bChris Lattner for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) 25901945c17398ec5f2934f4a166a231e3aea17831bChris Lattner for (unsigned i = 0, e = BB->getTerminator()->getNumSuccessors(); 26001945c17398ec5f2934f4a166a231e3aea17831bChris Lattner i != e; ++i) { 26101945c17398ec5f2934f4a166a231e3aea17831bChris Lattner Counts.push_back(std::make_pair(Edge(BB, i), EdgeCounts[Counter++])); 26201945c17398ec5f2934f4a166a231e3aea17831bChris Lattner if (Counter == EdgeCounts.size()) 26301945c17398ec5f2934f4a166a231e3aea17831bChris Lattner return; 26401945c17398ec5f2934f4a166a231e3aea17831bChris Lattner } 26501945c17398ec5f2934f4a166a231e3aea17831bChris Lattner} 266b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke 267b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke// getBBTrace - This method is used by consumers of basic-block trace 268b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke// information. 269b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke// 270b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaekevoid ProfileInfoLoader::getBBTrace(std::vector<BasicBlock *> &Trace) { 271b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke if (BBTrace.empty ()) { 272b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke std::cerr << "Basic block trace is not available!\n"; 273b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke return; 274b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke } 275b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke std::cerr << "Basic block trace loading is not implemented yet!\n"; 276b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke} 277b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke 278