From 8a3802d5b2c366c1470695c183da87920748a27d Mon Sep 17 00:00:00 2001
From: Sumant Kowshik <kowshik@uiuc.edu>
Date: Tue, 6 Dec 2005 18:04:30 +0000
Subject: [PATCH] Collapsing node if variable length struct with final field of
 length zero

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24621 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/Analysis/DataStructure/Local.cpp | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index dfd34297f3f..75ad018c149 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -434,7 +434,24 @@ void GraphBuilder::visitGetElementPtrInst(User &GEP) {
   // Add in the offset calculated...
   Value.setOffset(Value.getOffset()+Offset);
 
-  // Value is now the pointer we want to GEP to be...
+  // Check the offset
+  DSNode *N = Value.getNode();
+  if (N &&
+      !N->isNodeCompletelyFolded() &&
+      (N->getSize() != 0 || Offset != 0) &&
+      !N->isForwarding()) {
+    if ((Offset >= N->getSize()) || int(Offset) < 0) {
+      // Accessing offsets out of node size range
+      // This is seen in the "magic" struct in named (from bind), where the
+      // fourth field is an array of length 0, presumably used to create struct
+      // instances of different sizes
+
+      // Collapse the node since its size is now variable
+      N->foldNodeCompletely();
+    }
+  }
+  
+  // Value is now the pointer we want to GEP to be...  
   setDestTo(GEP, Value);
 }