[llvm-branch-commits] [llvm-branch] r80543 - in /llvm/branches/release_26/utils/TableGen: CodeGenDAGPatterns.cpp CodeGenDAGPatterns.h Record.cpp Record.h
Tanya Lattner
tonic at nondot.org
Sun Aug 30 23:12:12 PDT 2009
Author: tbrethou
Date: Mon Aug 31 01:12:11 2009
New Revision: 80543
URL: http://llvm.org/viewvc/llvm-project?rev=80543&view=rev
Log:
Merge from mainline.
Fix non-determinism in DAGISel emitter.
- This manifested as non-determinism in the .inc output in rare cases (when two
distinct patterns ended up being equivalent, which is rather rare). That
meant the pattern matching was non-deterministic, which could eventually mean
the code generator selected different instructions based on the arch.
- It's probably worth making the DAGISel ensure a total ordering (or force the
user to), but the simple fix here is to totally order the Record* maps based
on a unique ID.
- PR4672, PR4711.
Modified:
llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.cpp
llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.h
llvm/branches/release_26/utils/TableGen/Record.cpp
llvm/branches/release_26/utils/TableGen/Record.h
Modified: llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.cpp?rev=80543&r1=80542&r2=80543&view=diff
==============================================================================
--- llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.cpp (original)
+++ llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.cpp Mon Aug 31 01:12:11 2009
@@ -100,6 +100,9 @@
} // end namespace EEVT.
} // end namespace llvm.
+bool RecordPtrCmp::operator()(const Record *LHS, const Record *RHS) const {
+ return LHS->getID() < RHS->getID();
+}
/// Dependent variable map for CodeGenDAGPattern variant generation
typedef std::map<std::string, int> DepVarMap;
Modified: llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.h?rev=80543&r1=80542&r2=80543&view=diff
==============================================================================
--- llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.h (original)
+++ llvm/branches/release_26/utils/TableGen/CodeGenDAGPatterns.h Mon Aug 31 01:12:11 2009
@@ -462,6 +462,10 @@
std::string getPredicateCheck() const;
};
+// Deterministic comparison of Record*.
+struct RecordPtrCmp {
+ bool operator()(const Record *LHS, const Record *RHS) const;
+};
class CodeGenDAGPatterns {
RecordKeeper &Records;
@@ -469,12 +473,12 @@
std::vector<CodeGenIntrinsic> Intrinsics;
std::vector<CodeGenIntrinsic> TgtIntrinsics;
- std::map<Record*, SDNodeInfo> SDNodes;
- std::map<Record*, std::pair<Record*, std::string> > SDNodeXForms;
- std::map<Record*, ComplexPattern> ComplexPatterns;
- std::map<Record*, TreePattern*> PatternFragments;
- std::map<Record*, DAGDefaultOperand> DefaultOperands;
- std::map<Record*, DAGInstruction> Instructions;
+ std::map<Record*, SDNodeInfo, RecordPtrCmp> SDNodes;
+ std::map<Record*, std::pair<Record*, std::string>, RecordPtrCmp> SDNodeXForms;
+ std::map<Record*, ComplexPattern, RecordPtrCmp> ComplexPatterns;
+ std::map<Record*, TreePattern*, RecordPtrCmp> PatternFragments;
+ std::map<Record*, DAGDefaultOperand, RecordPtrCmp> DefaultOperands;
+ std::map<Record*, DAGInstruction, RecordPtrCmp> Instructions;
// Specific SDNode definitions:
Record *intrinsic_void_sdnode;
Modified: llvm/branches/release_26/utils/TableGen/Record.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_26/utils/TableGen/Record.cpp?rev=80543&r1=80542&r2=80543&view=diff
==============================================================================
--- llvm/branches/release_26/utils/TableGen/Record.cpp (original)
+++ llvm/branches/release_26/utils/TableGen/Record.cpp Mon Aug 31 01:12:11 2009
@@ -1319,6 +1319,8 @@
if (PrintSem) OS << ";\n";
}
+unsigned Record::LastID = 0;
+
void Record::setName(const std::string &Name) {
if (Records.getDef(getName()) == this) {
Records.removeDef(getName());
Modified: llvm/branches/release_26/utils/TableGen/Record.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_26/utils/TableGen/Record.h?rev=80543&r1=80542&r2=80543&view=diff
==============================================================================
--- llvm/branches/release_26/utils/TableGen/Record.h (original)
+++ llvm/branches/release_26/utils/TableGen/Record.h Mon Aug 31 01:12:11 2009
@@ -1220,6 +1220,10 @@
}
class Record {
+ static unsigned LastID;
+
+ // Unique record ID.
+ unsigned ID;
std::string Name;
SMLoc Loc;
std::vector<std::string> TemplateArgs;
@@ -1227,9 +1231,12 @@
std::vector<Record*> SuperClasses;
public:
- explicit Record(const std::string &N, SMLoc loc) : Name(N), Loc(loc) {}
+ explicit Record(const std::string &N, SMLoc loc) :
+ ID(LastID++), Name(N), Loc(loc) {}
~Record() {}
+ unsigned getID() const { return ID; }
+
const std::string &getName() const { return Name; }
void setName(const std::string &Name); // Also updates RecordKeeper.
More information about the llvm-branch-commits
mailing list