blob: d6f960f3e382a5032e5d96112ce64e153f7c1028 [file] [log] [blame]
Chad Rosier232e29e2016-07-06 21:20:47 +00001; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s
Geoff Berryb96d3b22016-06-01 21:30:40 +00002; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s
George Burgess IVe1100f52016-02-02 22:46:49 +00003;
4; Ensures that volatile stores/loads count as MemoryDefs
5
George Burgess IV82e355c2016-08-03 19:39:54 +00006; CHECK-LABEL: define i32 @foo
George Burgess IVe1100f52016-02-02 22:46:49 +00007define i32 @foo() {
8 %1 = alloca i32, align 4
9; CHECK: 1 = MemoryDef(liveOnEntry)
10; CHECK-NEXT: store volatile i32 4
11 store volatile i32 4, i32* %1, align 4
12; CHECK: 2 = MemoryDef(1)
13; CHECK-NEXT: store volatile i32 8
14 store volatile i32 8, i32* %1, align 4
15; CHECK: 3 = MemoryDef(2)
16; CHECK-NEXT: %2 = load volatile i32
17 %2 = load volatile i32, i32* %1, align 4
18; CHECK: 4 = MemoryDef(3)
19; CHECK-NEXT: %3 = load volatile i32
20 %3 = load volatile i32, i32* %1, align 4
21 %4 = add i32 %3, %2
22 ret i32 %4
23}
George Burgess IV82e355c2016-08-03 19:39:54 +000024
25; Ensuring that we don't automatically hoist nonvolatile loads around volatile
26; loads
27; CHECK-LABEL define void @volatile_only
28define void @volatile_only(i32* %arg1, i32* %arg2) {
29 ; Trivially NoAlias/MustAlias
30 %a = alloca i32
31 %b = alloca i32
32
33; CHECK: 1 = MemoryDef(liveOnEntry)
34; CHECK-NEXT: load volatile i32, i32* %a
35 load volatile i32, i32* %a
36; CHECK: MemoryUse(liveOnEntry)
37; CHECK-NEXT: load i32, i32* %b
38 load i32, i32* %b
39; CHECK: MemoryUse(1)
40; CHECK-NEXT: load i32, i32* %a
41 load i32, i32* %a
42
43 ; MayAlias
44; CHECK: 2 = MemoryDef(1)
45; CHECK-NEXT: load volatile i32, i32* %arg1
46 load volatile i32, i32* %arg1
47; CHECK: MemoryUse(2)
48; CHECK-NEXT: load i32, i32* %arg2
49 load i32, i32* %arg2
50
51 ret void
52}
53
54; Ensuring that volatile atomic operations work properly.
55; CHECK-LABEL define void @volatile_atomics
56define void @volatile_atomics(i32* %arg1, i32* %arg2) {
57 %a = alloca i32
58 %b = alloca i32
59
60 ; Trivially NoAlias/MustAlias
61
62; CHECK: 1 = MemoryDef(liveOnEntry)
63; CHECK-NEXT: load atomic volatile i32, i32* %a acquire, align 4
64 load atomic volatile i32, i32* %a acquire, align 4
65; CHECK: MemoryUse(1)
66; CHECK-NEXT: load i32, i32* %b
67 load i32, i32* %b
68
69; CHECK: 2 = MemoryDef(1)
70; CHECK-NEXT: load atomic volatile i32, i32* %a monotonic, align 4
71 load atomic volatile i32, i32* %a monotonic, align 4
72; CHECK: MemoryUse(1)
73; CHECK-NEXT: load i32, i32* %b
74 load i32, i32* %b
75; CHECK: MemoryUse(1)
76; CHECK-NEXT: load atomic i32, i32* %b unordered, align 4
77 load atomic i32, i32* %b unordered, align 4
78; CHECK: MemoryUse(2)
79; CHECK-NEXT: load atomic i32, i32* %a unordered, align 4
80 load atomic i32, i32* %a unordered, align 4
81; CHECK: MemoryUse(2)
82; CHECK-NEXT: load i32, i32* %a
83 load i32, i32* %a
84
85 ; MayAlias
86; CHECK: 3 = MemoryDef(2)
87; CHECK-NEXT: load atomic volatile i32, i32* %arg1 monotonic, align 4
88 load atomic volatile i32, i32* %arg1 monotonic, align 4
89; CHECK: MemoryUse(3)
90; CHECK-NEXT: load i32, i32* %arg2
91 load i32, i32* %arg2
92
93 ret void
94}