[llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h SelectionDAGNodes.h

Chris Lattner lattner at cs.uiuc.edu
Mon Aug 7 16:03:19 PDT 2006



Changes in directory llvm/include/llvm/CodeGen:

SelectionDAG.h updated: 1.108 -> 1.109
SelectionDAGNodes.h updated: 1.137 -> 1.138
---
Log message:

Revamp the "CSEMap" datastructure used in the SelectionDAG class.  This 
eliminates a bunch of std::map's in the SelectionDAG, replacing them with a
home-grown hashtable.

This is still a work in progress: not all the maps have been moved over and the
hashtable never resizes.  That said, this still speeds up llc 20% on kimwitu++
with -fast -regalloc=local using a release build.


---
Diffs of the changes:  (+24 -24)

 SelectionDAG.h      |   29 ++++++++++-------------------
 SelectionDAGNodes.h |   19 ++++++++++++++-----
 2 files changed, 24 insertions(+), 24 deletions(-)


Index: llvm/include/llvm/CodeGen/SelectionDAG.h
diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.108 llvm/include/llvm/CodeGen/SelectionDAG.h:1.109
--- llvm/include/llvm/CodeGen/SelectionDAG.h:1.108	Fri Aug  4 12:45:20 2006
+++ llvm/include/llvm/CodeGen/SelectionDAG.h	Mon Aug  7 18:03:03 2006
@@ -16,6 +16,7 @@
 #define LLVM_CODEGEN_SELECTIONDAG_H
 
 #include "llvm/CodeGen/SelectionDAGNodes.h"
+#include "llvm/CodeGen/SelectionDAGCSEMap.h"
 #include "llvm/ADT/ilist"
 
 #include <list>
@@ -441,13 +442,16 @@
 private:
   void RemoveNodeFromCSEMaps(SDNode *N);
   SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
-  SDNode **FindModifiedNodeSlot(SDNode *N, SDOperand Op);
-  SDNode **FindModifiedNodeSlot(SDNode *N, SDOperand Op1, SDOperand Op2);
-  SDNode **FindModifiedNodeSlot(SDNode *N, const std::vector<SDOperand> &Ops);
+  SDNode *FindModifiedNodeSlot(SDNode *N, SDOperand Op, void *&InsertPos);
+  SDNode *FindModifiedNodeSlot(SDNode *N, SDOperand Op1, SDOperand Op2,
+                               void *&InsertPos);
+  SDNode *FindModifiedNodeSlot(SDNode *N, const std::vector<SDOperand> &Ops,
+                               void *&InsertPos);
 
   void DeleteNodeNotInCSEMaps(SDNode *N);
-  void setNodeValueTypes(SDNode *N, std::vector<MVT::ValueType> &RetVals);
-  void setNodeValueTypes(SDNode *N, MVT::ValueType VT1, MVT::ValueType VT2);
+  MVT::ValueType *getNodeValueTypes(MVT::ValueType VT1);
+  MVT::ValueType *getNodeValueTypes(MVT::ValueType VT1, MVT::ValueType VT2);
+  MVT::ValueType *getNodeValueTypes(std::vector<MVT::ValueType> &RetVals);
   
   
   /// SimplifySetCC - Try to simplify a setcc built with the specified operands 
@@ -460,17 +464,10 @@
   
   // Maps to auto-CSE operations.
   std::map<std::pair<unsigned, MVT::ValueType>, SDNode *> NullaryOps;
-  std::map<std::pair<unsigned, std::pair<SDOperand, MVT::ValueType> >,
-           SDNode *> UnaryOps;
-  std::map<std::pair<unsigned, std::pair<SDOperand, SDOperand> >,
-           SDNode *> BinaryOps;
 
   std::map<std::pair<unsigned, MVT::ValueType>, RegisterSDNode*> RegNodes;
   std::vector<CondCodeSDNode*> CondCodeNodes;
 
-  std::map<std::pair<SDOperand, std::pair<SDOperand, MVT::ValueType> >,
-           SDNode *> Loads;
-
   std::map<std::pair<const GlobalValue*, int>, SDNode*> GlobalValues;
   std::map<std::pair<const GlobalValue*, int>, SDNode*> TargetGlobalValues;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> Constants;
@@ -488,13 +485,7 @@
   std::map<std::string, SDNode*> ExternalSymbols;
   std::map<std::string, SDNode*> TargetExternalSymbols;
   std::map<std::string, StringSDNode*> StringNodes;
-  std::map<std::pair<unsigned,
-                     std::pair<MVT::ValueType, std::vector<SDOperand> > >,
-           SDNode*> OneResultNodes;
-  std::map<std::pair<unsigned,
-                     std::pair<std::vector<MVT::ValueType>,
-                               std::vector<SDOperand> > >,
-           SDNode*> ArbitraryNodes;
+  SelectionDAGCSEMap CSEMap;
 };
 
 template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {


Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h
diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.137 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.138
--- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.137	Thu Jul 27 01:38:21 2006
+++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h	Mon Aug  7 18:03:03 2006
@@ -707,6 +707,9 @@
   SDNode *Prev, *Next;
   friend struct ilist_traits<SDNode>;
 
+  /// NextInBucket - This is used by the SelectionDAGCSEMap.
+  void *NextInBucket;
+  
   /// Uses - These are all of the SDNode's that use a value produced by this
   /// node.
   std::vector<SDNode*> Uses;
@@ -789,6 +792,11 @@
 
   static bool classof(const SDNode *) { return true; }
 
+  
+  /// NextInBucket accessors, these are private to SelectionDAGCSEMap.
+  void *getNextInBucket() const { return NextInBucket; }
+  void SetNextInBucket(void *N) { NextInBucket = N; }
+  
 protected:
   friend class SelectionDAG;
   
@@ -801,6 +809,7 @@
     ValueList = getValueTypeList(VT);
     NumValues = 1;
     Prev = 0; Next = 0;
+    NextInBucket = 0;
   }
   SDNode(unsigned NT, SDOperand Op)
     : NodeType(NT), NodeId(-1) {
@@ -811,6 +820,7 @@
     ValueList = 0;
     NumValues = 0;
     Prev = 0; Next = 0;
+    NextInBucket = 0;
   }
   SDNode(unsigned NT, SDOperand N1, SDOperand N2)
     : NodeType(NT), NodeId(-1) {
@@ -822,6 +832,7 @@
     ValueList = 0;
     NumValues = 0;
     Prev = 0; Next = 0;
+    NextInBucket = 0;
   }
   SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3)
     : NodeType(NT), NodeId(-1) {
@@ -836,6 +847,7 @@
     ValueList = 0;
     NumValues = 0;
     Prev = 0; Next = 0;
+    NextInBucket = 0;
   }
   SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4)
     : NodeType(NT), NodeId(-1) {
@@ -851,6 +863,7 @@
     ValueList = 0;
     NumValues = 0;
     Prev = 0; Next = 0;
+    NextInBucket = 0;
   }
   SDNode(unsigned Opc, const std::vector<SDOperand> &Nodes)
     : NodeType(Opc), NodeId(-1) {
@@ -865,6 +878,7 @@
     ValueList = 0;
     NumValues = 0;
     Prev = 0; Next = 0;
+    NextInBucket = 0;
   }
 
   /// MorphNodeTo - This clears the return value and operands list, and sets the
@@ -884,11 +898,6 @@
     NumOperands = 0;
   }
   
-  void setValueTypes(MVT::ValueType VT) {
-    assert(NumValues == 0 && "Should not have values yet!");
-    ValueList = getValueTypeList(VT);
-    NumValues = 1;
-  }
   void setValueTypes(MVT::ValueType *List, unsigned NumVal) {
     assert(NumValues == 0 && "Should not have values yet!");
     ValueList = List;






More information about the llvm-commits mailing list