remove some old hacky code that tried to infer whether a store
authorChris Lattner <sabre@nondot.org>
Sun, 6 Jan 2008 02:16:26 +0000 (02:16 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 6 Jan 2008 02:16:26 +0000 (02:16 +0000)
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

utils/TableGen/InstrInfoEmitter.cpp
utils/TableGen/InstrInfoEmitter.h

index e8fbe7852ab898710b2c4d941215fee312aed78a..d648721c379b8d7b7ac8967735269815bb8c47c9 100644 (file)
@@ -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;
 }
 
 
index b721adcf4cef36bce99e001f1dc2fd28ae6c1def..a223f2466ea85d96bfb0304d97ed140e9361463b 100644 (file)
@@ -29,7 +29,7 @@ class CodeGenInstruction;
 
 class InstrInfoEmitter : public TableGenBackend {
   RecordKeeper &Records;
-  CodeGenDAGPatterns CDP;
+  const CodeGenDAGPatterns CDP;
   std::map<std::string, unsigned> ItinClassMap;
   
 public: