Replace gcroot verifier tests
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 14 Feb 2019 22:41:01 +0000 (22:41 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 14 Feb 2019 22:41:01 +0000 (22:41 +0000)
These haven't been checking anything useful and have been testing the
wrong failure reason for many years. Replace them with something which
stresses what is actually implemented in the verifier now.

llvm-svn: 354070

llvm/test/Verifier/gcroot-alloca.ll [deleted file]
llvm/test/Verifier/gcroot-meta.ll [deleted file]
llvm/test/Verifier/gcroot-ptrptr.ll [deleted file]
llvm/test/Verifier/gcroot.ll [new file with mode: 0644]

diff --git a/llvm/test/Verifier/gcroot-alloca.ll b/llvm/test/Verifier/gcroot-alloca.ll
deleted file mode 100644 (file)
index 775bde7..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-; RUN: not llvm-as < %s > /dev/null 2>&1
-; PR1633
-
-%meta = type { i8* }
-%obj = type { %meta* }
-
-declare void @llvm.gcroot(%obj**, %meta*)
-
-define void @f() {
-entry:
-       call void @llvm.gcroot(%obj** null, %meta* null)
-       
-       ret void
-}
diff --git a/llvm/test/Verifier/gcroot-meta.ll b/llvm/test/Verifier/gcroot-meta.ll
deleted file mode 100644 (file)
index 26f7b51..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-; RUN: not llvm-as < %s > /dev/null 2>&1
-; PR1633
-
-%meta = type { i8* }
-%obj = type { %meta* }
-
-declare void @llvm.gcroot(%obj**, %meta*)
-
-define void @f() {
-entry:
-       %local.obj = alloca %obj*
-       %local.meta = alloca %meta
-       call void @llvm.gcroot(%obj** %local.obj, %meta* %local.meta)
-       
-       ret void
-}
diff --git a/llvm/test/Verifier/gcroot-ptrptr.ll b/llvm/test/Verifier/gcroot-ptrptr.ll
deleted file mode 100644 (file)
index 8d7557d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-; RUN: not llvm-as < %s > /dev/null 2>&1
-; PR1633
-
-%meta = type { i8* }
-%obj = type { %meta* }
-
-declare void @llvm.gcroot(%obj*, %meta*)
-
-define void @f() {
-entry:
-       %local.obj = alloca %obj
-       call void @llvm.gcroot(%obj* %local.obj, %meta* null)
-       ret void
-}
diff --git a/llvm/test/Verifier/gcroot.ll b/llvm/test/Verifier/gcroot.ll
new file mode 100644 (file)
index 0000000..75e51d7
--- /dev/null
@@ -0,0 +1,52 @@
+; RUN: not llvm-as -o /dev/null %s 2>&1 | FileCheck %s
+; PR1633
+
+declare void @llvm.gcroot(i8**, i8*)
+
+define void @caller_must_use_gc() {
+  ; CHECK: Enclosing function does not use GC.
+  ; CHECK-NEXT: call void @llvm.gcroot(i8** %alloca, i8* null)
+  %alloca = alloca i8*
+  call void @llvm.gcroot(i8** %alloca, i8* null)
+  ret void
+}
+
+define void @must_be_alloca() gc "test" {
+; CHECK: llvm.gcroot parameter #1 must be an alloca.
+; CHECK-NEXT: call void @llvm.gcroot(i8** null, i8* null)
+  call void @llvm.gcroot(i8** null, i8* null)
+  ret void
+}
+
+define void @non_ptr_alloca_null() gc "test" {
+  ; CHECK: llvm.gcroot parameter #1 must either be a pointer alloca, or argument #2 must be a non-null constant.
+  ; CHECK-NEXT: call void @llvm.gcroot(i8** %cast.alloca, i8* null)
+  %alloca = alloca i32
+  %cast.alloca = bitcast i32* %alloca to i8**
+  call void @llvm.gcroot(i8** %cast.alloca, i8* null)
+  ret void
+}
+
+define void @non_constant_arg1(i8* %arg) gc "test" {
+  ; CHECK: llvm.gcroot parameter #2 must be a constant.
+  ; CHECK-NEXT: call void @llvm.gcroot(i8** %alloca, i8* %arg)
+  %alloca = alloca i8*
+  call void @llvm.gcroot(i8** %alloca, i8* %arg)
+  ret void
+}
+
+define void @non_ptr_alloca_non_null() gc "test" {
+; CHECK-NOT: llvm.gcroot parameter
+  %alloca = alloca i32
+  %cast.alloca = bitcast i32* %alloca to i8**
+  call void @llvm.gcroot(i8** %cast.alloca, i8* inttoptr (i64 123 to i8*))
+  ret void
+}
+
+define void @casted_alloca() gc "test" {
+; CHECK-NOT: llvm.gcroot parameter
+  %alloca = alloca i32*
+  %ptr.cast.alloca = bitcast i32** %alloca to i8**
+  call void @llvm.gcroot(i8** %ptr.cast.alloca, i8* null)
+  ret void
+}