blob: 1e5f5513725d4f45151176bce267582ef2f68b3b [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
11#include "llvm/CodeGen/IGNode.h"
12#include "llvm/CodeGen/InterferenceGraph.h"
Vikram S. Adve4bc86972001-09-18 12:41:43 +000013#include "llvm/Target/MachineRegInfo.h"
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000014#include <stack>
Chris Lattner697954c2002-01-20 22:54:45 +000015#include <iostream>
Chris Lattner2182c782002-02-04 05:52:08 +000016class MachineRegClassInfo;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000017
Chris Lattner2182c782002-02-04 05:52:08 +000018typedef std::vector<unsigned> ReservedColorListType;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000019
20
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000021//-----------------------------------------------------------------------------
22// Class RegClass
23//
24// Implements a machine independant register class.
25//
26// This is the class that contains all data structures and common algos
27// for coloring a particular register class (e.g., int class, fp class).
28// This class is hardware independent. This class accepts a hardware
29// dependent description of machine registers (MachineRegInfo class) to
30// get hardware specific info and to color an individual IG node.
31//
32// This class contains the InterferenceGraph (IG).
33// Also it contains an IGNode stack that can be used for coloring.
34// The class provides some easy access methods to the IG methods, since these
35// methods are called thru a register class.
36//
37//-----------------------------------------------------------------------------
Chris Lattner2182c782002-02-04 05:52:08 +000038class RegClass {
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000039 const Method *const Meth; // Method we are working on
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000040 const MachineRegClassInfo *const MRC; // corresponding MRC
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000041 const unsigned RegClassID; // my int ID
42
43 InterferenceGraph IG; // Interference graph - constructed by
44 // buildInterferenceGraph
Chris Lattner697954c2002-01-20 22:54:45 +000045 std::stack<IGNode *> IGNodeStack; // the stack used for coloring
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000046
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000047 const ReservedColorListType *const ReservedColorList;
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000048 //
49 // for passing registers that are pre-allocated and cannot be used by the
50 // register allocator for this method.
51
52 bool *IsColorUsedArr;
53 //
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000054 // An array used for coloring each node. This array must be of size
55 // MRC->getNumOfAllRegs(). Allocated once in the constructor
56 // for efficiency.
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000057
58
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000059 //--------------------------- private methods ------------------------------
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000060
61 void pushAllIGNodes();
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000062
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000063 bool pushUnconstrainedIGNodes();
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000064
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000065 IGNode * getIGNodeWithMinSpillCost();
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000066
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000067 void colorIGNode(IGNode *const Node);
68
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000069
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000070 public:
71
72 RegClass(const Method *const M,
73 const MachineRegClassInfo *const MRC,
74 const ReservedColorListType *const RCL = NULL);
75
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000076 ~RegClass() { delete[] IsColorUsedArr; };
77
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000078 inline void createInterferenceGraph()
79 { IG.createGraph(); }
80
81 inline InterferenceGraph &getIG() { return IG; }
82
83 inline const unsigned getID() const { return RegClassID; }
84
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000085 // main method called for coloring regs
86 //
87 void colorAllRegs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000088
89 inline unsigned getNumOfAvailRegs() const
90 { return MRC->getNumOfAvailRegs(); }
91
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000092
93 // --- following methods are provided to access the IG contained within this
94 // ---- RegClass easilly.
95
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000096 inline void addLRToIG(LiveRange *const LR)
97 { IG.addLRToIG(LR); }
98
99 inline void setInterference(const LiveRange *const LR1,
100 const LiveRange *const LR2)
101 { IG.setInterference(LR1, LR2); }
102
103 inline unsigned getInterference(const LiveRange *const LR1,
104 const LiveRange *const LR2) const
105 { return IG.getInterference(LR1, LR2); }
106
107 inline void mergeIGNodesOfLRs(const LiveRange *const LR1,
108 LiveRange *const LR2)
109 { IG.mergeIGNodesOfLRs(LR1, LR2); }
110
111
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000112 inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
113
114
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000115 inline void printIGNodeList() const {
Chris Lattner697954c2002-01-20 22:54:45 +0000116 std::cerr << "IG Nodes for Register Class " << RegClassID << ":" << "\n";
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000117 IG.printIGNodeList();
118 }
119
120 inline void printIG() {
Chris Lattner697954c2002-01-20 22:54:45 +0000121 std::cerr << "IG for Register Class " << RegClassID << ":" << "\n";
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000122 IG.printIG();
123 }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000124};
125
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000126#endif