Add testcase and fix for another case where we query the size an
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Wed, 8 Dec 2004 23:42:11 +0000 (23:42 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Wed, 8 Dec 2004 23:42:11 +0000 (23:42 +0000)
abstract type.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18676 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicAliasAnalysis.cpp
test/Analysis/BasicAA/2004-12-08-BasicAACrash.ll [new file with mode: 0644]

index 7d6f0fa1d5c6bfc6d7a78a43ea308eded4bcea9f..a78c8abba22873ce6a0d6dbb8f2b164d51ddb953 100644 (file)
@@ -410,13 +410,18 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
           // the size of the argument... build an index vector that is equal to
           // the arguments provided, except substitute 0's for any variable
           // indexes we find...
-          for (unsigned i = 0; i != GEPOperands.size(); ++i)
-            if (!isa<ConstantInt>(GEPOperands[i]))
-              GEPOperands[i] =Constant::getNullValue(GEPOperands[i]->getType());
-          int64_t Offset = getTargetData().getIndexedOffset(BasePtr->getType(),
-                                                            GEPOperands);
-          if (Offset >= (int64_t)V2Size || Offset <= -(int64_t)V1Size)
-            return NoAlias;
+          if (cast<PointerType>(
+                BasePtr->getType())->getElementType()->isSized()) {
+            for (unsigned i = 0; i != GEPOperands.size(); ++i)
+              if (!isa<ConstantInt>(GEPOperands[i]))
+                GEPOperands[i] =
+                  Constant::getNullValue(GEPOperands[i]->getType());
+            int64_t Offset =
+              getTargetData().getIndexedOffset(BasePtr->getType(), GEPOperands);
+
+            if (Offset >= (int64_t)V2Size || Offset <= -(int64_t)V1Size)
+              return NoAlias;
+          }
         }
       }
     }
diff --git a/test/Analysis/BasicAA/2004-12-08-BasicAACrash.ll b/test/Analysis/BasicAA/2004-12-08-BasicAACrash.ll
new file mode 100644 (file)
index 0000000..4921824
--- /dev/null
@@ -0,0 +1,24 @@
+; RUN: llvm-as < %s | opt -licm
+
+"java/lang/Object" = type { %struct.llvm_java_object_base }
+       "java/lang/StringBuffer" = type { "java/lang/Object", int, { "java/lang/Object", uint, [0 x ushort] }*, bool }
+       %struct.llvm_java_object_base = type opaque
+
+implementation   ; Functions:
+
+void "java/lang/StringBuffer/setLength(I)V"(%struct.llvm_java_object_base*) {
+bc0:
+       br bool false, label %bc40, label %bc65
+
+bc65:          ; preds = %bc0, %bc40
+       ret void
+
+bc40:          ; preds = %bc0, %bc40
+       %tmp75 = cast %struct.llvm_java_object_base* %0 to "java/lang/StringBuffer"*            ; <"java/lang/StringBuffer"*> [#uses=1]
+       %tmp76 = getelementptr "java/lang/StringBuffer"* %tmp75, int 0, uint 1          ; <int*> [#uses=1]
+       store int 0, int* %tmp76
+       %tmp381 = cast %struct.llvm_java_object_base* %0 to "java/lang/StringBuffer"*           ; <"java/lang/StringBuffer"*> [#uses=1]
+       %tmp392 = getelementptr "java/lang/StringBuffer"* %tmp381, int 0, uint 1                ; <int*> [#uses=1]
+       %tmp403 = load int* %tmp392             ; <int> [#uses=0]
+       br bool false, label %bc40, label %bc65
+}