diff options
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 213 | 
1 files changed, 76 insertions, 137 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index da55e6bf4a01..77301b042022 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -10,7 +10,9 @@  // This implements the SelectionDAG class.  //  //===----------------------------------------------------------------------===// +  #include "llvm/CodeGen/SelectionDAG.h" +#include "SDNodeOrdering.h"  #include "llvm/Constants.h"  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/Function.h" @@ -48,8 +50,6 @@  #include <cmath>  using namespace llvm; -extern cl::opt<bool> DisableInstScheduling; -  /// makeVTList - Return an instance of the SDVTList struct initialized with the  /// specified members.  static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) { @@ -554,9 +554,6 @@ void SelectionDAG::RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,      }      DeallocateNode(N); - -    // Remove the ordering of this node. -    if (Ordering) Ordering->remove(N);    }  } @@ -582,9 +579,6 @@ void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {    N->DropOperands();    DeallocateNode(N); - -  // Remove the ordering of this node. -  if (Ordering) Ordering->remove(N);  }  void SelectionDAG::DeallocateNode(SDNode *N) { @@ -703,7 +697,6 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,    AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, 1);    AddNodeIDCustom(ID, N);    SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos); -  if (Ordering) Ordering->remove(Node);    return Node;  } @@ -722,7 +715,6 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,    AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, 2);    AddNodeIDCustom(ID, N);    SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos); -  if (Ordering) Ordering->remove(Node);    return Node;  } @@ -741,7 +733,6 @@ SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,    AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops, NumOps);    AddNodeIDCustom(ID, N);    SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos); -  if (Ordering) Ordering->remove(Node);    return Node;  } @@ -798,10 +789,8 @@ SelectionDAG::SelectionDAG(TargetLowering &tli, FunctionLoweringInfo &fli)                getVTList(MVT::Other)),      Root(getEntryNode()), Ordering(0) {    AllNodes.push_back(&EntryNode); -  if (DisableInstScheduling) { -    Ordering = new NodeOrdering(); -    Ordering->add(&EntryNode); -  } +  if (DisableScheduling) +    Ordering = new SDNodeOrdering();  }  void SelectionDAG::init(MachineFunction &mf, MachineModuleInfo *mmi, @@ -840,10 +829,8 @@ void SelectionDAG::clear() {    EntryNode.UseList = 0;    AllNodes.push_back(&EntryNode);    Root = getEntryNode(); -  if (DisableInstScheduling) { -    Ordering = new NodeOrdering(); -    Ordering->add(&EntryNode); -  } +  if (DisableScheduling) +    Ordering = new SDNodeOrdering();  }  SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) { @@ -904,17 +891,15 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, EVT VT, bool isT) {    ID.AddPointer(&Val);    void *IP = 0;    SDNode *N = NULL; -  if ((N = CSEMap.FindNodeOrInsertPos(ID, IP))) { -    if (Ordering) Ordering->add(N); +  if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))      if (!VT.isVector())        return SDValue(N, 0); -  } +    if (!N) {      N = NodeAllocator.Allocate<ConstantSDNode>();      new (N) ConstantSDNode(isT, &Val, EltVT);      CSEMap.InsertNode(N, IP);      AllNodes.push_back(N); -    if (Ordering) Ordering->add(N);    }    SDValue Result(N, 0); @@ -951,17 +936,15 @@ SDValue SelectionDAG::getConstantFP(const ConstantFP& V, EVT VT, bool isTarget){    ID.AddPointer(&V);    void *IP = 0;    SDNode *N = NULL; -  if ((N = CSEMap.FindNodeOrInsertPos(ID, IP))) { -    if (Ordering) Ordering->add(N); +  if ((N = CSEMap.FindNodeOrInsertPos(ID, IP)))      if (!VT.isVector())        return SDValue(N, 0); -  } +    if (!N) {      N = NodeAllocator.Allocate<ConstantFPSDNode>();      new (N) ConstantFPSDNode(isTarget, &V, EltVT);      CSEMap.InsertNode(N, IP);      AllNodes.push_back(N); -    if (Ordering) Ordering->add(N);    }    SDValue Result(N, 0); @@ -1016,15 +999,13 @@ SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV,    ID.AddInteger(Offset);    ID.AddInteger(TargetFlags);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<GlobalAddressSDNode>();    new (N) GlobalAddressSDNode(Opc, GV, VT, Offset, TargetFlags);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1034,15 +1015,13 @@ SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {    AddNodeIDNode(ID, Opc, getVTList(VT), 0, 0);    ID.AddInteger(FI);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<FrameIndexSDNode>();    new (N) FrameIndexSDNode(FI, VT, isTarget);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1056,15 +1035,13 @@ SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,    ID.AddInteger(JTI);    ID.AddInteger(TargetFlags);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<JumpTableSDNode>();    new (N) JumpTableSDNode(JTI, VT, isTarget, TargetFlags);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1084,15 +1061,13 @@ SDValue SelectionDAG::getConstantPool(Constant *C, EVT VT,    ID.AddPointer(C);    ID.AddInteger(TargetFlags);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<ConstantPoolSDNode>();    new (N) ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment, TargetFlags);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1113,15 +1088,13 @@ SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT,    C->AddSelectionDAGCSEId(ID);    ID.AddInteger(TargetFlags);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<ConstantPoolSDNode>();    new (N) ConstantPoolSDNode(isTarget, C, VT, Offset, Alignment, TargetFlags);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1130,15 +1103,13 @@ SDValue SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) {    AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), 0, 0);    ID.AddPointer(MBB);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<BasicBlockSDNode>();    new (N) BasicBlockSDNode(MBB);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1154,7 +1125,6 @@ SDValue SelectionDAG::getValueType(EVT VT) {    N = NodeAllocator.Allocate<VTSDNode>();    new (N) VTSDNode(VT);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1164,7 +1134,6 @@ SDValue SelectionDAG::getExternalSymbol(const char *Sym, EVT VT) {    N = NodeAllocator.Allocate<ExternalSymbolSDNode>();    new (N) ExternalSymbolSDNode(false, Sym, 0, VT);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1177,7 +1146,6 @@ SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT,    N = NodeAllocator.Allocate<ExternalSymbolSDNode>();    new (N) ExternalSymbolSDNode(true, Sym, TargetFlags, VT);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1190,8 +1158,8 @@ SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) {      new (N) CondCodeSDNode(Cond);      CondCodeNodes[Cond] = N;      AllNodes.push_back(N); -    if (Ordering) Ordering->add(N);    } +    return SDValue(CondCodeNodes[Cond], 0);  } @@ -1283,10 +1251,8 @@ SDValue SelectionDAG::getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1,      ID.AddInteger(MaskVec[i]);    void* IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  }    // Allocate the mask array for the node out of the BumpPtrAllocator, since    // SDNode doesn't have access to it.  This memory will be "leaked" when @@ -1298,7 +1264,6 @@ SDValue SelectionDAG::getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1,    new (N) ShuffleVectorSDNode(VT, dl, N1, N2, MaskAlloc);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1316,15 +1281,13 @@ SDValue SelectionDAG::getConvertRndSat(EVT VT, DebugLoc dl,    SDValue Ops[] = { Val, DTy, STy, Rnd, Sat };    AddNodeIDNode(ID, ISD::CONVERT_RNDSAT, getVTList(VT), &Ops[0], 5);    void* IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    CvtRndSatSDNode *N = NodeAllocator.Allocate<CvtRndSatSDNode>();    new (N) CvtRndSatSDNode(VT, dl, Ops, 5, Code);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1333,15 +1296,13 @@ SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) {    AddNodeIDNode(ID, ISD::Register, getVTList(VT), 0, 0);    ID.AddInteger(RegNo);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<RegisterSDNode>();    new (N) RegisterSDNode(RegNo, VT);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1353,15 +1314,13 @@ SDValue SelectionDAG::getLabel(unsigned Opcode, DebugLoc dl,    AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), &Ops[0], 1);    ID.AddInteger(LabelID);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<LabelSDNode>();    new (N) LabelSDNode(Opcode, dl, Root, LabelID);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1375,15 +1334,13 @@ SDValue SelectionDAG::getBlockAddress(BlockAddress *BA, EVT VT,    ID.AddPointer(BA);    ID.AddInteger(TargetFlags);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<BlockAddressSDNode>();    new (N) BlockAddressSDNode(Opc, VT, BA, TargetFlags);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -1396,16 +1353,13 @@ SDValue SelectionDAG::getSrcValue(const Value *V) {    ID.AddPointer(V);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  }    SDNode *N = NodeAllocator.Allocate<SrcValueSDNode>();    new (N) SrcValueSDNode(V);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -2316,16 +2270,14 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT) {    FoldingSetNodeID ID;    AddNodeIDNode(ID, Opcode, getVTList(VT), 0, 0);    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<SDNode>();    new (N) SDNode(Opcode, DL, getVTList(VT));    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -2549,10 +2501,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,      SDValue Ops[1] = { Operand };      AddNodeIDNode(ID, Opcode, VTs, Ops, 1);      void *IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return SDValue(E, 0); -    } +      N = NodeAllocator.Allocate<UnarySDNode>();      new (N) UnarySDNode(Opcode, DL, VTs, Operand);      CSEMap.InsertNode(N, IP); @@ -2562,7 +2513,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,    }    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -2970,10 +2920,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,      FoldingSetNodeID ID;      AddNodeIDNode(ID, Opcode, VTs, Ops, 2);      void *IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return SDValue(E, 0); -    } +      N = NodeAllocator.Allocate<BinarySDNode>();      new (N) BinarySDNode(Opcode, DL, VTs, N1, N2);      CSEMap.InsertNode(N, IP); @@ -2983,7 +2932,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,    }    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -3050,10 +2998,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,      FoldingSetNodeID ID;      AddNodeIDNode(ID, Opcode, VTs, Ops, 3);      void *IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return SDValue(E, 0); -    } +      N = NodeAllocator.Allocate<TernarySDNode>();      new (N) TernarySDNode(Opcode, DL, VTs, N1, N2, N3);      CSEMap.InsertNode(N, IP); @@ -3063,7 +3010,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,    }    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -3503,7 +3449,7 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst,                      /*isReturnValueUsed=*/false,                      getExternalSymbol(TLI.getLibcallName(RTLIB::MEMCPY),                                        TLI.getPointerTy()), -                    Args, *this, dl); +                    Args, *this, dl, GetOrdering(Chain.getNode()));    return CallResult.second;  } @@ -3552,7 +3498,7 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst,                      /*isReturnValueUsed=*/false,                      getExternalSymbol(TLI.getLibcallName(RTLIB::MEMMOVE),                                        TLI.getPointerTy()), -                    Args, *this, dl); +                    Args, *this, dl, GetOrdering(Chain.getNode()));    return CallResult.second;  } @@ -3611,7 +3557,7 @@ SDValue SelectionDAG::getMemset(SDValue Chain, DebugLoc dl, SDValue Dst,                      /*isReturnValueUsed=*/false,                      getExternalSymbol(TLI.getLibcallName(RTLIB::MEMSET),                                        TLI.getPointerTy()), -                    Args, *this, dl); +                    Args, *this, dl, GetOrdering(Chain.getNode()));    return CallResult.second;  } @@ -3659,14 +3605,12 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,    void* IP = 0;    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {      cast<AtomicSDNode>(E)->refineAlignment(MMO); -    if (Ordering) Ordering->add(E);      return SDValue(E, 0);    }    SDNode* N = NodeAllocator.Allocate<AtomicSDNode>();    new (N) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain, Ptr, Cmp, Swp, MMO);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -3724,14 +3668,12 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,    void* IP = 0;    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {      cast<AtomicSDNode>(E)->refineAlignment(MMO); -    if (Ordering) Ordering->add(E);      return SDValue(E, 0);    }    SDNode* N = NodeAllocator.Allocate<AtomicSDNode>();    new (N) AtomicSDNode(Opcode, dl, VTs, MemVT, Chain, Ptr, Val, MMO);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -3804,7 +3746,6 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,      void *IP = 0;      if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {        cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO); -      if (Ordering) Ordering->add(E);        return SDValue(E, 0);      } @@ -3816,7 +3757,6 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,      new (N) MemIntrinsicSDNode(Opcode, dl, VTList, Ops, NumOps, MemVT, MMO);    }    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -3881,14 +3821,12 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,    void *IP = 0;    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {      cast<LoadSDNode>(E)->refineAlignment(MMO); -    if (Ordering) Ordering->add(E);      return SDValue(E, 0);    }    SDNode *N = NodeAllocator.Allocate<LoadSDNode>();    new (N) LoadSDNode(Ops, dl, VTs, AM, ExtType, MemVT, MMO);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -3959,14 +3897,12 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,    void *IP = 0;    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {      cast<StoreSDNode>(E)->refineAlignment(MMO); -    if (Ordering) Ordering->add(E);      return SDValue(E, 0);    }    SDNode *N = NodeAllocator.Allocate<StoreSDNode>();    new (N) StoreSDNode(Ops, dl, VTs, ISD::UNINDEXED, false, VT, MMO);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -4021,14 +3957,12 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,    void *IP = 0;    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {      cast<StoreSDNode>(E)->refineAlignment(MMO); -    if (Ordering) Ordering->add(E);      return SDValue(E, 0);    }    SDNode *N = NodeAllocator.Allocate<StoreSDNode>();    new (N) StoreSDNode(Ops, dl, VTs, ISD::UNINDEXED, true, SVT, MMO);    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -4045,17 +3979,15 @@ SelectionDAG::getIndexedStore(SDValue OrigStore, DebugLoc dl, SDValue Base,    ID.AddInteger(ST->getMemoryVT().getRawBits());    ID.AddInteger(ST->getRawSubclassData());    void *IP = 0; -  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -    if (Ordering) Ordering->add(E); +  if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))      return SDValue(E, 0); -  } +    SDNode *N = NodeAllocator.Allocate<StoreSDNode>();    new (N) StoreSDNode(Ops, dl, VTs, AM,                        ST->isTruncatingStore(), ST->getMemoryVT(),                        ST->getMemOperand());    CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);    return SDValue(N, 0);  } @@ -4121,10 +4053,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,      AddNodeIDNode(ID, Opcode, VTs, Ops, NumOps);      void *IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return SDValue(E, 0); -    }      N = NodeAllocator.Allocate<SDNode>();      new (N) SDNode(Opcode, DL, VTs, Ops, NumOps); @@ -4135,7 +4065,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,    }    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -4191,10 +4120,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,      FoldingSetNodeID ID;      AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);      void *IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return SDValue(E, 0); -    } +      if (NumOps == 1) {        N = NodeAllocator.Allocate<UnarySDNode>();        new (N) UnarySDNode(Opcode, DL, VTList, Ops[0]); @@ -4225,7 +4153,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, SDVTList VTList,      }    }    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -4325,6 +4252,7 @@ SDVTList SelectionDAG::getVTList(const EVT *VTs, unsigned NumVTs) {      case 1: return getVTList(VTs[0]);      case 2: return getVTList(VTs[0], VTs[1]);      case 3: return getVTList(VTs[0], VTs[1], VTs[2]); +    case 4: return getVTList(VTs[0], VTs[1], VTs[2], VTs[3]);      default: break;    } @@ -4688,10 +4616,8 @@ SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc,    if (VTs.VTs[VTs.NumVTs-1] != MVT::Flag) {      FoldingSetNodeID ID;      AddNodeIDNode(ID, Opc, VTs, Ops, NumOps); -    if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(ON); +    if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))        return ON; -    }    }    if (!RemoveNodeFromCSEMaps(N)) @@ -4755,7 +4681,6 @@ SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc,    if (IP)      CSEMap.InsertNode(N, IP);   // Memoize the new node. -  if (Ordering) Ordering->add(N);    return N;  } @@ -4894,10 +4819,8 @@ SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,      FoldingSetNodeID ID;      AddNodeIDNode(ID, ~Opcode, VTs, Ops, NumOps);      IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return cast<MachineSDNode>(E); -    }    }    // Allocate a new MachineSDNode. @@ -4919,7 +4842,6 @@ SelectionDAG::getMachineNode(unsigned Opcode, DebugLoc DL, SDVTList VTs,      CSEMap.InsertNode(N, IP);    AllNodes.push_back(N); -  if (Ordering) Ordering->add(N);  #ifndef NDEBUG    VerifyNode(N);  #endif @@ -4956,10 +4878,8 @@ SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,      FoldingSetNodeID ID;      AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);      void *IP = 0; -    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { -      if (Ordering) Ordering->add(E); +    if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))        return E; -    }    }    return NULL;  } @@ -5291,6 +5211,18 @@ unsigned SelectionDAG::AssignTopologicalOrder() {    return DAGSize;  } +/// AssignOrdering - Assign an order to the SDNode. +void SelectionDAG::AssignOrdering(SDNode *SD, unsigned Order) { +  assert(SD && "Trying to assign an order to a null node!"); +  if (Ordering) +    Ordering->add(SD, Order); +} + +/// GetOrdering - Get the order for the SDNode. +unsigned SelectionDAG::GetOrdering(const SDNode *SD) const { +  assert(SD && "Trying to get the order of a null node!"); +  return Ordering ? Ordering->getOrder(SD) : 0; +}  //===----------------------------------------------------------------------===// @@ -5931,6 +5863,10 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const {      if (unsigned int TF = BA->getTargetFlags())        OS << " [TF=" << TF << ']';    } + +  if (G) +    if (unsigned Order = G->GetOrdering(this)) +      OS << " [ORD=" << Order << ']';  }  void SDNode::print(raw_ostream &OS, const SelectionDAG *G) const { @@ -6126,9 +6062,6 @@ void SelectionDAG::dump() const {    errs() << "\n\n";  } -void SelectionDAG::NodeOrdering::dump() const { -} -  void SDNode::printr(raw_ostream &OS, const SelectionDAG *G) const {    print_types(OS, G);    print_details(OS, G); @@ -6139,25 +6072,31 @@ static void DumpNodesr(raw_ostream &OS, const SDNode *N, unsigned indent,                         const SelectionDAG *G, VisitedSDNodeSet &once) {    if (!once.insert(N))          // If we've been here before, return now.      return; +    // Dump the current SDNode, but don't end the line yet.    OS << std::string(indent, ' ');    N->printr(OS, G); +    // Having printed this SDNode, walk the children:    for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {      const SDNode *child = N->getOperand(i).getNode(); +      if (i) OS << ",";      OS << " "; +      if (child->getNumOperands() == 0) {        // This child has no grandchildren; print it inline right here.        child->printr(OS, G);        once.insert(child); -    } else {          // Just the address.  FIXME: also print the child's opcode +    } else {         // Just the address. FIXME: also print the child's opcode.        OS << (void*)child;        if (unsigned RN = N->getOperand(i).getResNo())          OS << ":" << RN;      }    } +    OS << "\n"; +    // Dump children that have grandchildren on their own line(s).    for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {      const SDNode *child = N->getOperand(i).getNode();  | 
