mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Fix BU datastructures with povray!
The problem was that we were merging a field of a node with a value that was deleted. Thanks to bugpoint for reducing povray to a nice small 3 function example. :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
16437ff705
commit
f590ced5c5
@ -81,10 +81,11 @@ DSNode::DSNode(const Type *T, DSGraph *G)
|
|||||||
// DSNode copy constructor... do not copy over the referrers list!
|
// DSNode copy constructor... do not copy over the referrers list!
|
||||||
DSNode::DSNode(const DSNode &N, DSGraph *G, bool NullLinks)
|
DSNode::DSNode(const DSNode &N, DSGraph *G, bool NullLinks)
|
||||||
: NumReferrers(0), Size(N.Size), ParentGraph(G),
|
: NumReferrers(0), Size(N.Size), ParentGraph(G),
|
||||||
Ty(N.Ty), Globals(N.Globals), NodeType(N.NodeType) {
|
Ty(N.Ty), NodeType(N.NodeType) {
|
||||||
if (!NullLinks)
|
if (!NullLinks) {
|
||||||
Links = N.Links;
|
Links = N.Links;
|
||||||
else
|
Globals = N.Globals;
|
||||||
|
} else
|
||||||
Links.resize(N.Links.size()); // Create the appropriate number of null links
|
Links.resize(N.Links.size()); // Create the appropriate number of null links
|
||||||
G->addNode(this);
|
G->addNode(this);
|
||||||
++NumNodeAllocated;
|
++NumNodeAllocated;
|
||||||
@ -631,6 +632,8 @@ void DSNode::mergeGlobals(const std::vector<GlobalValue*> &RHS) {
|
|||||||
void DSNode::MergeNodes(DSNodeHandle& CurNodeH, DSNodeHandle& NH) {
|
void DSNode::MergeNodes(DSNodeHandle& CurNodeH, DSNodeHandle& NH) {
|
||||||
assert(CurNodeH.getOffset() >= NH.getOffset() &&
|
assert(CurNodeH.getOffset() >= NH.getOffset() &&
|
||||||
"This should have been enforced in the caller.");
|
"This should have been enforced in the caller.");
|
||||||
|
assert(CurNodeH.getNode()->getParentGraph()==NH.getNode()->getParentGraph() &&
|
||||||
|
"Cannot merge two nodes that are not in the same graph!");
|
||||||
|
|
||||||
// Now we know that Offset >= NH.Offset, so convert it so our "Offset" (with
|
// Now we know that Offset >= NH.Offset, so convert it so our "Offset" (with
|
||||||
// respect to NH.Offset) is now zero. NOffset is the distance from the base
|
// respect to NH.Offset) is now zero. NOffset is the distance from the base
|
||||||
@ -782,6 +785,9 @@ DSNodeHandle ReachabilityCloner::getClonedNH(const DSNodeHandle &SrcNH) {
|
|||||||
if (!NH.isNull()) // Node already mapped?
|
if (!NH.isNull()) // Node already mapped?
|
||||||
return DSNodeHandle(NH.getNode(), NH.getOffset()+SrcNH.getOffset());
|
return DSNodeHandle(NH.getNode(), NH.getOffset()+SrcNH.getOffset());
|
||||||
|
|
||||||
|
// FIXME if SrcNH has globals and the dest graph contains the same globals, we
|
||||||
|
// could use 'merge' to do this work more efficiently!
|
||||||
|
|
||||||
DSNode *DN = new DSNode(*SN, &Dest, true /* Null out all links */);
|
DSNode *DN = new DSNode(*SN, &Dest, true /* Null out all links */);
|
||||||
DN->maskNodeTypes(BitsToKeep);
|
DN->maskNodeTypes(BitsToKeep);
|
||||||
NH = DN;
|
NH = DN;
|
||||||
@ -824,6 +830,7 @@ DSNodeHandle ReachabilityCloner::getClonedNH(const DSNodeHandle &SrcNH) {
|
|||||||
if (CloneFlags & DSGraph::UpdateInlinedGlobals)
|
if (CloneFlags & DSGraph::UpdateInlinedGlobals)
|
||||||
Dest.getInlinedGlobals().insert(GV);
|
Dest.getInlinedGlobals().insert(GV);
|
||||||
}
|
}
|
||||||
|
NH.getNode()->mergeGlobals(SN->getGlobals());
|
||||||
|
|
||||||
return DSNodeHandle(NH.getNode(), NH.getOffset()+SrcNH.getOffset());
|
return DSNodeHandle(NH.getNode(), NH.getOffset()+SrcNH.getOffset());
|
||||||
}
|
}
|
||||||
@ -913,6 +920,7 @@ void ReachabilityCloner::merge(const DSNodeHandle &NH,
|
|||||||
if (CloneFlags & DSGraph::UpdateInlinedGlobals)
|
if (CloneFlags & DSGraph::UpdateInlinedGlobals)
|
||||||
Dest.getInlinedGlobals().insert(GV);
|
Dest.getInlinedGlobals().insert(GV);
|
||||||
}
|
}
|
||||||
|
NH.getNode()->mergeGlobals(SN->getGlobals());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// We cannot handle this case without allocating a temporary node. Fall
|
// We cannot handle this case without allocating a temporary node. Fall
|
||||||
@ -964,19 +972,25 @@ void ReachabilityCloner::merge(const DSNodeHandle &NH,
|
|||||||
// wrapping), but if the current node gets collapsed due to
|
// wrapping), but if the current node gets collapsed due to
|
||||||
// recursive merging, we must make sure to merge in all remaining
|
// recursive merging, we must make sure to merge in all remaining
|
||||||
// links at offset zero.
|
// links at offset zero.
|
||||||
unsigned MergeOffset = 0;
|
|
||||||
DSNode *CN = SCNH.getNode();
|
DSNode *CN = SCNH.getNode();
|
||||||
if (CN->getSize() != 1)
|
unsigned MergeOffset =
|
||||||
MergeOffset = ((i << DS::PointerShift)+SCNH.getOffset()) %CN->getSize();
|
((i << DS::PointerShift)+SCNH.getOffset()) % CN->getSize();
|
||||||
|
|
||||||
DSNodeHandle &Link = CN->getLink(MergeOffset);
|
DSNodeHandle Tmp = CN->getLink(MergeOffset);
|
||||||
if (!Link.isNull()) {
|
if (!Tmp.isNull()) {
|
||||||
// Perform the recursive merging. Make sure to create a temporary NH,
|
// Perform the recursive merging. Make sure to create a temporary NH,
|
||||||
// because the Link can disappear in the process of recursive merging.
|
// because the Link can disappear in the process of recursive merging.
|
||||||
DSNodeHandle Tmp = Link;
|
|
||||||
merge(Tmp, SrcEdge);
|
merge(Tmp, SrcEdge);
|
||||||
} else {
|
} else {
|
||||||
merge(Link, SrcEdge);
|
Tmp.mergeWith(getClonedNH(SrcEdge));
|
||||||
|
// Merging this could cause all kinds of recursive things to happen,
|
||||||
|
// culminating in the current node being eliminated. Since this is
|
||||||
|
// possible, make sure to reaquire the link from 'CN'.
|
||||||
|
|
||||||
|
unsigned MergeOffset = 0;
|
||||||
|
CN = SCNH.getNode();
|
||||||
|
MergeOffset = ((i << DS::PointerShift)+SCNH.getOffset()) %CN->getSize();
|
||||||
|
CN->getLink(MergeOffset).mergeWith(Tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user