summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-08-11 20:10:07 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-08-11 20:10:07 +0000
commit8409bfbbc306bc051fbd8b049804103ca7df2f63 (patch)
tree720b6d202f061af2a971d7efe5de5efd48ff9c02 /utils
parentf536368be8729154db369cc785fd5477e42c950e (diff)
downloadllvm-8409bfbbc306bc051fbd8b049804103ca7df2f63.tar.gz
llvm-8409bfbbc306bc051fbd8b049804103ca7df2f63.tar.bz2
llvm-8409bfbbc306bc051fbd8b049804103ca7df2f63.tar.xz
llvm-mc/AsmMatcher: Fix two thinkos in determining whether two classes are
related. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78706 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/AsmMatcherEmitter.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp
index d02318e229..57b93b1d27 100644
--- a/utils/TableGen/AsmMatcherEmitter.cpp
+++ b/utils/TableGen/AsmMatcherEmitter.cpp
@@ -325,6 +325,10 @@ struct ClassInfo {
/// MCInst; this is not valid for Token or register kinds.
std::string RenderMethod;
+ /// For register classes, the records for all the registers in this class.
+ std::set<Record*> Registers;
+
+public:
/// isRegisterClass() - Check if this is a register class.
bool isRegisterClass() const {
return Kind >= RegisterClass0 && Kind < UserClass0;
@@ -342,18 +346,32 @@ struct ClassInfo {
if (Kind == Token || RHS.Kind == Token)
return Kind == Token && RHS.Kind == Token;
- // Registers are only related to registers.
- if (isRegisterClass() || RHS.isRegisterClass())
- return isRegisterClass() && RHS.isRegisterClass();
+ // Registers classes are only related to registers classes, and only if
+ // their intersection is non-empty.
+ if (isRegisterClass() || RHS.isRegisterClass()) {
+ if (!isRegisterClass() || !RHS.isRegisterClass())
+ return false;
+
+ std::set<Record*> Tmp;
+ std::insert_iterator< std::set<Record*> > II(Tmp, Tmp.begin());
+ std::set_intersection(Registers.begin(), Registers.end(),
+ RHS.Registers.begin(), RHS.Registers.end(),
+ II);
+
+ return !Tmp.empty();
+ }
// Otherwise we have two users operands; they are related if they are in the
// same class hierarchy.
+ //
+ // FIXME: This is an oversimplification, they should only be related if they
+ // intersect, however we don't have that information.
assert(isUserClass() && RHS.isUserClass() && "Unexpected class!");
const ClassInfo *Root = this;
while (!Root->SuperClasses.empty())
Root = Root->SuperClasses.front();
- const ClassInfo *RHSRoot = this;
+ const ClassInfo *RHSRoot = &RHS;
while (!RHSRoot->SuperClasses.empty())
RHSRoot = RHSRoot->SuperClasses.front();
@@ -674,6 +692,7 @@ void AsmMatcherInfo::BuildRegisterClasses(CodeGenTarget &Target) {
CI->ValueName = "";
CI->PredicateMethod = ""; // unused
CI->RenderMethod = "addRegOperands";
+ CI->Registers = *it;
Classes.push_back(CI);
RegisterSetClasses.insert(std::make_pair(*it, CI));
}