[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/DataStructure.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu Jan 29 02:37:02 PST 2004
Changes in directory llvm/lib/Analysis/DataStructure:
DataStructure.cpp updated: 1.147 -> 1.148
---
Log message:
Fix a bug aflicting 265.gap
---
Diffs of the changes: (+18 -4)
Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.147 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.148
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.147 Wed Jan 28 21:32:15 2004
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp Thu Jan 29 02:36:22 2004
@@ -853,7 +853,6 @@
// 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 @@
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 @@
} 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 @@
// 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 DSGraph::updateFromGlobalGraph() {
TIME_REGION(X, "updateFromGlobalGraph");
-
ReachabilityCloner RC(*this, *GlobalsGraph, 0);
// Clone the non-up-to-date global nodes into this graph.
More information about the llvm-commits
mailing list