mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Make all unnamed RegisterClass TreePatternNodes typed MVT::i32.
A register class can appear as a leaf TreePatternNode with and without a name: (COPY_TO_REGCLASS GPR:$src, F8RC) In a named leaf node like GPR:$src, the register class provides type information for the named variable represented by the node. The TypeSet for such a node is the set of value types that the register class can represent. In an unnamed leaf node like F8RC above, the register class represents itself as a kind of immediate. Such a node has the type MVT::i32, we'll never create a virtual register representing it. This change makes it possible to remove the special handling of COPY_TO_REGCLASS in CodeGenDAGPatterns.cpp. llvm-svn: 177825
This commit is contained in:
parent
8e322b7c0a
commit
a8e8e879c0
@ -1321,8 +1321,18 @@ TreePatternNode *TreePatternNode::InlinePatternFragments(TreePattern &TP) {
|
||||
/// type which should be applied to it. This will infer the type of register
|
||||
/// references from the register file information, for example.
|
||||
///
|
||||
/// When Unnamed is set, return the type of a DAG operand with no name, such as
|
||||
/// the F8RC register class argument in:
|
||||
///
|
||||
/// (COPY_TO_REGCLASS GPR:$src, F8RC)
|
||||
///
|
||||
/// When Unnamed is false, return the type of a named DAG operand such as the
|
||||
/// GPR:$src operand above.
|
||||
///
|
||||
static EEVT::TypeSet getImplicitType(Record *R, unsigned ResNo,
|
||||
bool NotRegisters, TreePattern &TP) {
|
||||
bool NotRegisters,
|
||||
bool Unnamed,
|
||||
TreePattern &TP) {
|
||||
// Check to see if this is a register operand.
|
||||
if (R->isSubClassOf("RegisterOperand")) {
|
||||
assert(ResNo == 0 && "Regoperand ref only has one result!");
|
||||
@ -1336,6 +1346,13 @@ static EEVT::TypeSet getImplicitType(Record *R, unsigned ResNo,
|
||||
// Check to see if this is a register or a register class.
|
||||
if (R->isSubClassOf("RegisterClass")) {
|
||||
assert(ResNo == 0 && "Regclass ref only has one result!");
|
||||
// An unnamed register class represents itself as an i32 immediate, for
|
||||
// example on a COPY_TO_REGCLASS instruction.
|
||||
if (Unnamed)
|
||||
return EEVT::TypeSet(MVT::i32, TP);
|
||||
|
||||
// In a named operand, the register class provides the possible set of
|
||||
// types.
|
||||
if (NotRegisters)
|
||||
return EEVT::TypeSet(); // Unknown.
|
||||
const CodeGenTarget &T = TP.getDAGPatterns().getTargetInfo();
|
||||
@ -1469,7 +1486,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
|
||||
bool MadeChange = false;
|
||||
for (unsigned i = 0, e = Types.size(); i != e; ++i)
|
||||
MadeChange |= UpdateNodeType(i, getImplicitType(DI->getDef(), i,
|
||||
NotRegisters, TP), TP);
|
||||
NotRegisters,
|
||||
!hasName(), TP), TP);
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
@ -1532,25 +1550,6 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
if (getOperator()->getName() == "COPY_TO_REGCLASS") {
|
||||
bool MadeChange = false;
|
||||
MadeChange |= getChild(0)->ApplyTypeConstraints(TP, NotRegisters);
|
||||
MadeChange |= getChild(1)->ApplyTypeConstraints(TP, NotRegisters);
|
||||
|
||||
assert(getChild(0)->getNumTypes() == 1 &&
|
||||
getChild(1)->getNumTypes() == 1 && "Unhandled case");
|
||||
|
||||
// child #1 of COPY_TO_REGCLASS should be a register class. We don't care
|
||||
// what type it gets, so if it didn't get a concrete type just give it the
|
||||
// first viable type from the reg class.
|
||||
if (!getChild(1)->hasTypeSet(0) &&
|
||||
!getChild(1)->getExtType(0).isCompletelyUnknown()) {
|
||||
MVT::SimpleValueType RCVT = getChild(1)->getExtType(0).getTypeList()[0];
|
||||
MadeChange |= getChild(1)->UpdateNodeType(0, RCVT, TP);
|
||||
}
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
if (const CodeGenIntrinsic *Int = getIntrinsicInfo(CDP)) {
|
||||
bool MadeChange = false;
|
||||
|
||||
|
@ -334,6 +334,7 @@ public:
|
||||
}
|
||||
~TreePatternNode();
|
||||
|
||||
bool hasName() const { return !Name.empty(); }
|
||||
const std::string &getName() const { return Name; }
|
||||
void setName(StringRef N) { Name.assign(N.begin(), N.end()); }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user