1; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s
2;
3; Ensuring that external functions without attributes are MemoryDefs
4
5@g = external global i32
6declare void @modifyG()
7
8define i32 @foo() {
9; CHECK: MemoryUse(liveOnEntry)
10; CHECK-NEXT: %1 = load i32
11  %1 = load i32, i32* @g
12
13; CHECK: 1 = MemoryDef(liveOnEntry)
14; CHECK-NEXT: store i32 4
15  store i32 4, i32* @g, align 4
16
17; CHECK: 2 = MemoryDef(1)
18; CHECK-NEXT: call void @modifyG()
19  call void @modifyG()
20
21; CHECK: MemoryUse(2)
22; CHECK-NEXT: %2 = load i32
23  %2 = load i32, i32* @g
24  %3 = add i32 %2, %1
25  ret i32 %3
26}
27
28declare void @readEverything() readonly
29declare void @clobberEverything()
30
31; CHECK-LABEL: define void @bar
32define void @bar() {
33; CHECK: 1 = MemoryDef(liveOnEntry)
34; CHECK-NEXT: call void @clobberEverything()
35  call void @clobberEverything()
36  br i1 undef, label %if.end, label %if.then
37
38if.then:
39; CHECK: MemoryUse(1)
40; CHECK-NEXT: call void @readEverything()
41  call void @readEverything()
42; CHECK: 2 = MemoryDef(1)
43; CHECK-NEXT: call void @clobberEverything()
44  call void @clobberEverything()
45  br label %if.end
46
47if.end:
48; CHECK: 3 = MemoryPhi({%0,1},{if.then,2})
49; CHECK: MemoryUse(3)
50; CHECK-NEXT: call void @readEverything()
51  call void @readEverything()
52  ret void
53}
54