mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-18 12:29:21 +00:00
Add support for reading block frequencies. Fix bug in attribution of counts
to functions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9559 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b9e578934f
commit
33f1ca7d8a
@ -148,7 +148,28 @@ void ProfileInfo::getFunctionCounts(std::vector<std::pair<Function*,
|
|||||||
|
|
||||||
unsigned Counter = 0;
|
unsigned Counter = 0;
|
||||||
for (Module::iterator I = M.begin(), E = M.end();
|
for (Module::iterator I = M.begin(), E = M.end();
|
||||||
I != E && Counter != FunctionCounts.size(); ++I, ++Counter)
|
I != E && Counter != FunctionCounts.size(); ++I)
|
||||||
if (!I->isExternal())
|
if (!I->isExternal())
|
||||||
Counts.push_back(std::make_pair(I, FunctionCounts[Counter]));
|
Counts.push_back(std::make_pair(I, FunctionCounts[Counter++]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// getBlockCounts - This method is used by consumers of block counting
|
||||||
|
// information. If we do not directly have block count information, we
|
||||||
|
// compute it from other, more refined, types of profile information.
|
||||||
|
//
|
||||||
|
void ProfileInfo::getBlockCounts(std::vector<std::pair<BasicBlock*,
|
||||||
|
unsigned> > &Counts) {
|
||||||
|
if (BlockCounts.empty()) {
|
||||||
|
std::cerr << "Block counts not available, and no synthesis "
|
||||||
|
<< "is implemented yet!\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Counter = 0;
|
||||||
|
for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F)
|
||||||
|
for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
|
||||||
|
Counts.push_back(std::make_pair(BB, BlockCounts[Counter++]));
|
||||||
|
if (Counter == BlockCounts.size())
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
class Module;
|
class Module;
|
||||||
class Function;
|
class Function;
|
||||||
|
class BasicBlock;
|
||||||
|
|
||||||
class ProfileInfo {
|
class ProfileInfo {
|
||||||
Module &M;
|
Module &M;
|
||||||
@ -37,6 +38,18 @@ public:
|
|||||||
//
|
//
|
||||||
void getFunctionCounts(std::vector<std::pair<Function*, unsigned> > &Counts);
|
void getFunctionCounts(std::vector<std::pair<Function*, unsigned> > &Counts);
|
||||||
|
|
||||||
|
// hasAccurateBlockCounts - Return true if we can synthesize accurate block
|
||||||
|
// frequency information from whatever we have.
|
||||||
|
//
|
||||||
|
bool hasAccurateBlockCounts() const {
|
||||||
|
return !BlockCounts.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// getBlockCounts - This method is used by consumers of block counting
|
||||||
|
// information. If we do not directly have block count information, we
|
||||||
|
// compute it from other, more refined, types of profile information.
|
||||||
|
//
|
||||||
|
void getBlockCounts(std::vector<std::pair<BasicBlock*, unsigned> > &Counts);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "Support/CommandLine.h"
|
#include "Support/CommandLine.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
cl::opt<std::string>
|
cl::opt<std::string>
|
||||||
@ -77,5 +78,16 @@ int main(int argc, char **argv) {
|
|||||||
for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i)
|
for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i)
|
||||||
printf("%3d. %5d/%d %s\n", i, FunctionCounts[i].second, TotalExecutions,
|
printf("%3d. %5d/%d %s\n", i, FunctionCounts[i].second, TotalExecutions,
|
||||||
FunctionCounts[i].first->getName().c_str());
|
FunctionCounts[i].first->getName().c_str());
|
||||||
|
|
||||||
|
|
||||||
|
// If we have block count information, print out the LLVM module with
|
||||||
|
// frequency annotations.
|
||||||
|
if (PI.hasAccurateBlockCounts()) {
|
||||||
|
std::vector<std::pair<BasicBlock*, unsigned> > Counts;
|
||||||
|
PI.getBlockCounts(Counts);
|
||||||
|
std::map<BasicBlock*, unsigned> BlockFreqs(Counts.begin(), Counts.end());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user