typedef int OpLabel;
typedef int StateLabel;
-struct BasicTreeNode {
- BasicTreeNode* leftChild;
- BasicTreeNode* rightChild;
- BasicTreeNode* parent;
- OpLabel opLabel;
- StateLabel state;
- InstrTreeNode *treeNodePtr; // points to the C++ tree node object
- // that "contains" this node
-};
-
//-------------------------------------------------------------------------
// Declarations of data and functions created by BURG
//-------------------------------------------------------------------------
extern short* burm_nts[];
-extern StateLabel burm_label (BasicTreeNode* p);
+extern StateLabel burm_label (InstrTreeNode* p);
extern StateLabel burm_state (OpLabel op, StateLabel leftState,
StateLabel rightState);
extern StateLabel burm_rule (StateLabel state, int goalNT);
-extern BasicTreeNode** burm_kids (BasicTreeNode* p, int eruleno,
- BasicTreeNode* kids[]);
+extern InstrTreeNode** burm_kids (InstrTreeNode* p, int eruleno,
+ InstrTreeNode* kids[]);
-extern void printcover (BasicTreeNode*, int, int);
-extern void printtree (BasicTreeNode*);
-extern int treecost (BasicTreeNode*, int, int);
-extern void printMatches (BasicTreeNode*);
+extern void printcover (InstrTreeNode*, int, int);
+extern void printtree (InstrTreeNode*);
+extern int treecost (InstrTreeNode*, int, int);
+extern void printMatches (InstrTreeNode*);
//------------------------------------------------------------------------
NTConstNode,
NTLabelNode };
+ // BASIC TREE NODE START
+ InstrTreeNode* LeftChild;
+ InstrTreeNode* RightChild;
+ InstrTreeNode* Parent;
+ OpLabel opLabel;
+ StateLabel state;
+ // BASIC TREE NODE END
+
protected:
- BasicTreeNode basicNode;
InstrTreeNodeType treeNodeType;
Value* val;
Value* _val);
/*dtor*/ virtual ~InstrTreeNode () {}
- BasicTreeNode* getBasicNode () { return &basicNode; }
-
InstrTreeNodeType getNodeType () const { return treeNodeType; }
Value* getValue () const { return val; }
- inline OpLabel getOpLabel () const { return basicNode.opLabel; }
+ inline OpLabel getOpLabel () const { return opLabel; }
inline InstrTreeNode* leftChild () const {
- return (basicNode.leftChild? basicNode.leftChild->treeNodePtr : NULL);
+ return LeftChild;
}
// If right child is a list node, recursively get its *left* child
- inline InstrTreeNode* rightChild () const {
- return (InstrTreeNode*)
- (basicNode.rightChild
- ? (basicNode.rightChild->treeNodePtr->getOpLabel() == VRegListOp
- ? basicNode.rightChild->treeNodePtr->leftChild()
- : basicNode.rightChild->treeNodePtr)
- : NULL);
+ inline InstrTreeNode* rightChild() const {
+ return (!RightChild ? 0 :
+ (RightChild->getOpLabel() == VRegListOp
+ ? RightChild->LeftChild : RightChild));
}
- inline InstrTreeNode* parent () const {
- return (basicNode.parent? basicNode.parent->treeNodePtr : NULL);
+ inline InstrTreeNode *parent() const {
+ return Parent;
}
void dump (int dumpChildren,
//------------------------------------------------------------------------
-InstrTreeNode::InstrTreeNode(InstrTreeNodeType nodeType,
- Value* _val)
- : treeNodeType(nodeType),
- val(_val)
-{
- basicNode.leftChild = NULL;
- basicNode.rightChild = NULL;
- basicNode.parent = NULL;
- basicNode.opLabel = InvalidOp;
- basicNode.treeNodePtr = this;
+InstrTreeNode::InstrTreeNode(InstrTreeNodeType nodeType, Value* _val)
+ : treeNodeType(nodeType), val(_val) {
+ LeftChild = 0;
+ RightChild = 0;
+ Parent = 0;
+ opLabel = InvalidOp;
}
-void
-InstrTreeNode::dump(int dumpChildren,
- int indent) const
-{
- this->dumpNode(indent);
+void InstrTreeNode::dump(int dumpChildren, int indent) const {
+ dumpNode(indent);
if (dumpChildren)
{
}
}
- basicNode.opLabel = opLabel;
+ this->opLabel = opLabel;
}
}
-VRegListNode::VRegListNode()
- : InstrTreeNode(NTVRegListNode, NULL)
-{
- basicNode.opLabel = VRegListOp;
+VRegListNode::VRegListNode() : InstrTreeNode(NTVRegListNode, 0) {
+ opLabel = VRegListOp;
}
void
}
-VRegNode::VRegNode(Value* _val)
- : InstrTreeNode(NTVRegNode, _val)
-{
- basicNode.opLabel = VRegNodeOp;
+VRegNode::VRegNode(Value* _val) : InstrTreeNode(NTVRegNode, _val) {
+ opLabel = VRegNodeOp;
}
void
}
-ConstantNode::ConstantNode(ConstPoolVal* constVal)
- : InstrTreeNode(NTConstNode, constVal)
-{
- basicNode.opLabel = ConstantNodeOp;
+ConstantNode::ConstantNode(ConstPoolVal *constVal)
+ : InstrTreeNode(NTConstNode, constVal) {
+ opLabel = ConstantNodeOp;
}
void
}
-LabelNode::LabelNode(BasicBlock* _bblock)
- : InstrTreeNode(NTLabelNode, _bblock)
-{
- basicNode.opLabel = LabelNodeOp;
+LabelNode::LabelNode(BasicBlock *BB) : InstrTreeNode(NTLabelNode, BB) {
+ opLabel = LabelNodeOp;
}
void
inline void
-InstrForest::setLeftChild(InstrTreeNode* parent, InstrTreeNode* child)
-{
- parent->basicNode.leftChild = & child->basicNode;
- child->basicNode.parent = & parent->basicNode;
+InstrForest::setLeftChild(InstrTreeNode* parent, InstrTreeNode* child) {
+ parent->LeftChild = child;
+ child->Parent = parent;
if (child->getNodeType() == InstrTreeNode::NTInstructionNode)
treeRoots.erase((InstructionNode*) child); // no longer a tree root
}
inline void
InstrForest::setRightChild(InstrTreeNode* parent, InstrTreeNode* child)
{
- parent->basicNode.rightChild = & child->basicNode;
- child->basicNode.parent = & parent->basicNode;
+ parent->RightChild = child;
+ child->Parent = parent;
if (child->getNodeType() == InstrTreeNode::NTInstructionNode)
treeRoots.erase((InstructionNode*) child); // no longer a tree root
}
//**************************************************************************/
-//************************** System Include Files ***************************/
-
-
-//*************************** User Include Files ***************************/
-
#include "llvm/CodeGen/InstrSelection.h"
+#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Type.h"
#include "llvm/iMemory.h"
#include "llvm/Instruction.h"
#include "llvm/BasicBlock.h"
#include "llvm/Method.h"
-#include "llvm/CodeGen/MachineInstr.h"
-
-//************************* Forward Declarations ***************************/
-
-static bool SelectInstructionsForTree(BasicTreeNode* treeRoot,
- int goalnt,
+static bool SelectInstructionsForTree(InstrTreeNode* treeRoot, int goalnt,
TargetMachine &Target);
-//************************* Internal Data Types *****************************/
-
enum SelectDebugLevel_t {
Select_NoDebugInfo,
Select_PrintMachineCode,
clEnumValN(Select_DebugBurgTrees, "b", "print burg trees"), 0);
-//************************** External Functions ****************************/
-
//---------------------------------------------------------------------------
// Entry point for instruction selection using BURG.
treeRootIter != treeRoots.end();
++treeRootIter)
{
- BasicTreeNode* basicNode = (*treeRootIter)->getBasicNode();
+ InstrTreeNode* basicNode = *treeRootIter;
// Invoke BURM to label each tree node with a state
(void) burm_label(basicNode);
//---------------------------------------------------------------------------
bool
-SelectInstructionsForTree(BasicTreeNode* treeRoot,
- int goalnt,
+SelectInstructionsForTree(InstrTreeNode* treeRoot, int goalnt,
TargetMachine &Target)
{
// Use a static vector to avoid allocating a new one per VM instruction
//
if (treeRoot->opLabel != VRegListOp)
{
- InstructionNode* instrNode = (InstructionNode*)treeRoot->treeNodePtr;
+ InstructionNode* instrNode = (InstructionNode*)treeRoot;
assert(instrNode->getNodeType() == InstrTreeNode::NTInstructionNode);
unsigned N = GetInstructionsByRule(instrNode, ruleForNode, nts, Target,
if (nts[0])
{ // i.e., there is at least one kid
- BasicTreeNode* kids[2];
+ InstrTreeNode* kids[2];
int currentRule = ruleForNode;
burm_kids(treeRoot, currentRule, kids);
for (int i = 0; nts[i]; i++)
{
assert(i < 2);
- InstrTreeNode::InstrTreeNodeType
- nodeType = kids[i]->treeNodePtr->getNodeType();
+ InstrTreeNode::InstrTreeNodeType nodeType = kids[i]->getNodeType();
if (nodeType == InstrTreeNode::NTVRegListNode ||
nodeType == InstrTreeNode::NTInstructionNode)
{
#include <stdio.h>
#include <llvm/CodeGen/InstrForest.h>
-typedef BasicTreeNode* NODEPTR_TYPE;
+typedef InstrTreeNode* NODEPTR_TYPE;
#define OP_LABEL(p) ((p)->opLabel)
-#define LEFT_CHILD(p) ((p)->leftChild)
-#define RIGHT_CHILD(p) ((p)->rightChild)
+#define LEFT_CHILD(p) ((p)->LeftChild)
+#define RIGHT_CHILD(p) ((p)->RightChild)
#define STATE_LABEL(p) ((p)->state)
#define PANIC printf
%}
// 7/02/01 - Vikram Adve - Created
//**************************************************************************/
+#include "llvm/CodeGen/Sparc.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/InstrForest.h"
+#include "llvm/CodeGen/InstrSelection.h"
#include "llvm/Support/MathExtras.h"
-#include "llvm/Type.h"
#include "llvm/DerivedTypes.h"
-#include "llvm/SymbolTable.h"
-#include "llvm/Value.h"
-#include "llvm/Instruction.h"
-#include "llvm/InstrTypes.h"
#include "llvm/iTerminators.h"
#include "llvm/iMemory.h"
#include "llvm/iOther.h"
#include "llvm/BasicBlock.h"
#include "llvm/Method.h"
#include "llvm/ConstPoolVals.h"
-#include "llvm/CodeGen/Sparc.h"
-#include "llvm/CodeGen/MachineInstr.h"
-#include "llvm/CodeGen/InstrForest.h"
-#include "llvm/CodeGen/InstrSelection.h"
//******************** Internal Data Declarations ************************/
assert(ThisIsAChainRule(ruleForNode));
assert(nts[0] && ! nts[1]
&& "A chain rule should have only one RHS non-terminal!");
- nextRule = burm_rule(subtreeRoot->getBasicNode()->state, nts[0]);
+ nextRule = burm_rule(subtreeRoot->state, nts[0]);
nts = burm_nts[nextRule];
numInstr = GetInstructionsByRule(subtreeRoot, nextRule, nts,target,mvec);
break;
//------------------------------------------------------------------------
-InstrTreeNode::InstrTreeNode(InstrTreeNodeType nodeType,
- Value* _val)
- : treeNodeType(nodeType),
- val(_val)
-{
- basicNode.leftChild = NULL;
- basicNode.rightChild = NULL;
- basicNode.parent = NULL;
- basicNode.opLabel = InvalidOp;
- basicNode.treeNodePtr = this;
+InstrTreeNode::InstrTreeNode(InstrTreeNodeType nodeType, Value* _val)
+ : treeNodeType(nodeType), val(_val) {
+ LeftChild = 0;
+ RightChild = 0;
+ Parent = 0;
+ opLabel = InvalidOp;
}
-void
-InstrTreeNode::dump(int dumpChildren,
- int indent) const
-{
- this->dumpNode(indent);
+void InstrTreeNode::dump(int dumpChildren, int indent) const {
+ dumpNode(indent);
if (dumpChildren)
{
}
}
- basicNode.opLabel = opLabel;
+ this->opLabel = opLabel;
}
}
-VRegListNode::VRegListNode()
- : InstrTreeNode(NTVRegListNode, NULL)
-{
- basicNode.opLabel = VRegListOp;
+VRegListNode::VRegListNode() : InstrTreeNode(NTVRegListNode, 0) {
+ opLabel = VRegListOp;
}
void
}
-VRegNode::VRegNode(Value* _val)
- : InstrTreeNode(NTVRegNode, _val)
-{
- basicNode.opLabel = VRegNodeOp;
+VRegNode::VRegNode(Value* _val) : InstrTreeNode(NTVRegNode, _val) {
+ opLabel = VRegNodeOp;
}
void
}
-ConstantNode::ConstantNode(ConstPoolVal* constVal)
- : InstrTreeNode(NTConstNode, constVal)
-{
- basicNode.opLabel = ConstantNodeOp;
+ConstantNode::ConstantNode(ConstPoolVal *constVal)
+ : InstrTreeNode(NTConstNode, constVal) {
+ opLabel = ConstantNodeOp;
}
void
}
-LabelNode::LabelNode(BasicBlock* _bblock)
- : InstrTreeNode(NTLabelNode, _bblock)
-{
- basicNode.opLabel = LabelNodeOp;
+LabelNode::LabelNode(BasicBlock *BB) : InstrTreeNode(NTLabelNode, BB) {
+ opLabel = LabelNodeOp;
}
void
inline void
-InstrForest::setLeftChild(InstrTreeNode* parent, InstrTreeNode* child)
-{
- parent->basicNode.leftChild = & child->basicNode;
- child->basicNode.parent = & parent->basicNode;
+InstrForest::setLeftChild(InstrTreeNode* parent, InstrTreeNode* child) {
+ parent->LeftChild = child;
+ child->Parent = parent;
if (child->getNodeType() == InstrTreeNode::NTInstructionNode)
treeRoots.erase((InstructionNode*) child); // no longer a tree root
}
inline void
InstrForest::setRightChild(InstrTreeNode* parent, InstrTreeNode* child)
{
- parent->basicNode.rightChild = & child->basicNode;
- child->basicNode.parent = & parent->basicNode;
+ parent->RightChild = child;
+ child->Parent = parent;
if (child->getNodeType() == InstrTreeNode::NTInstructionNode)
treeRoots.erase((InstructionNode*) child); // no longer a tree root
}
//**************************************************************************/
-//************************** System Include Files ***************************/
-
-
-//*************************** User Include Files ***************************/
-
#include "llvm/CodeGen/InstrSelection.h"
+#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Type.h"
#include "llvm/iMemory.h"
#include "llvm/Instruction.h"
#include "llvm/BasicBlock.h"
#include "llvm/Method.h"
-#include "llvm/CodeGen/MachineInstr.h"
-
-//************************* Forward Declarations ***************************/
-
-static bool SelectInstructionsForTree(BasicTreeNode* treeRoot,
- int goalnt,
+static bool SelectInstructionsForTree(InstrTreeNode* treeRoot, int goalnt,
TargetMachine &Target);
-//************************* Internal Data Types *****************************/
-
enum SelectDebugLevel_t {
Select_NoDebugInfo,
Select_PrintMachineCode,
clEnumValN(Select_DebugBurgTrees, "b", "print burg trees"), 0);
-//************************** External Functions ****************************/
-
//---------------------------------------------------------------------------
// Entry point for instruction selection using BURG.
treeRootIter != treeRoots.end();
++treeRootIter)
{
- BasicTreeNode* basicNode = (*treeRootIter)->getBasicNode();
+ InstrTreeNode* basicNode = *treeRootIter;
// Invoke BURM to label each tree node with a state
(void) burm_label(basicNode);
//---------------------------------------------------------------------------
bool
-SelectInstructionsForTree(BasicTreeNode* treeRoot,
- int goalnt,
+SelectInstructionsForTree(InstrTreeNode* treeRoot, int goalnt,
TargetMachine &Target)
{
// Use a static vector to avoid allocating a new one per VM instruction
//
if (treeRoot->opLabel != VRegListOp)
{
- InstructionNode* instrNode = (InstructionNode*)treeRoot->treeNodePtr;
+ InstructionNode* instrNode = (InstructionNode*)treeRoot;
assert(instrNode->getNodeType() == InstrTreeNode::NTInstructionNode);
unsigned N = GetInstructionsByRule(instrNode, ruleForNode, nts, Target,
if (nts[0])
{ // i.e., there is at least one kid
- BasicTreeNode* kids[2];
+ InstrTreeNode* kids[2];
int currentRule = ruleForNode;
burm_kids(treeRoot, currentRule, kids);
for (int i = 0; nts[i]; i++)
{
assert(i < 2);
- InstrTreeNode::InstrTreeNodeType
- nodeType = kids[i]->treeNodePtr->getNodeType();
+ InstrTreeNode::InstrTreeNodeType nodeType = kids[i]->getNodeType();
if (nodeType == InstrTreeNode::NTVRegListNode ||
nodeType == InstrTreeNode::NTInstructionNode)
{