Make sure to consider alignment of variable sized objects.
[oota-llvm.git] / include / llvm / CodeGen / SelectionDAG.h
index 6c9c5908d042adc49062d4d98191ee098851d930..01f56a9e866529a994dbeeac2f96c0afc4592284 100644 (file)
@@ -25,6 +25,7 @@
 namespace llvm {
   class TargetLowering;
   class TargetMachine;
+  class MachineDebugInfo;
   class MachineFunction;
 
 /// SelectionDAG class - This is used to represent a portion of an LLVM function
@@ -41,6 +42,7 @@ namespace llvm {
 class SelectionDAG {
   TargetLowering &TLI;
   MachineFunction &MF;
+  MachineDebugInfo *DI;
 
   // Root - The root of the entire DAG.  EntryNode - The starting token.
   SDOperand Root, EntryNode;
@@ -52,7 +54,8 @@ class SelectionDAG {
   std::map<std::pair<const Value*, int>, SDNode*> ValueNodes;
 
 public:
-  SelectionDAG(TargetLowering &tli, MachineFunction &mf) : TLI(tli), MF(mf) {
+  SelectionDAG(TargetLowering &tli, MachineFunction &mf, MachineDebugInfo *di)
+  : TLI(tli), MF(mf), DI(di) {
     EntryNode = Root = getNode(ISD::EntryToken, MVT::Other);
   }
   ~SelectionDAG();
@@ -60,6 +63,7 @@ public:
   MachineFunction &getMachineFunction() const { return MF; }
   const TargetMachine &getTarget() const;
   TargetLowering &getTargetLoweringInfo() const { return TLI; }
+  MachineDebugInfo *getMachineDebugInfo() const { return DI; }
 
   /// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
   ///
@@ -109,14 +113,17 @@ public:
   SDOperand getConstant(uint64_t Val, MVT::ValueType VT);
   SDOperand getTargetConstant(uint64_t Val, MVT::ValueType VT);
   SDOperand getConstantFP(double Val, MVT::ValueType VT);
+  SDOperand getTargetConstantFP(double Val, MVT::ValueType VT);
   SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
                              int offset = 0);
   SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT,
                                    int offset = 0);
   SDOperand getFrameIndex(int FI, MVT::ValueType VT);
   SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT);
-  SDOperand getConstantPool(Constant *C, MVT::ValueType VT);
-  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT);
+  SDOperand getConstantPool(Constant *C, MVT::ValueType VT,
+                           unsigned Alignment=0,  int offset = 0);
+  SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT,
+                                  unsigned Alignment=0, int offset = 0);
   SDOperand getBasicBlock(MachineBasicBlock *MBB);
   SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT);
   SDOperand getTargetExternalSymbol(const char *Sym, MVT::ValueType VT);
@@ -184,46 +191,23 @@ public:
     return getNode(ISD::CopyFromReg, ResultTys, Ops);
   }
 
-  /// getCall - Note that this destroys the vector of RetVals passed in.
-  ///
-  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
-                  SDOperand Callee, bool isTailCall = false) {
-    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, Chain,
-                            Callee);
-    setNodeValueTypes(NN, RetVals);
-    AllNodes.push_back(NN);
-    return NN;
-  }
-  /// getCall - Note that this destroys the vector of RetVals passed in.
-  ///
-  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
-                  SDOperand Callee, SDOperand Flag, bool isTailCall = false) {
-    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, Chain,
-                            Callee, Flag);
-    setNodeValueTypes(NN, RetVals);
-    AllNodes.push_back(NN);
-    return NN;
-  }
-  
-  /// getCall - This is identical to the one above, and should be used for calls
-  /// where arguments are passed in physical registers.  This destroys the
-  /// RetVals and ArgsInRegs vectors.
-  SDNode *getCall(std::vector<MVT::ValueType> &RetVals, SDOperand Chain,
-                  SDOperand Callee, std::vector<SDOperand> &ArgsInRegs,
-                  bool isTailCall = false) {
-    ArgsInRegs.insert(ArgsInRegs.begin(), Callee);
-    ArgsInRegs.insert(ArgsInRegs.begin(), Chain);
-    SDNode *NN = new SDNode(isTailCall ? ISD::TAILCALL : ISD::CALL, ArgsInRegs);
-    setNodeValueTypes(NN, RetVals);
-    AllNodes.push_back(NN);
-    return NN;
-  }
-
   SDOperand getCondCode(ISD::CondCode Cond);
 
   /// getZeroExtendInReg - Return the expression required to zero extend the Op
   /// value assuming it was the smaller SrcTy value.
   SDOperand getZeroExtendInReg(SDOperand Op, MVT::ValueType SrcTy);
