summaryrefslogtreecommitdiff
path: root/utils/TableGen/InstrInfoEmitter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-01-06 02:16:26 +0000
committerChris Lattner <sabre@nondot.org>2008-01-06 02:16:26 +0000
commit2d51a4ce8f64a0e4aa70a52c46aafb22a31e47e4 (patch)
treef03f00e3bee5634dcc55d733e1961acc2727a040 /utils/TableGen/InstrInfoEmitter.cpp
parenta529a37fbd602d748e3e1b345db059ebe3ccf5b1 (diff)
downloadllvm-2d51a4ce8f64a0e4aa70a52c46aafb22a31e47e4.tar.gz
llvm-2d51a4ce8f64a0e4aa70a52c46aafb22a31e47e4.tar.bz2
llvm-2d51a4ce8f64a0e4aa70a52c46aafb22a31e47e4.tar.xz
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/InstrInfoEmitter.cpp')
-rw-r--r--utils/TableGen/InstrInfoEmitter.cpp68
1 files changed, 49 insertions, 19 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;
}