Dramatically simplify internal DSNode representation, get implementation
*FULLY OPERATIONAL* and safe. We are now capable of completely analyzing
at LEAST the Olden benchmarks + 181.mcf
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4562 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index 42847ca..bc2065e 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -184,13 +184,12 @@
///
DSNodeHandle &GraphBuilder::getLink(const DSNodeHandle &node, unsigned LinkNo) {
DSNodeHandle &Node = const_cast<DSNodeHandle&>(node);
- DSNodeHandle *Link = Node.getLink(LinkNo);
- if (Link) return *Link;
-
- // If the link hasn't been created yet, make and return a new shadow node
- DSNode *N = createNode(DSNode::ShadowNode);
- Node.setLink(LinkNo, N);
- return *Node.getLink(LinkNo);
+ DSNodeHandle &Link = Node.getLink(LinkNo);
+ if (!Link.getNode()) {
+ // If the link hasn't been created yet, make and return a new shadow node
+ Link = createNode(DSNode::ShadowNode);
+ }
+ return Link;
}
@@ -236,15 +235,14 @@
unsigned Offset = 0;
const PointerType *PTy = cast<PointerType>(GEP.getOperand(0)->getType());
const Type *CurTy = PTy->getElementType();
- DSTypeRec &TopTypeRec =
- Value.getNode()->getTypeRec(PTy->getElementType(), Value.getOffset());
- // If the node had to be folded... exit quickly
- if (TopTypeRec.Ty == Type::VoidTy) {
+ if (Value.getNode()->mergeTypeInfo(CurTy, Value.getOffset())) {
+ // If the node had to be folded... exit quickly
setDestTo(GEP, Value); // GEP result points to folded node
return;
}
+#if 0
// Handle the pointer index specially...
if (GEP.getNumOperands() > 1 &&
GEP.getOperand(1) != ConstantSInt::getNullValue(Type::LongTy)) {
@@ -269,6 +267,7 @@
}
}
}
+#endif
// All of these subscripts are indexing INTO the elements we have...
for (unsigned i = 2, e = GEP.getNumOperands(); i < e; ++i)
@@ -276,6 +275,7 @@
// Get the type indexing into...
const SequentialType *STy = cast<SequentialType>(CurTy);
CurTy = STy->getElementType();
+#if 0
if (ConstantSInt *CS = dyn_cast<ConstantSInt>(GEP.getOperand(i))) {
Offset += CS->getValue()*TD.getTypeSize(CurTy);
} else {
@@ -298,6 +298,7 @@
N->mergeIndexes(RawOffset+j, RawOffset+i*ElSize+j);
}
}
+#endif
} else if (GEP.getOperand(i)->getType() == Type::UByteTy) {
unsigned FieldNo = cast<ConstantUInt>(GEP.getOperand(i))->getValue();
const StructType *STy = cast<StructType>(CurTy);
@@ -320,7 +321,7 @@
Ptr.getNode()->NodeType |= DSNode::Read;
// Ensure a typerecord exists...
- Ptr.getNode()->getTypeRec(LI.getType(), Ptr.getOffset());
+ Ptr.getNode()->mergeTypeInfo(LI.getType(), Ptr.getOffset());
if (isPointerType(LI.getType()))
setDestTo(LI, getLink(Ptr));
@@ -335,7 +336,7 @@
Dest.getNode()->NodeType |= DSNode::Modified;
// Ensure a typerecord exists...
- Dest.getNode()->getTypeRec(StoredTy, Dest.getOffset());
+ Dest.getNode()->mergeTypeInfo(StoredTy, Dest.getOffset());
// Avoid adding edges from null, or processing non-"pointer" stores
if (isPointerType(StoredTy))