+  
+  /// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
+  /// a flag result (to ensure it's not CSE'd).
+  SDOperand getCALLSEQ_START(SDOperand Chain, SDOperand Op) {
+    std::vector<MVT::ValueType> ResultTys;
+    ResultTys.push_back(MVT::Other);
+    ResultTys.push_back(MVT::Flag);
+    std::vector<SDOperand> Ops;
+    Ops.push_back(Chain);
+    Ops.push_back(Op);
+    return getNode(ISD::CALLSEQ_START, ResultTys, Ops);
+  }
 
   /// getNode - Gets or creates the specified node.
   ///
@@ -238,9 +222,6 @@ public:
   SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
                     SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4,
                     SDOperand N5);
-  SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
-                    SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4,
-                    SDOperand N5, SDOperand N6);
   SDOperand getNode(unsigned Opcode, MVT::ValueType VT,
                     std::vector<SDOperand> &Children);
   SDOperand getNode(unsigned Opcode, std::vector<MVT::ValueType> &ResultTys,
@@ -263,20 +244,10 @@ public:
     return getNode(ISD::SELECT_CC, VT, LHS, RHS, True, False,getCondCode(Cond));
   }
   
-  /// getBR2Way_CC - Helper function to make it easier to build BRTWOWAY_CC
-  /// nodes.
-  ///
-  SDOperand getBR2Way_CC(SDOperand Chain, SDOperand CCNode, SDOperand LHS, 
-                         SDOperand RHS, SDOperand True, SDOperand False) {
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Chain);
-    Ops.push_back(CCNode);
-    Ops.push_back(LHS);
-    Ops.push_back(RHS);
-    Ops.push_back(True);
-    Ops.push_back(False);
-    return getNode(ISD::BRTWOWAY_CC, MVT::Other, Ops);
-  }
+  /// getVAArg - VAArg produces a result and token chain, and takes a pointer
+  /// and a source value as input.
+  SDOperand getVAArg(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr,
+                     SDOperand SV);
 
   /// getLoad - Loads are not normal binary operators: their result type is not
   /// determined by their operands, and they produce a value AND a token chain.
@@ -291,6 +262,21 @@ public:
   // getSrcValue - construct a node to track a Value* through the backend
   SDOperand getSrcValue(const Value* I, int offset = 0);
 
+  /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
+  /// specified operands.  If the resultant node already exists in the DAG,
+  /// this does not modify the specified node, instead it returns the node that
+  /// already exists.  If the resultant node does not exist in the DAG, the
+  /// input node is returned.  As a degenerate case, if you specify the same
+  /// input operands as the node already has, the input node is returned.
+  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op);
+  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2);
+  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
+                               SDOperand Op3);
+  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
+                               SDOperand Op3, SDOperand Op4);
+  SDOperand UpdateNodeOperands(SDOperand N, SDOperand Op1, SDOperand Op2,
+                               SDOperand Op3, SDOperand Op4, SDOperand Op5);
+  SDOperand UpdateNodeOperands(SDOperand N, const std::vector<SDOperand> &Op);
   
   /// SelectNodeTo - These are used for target selectors to *mutate* the
   /// specified node to have the specified return type, Target opcode, and
@@ -313,6 +299,14 @@ public:
   SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, 
                          SDOperand Op1, SDOperand Op2, SDOperand Op3, 
                          SDOperand Op4, SDOperand Op5, SDOperand Op6);
+  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, 
+                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                         SDOperand Op4, SDOperand Op5, SDOperand Op6,
+                        SDOperand Op7);
+  SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, 
+                         SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                         SDOperand Op4, SDOperand Op5, SDOperand Op6,
+                        SDOperand Op7, SDOperand Op8);
   SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1, 
                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
   SDOperand SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1,
