aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-06-29 23:57:05 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-06-29 23:57:05 +0000
commit322812e603705e1c2037313633e72f689524b163 (patch)
tree7d13d6695fbade190d0cc907b4b48dd5dbce83b5
parent7dabf399b95aad4056985eac346451e134de9ebe (diff)
Ugly hack! Add helper functions InsertInFlightSetEntry and
RemoveInFlightSetEntry. They are used in place of direct set operators to reduce instruction selection function stack size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28987 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/SelectionDAG.h13
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp14
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp12
3 files changed, 34 insertions, 5 deletions
diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h
index f05b5b96bd..473021afad 100644
--- a/include/llvm/CodeGen/SelectionDAG.h
+++ b/include/llvm/CodeGen/SelectionDAG.h
@@ -18,8 +18,9 @@
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/ADT/ilist"
-#include <map>
#include <list>
+#include <map>
+#include <set>
#include <string>
namespace llvm {
@@ -429,6 +430,16 @@ public:
static void InsertISelMapEntry(std::map<SDOperand, SDOperand> &Map,
SDNode *Key, unsigned KeyResNo,
SDNode *Element, unsigned ElementResNo);
+
+ /// InsertInFlightSetEntry - A helper function to insert a SDNode* to a
+ /// SDNode* set. This is added to avoid the set insertion operator from being
+ /// inlined.
+ static void InsertInFlightSetEntry(std::set<SDNode*> &Set, SDNode *N);
+
+ /// RemoveInFlightSetEntry - A helper function to remove a SDNode* from a
+ /// SDNode* set. This is added to avoid the set removal operator from being
+ /// inlined.
+ static void RemoveInFlightSetEntry(std::set<SDNode*> &Set, SDNode *N);
private:
void RemoveNodeFromCSEMaps(SDNode *N);
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index f0c61e77a9..13f0c491aa 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3099,3 +3099,17 @@ void SelectionDAG::InsertISelMapEntry(std::map<SDOperand, SDOperand> &Map,
Map.insert(std::make_pair(SDOperand(Key, KeyResNo),
SDOperand(Element, ElementResNo)));
}
+
+/// InsertInFlightSetEntry - A helper function to insert a SDNode* to a
+/// SDNode* set. This is added to avoid the set insertion operator from being
+/// inlined.
+void SelectionDAG::InsertInFlightSetEntry(std::set<SDNode*> &Set, SDNode *N) {
+ Set.insert(N);
+}
+
+/// RemoveInFlightSetEntry - A helper function to remove a SDNode* from a
+/// SDNode* set. This is added to avoid the set removal operator from being
+/// inlined.
+void SelectionDAG::RemoveInFlightSetEntry(std::set<SDNode*> &Set, SDNode *N) {
+ Set.erase(N);
+}
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index d478a1e680..bf9c27a6ac 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -2450,14 +2450,16 @@ public:
emitCode("if (!Match) {");
for (std::vector<std::string>::iterator AI = InflightNodes.begin(),
AE = InflightNodes.end(); AI != AE; ++AI)
- emitCode(" InFlightSet.erase(" + *AI + ".Val);");
+ emitCode(" SelectionDAG::RemoveInFlightSetEntry(InFlightSet, " +
+ *AI + ".Val);");
emitCode("}");
}
emitCheck("Match");
for (unsigned i = 0; i < NumRes; ++i) {
- emitCode("InFlightSet.insert(CPTmp" + utostr(i+ResNo) + ".Val);");
+ emitCode("SelectionDAG::InsertInFlightSetEntry(InFlightSet, CPTmp" +
+ utostr(i+ResNo) + ".Val);");
InflightNodes.push_back("CPTmp" + utostr(i+ResNo));
}
for (unsigned i = 0; i < NumRes; ++i) {
@@ -2579,7 +2581,8 @@ public:
assert(!Val.empty() &&
"Variable referenced but not defined and not caught earlier!");
if (Child->isLeaf() && !NodeGetComplexPattern(Child, ISE)) {
- emitCode("InFlightSet.insert(" + Val + ".Val);");
+ emitCode("SelectionDAG::InsertInFlightSetEntry(InFlightSet, " +
+ Val + ".Val);");
InflightNodes.push_back(Val);
}
}
@@ -2616,7 +2619,8 @@ public:
// The operands have been selected. Remove them from InFlightSet.
for (std::vector<std::string>::iterator AI = InflightNodes.begin(),
AE = InflightNodes.end(); AI != AE; ++AI)
- emitCode("InFlightSet.erase(" + *AI + ".Val);");
+ emitCode("SelectionDAG::RemoveInFlightSetEntry(InFlightSet, " +
+ *AI + ".Val);");
}
unsigned NumResults = Inst.getNumResults();