summaryrefslogtreecommitdiff
path: root/utils/TableGen/DAGISelEmitter.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-02-06 22:27:42 +0000
committerDan Gohman <gohman@apple.com>2008-02-06 22:27:42 +0000
commit69de1932b350d7cdfc0ed1f4198d6f78c7822a02 (patch)
tree9509f355cd39a5d69988db1d878c213d0526011d /utils/TableGen/DAGISelEmitter.cpp
parentb745e88bf0a6d7f51a336cd6158824e7383e8d24 (diff)
downloadllvm-69de1932b350d7cdfc0ed1f4198d6f78c7822a02.tar.gz
llvm-69de1932b350d7cdfc0ed1f4198d6f78c7822a02.tar.bz2
llvm-69de1932b350d7cdfc0ed1f4198d6f78c7822a02.tar.xz
Re-apply the memory operand changes, with a fix for the static
initializer problem, a minor tweak to the way the DAGISelEmitter finds load/store nodes, and a renaming of the new PseudoSourceValue objects. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46827 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/DAGISelEmitter.cpp')
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 7a1920ceac..f74b997010 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -313,6 +313,12 @@ private:
std::vector<std::pair<std::string, std::string> > OrigChains;
std::set<std::string> Duplicates;
+ /// LSI - Load/Store information.
+ /// Save loads/stores matched by a pattern, and generate a MemOperandSDNode
+ /// for each memory access. This facilitates the use of AliasAnalysis in
+ /// the backend.
+ std::vector<std::string> LSI;
+
/// GeneratedCode - This is the buffer that we emit code to. The first int
/// indicates whether this is an exit predicate (something that should be
/// tested, and if true, the match fails) [when 1], or normal code to emit
@@ -373,6 +379,16 @@ public:
void EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
const std::string &RootName, const std::string &ChainSuffix,
bool &FoundChain) {
+
+ // Save loads/stores matched by a pattern.
+ if (!N->isLeaf() && N->getName().empty()) {
+ std::string EnumName = N->getOperator()->getValueAsString("Opcode");
+ if (EnumName == "ISD::LOAD" ||
+ EnumName == "ISD::STORE") {
+ LSI.push_back(RootName);
+ }
+ }
+
bool isRoot = (P == NULL);
// Emit instruction predicates. Each predicate is just a string for now.
if (isRoot) {
@@ -944,6 +960,18 @@ public:
}
}
+ // Generate MemOperandSDNodes nodes for each memory accesses covered by this
+ // pattern.
+ if (isRoot) {
+ std::vector<std::string>::const_iterator mi, mie;
+ for (mi = LSI.begin(), mie = LSI.end(); mi != mie; ++mi) {
+ emitCode("SDOperand LSI_" + *mi + " = "
+ "CurDAG->getMemOperand(cast<LSBaseSDNode>(" +
+ *mi + ")->getMemOperand());");
+ AllOps.push_back("LSI_" + *mi);
+ }
+ }
+
// Emit all the chain and CopyToReg stuff.
bool ChainEmitted = NodeHasChain;
if (NodeHasChain)