@@ -325,138 +319,78 @@ public:
                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
                          SDOperand Op3, SDOperand Op4, SDOperand Op5);
 
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          SDOperand Op1) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          SDOperand Op1, SDOperand Op2) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          SDOperand Op1, SDOperand Op2, SDOperand Op3) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
-                          SDOperand Op4) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
-                          SDOperand Op4, SDOperand Op5) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4, Op5);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          SDOperand Op1, SDOperand Op2, SDOperand Op3,
-                          SDOperand Op4, SDOperand Op5, SDOperand Op6) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4, Op5, Op6);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT,
-                          std::vector<SDOperand> &Ops) {
-    return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    Ops.push_back(Op2);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
-                          SDOperand Op3) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    Ops.push_back(Op2);
-    Ops.push_back(Op3);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
-                          SDOperand Op3, SDOperand Op4) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    Ops.push_back(Op2);
-    Ops.push_back(Op3);
-    Ops.push_back(Op4);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
-                          SDOperand Op3, SDOperand Op4, SDOperand Op5) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    Ops.push_back(Op2);
-    Ops.push_back(Op3);
-    Ops.push_back(Op4);
-    Ops.push_back(Op5);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
-                          SDOperand Op3, SDOperand Op4, SDOperand Op5,
-                          SDOperand Op6) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    Ops.push_back(Op2);
-    Ops.push_back(Op3);
-    Ops.push_back(Op4);
-    Ops.push_back(Op5);
-    Ops.push_back(Op6);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1,
-                          MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
-                          SDOperand Op3, SDOperand Op4, SDOperand Op5,
-                          SDOperand Op6, SDOperand Op7) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    std::vector<SDOperand> Ops;
-    Ops.push_back(Op1);
-    Ops.push_back(Op2);
-    Ops.push_back(Op3);
-    Ops.push_back(Op4);
-    Ops.push_back(Op5);
-    Ops.push_back(Op6); 
-    Ops.push_back(Op7);
-   return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
-  SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1, 
-                          MVT::ValueType VT2, std::vector<SDOperand> &Ops) {
-    std::vector<MVT::ValueType> ResultTys;
-    ResultTys.push_back(VT1);
-    ResultTys.push_back(VT2);
-    return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops);
-  }
+  /// getTargetNode - These are used for target selectors to create a new node
+  /// with specified return type(s), target opcode, and operands.
+  ///
+  /// Note that getTargetNode returns the resultant node.  If there is already a
+  /// node of the specified opcode and operands, it returns that node instead of
+  /// the current one.
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2, SDOperand Op3);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                        SDOperand Op4);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                        SDOperand Op4, SDOperand Op5);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                        SDOperand Op4, SDOperand Op5, SDOperand Op6);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                        SDOperand Op4, SDOperand Op5, SDOperand Op6,
+                        SDOperand Op7);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        SDOperand Op1, SDOperand Op2, SDOperand Op3,
+                        SDOperand Op4, SDOperand Op5, SDOperand Op6,
+                        SDOperand Op7, SDOperand Op8);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT,
+                        std::vector<SDOperand> &Ops);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4, SDOperand Op5);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
+                        SDOperand Op6);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
+                        SDOperand Op6, SDOperand Op7);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, MVT::ValueType VT3,
+                        SDOperand Op1, SDOperand Op2);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, MVT::ValueType VT3,
+                        SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4, SDOperand Op5);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, MVT::ValueType VT3,
+                        SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
+                        SDOperand Op6);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1,
+                        MVT::ValueType VT2, MVT::ValueType VT3,
+                        SDOperand Op1, SDOperand Op2,
+                        SDOperand Op3, SDOperand Op4, SDOperand Op5,
+                        SDOperand Op6, SDOperand Op7);
+  SDNode *getTargetNode(unsigned Opcode, MVT::ValueType VT1, 
+                        MVT::ValueType VT2, std::vector<SDOperand> &Ops);
   
   /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
   /// This can cause recursive merging of nodes in the DAG.  Use the first
@@ -473,17 +407,34 @@ public:
                           std::vector<SDNode*> *Deleted = 0);
   void ReplaceAllUsesWith(SDNode *From, const std::vector<SDOperand> &To,
                           std::vector<SDNode*> *Deleted = 0);
-  
-  
+
+  /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
+  /// uses of other values produced by From.Val alone.  The Deleted vector is
+  /// handled the same was as for ReplaceAllUsesWith, but it is required for
+  /// this method.
+  void ReplaceAllUsesOfValueWith(SDOperand From, SDOperand To,
+                                 std::vector<SDNode*> &Deleted);
+
   /// DeleteNode - Remove the specified node from the system.  This node must
   /// have no referrers.
   void DeleteNode(SDNode *N);
   
   void dump() const;
 
+  /// InsertISelMapEntry - A helper function to insert a key / element pair
+  /// into a SDOperand to SDOperand map. This is added to avoid the map
+  /// insertion operator from being inlined.
+  static void InsertISelMapEntry(std::map<SDOperand, SDOperand> &Map,
+                                 SDNode *Key, unsigned KeyResNo,
+                                 SDNode *Element, unsigned ElementResNo);
+  
 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);
+
   void DestroyDeadNode(SDNode *N);
   void DeleteNodeNotInCSEMaps(SDNode *N);
   void setNodeValueTypes(SDNode *N, std::vector<MVT::ValueType> &RetVals);
@@ -516,9 +467,12 @@ private:
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> Constants;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstants;
   std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs;
+  std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstantFPs;
   std::map<int, SDNode*> FrameIndices, TargetFrameIndices;
-  std::map<Constant *, SDNode*> ConstantPoolIndices;
-  std::map<Constant *, SDNode*> TargetConstantPoolIndices;
+  std::map<std::pair<Constant *,
+                     std::pair<int, unsigned> >, SDNode*> ConstantPoolIndices;
+  std::map<std::pair<Constant *,
+                 std::pair<int, unsigned> >, SDNode*> TargetConstantPoolIndices;
   std::map<MachineBasicBlock *, SDNode*> BBNodes;
   std::vector<SDNode*> ValueTypeNodes;
   std::map<std::string, SDNode*> ExternalSymbols;