Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / Analysis / MemorySSA / volatile-clobber.ll
blob6380f244705d30e90a7748c52181d7058d69e94d
1 ; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s
3 ; Ensures that volatile stores/loads count as MemoryDefs
5 ; CHECK-LABEL: define i32 @foo
6 define i32 @foo() {
7   %1 = alloca i32, align 4
8 ; CHECK: 1 = MemoryDef(liveOnEntry)
9 ; CHECK-NEXT: store volatile i32 4
10   store volatile i32 4, ptr %1, align 4
11 ; CHECK: 2 = MemoryDef(1)
12 ; CHECK-NEXT: store volatile i32 8
13   store volatile i32 8, ptr %1, align 4
14 ; CHECK: 3 = MemoryDef(2)
15 ; CHECK-NEXT: %2 = load volatile i32
16   %2 = load volatile i32, ptr %1, align 4
17 ; CHECK: 4 = MemoryDef(3)
18 ; CHECK-NEXT: %3 = load volatile i32
19   %3 = load volatile i32, ptr %1, align 4
20   %4 = add i32 %3, %2
21   ret i32 %4
24 ; Ensuring we allow hoisting nonvolatile loads around volatile loads.
25 ; CHECK-LABEL: define void @volatile_only
26 define void @volatile_only(ptr %arg1, ptr %arg2) {
27   ; Trivially NoAlias/MustAlias
28   %a = alloca i32
29   %b = alloca i32
31 ; CHECK: 1 = MemoryDef(liveOnEntry)
32 ; CHECK-NEXT: load volatile i32, ptr %a
33   load volatile i32, ptr %a
34 ; CHECK: MemoryUse(liveOnEntry)
35 ; CHECK-NEXT: load i32, ptr %b
36   load i32, ptr %b
37 ; CHECK: MemoryUse(liveOnEntry)
38 ; CHECK-NEXT: load i32, ptr %a
39   load i32, ptr %a
41   ; MayAlias
42 ; CHECK: 2 = MemoryDef(1)
43 ; CHECK-NEXT: load volatile i32, ptr %arg1
44   load volatile i32, ptr %arg1
45 ; CHECK: MemoryUse(liveOnEntry)
46 ; CHECK-NEXT: load i32, ptr %arg2
47   load i32, ptr %arg2
49   ret void
52 ; Ensuring that volatile atomic operations work properly.
53 ; CHECK-LABEL: define void @volatile_atomics
54 define void @volatile_atomics(ptr %arg1, ptr %arg2) {
55   %a = alloca i32
56   %b = alloca i32
58  ; Trivially NoAlias/MustAlias
60 ; CHECK: 1 = MemoryDef(liveOnEntry)
61 ; CHECK-NEXT: load atomic volatile i32, ptr %a acquire, align 4
62   load atomic volatile i32, ptr %a acquire, align 4
63 ; CHECK: MemoryUse(1)
64 ; CHECK-NEXT: load i32, ptr %b
65   load i32, ptr %b
67 ; CHECK: 2 = MemoryDef(1)
68 ; CHECK-NEXT: load atomic volatile i32, ptr %a monotonic, align 4
69   load atomic volatile i32, ptr %a monotonic, align 4
70 ; CHECK: MemoryUse(1)
71 ; CHECK-NEXT: load i32, ptr %b
72   load i32, ptr %b
73 ; CHECK: MemoryUse(1)
74 ; CHECK-NEXT: load atomic i32, ptr %b unordered, align 4
75   load atomic i32, ptr %b unordered, align 4
76 ; CHECK: MemoryUse(1)
77 ; CHECK-NEXT: load atomic i32, ptr %a unordered, align 4
78   load atomic i32, ptr %a unordered, align 4
79 ; CHECK: MemoryUse(1)
80 ; CHECK-NEXT: load i32, ptr %a
81   load i32, ptr %a
83   ; MayAlias
84 ; CHECK: 3 = MemoryDef(2)
85 ; CHECK-NEXT: load atomic volatile i32, ptr %arg1 monotonic, align 4
86   load atomic volatile i32, ptr %arg1 monotonic, align 4
87 ; CHECK: MemoryUse(1)
88 ; CHECK-NEXT: load i32, ptr %arg2
89   load i32, ptr %arg2
91   ret void