diff options
author | Chris Lattner <sabre@nondot.org> | 2008-01-06 02:16:26 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-01-06 02:16:26 +0000 |
commit | 2d51a4ce8f64a0e4aa70a52c46aafb22a31e47e4 (patch) | |
tree | f03f00e3bee5634dcc55d733e1961acc2727a040 /utils/TableGen | |
parent | a529a37fbd602d748e3e1b345db059ebe3ccf5b1 (diff) |
remove some old hacky code that tried to infer whether a store
occured in a pattern, but failed miserably. The new code works for
any instruction that has a store in its pattern, including all the
x86 mem op mem instructions.
The only target-independent code that uses this is branch folding,
so this won't change anything in practice.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45648 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen')
-rw-r--r-- | utils/TableGen/InstrInfoEmitter.cpp | 68 | ||||
-rw-r--r-- | utils/TableGen/InstrInfoEmitter.h | 2 |
2 files changed, 50 insertions, 20 deletions
diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp index e8fbe7852a..d648721c37 100644 --- a/utils/TableGen/InstrInfoEmitter.cpp +++ b/utils/TableGen/InstrInfoEmitter.cpp @@ -141,6 +141,51 @@ void InstrInfoEmitter::EmitOperandInfo(std::ostream &OS, // Instruction Analysis //===----------------------------------------------------------------------===// +class InstAnalyzer { + const CodeGenDAGPatterns &CDP; + bool &isStore; + bool &isLoad; + bool &NeverHasSideEffects; +public: + InstAnalyzer(const CodeGenDAGPatterns &cdp, + bool &isstore, bool &isload, bool &nhse) + : CDP(cdp), isStore(isstore), isLoad(isload), NeverHasSideEffects(nhse) { + } + + void Analyze(Record *InstRecord) { + const TreePattern *Pattern = CDP.getInstruction(InstRecord).getPattern(); + if (Pattern == 0) return; // No pattern. + + // Assume there is no side-effect unless we see one. + // FIXME: Enable this. + //NeverHasSideEffects = true; + + + // FIXME: Assume only the first tree is the pattern. The others are clobber + // nodes. + AnalyzeNode(Pattern->getTree(0)); + } + +private: + void AnalyzeNode(const TreePatternNode *N) { + if (N->isLeaf()) { + return; + } + + if (N->getOperator()->getName() != "set") { + // Get information about the SDNode for the operator. + const SDNodeInfo &OpInfo = CDP.getSDNodeInfo(N->getOperator()); + + if (OpInfo.getEnumName() == "ISD::STORE") + isStore = true; + } + + for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) + AnalyzeNode(N->getChild(i)); + } + +}; + void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst, bool &isStore, bool &isLoad, bool &NeverHasSideEffects) { @@ -148,26 +193,11 @@ void InstrInfoEmitter::InferFromPattern(const CodeGenInstruction &Inst, isLoad = Inst.isLoad; NeverHasSideEffects = Inst.neverHasSideEffects; - const TreePattern *Pattern = CDP.getInstruction(Inst.TheDef).getPattern(); - if (Pattern == 0) return; // No pattern. - - // FIXME: Change this to use pattern info. - if (dynamic_cast<ListInit*>(Inst.TheDef->getValueInit("Pattern"))) { - ListInit *LI = Inst.TheDef->getValueAsListInit("Pattern"); - if (LI && LI->getSize() > 0) { - DagInit *Dag = (DagInit *)LI->getElement(0); - DefInit *OpDef = dynamic_cast<DefInit*>(Dag->getOperator()); - if (OpDef) { - Record *Operator = OpDef->getDef(); - if (Operator->isSubClassOf("SDNode")) { - const std::string Opcode = Operator->getValueAsString("Opcode"); - if (Opcode == "ISD::STORE" || Opcode == "ISD::TRUNCSTORE") - isStore = true; - } - } - } - } + InstAnalyzer(CDP, isStore, isLoad, NeverHasSideEffects).Analyze(Inst.TheDef); + // If the .td file explicitly says there is no side effect, believe it. + if (Inst.neverHasSideEffects) + NeverHasSideEffects = true; } diff --git a/utils/TableGen/InstrInfoEmitter.h b/utils/TableGen/InstrInfoEmitter.h index b721adcf4c..a223f2466e 100644 --- a/utils/TableGen/InstrInfoEmitter.h +++ b/utils/TableGen/InstrInfoEmitter.h @@ -29,7 +29,7 @@ class CodeGenInstruction; class InstrInfoEmitter : public TableGenBackend { RecordKeeper &Records; - CodeGenDAGPatterns CDP; + const CodeGenDAGPatterns CDP; std::map<std::string, unsigned> ItinClassMap; public: |