blob: c93d6961e0bd8251d5a14c4cc784ee65fbd6e926 [file] [log] [blame]
Chris Lattnere5bc8b02001-09-14 06:08:03 +00001/* Title: RegClass.h -*- C++ -*-
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +00002 Author: Ruchira Sasanka
3 Date: Aug 20, 01
4 Purpose: Contains machine independent methods for register coloring.
5
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +00006*/
7
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +00008#ifndef REG_CLASS_H
9#define REG_CLASS_H
10
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000011#include "llvm/CodeGen/InterferenceGraph.h"
Vikram S. Adve4bc86972001-09-18 12:41:43 +000012#include "llvm/Target/MachineRegInfo.h"
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000013#include <stack>
Chris Lattner2182c782002-02-04 05:52:08 +000014class MachineRegClassInfo;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000015
Chris Lattner2182c782002-02-04 05:52:08 +000016typedef std::vector<unsigned> ReservedColorListType;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000017
18
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000019//-----------------------------------------------------------------------------
20// Class RegClass
21//
22// Implements a machine independant register class.
23//
24// This is the class that contains all data structures and common algos
25// for coloring a particular register class (e.g., int class, fp class).
26// This class is hardware independent. This class accepts a hardware
27// dependent description of machine registers (MachineRegInfo class) to
28// get hardware specific info and to color an individual IG node.
29//
30// This class contains the InterferenceGraph (IG).
31// Also it contains an IGNode stack that can be used for coloring.
32// The class provides some easy access methods to the IG methods, since these
33// methods are called thru a register class.
34//
35//-----------------------------------------------------------------------------
Chris Lattner2182c782002-02-04 05:52:08 +000036class RegClass {
Chris Lattnerb7653df2002-04-08 22:03:57 +000037 const Function *const Meth; // Function we are working on
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000038 const MachineRegClassInfo *const MRC; // corresponding MRC
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000039 const unsigned RegClassID; // my int ID
40
41 InterferenceGraph IG; // Interference graph - constructed by
42 // buildInterferenceGraph
Chris Lattner697954c2002-01-20 22:54:45 +000043 std::stack<IGNode *> IGNodeStack; // the stack used for coloring
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000044
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000045 const ReservedColorListType *const ReservedColorList;
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000046 //
47 // for passing registers that are pre-allocated and cannot be used by the
Chris Lattnerb7653df2002-04-08 22:03:57 +000048 // register allocator for this function.
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000049
50 bool *IsColorUsedArr;
51 //
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000052 // An array used for coloring each node. This array must be of size
53 // MRC->getNumOfAllRegs(). Allocated once in the constructor
54 // for efficiency.
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000055
56
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000057 //--------------------------- private methods ------------------------------
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000058
59 void pushAllIGNodes();
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000060
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000061 bool pushUnconstrainedIGNodes();
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000062
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000063 IGNode * getIGNodeWithMinSpillCost();
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000064
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000065 void colorIGNode(IGNode *const Node);
66
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000067
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000068 public:
69
Chris Lattnerb7653df2002-04-08 22:03:57 +000070 RegClass(const Function *M,
71 const MachineRegClassInfo *MRC,
72 const ReservedColorListType *RCL = 0);
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000073
Chris Lattnerb7653df2002-04-08 22:03:57 +000074 ~RegClass() { delete[] IsColorUsedArr; }
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000075
Chris Lattnerb7653df2002-04-08 22:03:57 +000076 inline void createInterferenceGraph() { IG.createGraph(); }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000077
78 inline InterferenceGraph &getIG() { return IG; }
79
80 inline const unsigned getID() const { return RegClassID; }
81
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000082 // main method called for coloring regs
83 //
84 void colorAllRegs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000085
86 inline unsigned getNumOfAvailRegs() const
87 { return MRC->getNumOfAvailRegs(); }
88
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000089
90 // --- following methods are provided to access the IG contained within this
91 // ---- RegClass easilly.
92
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000093 inline void addLRToIG(LiveRange *const LR)
94 { IG.addLRToIG(LR); }
95
96 inline void setInterference(const LiveRange *const LR1,
97 const LiveRange *const LR2)
98 { IG.setInterference(LR1, LR2); }
99
100 inline unsigned getInterference(const LiveRange *const LR1,
101 const LiveRange *const LR2) const
102 { return IG.getInterference(LR1, LR2); }
103
104 inline void mergeIGNodesOfLRs(const LiveRange *const LR1,
105 LiveRange *const LR2)
106 { IG.mergeIGNodesOfLRs(LR1, LR2); }
107
108
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000109 inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
110
111
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000112 inline void printIGNodeList() const {
Chris Lattner697954c2002-01-20 22:54:45 +0000113 std::cerr << "IG Nodes for Register Class " << RegClassID << ":" << "\n";
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000114 IG.printIGNodeList();
115 }
116
117 inline void printIG() {
Chris Lattner697954c2002-01-20 22:54:45 +0000118 std::cerr << "IG for Register Class " << RegClassID << ":" << "\n";
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000119 IG.printIG();
120 }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000121};
122
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000123#endif