mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
Have TableGen emit setSubgraphColor calls under control of a -gen-debug
flag. Then in a debugger developers can set breakpoints at these calls to see waht is about to be selected and what the resulting subgraph looks like. This really helps when debugging instruction selection. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58278 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9a40d3361a
commit
8ad4c00c00
@ -153,7 +153,7 @@ void ReplaceUses(SDNode *F, SDNode *T) DISABLE_INLINE {
|
||||
|
||||
/// SelectRoot - Top level entry to DAG instruction selector.
|
||||
/// Selects instructions starting at the root of the current DAG.
|
||||
void SelectRoot() {
|
||||
void SelectRoot(SelectionDAG &DAG) {
|
||||
SelectRootInit();
|
||||
unsigned NumBytes = (DAGSize + 7) / 8;
|
||||
ISelQueued = new unsigned char[NumBytes];
|
||||
@ -176,14 +176,18 @@ void SelectRoot() {
|
||||
// Skip already selected nodes.
|
||||
if (isSelected(Node->getNodeId()))
|
||||
continue;
|
||||
DAG.setSubgraphColor(Node, "red");
|
||||
SDNode *ResNode = Select(SDValue(Node, 0));
|
||||
// If node should not be replaced,
|
||||
// continue with the next one.
|
||||
if (ResNode == Node)
|
||||
continue;
|
||||
// Replace node.
|
||||
if (ResNode)
|
||||
if (ResNode) {
|
||||
DAG.setSubgraphColor(ResNode, "yellow");
|
||||
DAG.setSubgraphColor(ResNode, "black");
|
||||
ReplaceUses(Node, ResNode);
|
||||
}
|
||||
// If after the replacement this node is not used any more,
|
||||
// remove this dead node.
|
||||
if (Node->use_empty()) { // Don't delete EntryToken, etc.
|
||||
@ -191,6 +195,7 @@ void SelectRoot() {
|
||||
CurDAG->RemoveDeadNode(Node, &ISQU);
|
||||
UpdateQueue(ISQU);
|
||||
}
|
||||
//DAG.setSubgraphColor(Node, "black");
|
||||
}
|
||||
|
||||
delete[] ISelQueued;
|
||||
|
@ -94,7 +94,7 @@ public:
|
||||
void ARMDAGToDAGISel::InstructionSelect() {
|
||||
DEBUG(BB->dump());
|
||||
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
CurDAG->RemoveDeadNodes();
|
||||
}
|
||||
|
||||
|
@ -230,7 +230,7 @@ void AlphaDAGToDAGISel::InstructionSelect() {
|
||||
DEBUG(BB->dump());
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
CurDAG->RemoveDeadNodes();
|
||||
}
|
||||
|
||||
|
@ -344,7 +344,7 @@ SPUDAGToDAGISel::InstructionSelect()
|
||||
DEBUG(BB->dump());
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
CurDAG->RemoveDeadNodes();
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ void IA64DAGToDAGISel::InstructionSelect() {
|
||||
DEBUG(BB->dump());
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
CurDAG->RemoveDeadNodes();
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ InstructionSelect()
|
||||
#endif
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
|
||||
#ifndef NDEBUG
|
||||
DOUT << "===== Instruction selection ends:\n";
|
||||
|
@ -102,7 +102,7 @@ void PIC16DAGToDAGISel::InstructionSelect()
|
||||
#endif
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
|
||||
DOUT << "===== Instruction selection ends:\n";
|
||||
|
||||
|
@ -204,7 +204,7 @@ void PPCDAGToDAGISel::InstructionSelect() {
|
||||
DEBUG(BB->dump());
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
CurDAG->RemoveDeadNodes();
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@ void SparcDAGToDAGISel::InstructionSelect() {
|
||||
DEBUG(BB->dump());
|
||||
|
||||
// Select target instructions for the DAG.
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
CurDAG->RemoveDeadNodes();
|
||||
}
|
||||
|
||||
|
@ -655,7 +655,7 @@ void X86DAGToDAGISel::InstructionSelect() {
|
||||
DOUT << "===== Instruction selection begins:\n";
|
||||
Indent = 0;
|
||||
#endif
|
||||
SelectRoot();
|
||||
SelectRoot(*CurDAG);
|
||||
#ifndef NDEBUG
|
||||
DOUT << "===== Instruction selection ends:\n";
|
||||
#endif
|
||||
|
@ -14,13 +14,21 @@
|
||||
#include "DAGISelEmitter.h"
|
||||
#include "Record.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/Streams.h"
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
cl::opt<bool>
|
||||
GenDebug("gen-debug", cl::desc("Generate debug code"),
|
||||
cl::init(false));
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DAGISelEmitter Helper methods
|
||||
//
|
||||
@ -969,6 +977,10 @@ public:
|
||||
emitCode("InChains.push_back(" + ChainName + ");");
|
||||
emitCode(ChainName + " = CurDAG->getNode(ISD::TokenFactor, MVT::Other, "
|
||||
"&InChains[0], InChains.size());");
|
||||
if (GenDebug) {
|
||||
emitCode("CurDAG->setSubgraphColor(" + ChainName +".getNode(), \"yellow\");");
|
||||
emitCode("CurDAG->setSubgraphColor(" + ChainName +".getNode(), \"black\");");
|
||||
}
|
||||
}
|
||||
|
||||
// Loop over all of the operands of the instruction pattern, emitting code
|
||||
@ -1096,13 +1108,18 @@ public:
|
||||
if (II.isSimpleLoad | II.mayLoad | II.mayStore) {
|
||||
std::vector<std::string>::const_iterator mi, mie;
|
||||
for (mi = LSI.begin(), mie = LSI.end(); mi != mie; ++mi) {
|
||||
emitCode("SDValue LSI_" + *mi + " = "
|
||||
std::string LSIName = "LSI_" + *mi;
|
||||
emitCode("SDValue " + LSIName + " = "
|
||||
"CurDAG->getMemOperand(cast<MemSDNode>(" +
|
||||
*mi + ")->getMemOperand());");
|
||||
if (GenDebug) {
|
||||
emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"yellow\");");
|
||||
emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"black\");");
|
||||
}
|
||||
if (IsVariadic)
|
||||
emitCode("Ops" + utostr(OpsNo) + ".push_back(LSI_" + *mi + ");");
|
||||
emitCode("Ops" + utostr(OpsNo) + ".push_back(" + LSIName + ");");
|
||||
else
|
||||
AllOps.push_back("LSI_" + *mi);
|
||||
AllOps.push_back(LSIName);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1269,6 +1286,18 @@ public:
|
||||
}
|
||||
|
||||
emitCode(CodePrefix + Code + ");");
|
||||
|
||||
if (GenDebug) {
|
||||
if (!isRoot) {
|
||||
emitCode("CurDAG->setSubgraphColor(" + NodeName +".getNode(), \"yellow\");");
|
||||
emitCode("CurDAG->setSubgraphColor(" + NodeName +".getNode(), \"black\");");
|
||||
}
|
||||
else {
|
||||
emitCode("CurDAG->setSubgraphColor(" + NodeName +", \"yellow\");");
|
||||
emitCode("CurDAG->setSubgraphColor(" + NodeName +", \"black\");");
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0, e = After.size(); i != e; ++i)
|
||||
emitCode(After[i]);
|
||||
|
||||
@ -1766,8 +1795,19 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
|
||||
|
||||
// Replace the emission code within selection routines with calls to the
|
||||
// emission functions.
|
||||
CallerCode = "return Emit_" + utostr(EmitFuncNum) + CallerCode;
|
||||
GeneratedCode.push_back(std::make_pair(false, CallerCode));
|
||||
if (GenDebug) {
|
||||
GeneratedCode.push_back(std::make_pair(0, "CurDAG->setSubgraphColor(N.getNode(), \"red\");"));
|
||||
}
|
||||
CallerCode = "SDNode *Result = Emit_" + utostr(EmitFuncNum) + CallerCode;
|
||||
GeneratedCode.push_back(std::make_pair(3, CallerCode));
|
||||
if (GenDebug) {
|
||||
GeneratedCode.push_back(std::make_pair(0, "if(Result) {"));
|
||||
GeneratedCode.push_back(std::make_pair(0, " CurDAG->setSubgraphColor(Result, \"yellow\");"));
|
||||
GeneratedCode.push_back(std::make_pair(0, " CurDAG->setSubgraphColor(Result, \"black\");"));
|
||||
GeneratedCode.push_back(std::make_pair(0, "}"));
|
||||
//GeneratedCode.push_back(std::make_pair(0, "CurDAG->setSubgraphColor(N.getNode(), \"black\");"));
|
||||
}
|
||||
GeneratedCode.push_back(std::make_pair(0, "return Result;"));
|
||||
}
|
||||
|
||||
// Print function.
|
||||
|
Loading…
Reference in New Issue
Block a user