aboutsummaryrefslogtreecommitdiffstats
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)
downloadexternal_llvm-322812e603705e1c2037313633e72f689524b163.tar.gz
external_llvm-322812e603705e1c2037313633e72f689524b163.tar.bz2
external_llvm-322812e603705e1c2037313633e72f689524b163.zip
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();