You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
@ -1,24 +0,0 @@
|
||||
; This testcase ensures that CFL AA handles assignment in an inclusion-based
|
||||
; manner
|
||||
|
||||
; 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: test_assign
|
||||
; CHECK: NoAlias: i64* %a, i64* %b
|
||||
; CHECK: NoAlias: i32* %c, i64* %b
|
||||
; CHECK: NoAlias: i32* %d, i64* %a
|
||||
; CHECK: NoAlias: i32* %c, i32* %d
|
||||
; CHECK: MayAlias: i32* %e, i64* %a
|
||||
; CHECK: MayAlias: i32* %e, i64* %b
|
||||
; CHECK: MayAlias: i32* %c, i32* %e
|
||||
; CHECK: MayAlias: i32* %d, i32* %e
|
||||
define void @test_assign(i1 %cond) {
|
||||
%a = alloca i64, align 8
|
||||
%b = alloca i64, align 8
|
||||
|
||||
%c = bitcast i64* %a to i32*
|
||||
%d = bitcast i64* %b to i32*
|
||||
%e = select i1 %cond, i32* %c, i32* %d
|
||||
ret void
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
; This testcase ensures that CFL AA handles assignment in an inclusion-based
|
||||
; manner
|
||||
|
||||
; 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: test_assign2
|
||||
; CHECK: NoAlias: i32* %b, i64* %a
|
||||
; CHECK: NoAlias: i32* %b, i32* %c
|
||||
; CHECK: NoAlias: i32* %b, i32* %d
|
||||
; CHECK: MayAlias: i32* %e, i64* %a
|
||||
; CHECK: MayAlias: i32* %b, i32* %e
|
||||
; CHECK: MayAlias: i32* %c, i32* %e
|
||||
; CHECK: MayAlias: i32* %d, i32* %e
|
||||
define void @test_assign2(i1 %cond) {
|
||||
%a = alloca i64, align 8
|
||||
%b = alloca i32, align 4
|
||||
|
||||
%c = bitcast i64* %a to i32*
|
||||
%d = bitcast i64* %a to i32*
|
||||
%e = select i1 %cond, i32* %c, i32* %b
|
||||
ret void
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
; This testcase ensures that AliasAttrs are propagated not only on the same
|
||||
; level but also downward.
|
||||
|
||||
; 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: test_attr_below
|
||||
; CHECK: MayAlias: i64* %q, i64*** %p
|
||||
; CHECK: NoAlias: i64* %esc, i64*** %p
|
||||
; CHECK: NoAlias: i64* %esc, i64* %q
|
||||
|
||||
; CHECK: MayAlias: i64* %unknown, i64*** %p
|
||||
; CHECK: MayAlias: i64* %q, i64* %unknown
|
||||
; CHECK: MayAlias: i64* %esc, i64* %unknown
|
||||
; CHECK: MayAlias: i64* %q, i64** %pdrf
|
||||
; CHECK: MayAlias: i64* %esc, i64** %pdrf
|
||||
; CHECK: MayAlias: i64* %unknown, i64** %pdrf
|
||||
; CHECK: MayAlias: i64* %pdrf2, i64* %q
|
||||
; CHECK: MayAlias: i64* %esc, i64* %pdrf2
|
||||
; CHECK: MayAlias: i64* %pdrf2, i64* %unknown
|
||||
define void @test_attr_below(i64*** %p, i64* %q) {
|
||||
%esc = alloca i64, align 8
|
||||
%escint = ptrtoint i64* %esc to i64
|
||||
%unknown = inttoptr i64 %escint to i64*
|
||||
|
||||
%pdrf = load i64**, i64*** %p
|
||||
%pdrf2 = load i64*, i64** %pdrf
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: Function: test_attr_assign_below
|
||||
; CHECK: MayAlias: i64** %sel, i64*** %p
|
||||
; CHECK: MayAlias: i64* %q, i64** %sel
|
||||
; CHECK: MayAlias: i64** %a, i64** %sel
|
||||
; CHECK: MayAlias: i64** %pdrf, i64** %sel
|
||||
|
||||
; CHECK: MayAlias: i64** %c, i64*** %p
|
||||
; CHECK: MayAlias: i64* %q, i64** %c
|
||||
; CHECK: MayAlias: i64** %a, i64** %c
|
||||
; CHECK: MayAlias: i64** %c, i64** %pdrf
|
||||
; CHECK: MayAlias: i64** %c, i64** %sel
|
||||
|
||||
; CHECK: MayAlias: i64* %d, i64*** %p
|
||||
; CHECK: MayAlias: i64* %d, i64* %q
|
||||
; CHECK: MayAlias: i64* %d, i64** %pdrf
|
||||
; CHECK: MayAlias: i64* %d, i64** %sel
|
||||
define void @test_attr_assign_below(i64*** %p, i64* %q, i1 %cond) {
|
||||
%a = alloca i64*, align 8
|
||||
%pdrf = load i64**, i64*** %p
|
||||
%sel = select i1 %cond, i64** %a, i64** %pdrf
|
||||
|
||||
%b = alloca i64**, align 8
|
||||
store i64** %sel, i64*** %b
|
||||
|
||||
%c = load i64**, i64*** %b
|
||||
%d = load i64*, i64** %c
|
||||
|
||||
ret void
|
||||
}
|
||||
|
@ -1,94 +0,0 @@
|
||||
; This testcase ensures that CFL AA handles escaped values no more conservative than it should
|
||||
|
||||
; 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: test_local
|
||||
; CHECK: NoAlias: i32* %a, i32* %b
|
||||
; CHECK: MayAlias: i32* %a, i32* %aAlias
|
||||
; CHECK: NoAlias: i32* %aAlias, i32* %b
|
||||
define void @test_local() {
|
||||
%a = alloca i32, align 4
|
||||
%b = alloca i32, align 4
|
||||
%aint = ptrtoint i32* %a to i64
|
||||
%aAlias = inttoptr i64 %aint to i32*
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: Function: test_global_param
|
||||
; CHECK: NoAlias: i32* %a, i32** %x
|
||||
; CHECK: MayAlias: i32* %a, i32* %xload
|
||||
; CHECK: MayAlias: i32* %a, i32* %gload
|
||||
; CHECK: MayAlias: i32* %gload, i32* %xload
|
||||
; CHECK: MayAlias: i32** %x, i32** @ext_global
|
||||
; CHECK: NoAlias: i32* %a, i32** @ext_global
|
||||
@ext_global = external global i32*
|
||||
define void @test_global_param(i32** %x) {
|
||||
%a = alloca i32, align 4
|
||||
%aint = ptrtoint i32* %a to i64
|
||||
%xload = load i32*, i32** %x
|
||||
%gload = load i32*, i32** @ext_global
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @external_func(i32**)
|
||||
; CHECK-LABEL: Function: test_external_call
|
||||
; CHECK: NoAlias: i32* %b, i32* %x
|
||||
; CHECK: NoAlias: i32* %b, i32** %a
|
||||
; CHECK: MayAlias: i32* %c, i32* %x
|
||||
; CHECK: MayAlias: i32* %c, i32** %a
|
||||
; CHECK: NoAlias: i32* %b, i32* %c
|
||||
define void @test_external_call(i32* %x) {
|
||||
%a = alloca i32*, align 8
|
||||
%b = alloca i32, align 4
|
||||
call void @external_func(i32** %a)
|
||||
%c = load i32*, i32** %a
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @external_func_readonly(i32**) readonly
|
||||
; CHECK-LABEL: Function: test_external_call_func_readonly
|
||||
; CHECK: MayAlias: i32* %c, i32* %x
|
||||
; CHECK: NoAlias: i32* %c, i32** %a
|
||||
define void @test_external_call_func_readonly(i32* %x) {
|
||||
%a = alloca i32*, align 8
|
||||
%b = alloca i32, align 4
|
||||
store i32* %x, i32** %a, align 4
|
||||
call void @external_func_readonly(i32** %a)
|
||||
%c = load i32*, i32** %a
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: Function: test_external_call_callsite_readonly
|
||||
; CHECK: MayAlias: i32* %c, i32* %x
|
||||
; CHECK: NoAlias: i32* %c, i32** %a
|
||||
define void @test_external_call_callsite_readonly(i32* %x) {
|
||||
%a = alloca i32*, align 8
|
||||
%b = alloca i32, align 4
|
||||
store i32* %x, i32** %a, align 4
|
||||
call void @external_func(i32** %a) readonly
|
||||
%c = load i32*, i32** %a
|
||||
ret void
|
||||
}
|
||||
|
||||
declare i32* @external_func_normal_return(i32*)
|
||||
; CHECK-LABEL: Function: test_external_call_normal_return
|
||||
; CHECK: MayAlias: i32* %c, i32* %x
|
||||
; CHECK: MayAlias: i32* %a, i32* %c
|
||||
define void @test_external_call_normal_return(i32* %x) {
|
||||
%a = alloca i32, align 8
|
||||
%b = alloca i32, align 4
|
||||
%c = call i32* @external_func_normal_return(i32* %a)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare noalias i32* @external_func_noalias_return(i32*)
|
||||
; CHECK-LABEL: Function: test_external_call_noalias_return
|
||||
; CHECK: NoAlias: i32* %c, i32* %x
|
||||
; CHECK: NoAlias: i32* %a, i32* %c
|
||||
define void @test_external_call_noalias_return(i32* %x) {
|
||||
%a = alloca i32, align 8
|
||||
%b = alloca i32, align 4
|
||||
%c = call i32* @external_func_noalias_return(i32* %a)
|
||||
ret void
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
; This testcase ensures that CFL AA handles assignment cycles correctly
|
||||
|
||||
; 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: test_cycle
|
||||
; CHECK: NoAlias: i64* %a, i64** %b
|
||||
; CHECK: NoAlias: i64* %a, i64*** %c
|
||||
; CHECK: NoAlias: i64** %b, i64*** %c
|
||||
; CHECK: NoAlias: i64* %a, i64**** %d
|
||||
; CHECK: NoAlias: i64** %b, i64**** %d
|
||||
; CHECK: NoAlias: i64*** %c, i64**** %d
|
||||
; CHECK: NoAlias: i64* %a, i64* %e
|
||||
; CHECK: NoAlias: i64* %e, i64** %b
|
||||
; CHECK: NoAlias: i64* %e, i64*** %c
|
||||
; CHECK: MayAlias: i64* %a, i64* %f
|
||||
; CHECK: NoAlias: i64* %f, i64** %b
|
||||
; CHECK: NoAlias: i64* %f, i64*** %c
|
||||
; CHECK: MayAlias: i64* %f, i64**** %d
|
||||
; CHECK: MayAlias: i64* %e, i64* %f
|
||||
define void @test_cycle() {
|
||||
%a = alloca i64, align 8
|
||||
%b = alloca i64*, align 8
|
||||
%c = alloca i64**, align 8
|
||||
%d = alloca i64***, align 8
|
||||
store i64* %a, i64** %b
|
||||
store i64** %b, i64*** %c
|
||||
store i64*** %c, i64**** %d
|
||||
|
||||
%e = bitcast i64**** %d to i64*
|
||||
store i64* %e, i64** %b
|
||||
%f = load i64*, i64** %b
|
||||
ret void
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
; 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
|
||||
|
||||
; Temporarily disable modref checks
|
||||
; NoModRef: Ptr: i32* %a <-> %c = call i32* @return_arg_callee(i32* %a, i32* %b)
|
||||
; NoModRef: Ptr: i32* %b <-> %c = call i32* @return_arg_callee(i32* %a, i32* %b)
|
||||
; NoModRef: Ptr: i32* %c <-> %c = call i32* @return_arg_callee(i32* %a, i32* %b)
|
||||
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
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
; 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
|
||||
|
||||
; Temporarily disable modref checks
|
||||
; Just Ref: Ptr: i32** %p <-> %c = call i32* @return_deref_arg_multilevel_callee(i32*** %pp)
|
||||
; Just Ref: Ptr: i32*** %pp <-> %c = call i32* @return_deref_arg_multilevel_callee(i32*** %pp)
|
||||
; Just Ref: Ptr: i32** %lpp <-> %c = call i32* @return_deref_arg_multilevel_callee(i32*** %pp)
|
||||
|
||||
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
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
; 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
|
||||
|
||||
; Temporarily disable modref checks
|
||||
; NoModRef: Ptr: i32* %a <-> %c = call i32* @return_deref_arg_callee(i32** %p)
|
||||
; NoModRef: Ptr: i32* %b <-> %c = call i32* @return_deref_arg_callee(i32** %p)
|
||||
; Just Ref: Ptr: i32** %p <-> %c = call i32* @return_deref_arg_callee(i32** %p)
|
||||
; NoModRef: Ptr: i32* %c <-> %c = call i32* @return_deref_arg_callee(i32** %p)
|
||||
; NoModRef: Ptr: i32* %lp <-> %c = call i32* @return_deref_arg_callee(i32** %p)
|
||||
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
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
; 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
|
||||
|
||||
; Temporarily disable modref checks
|
||||
; Just Mod: Ptr: i32*** %b <-> %b = call i32*** @return_ref_arg_multilevel_callee(i32* %a)
|
||||
; Just Mod: Ptr: i32** %lb <-> %b = call i32*** @return_ref_arg_multilevel_callee(i32* %a)
|
||||
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
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
; 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
|
||||
|
||||
; Temporarily disable modref checks
|
||||
; Just Mod: Ptr: i32** %b <-> %b = call i32** @return_ref_arg_callee(i32* %a)
|
||||
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
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
; 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
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
; 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
|
||||
|
||||
; Temporarily disable modref checks
|
||||
; NoModRef: Ptr: i32* %a <-> call void @store_arg_callee(i32** %p, i32* %b)
|
||||
; Just Ref: Ptr: i32* %b <-> call void @store_arg_callee(i32** %p, i32* %b)
|
||||
; Just Mod: Ptr: i32** %p <-> call void @store_arg_callee(i32** %p, i32* %b)
|
||||
; NoModRef: Ptr: i32** %q <-> call void @store_arg_callee(i32** %p, i32* %b)
|
||||
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
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
; This testcase ensures that CFL AA correctly handles simple memory alias
|
||||
; pattern
|
||||
|
||||
; 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: test_memalias
|
||||
; CHECK: NoAlias: i64* %a, i64** %b
|
||||
; CHECK: NoAlias: i32** %c, i64* %a
|
||||
; CHECK: MayAlias: i32* %d, i64* %a
|
||||
; CHECK: NoAlias: i32* %d, i64** %b
|
||||
; CHECK: NoAlias: i32* %d, i32** %c
|
||||
define void @test_memalias() {
|
||||
%a = alloca i64, align 8
|
||||
%b = alloca i64*, align 8
|
||||
store i64* %a, i64** %b
|
||||
|
||||
%c = bitcast i64** %b to i32**
|
||||
%d = load i32*, i32** %c
|
||||
ret void
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
; Ensures that our struct ops are sane.
|
||||
|
||||
; 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
|
||||
|
||||
; Since we ignore non-pointer values, we effectively ignore extractvalue
|
||||
; instructions. This means that %c "doesn't exist" in test_structure's graph,
|
||||
; so we currently get MayAlias.
|
||||
; XFAIL: *
|
||||
|
||||
; CHECK-LABEL: Function: test_structure
|
||||
; CHECK: NoAlias: i64** %c, { i64**, i64** }* %a
|
||||
define void @test_structure() {
|
||||
%a = alloca {i64**, i64**}, align 8
|
||||
%b = load {i64**, i64**}, {i64**, i64**}* %a
|
||||
%c = extractvalue {i64**, i64**} %b, 0
|
||||
ret void
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user