Fix a bug aflicting 265.gap
authorChris Lattner <sabre@nondot.org>
Thu, 29 Jan 2004 08:36:22 +0000 (08:36 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 29 Jan 2004 08:36:22 +0000 (08:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11006 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructure.cpp

index 9e0a0b9fc3a72debecf0448a7eab6b3f7bb969d2..470899e07024a9c3c7a823e5582e71c3ff92a69b 100644 (file)
@@ -853,7 +853,6 @@ void ReachabilityCloner::merge(const DSNodeHandle &NH,
   // requires an allocation anyway.
   DSNode *DN = NH.getNode();   // Make sure the Offset is up-to-date
   if (NH.getOffset() >= SrcNH.getOffset()) {
-
     if (!DN->isNodeCompletelyFolded()) {
       // Make sure the destination node is folded if the source node is folded.
       if (SN->isNodeCompletelyFolded()) {
@@ -904,7 +903,7 @@ void ReachabilityCloner::merge(const DSNodeHandle &NH,
         DSNodeHandle &DestGNH = NodeMap[SrcGNH.getNode()];
         assert(DestGNH.getNode()==NH.getNode() &&"Global mapping inconsistent");
         Dest.getNodeForValue(GV).mergeWith(DSNodeHandle(DestGNH.getNode(),
-                                           DestGNH.getOffset()+SrcGNH.getOffset()));
+                                      DestGNH.getOffset()+SrcGNH.getOffset()));
         
         if (CloneFlags & DSGraph::UpdateInlinedGlobals)
           Dest.getInlinedGlobals().insert(GV);
@@ -913,12 +912,12 @@ void ReachabilityCloner::merge(const DSNodeHandle &NH,
   } else {
     // We cannot handle this case without allocating a temporary node.  Fall
     // back on being simple.
-
     DSNode *NewDN = new DSNode(*SN, &Dest, true /* Null out all links */);
     NewDN->maskNodeTypes(BitsToKeep);
 
     unsigned NHOffset = NH.getOffset();
     NH.mergeWith(DSNodeHandle(NewDN, SrcNH.getOffset()));
+
     assert(NH.getNode() &&
            (NH.getOffset() > NHOffset ||
             (NH.getOffset() == 0 && NH.getNode()->isNodeCompletelyFolded())) &&
@@ -927,6 +926,22 @@ void ReachabilityCloner::merge(const DSNodeHandle &NH,
     // Before we start merging outgoing links and updating the scalar map, make
     // sure it is known that this is the representative node for the src node.
     SCNH = DSNodeHandle(NH.getNode(), NH.getOffset()-SrcNH.getOffset());
+
+    // If the source node contained any globals, make sure to create entries 
+    // in the scalar map for them!
+    for (DSNode::global_iterator I = SN->global_begin(), E = SN->global_end();
+         I != E; ++I) {
+      GlobalValue *GV = *I;
+      const DSNodeHandle &SrcGNH = Src.getNodeForValue(GV);
+      DSNodeHandle &DestGNH = NodeMap[SrcGNH.getNode()];
+      assert(DestGNH.getNode()==NH.getNode() &&"Global mapping inconsistent");
+      assert(SrcGNH.getNode() == SN && "Global mapping inconsistent");
+      Dest.getNodeForValue(GV).mergeWith(DSNodeHandle(DestGNH.getNode(),
+                                    DestGNH.getOffset()+SrcGNH.getOffset()));
+      
+      if (CloneFlags & DSGraph::UpdateInlinedGlobals)
+        Dest.getInlinedGlobals().insert(GV);
+    }
   }
 
 
@@ -1060,7 +1075,6 @@ void DSNode::remapLinks(DSGraph::NodeMapTy &OldNodeMap) {
 /// 
 void DSGraph::updateFromGlobalGraph() {
   TIME_REGION(X, "updateFromGlobalGraph");
-
   ReachabilityCloner RC(*this, *GlobalsGraph, 0);
 
   // Clone the non-up-to-date global nodes into this graph.