mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-19 06:31:18 +00:00
emit a histogram of the opcodes in comments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97047 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9e6396d05e
commit
09b9f3928e
@ -20,11 +20,9 @@
|
|||||||
#include "llvm/Support/FormattedStream.h"
|
#include "llvm/Support/FormattedStream.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
|
||||||
enum {
|
enum {
|
||||||
CommentIndent = 30
|
CommentIndent = 30
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
/// ClassifyInt - Classify an integer by size, return '1','2','4','8' if this
|
/// ClassifyInt - Classify an integer by size, return '1','2','4','8' if this
|
||||||
/// fits in 1, 2, 4, or 8 sign extended bytes.
|
/// fits in 1, 2, 4, or 8 sign extended bytes.
|
||||||
@ -78,6 +76,8 @@ class MatcherTableEmitter {
|
|||||||
DenseMap<Record*, unsigned> NodeXFormMap;
|
DenseMap<Record*, unsigned> NodeXFormMap;
|
||||||
std::vector<const Record*> NodeXForms;
|
std::vector<const Record*> NodeXForms;
|
||||||
|
|
||||||
|
// Per opcode frequence count.
|
||||||
|
std::vector<unsigned> Histogram;
|
||||||
public:
|
public:
|
||||||
MatcherTableEmitter() {}
|
MatcherTableEmitter() {}
|
||||||
|
|
||||||
@ -85,6 +85,8 @@ public:
|
|||||||
unsigned StartIdx, formatted_raw_ostream &OS);
|
unsigned StartIdx, formatted_raw_ostream &OS);
|
||||||
|
|
||||||
void EmitPredicateFunctions(formatted_raw_ostream &OS);
|
void EmitPredicateFunctions(formatted_raw_ostream &OS);
|
||||||
|
|
||||||
|
void EmitHistogram(formatted_raw_ostream &OS);
|
||||||
private:
|
private:
|
||||||
unsigned EmitMatcher(const MatcherNode *N, unsigned Indent,
|
unsigned EmitMatcher(const MatcherNode *N, unsigned Indent,
|
||||||
formatted_raw_ostream &OS);
|
formatted_raw_ostream &OS);
|
||||||
@ -377,6 +379,10 @@ EmitMatcherList(const MatcherNode *N, unsigned Indent, unsigned CurrentIdx,
|
|||||||
formatted_raw_ostream &OS) {
|
formatted_raw_ostream &OS) {
|
||||||
unsigned Size = 0;
|
unsigned Size = 0;
|
||||||
while (N) {
|
while (N) {
|
||||||
|
if (unsigned(N->getKind()) >= Histogram.size())
|
||||||
|
Histogram.resize(N->getKind()+1);
|
||||||
|
Histogram[N->getKind()]++;
|
||||||
|
|
||||||
// Push is a special case since it is binary.
|
// Push is a special case since it is binary.
|
||||||
if (const PushMatcherNode *PMN = dyn_cast<PushMatcherNode>(N)) {
|
if (const PushMatcherNode *PMN = dyn_cast<PushMatcherNode>(N)) {
|
||||||
// We need to encode the child and the offset of the failure code before
|
// We need to encode the child and the offset of the failure code before
|
||||||
@ -498,6 +504,54 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
|||||||
OS << "}\n\n";
|
OS << "}\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
|
||||||
|
OS << " // Opcode Histogram:\n";
|
||||||
|
for (unsigned i = 0, e = Histogram.size(); i != e; ++i) {
|
||||||
|
OS << " // #";
|
||||||
|
switch ((MatcherNode::KindTy)i) {
|
||||||
|
case MatcherNode::Push: OS << "OPC_Push"; break;
|
||||||
|
case MatcherNode::RecordNode: OS << "OPC_RecordNode"; break;
|
||||||
|
case MatcherNode::RecordChild: OS << "OPC_RecordChild"; break;
|
||||||
|
case MatcherNode::RecordMemRef: OS << "OPC_RecordMemRef"; break;
|
||||||
|
case MatcherNode::CaptureFlagInput: OS << "OPC_CaptureFlagInput"; break;
|
||||||
|
case MatcherNode::MoveChild: OS << "OPC_MoveChild"; break;
|
||||||
|
case MatcherNode::MoveParent: OS << "OPC_MoveParent"; break;
|
||||||
|
case MatcherNode::CheckSame: OS << "OPC_CheckSame"; break;
|
||||||
|
case MatcherNode::CheckPatternPredicate:
|
||||||
|
OS << "OPC_CheckPatternPredicate"; break;
|
||||||
|
case MatcherNode::CheckPredicate: OS << "OPC_CheckPredicate"; break;
|
||||||
|
case MatcherNode::CheckOpcode: OS << "OPC_CheckOpcode"; break;
|
||||||
|
case MatcherNode::CheckMultiOpcode: OS << "OPC_CheckMultiOpcode"; break;
|
||||||
|
case MatcherNode::CheckType: OS << "OPC_CheckType"; break;
|
||||||
|
case MatcherNode::CheckInteger: OS << "OPC_CheckInteger"; break;
|
||||||
|
case MatcherNode::CheckCondCode: OS << "OPC_CheckCondCode"; break;
|
||||||
|
case MatcherNode::CheckValueType: OS << "OPC_CheckValueType"; break;
|
||||||
|
case MatcherNode::CheckComplexPat: OS << "OPC_CheckComplexPat"; break;
|
||||||
|
case MatcherNode::CheckAndImm: OS << "OPC_CheckAndImm"; break;
|
||||||
|
case MatcherNode::CheckOrImm: OS << "OPC_CheckOrImm"; break;
|
||||||
|
case MatcherNode::CheckFoldableChainNode:
|
||||||
|
OS << "OPC_CheckFoldableChainNode"; break;
|
||||||
|
case MatcherNode::CheckChainCompatible:
|
||||||
|
OS << "OPC_CheckChainCompatible"; break;
|
||||||
|
case MatcherNode::EmitInteger: OS << "OPC_EmitInteger"; break;
|
||||||
|
case MatcherNode::EmitStringInteger: OS << "OPC_EmitStringInteger"; break;
|
||||||
|
case MatcherNode::EmitRegister: OS << "OPC_EmitRegister"; break;
|
||||||
|
case MatcherNode::EmitConvertToTarget:
|
||||||
|
OS << "OPC_EmitConvertToTarget"; break;
|
||||||
|
case MatcherNode::EmitMergeInputChains:
|
||||||
|
OS << "OPC_EmitMergeInputChains"; break;
|
||||||
|
case MatcherNode::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
|
||||||
|
case MatcherNode::EmitNode: OS << "OPC_EmitNode"; break;
|
||||||
|
case MatcherNode::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
|
||||||
|
case MatcherNode::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
|
||||||
|
case MatcherNode::CompleteMatch: OS << "OPC_CompleteMatch"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
OS.PadToColumn(40) << " = " << Histogram[i] << '\n';
|
||||||
|
}
|
||||||
|
OS << '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void llvm::EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &O) {
|
void llvm::EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &O) {
|
||||||
formatted_raw_ostream OS(O);
|
formatted_raw_ostream OS(O);
|
||||||
@ -512,6 +566,9 @@ void llvm::EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &O) {
|
|||||||
OS << " static const unsigned char MatcherTable[] = {\n";
|
OS << " static const unsigned char MatcherTable[] = {\n";
|
||||||
unsigned TotalSize = MatcherEmitter.EmitMatcherList(Matcher, 5, 0, OS);
|
unsigned TotalSize = MatcherEmitter.EmitMatcherList(Matcher, 5, 0, OS);
|
||||||
OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
|
OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
|
||||||
|
|
||||||
|
MatcherEmitter.EmitHistogram(OS);
|
||||||
|
|
||||||
OS << " #undef TARGET_OPCODE\n";
|
OS << " #undef TARGET_OPCODE\n";
|
||||||
OS << " return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
|
OS << " return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
|
||||||
OS << "\n";
|
OS << "\n";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user