mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Split out register class subclassing to a separate function and clean up
accordingly. No functional change. llvm-svn: 112008
This commit is contained in:
parent
109fe5d8f8
commit
70a1a20101
@ -19,6 +19,7 @@
|
|||||||
#include "llvm/ADT/DenseMap.h"
|
#include "llvm/ADT/DenseMap.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <set>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
@ -55,6 +56,37 @@ namespace llvm {
|
|||||||
assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
|
assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns true if RC is a strict subclass.
|
||||||
|
// RC is a sub-class of this class if it is a valid replacement for any
|
||||||
|
// instruction operand where a register of this classis required. It must
|
||||||
|
// satisfy these conditions:
|
||||||
|
//
|
||||||
|
// 1. All RC registers are also in this.
|
||||||
|
// 2. The RC spill size must not be smaller than our spill size.
|
||||||
|
// 3. RC spill alignment must be compatible with ours.
|
||||||
|
//
|
||||||
|
bool hasSubClass(const CodeGenRegisterClass *RC) const {
|
||||||
|
|
||||||
|
if (RC->Elements.size() > Elements.size() ||
|
||||||
|
(SpillAlignment && RC->SpillAlignment % SpillAlignment) ||
|
||||||
|
SpillSize > RC->SpillSize)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::set<Record*> RegSet;
|
||||||
|
for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
|
||||||
|
Record *Reg = Elements[i];
|
||||||
|
RegSet.insert(Reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 0, e = RC->Elements.size(); i != e; ++i) {
|
||||||
|
Record *Reg = RC->Elements[i];
|
||||||
|
if (!RegSet.count(Reg))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
CodeGenRegisterClass(Record *R);
|
CodeGenRegisterClass(Record *R);
|
||||||
};
|
};
|
||||||
|
@ -119,16 +119,6 @@ void RegisterInfoEmitter::runHeader(raw_ostream &OS) {
|
|||||||
OS << "} // End llvm namespace \n";
|
OS << "} // End llvm namespace \n";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSubRegisterClass(const CodeGenRegisterClass &RC,
|
|
||||||
std::set<Record*> &RegSet) {
|
|
||||||
for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) {
|
|
||||||
Record *Reg = RC.Elements[i];
|
|
||||||
if (!RegSet.count(Reg))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void addSuperReg(Record *R, Record *S,
|
static void addSuperReg(Record *R, Record *S,
|
||||||
std::map<Record*, std::set<Record*>, LessRecord> &SubRegs,
|
std::map<Record*, std::set<Record*>, LessRecord> &SubRegs,
|
||||||
std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs,
|
std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs,
|
||||||
@ -498,12 +488,6 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
|
|||||||
// Give the register class a legal C name if it's anonymous.
|
// Give the register class a legal C name if it's anonymous.
|
||||||
std::string Name = RC.TheDef->getName();
|
std::string Name = RC.TheDef->getName();
|
||||||
|
|
||||||
std::set<Record*> RegSet;
|
|
||||||
for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) {
|
|
||||||
Record *Reg = RC.Elements[i];
|
|
||||||
RegSet.insert(Reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
OS << " // " << Name
|
OS << " // " << Name
|
||||||
<< " Register Class sub-classes...\n"
|
<< " Register Class sub-classes...\n"
|
||||||
<< " static const TargetRegisterClass* const "
|
<< " static const TargetRegisterClass* const "
|
||||||
@ -513,21 +497,9 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
|
|||||||
for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
|
for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
|
||||||
const CodeGenRegisterClass &RC2 = RegisterClasses[rc2];
|
const CodeGenRegisterClass &RC2 = RegisterClasses[rc2];
|
||||||
|
|
||||||
// RC2 is a sub-class of RC if it is a valid replacement for any
|
|
||||||
// instruction operand where an RC register is required. It must satisfy
|
|
||||||
// these conditions:
|
|
||||||
//
|
|
||||||
// 1. All RC2 registers are also in RC.
|
|
||||||
// 2. The RC2 spill size must not be smaller that the RC spill size.
|
|
||||||
// 3. RC2 spill alignment must be compatible with RC.
|
|
||||||
//
|
|
||||||
// Sub-classes are used to determine if a virtual register can be used
|
// Sub-classes are used to determine if a virtual register can be used
|
||||||
// as an instruction operand, or if it must be copied first.
|
// as an instruction operand, or if it must be copied first.
|
||||||
|
if (rc == rc2 || !RC.hasSubClass(&RC2)) continue;
|
||||||
if (rc == rc2 || RC2.Elements.size() > RC.Elements.size() ||
|
|
||||||
(RC.SpillAlignment && RC2.SpillAlignment % RC.SpillAlignment) ||
|
|
||||||
RC.SpillSize > RC2.SpillSize || !isSubRegisterClass(RC2, RegSet))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!Empty) OS << ", ";
|
if (!Empty) OS << ", ";
|
||||||
OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
|
OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
|
||||||
|
Loading…
Reference in New Issue
Block a user