diff options
author | Dan Gohman <gohman@apple.com> | 2008-02-06 22:27:42 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-02-06 22:27:42 +0000 |
commit | 69de1932b350d7cdfc0ed1f4198d6f78c7822a02 (patch) | |
tree | 9509f355cd39a5d69988db1d878c213d0526011d /utils | |
parent | b745e88bf0a6d7f51a336cd6158824e7383e8d24 (diff) | |
download | llvm-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')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 28 |
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) |