summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/basic-interproc.ll22
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-deref-escape.ll33
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-escape.ll31
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-arg.ll21
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg-multilevel.ll46
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg.ll30
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-escape.ll33
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg-multilevel.ll49
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg.ll34
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-unknown.ll38
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-multilevel.ll45
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-unknown.ll32
-rw-r--r--llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg.ll34
13 files changed, 448 insertions, 0 deletions
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/basic-interproc.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/basic-interproc.ll
new file mode 100644
index 00000000000..9ec52521a04
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/basic-interproc.ll
@@ -0,0 +1,22 @@
+; This testcase ensures that CFL AA won't be too conservative when trying to do
+; interprocedural analysis on simple callee
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+; CHECK-LABEL: Function: noop_callee
+; CHECK: MayAlias: i32* %arg1, i32* %arg2
+define void @noop_callee(i32* %arg1, i32* %arg2) {
+ store i32 0, i32* %arg1
+ store i32 0, i32* %arg2
+ ret void
+}
+; CHECK-LABEL: Function: test_noop
+; CHECK: NoAlias: i32* %a, i32* %b
+define void @test_noop() {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ call void @noop_callee(i32* %a, i32* %b)
+
+ ret void
+}
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-deref-escape.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-deref-escape.ll
new file mode 100644
index 00000000000..c71f40403f6
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-deref-escape.ll
@@ -0,0 +1,33 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to escape the memory pointed to by its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+declare void @opaque(i32*)
+define void @escape_arg_deref(i32** %arg) {
+ %arg_deref = load i32*, i32** %arg
+ call void @opaque(i32* %arg_deref)
+ ret void
+}
+; CHECK-LABEL: Function: test_arg_deref_escape
+; CHECK: NoAlias: i32* %a, i32** %x
+; CHECK: NoAlias: i32* %b, i32** %x
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: NoAlias: i32** %p, i32** %x
+; CHECK: NoAlias: i32* %a, i32** %p
+; CHECK: NoAlias: i32* %b, i32** %p
+; CHECK: MayAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+; CHECK: NoAlias: i32* %c, i32** %p
+define void @test_arg_deref_escape(i32** %x) {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %p = alloca i32*, align 4
+
+ store i32* %a, i32** %p
+ call void @escape_arg_deref(i32** %p)
+ %c = load i32*, i32** %x
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-escape.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-escape.ll
new file mode 100644
index 00000000000..a87764fa7f7
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-arg-escape.ll
@@ -0,0 +1,31 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to escape its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+declare void @opaque(i32*)
+define void @escape_arg(i32* %arg) {
+ call void @opaque(i32* %arg)
+ ret void
+}
+; CHECK-LABEL: Function: test_arg_escape
+; CHECK: NoAlias: i32* %a, i32** %x
+; CHECK: NoAlias: i32* %b, i32** %x
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: NoAlias: i32* %c, i32** %x
+; CHECK: NoAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+; CHECK: MayAlias: i32* %a, i32* %d
+; CHECK: MayAlias: i32* %b, i32* %d
+; CHECK: NoAlias: i32* %c, i32* %d
+define void @test_arg_escape(i32** %x) {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %c = alloca i32, align 4
+ call void @escape_arg(i32* %a)
+ call void @escape_arg(i32* %b)
+ %d = load i32*, i32** %x
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-arg.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-arg.ll
new file mode 100644
index 00000000000..b90ecab7df4
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-arg.ll
@@ -0,0 +1,21 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return one of its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+define i32* @return_arg_callee(i32* %arg1, i32* %arg2) {
+ ret i32* %arg1
+}
+; CHECK-LABEL: Function: test_return_arg
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: MayAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+define void @test_return_arg() {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+
+ %c = call i32* @return_arg_callee(i32* %a, i32* %b)
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg-multilevel.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg-multilevel.ll
new file mode 100644
index 00000000000..3b129dc3017
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg-multilevel.ll
@@ -0,0 +1,46 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return the multi-level dereference of one of its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+define i32* @return_deref_arg_multilevel_callee(i32*** %arg1) {
+ %deref = load i32**, i32*** %arg1
+ %deref2 = load i32*, i32** %deref
+ ret i32* %deref2
+}
+; CHECK-LABEL: Function: test_return_deref_arg_multilevel
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: MayAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+; CHECK: NoAlias: i32* %c, i32** %p
+; CHECK: NoAlias: i32* %c, i32*** %pp
+; CHECK: MayAlias: i32** %lpp, i32** %p
+; CHECK: NoAlias: i32** %lpp, i32*** %pp
+; CHECK: NoAlias: i32* %c, i32** %lpp
+; CHECK: MayAlias: i32* %a, i32* %lpp_deref
+; CHECK: NoAlias: i32* %b, i32* %lpp_deref
+; CHECK: NoAlias: i32* %lpp_deref, i32*** %pp
+; CHECK: MayAlias: i32* %a, i32* %lp
+; CHECK: NoAlias: i32* %b, i32* %lp
+; CHECK: NoAlias: i32* %lp, i32** %p
+; CHECK: NoAlias: i32* %lp, i32*** %pp
+; CHECK: MayAlias: i32* %c, i32* %lp
+; CHECK: NoAlias: i32* %lp, i32** %lpp
+; CHECK: MayAlias: i32* %lp, i32* %lpp_deref
+define void @test_return_deref_arg_multilevel() {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %p = alloca i32*, align 8
+ %pp = alloca i32**, align 8
+
+ store i32* %a, i32** %p
+ store i32** %p, i32*** %pp
+ %c = call i32* @return_deref_arg_multilevel_callee(i32*** %pp)
+
+ %lpp = load i32**, i32*** %pp
+ %lpp_deref = load i32*, i32** %lpp
+ %lp = load i32*, i32** %p
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg.ll
new file mode 100644
index 00000000000..13aab52f734
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-deref-arg.ll
@@ -0,0 +1,30 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return the dereference of one of its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+define i32* @return_deref_arg_callee(i32** %arg1) {
+ %deref = load i32*, i32** %arg1
+ ret i32* %deref
+}
+; CHECK-LABEL: Function: test_return_deref_arg
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: MayAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+; CHECK: MayAlias: i32* %a, i32* %lp
+; CHECK: NoAlias: i32* %b, i32* %lp
+; CHECK: NoAlias: i32* %lp, i32** %p
+; CHECK: MayAlias: i32* %c, i32* %lp
+define void @test_return_deref_arg() {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %p = alloca i32*, align 8
+
+ store i32* %a, i32** %p
+ %c = call i32* @return_deref_arg_callee(i32** %p)
+
+ %lp = load i32*, i32** %p
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-escape.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-escape.ll
new file mode 100644
index 00000000000..5eb8f30dbaa
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-escape.ll
@@ -0,0 +1,33 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return an escaped pointer
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+declare noalias i8* @malloc(i64)
+declare void @opaque(i32*)
+
+define i32* @return_escaped_callee() {
+ %ptr = call noalias i8* @malloc(i64 8)
+ %ptr_cast = bitcast i8* %ptr to i32*
+ call void @opaque(i32* %ptr_cast)
+ ret i32* %ptr_cast
+}
+; CHECK-LABEL: Function: test_return_escape
+; CHECK: NoAlias: i32* %a, i32** %x
+; CHECK: NoAlias: i32* %b, i32** %x
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: NoAlias: i32* %c, i32** %x
+; CHECK: NoAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+; CHECK: NoAlias: i32* %a, i32* %d
+; CHECK: MayAlias: i32* %b, i32* %d
+; CHECK: MayAlias: i32* %c, i32* %d
+define void @test_return_escape(i32** %x) {
+ %a = alloca i32, align 4
+ %b = call i32* @return_escaped_callee()
+ %c = call i32* @return_escaped_callee()
+ %d = load i32*, i32** %x
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg-multilevel.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg-multilevel.ll
new file mode 100644
index 00000000000..fab1de87b14
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg-multilevel.ll
@@ -0,0 +1,49 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return the multi-level reference of one of its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+declare noalias i8* @malloc(i64)
+
+define i32*** @return_ref_arg_multilevel_callee(i32* %arg1) {
+ %ptr = call noalias i8* @malloc(i64 8)
+ %ptr_cast = bitcast i8* %ptr to i32***
+ %ptr2 = call noalias i8* @malloc(i64 8)
+ %ptr_cast2 = bitcast i8* %ptr2 to i32**
+ store i32* %arg1, i32** %ptr_cast2
+ store i32** %ptr_cast2, i32*** %ptr_cast
+ ret i32*** %ptr_cast
+}
+; CHECK-LABEL: Function: test_return_ref_arg_multilevel
+; CHECK: NoAlias: i32* %a, i32*** %b
+; CHECK: NoAlias: i32** %p, i32*** %b
+; CHECK: NoAlias: i32*** %b, i32*** %pp
+; CHECK: NoAlias: i32* %a, i32** %lb
+; CHECK: NoAlias: i32** %lb, i32** %p
+; CHECK: NoAlias: i32** %lb, i32*** %pp
+; CHECK: NoAlias: i32** %lb, i32*** %b
+; CHECK: MayAlias: i32* %a, i32* %lb_deref
+; CHECK: NoAlias: i32* %lb_deref, i32** %lpp
+; CHECK: MayAlias: i32* %lb_deref, i32* %lpp_deref
+; CHECK: NoAlias: i32* %lpp_deref, i32** %lpp
+; CHECK: MayAlias: i32* %lb_deref, i32* %lp
+; CHECK: NoAlias: i32* %lp, i32** %lpp
+; CHECK: MayAlias: i32* %lp, i32* %lpp_deref
+define void @test_return_ref_arg_multilevel() {
+ %a = alloca i32, align 4
+ %p = alloca i32*, align 8
+ %pp = alloca i32**, align 8
+
+ store i32* %a, i32** %p
+ store i32** %p, i32*** %pp
+ %b = call i32*** @return_ref_arg_multilevel_callee(i32* %a)
+
+ %lb = load i32**, i32*** %b
+ %lb_deref = load i32*, i32** %lb
+ %lpp = load i32**, i32*** %pp
+ %lpp_deref = load i32*, i32** %lpp
+ %lp = load i32*, i32** %p
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg.ll
new file mode 100644
index 00000000000..184aff1db18
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-ref-arg.ll
@@ -0,0 +1,34 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return the reference of one of its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+declare noalias i8* @malloc(i64)
+
+define i32** @return_ref_arg_callee(i32* %arg1) {
+ %ptr = call noalias i8* @malloc(i64 8)
+ %ptr_cast = bitcast i8* %ptr to i32**
+ store i32* %arg1, i32** %ptr_cast
+ ret i32** %ptr_cast
+}
+; CHECK-LABEL: Function: test_return_ref_arg
+; CHECK: NoAlias: i32** %b, i32** %p
+; CHECK: MayAlias: i32* %a, i32* %lb
+; CHECK: NoAlias: i32* %lb, i32** %p
+; CHECK: NoAlias: i32* %lb, i32** %b
+; CHECK: NoAlias: i32* %lp, i32** %p
+; CHECK: NoAlias: i32* %lp, i32** %b
+; CHECK: MayAlias: i32* %lb, i32* %lp
+define void @test_return_ref_arg() {
+ %a = alloca i32, align 4
+ %p = alloca i32*, align 8
+
+ store i32* %a, i32** %p
+ %b = call i32** @return_ref_arg_callee(i32* %a)
+
+ %lb = load i32*, i32** %b
+ %lp = load i32*, i32** %p
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-unknown.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-unknown.ll
new file mode 100644
index 00000000000..4c20269896a
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-ret-unknown.ll
@@ -0,0 +1,38 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to return an unknown pointer
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+@g = external global i32
+define i32* @return_unknown_callee(i32* %arg1, i32* %arg2) {
+ ret i32* @g
+}
+; CHECK-LABEL: Function: test_return_unknown
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: MayAlias: i32* %c, i32* %x
+; CHECK: NoAlias: i32* %a, i32* %c
+; CHECK: NoAlias: i32* %b, i32* %c
+define void @test_return_unknown(i32* %x) {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+
+ %c = call i32* @return_unknown_callee(i32* %a, i32* %b)
+
+ ret void
+}
+
+@g2 = external global i32*
+define i32** @return_unknown_callee2() {
+ ret i32** @g2
+}
+; CHECK-LABEL: Function: test_return_unknown2
+; CHECK: MayAlias: i32* %x, i32** %a
+; CHECK: MayAlias: i32* %b, i32* %x
+; CHECK: MayAlias: i32* %b, i32** %a
+define void @test_return_unknown2(i32* %x) {
+ %a = call i32** @return_unknown_callee2()
+ %b = load i32*, i32** %a
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-multilevel.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-multilevel.ll
new file mode 100644
index 00000000000..bf19e270b64
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-multilevel.ll
@@ -0,0 +1,45 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to mutate the memory pointed to by its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+declare noalias i8* @malloc(i64)
+
+define void @store_arg_multilevel_callee(i32*** %arg1, i32* %arg2) {
+ %ptr = call noalias i8* @malloc(i64 8)
+ %ptr_cast = bitcast i8* %ptr to i32**
+ store i32* %arg2, i32** %ptr_cast
+ store i32** %ptr_cast, i32*** %arg1
+ ret void
+}
+; CHECK-LABEL: Function: test_store_arg_multilevel
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: NoAlias: i32* %a, i32** %lpp
+; CHECK: NoAlias: i32* %b, i32** %lpp
+; CHECK: MayAlias: i32** %lpp, i32** %p
+; CHECK: MayAlias: i32* %a, i32* %lpp_deref
+; CHECK: MayAlias: i32* %b, i32* %lpp_deref
+; CHECK: NoAlias: i32* %lpp_deref, i32** %p
+; CHECK: NoAlias: i32* %lpp_deref, i32*** %pp
+; CHECK: NoAlias: i32* %lpp_deref, i32** %lpp
+; CHECK: MayAlias: i32* %a, i32* %lp
+; CHECK: NoAlias: i32* %lp, i32*** %pp
+; CHECK: NoAlias: i32* %lp, i32** %lpp
+; CHECK: MayAlias: i32* %lp, i32* %lpp_deref
+define void @test_store_arg_multilevel() {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %p = alloca i32*, align 8
+ %pp = alloca i32**, align 8
+
+ store i32* %a, i32** %p
+ store i32** %p, i32*** %pp
+ call void @store_arg_multilevel_callee(i32*** %pp, i32* %b)
+
+ %lpp = load i32**, i32*** %pp
+ %lpp_deref = load i32*, i32** %lpp
+ %lp = load i32*, i32** %p
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-unknown.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-unknown.ll
new file mode 100644
index 00000000000..05717b5ddb3
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg-unknown.ll
@@ -0,0 +1,32 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to mutate the memory pointed to by its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+@g = external global i32
+
+define void @store_arg_unknown_callee(i32** %arg1) {
+ store i32* @g, i32** %arg1
+ ret void
+}
+; CHECK-LABEL: Function: test_store_arg_unknown
+; CHECK: NoAlias: i32* %x, i32** %p
+; CHECK: NoAlias: i32* %a, i32** %p
+; CHECK: NoAlias: i32* %b, i32** %p
+; CHECK: MayAlias: i32* %lp, i32* %x
+; CHECK: MayAlias: i32* %a, i32* %lp
+; CHECK: NoAlias: i32* %b, i32* %lp
+; CHECK: NoAlias: i32* %lp, i32** %p
+define void @test_store_arg_unknown(i32* %x) {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %p = alloca i32*, align 8
+
+ store i32* %a, i32** %p
+ call void @store_arg_unknown_callee(i32** %p)
+
+ %lp = load i32*, i32** %p
+
+ ret void
+} \ No newline at end of file
diff --git a/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg.ll b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg.ll
new file mode 100644
index 00000000000..92e720aec14
--- /dev/null
+++ b/llvm/test/Analysis/CFLAliasAnalysis/Andersen/interproc-store-arg.ll
@@ -0,0 +1,34 @@
+; This testcase ensures that CFL AA answers queries soundly when callee tries
+; to mutate the memory pointed to by its parameters
+
+; RUN: opt < %s -disable-basicaa -cfl-anders-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+define void @store_arg_callee(i32** %arg1, i32* %arg2) {
+ store i32* %arg2, i32** %arg1
+ ret void
+}
+; CHECK-LABEL: Function: test_store_arg
+; CHECK: NoAlias: i32* %a, i32* %b
+; CHECK: NoAlias: i32* %a, i32** %p
+; CHECK: NoAlias: i32* %b, i32** %p
+; CHECK: MayAlias: i32* %a, i32* %lp
+; CHECK: MayAlias: i32* %b, i32* %lp
+; CHECK: NoAlias: i32* %a, i32* %lq
+; CHECK: MayAlias: i32* %b, i32* %lq
+; CHECK: MayAlias: i32* %lp, i32* %lq
+define void @test_store_arg() {
+ %a = alloca i32, align 4
+ %b = alloca i32, align 4
+ %p = alloca i32*, align 8
+ %q = alloca i32*, align 8
+
+ store i32* %a, i32** %p
+ store i32* %b, i32** %q
+ call void @store_arg_callee(i32** %p, i32* %b)
+
+ %lp = load i32*, i32** %p
+ %lq = load i32*, i32** %q
+
+ ret void
+} \ No newline at end of file
OpenPOWER on IntegriCloud