blob: 7e1eb6590dfd394211cdad6da3c4d18d0a2c4b9e [file] [log] [blame]
Chris Lattner87b3bf62001-09-14 06:08:03 +00001/* Title: RegClass.h -*- C++ -*-
Ruchira Sasankaf5788aa2001-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 Sasankaf5788aa2001-09-08 14:22:50 +00006*/
7
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +00008#ifndef REG_CLASS_H
9#define REG_CLASS_H
10
Chris Lattnerf9781b52002-12-29 03:13:05 +000011#include "llvm/Target/TargetRegInfo.h"
Chris Lattnere46165f2003-01-15 21:02:16 +000012#include "InterferenceGraph.h"
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000013#include <stack>
Chris Lattnerf9781b52002-12-29 03:13:05 +000014class TargetRegClassInfo;
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000015
Chris Lattnerb0da8b22002-02-04 05:52:08 +000016typedef std::vector<unsigned> ReservedColorListType;
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000017
18
Ruchira Sasankaf20079d2002-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
Chris Lattnerf9781b52002-12-29 03:13:05 +000027// dependent description of machine registers (TargetRegInfo class) to
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000028// 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 Lattnerb0da8b22002-02-04 05:52:08 +000036class RegClass {
Chris Lattnerf739fa82002-04-08 22:03:57 +000037 const Function *const Meth; // Function we are working on
Chris Lattnerf9781b52002-12-29 03:13:05 +000038 const TargetRegClassInfo *const MRC; // corresponding MRC
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000039 const unsigned RegClassID; // my int ID
40
41 InterferenceGraph IG; // Interference graph - constructed by
42 // buildInterferenceGraph
Chris Lattner7f74a562002-01-20 22:54:45 +000043 std::stack<IGNode *> IGNodeStack; // the stack used for coloring
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000044
Chris Lattnerabe98192002-05-23 15:50:03 +000045 // ReservedColorList - for passing registers that are pre-allocated and cannot
46 // be used by the register allocator for this function.
47 //
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000048 const ReservedColorListType *const ReservedColorList;
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000049
Chris Lattnerabe98192002-05-23 15:50:03 +000050 // IsColorUsedArr - An array used for coloring each node. This array must be
51 // of size MRC->getNumOfAllRegs(). Allocated once in the constructor for
52 // efficiency.
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000053 //
Chris Lattnerabe98192002-05-23 15:50:03 +000054 std::vector<bool> IsColorUsedArr;
55
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000056
57
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000058 //--------------------------- private methods ------------------------------
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000059
60 void pushAllIGNodes();
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000061
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000062 bool pushUnconstrainedIGNodes();
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000063
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000064 IGNode * getIGNodeWithMinSpillCost();
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000065
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000066 void colorIGNode(IGNode *const Node);
67
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000068
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000069 public:
70
Chris Lattnerf739fa82002-04-08 22:03:57 +000071 RegClass(const Function *M,
Chris Lattnerf9781b52002-12-29 03:13:05 +000072 const TargetRegClassInfo *MRC,
Chris Lattnerf739fa82002-04-08 22:03:57 +000073 const ReservedColorListType *RCL = 0);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000074
Chris Lattnerf739fa82002-04-08 22:03:57 +000075 inline void createInterferenceGraph() { IG.createGraph(); }
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000076
77 inline InterferenceGraph &getIG() { return IG; }
78
79 inline const unsigned getID() const { return RegClassID; }
80
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000081 // main method called for coloring regs
82 //
83 void colorAllRegs();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000084
85 inline unsigned getNumOfAvailRegs() const
86 { return MRC->getNumOfAvailRegs(); }
87
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000088
89 // --- following methods are provided to access the IG contained within this
90 // ---- RegClass easilly.
91
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000092 inline void addLRToIG(LiveRange *const LR)
93 { IG.addLRToIG(LR); }
94
95 inline void setInterference(const LiveRange *const LR1,
96 const LiveRange *const LR2)
97 { IG.setInterference(LR1, LR2); }
98
99 inline unsigned getInterference(const LiveRange *const LR1,
100 const LiveRange *const LR2) const
101 { return IG.getInterference(LR1, LR2); }
102
103 inline void mergeIGNodesOfLRs(const LiveRange *const LR1,
104 LiveRange *const LR2)
105 { IG.mergeIGNodesOfLRs(LR1, LR2); }
106
107
Chris Lattnerabe98192002-05-23 15:50:03 +0000108 inline std::vector<bool> &getIsColorUsedArr() { return IsColorUsedArr; }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000109
110
Chris Lattner189c0992002-10-29 16:50:33 +0000111 void printIGNodeList() const;
112 void printIG();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000113};
114
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000115#endif