1; This testcase ensures that CFL AA answers queries soundly when callee tries
2; to escape its parameters
3
4; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
5
6declare void @opaque(i32*)
7define void @escape_arg(i32* %arg) {
8	call void @opaque(i32* %arg)
9	ret void
10}
11; CHECK-LABEL: Function: test_arg_escape
12; CHECK-DAG: NoAlias: i32* %a, i32** %x
13; CHECK-DAG: NoAlias: i32* %b, i32** %x
14; CHECK-DAG: NoAlias: i32* %a, i32* %b
15; CHECK-DAG: NoAlias: i32* %c, i32** %x
16; CHECK-DAG: NoAlias: i32* %a, i32* %c
17; CHECK-DAG: NoAlias: i32* %b, i32* %c
18; CHECK-DAG: MayAlias: i32* %a, i32* %d
19; CHECK-DAG: MayAlias: i32* %b, i32* %d
20; CHECK-DAG: NoAlias: i32* %c, i32* %d
21define void @test_arg_escape(i32** %x) {
22  %a = alloca i32, align 4
23  %b = alloca i32, align 4
24  %c = alloca i32, align 4
25  load i32, i32* %a
26  load i32, i32* %b
27  load i32, i32* %c
28  call void @escape_arg(i32* %a)
29  call void @escape_arg(i32* %b)
30  %d = load i32*, i32** %x
31  load i32, i32* %d
32
33  ret void
34}
35