Weak relaxing of the constraints on atomics in MemoryDependencyAnalysis
[oota-llvm.git] / test / Transforms / DeadStoreElimination / atomic.ll
1 ; RUN: opt -basicaa -dse -S < %s | FileCheck %s
2
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4 target triple = "x86_64-apple-macosx10.7.0"
5
6 ; Sanity tests for atomic stores.
7 ; Note that it turns out essentially every transformation DSE does is legal on
8 ; atomic ops, just some transformations are not allowed across them. 
9
10 @x = common global i32 0, align 4
11 @y = common global i32 0, align 4
12
13 declare void @randomop(i32*)
14
15 ; DSE across unordered store (allowed)
16 define void @test1()  nounwind uwtable ssp {
17 ; CHECK: test1
18 ; CHECK-NOT: store i32 0
19 ; CHECK: store i32 1
20 entry:
21   store i32 0, i32* @x
22   store atomic i32 0, i32* @y unordered, align 4
23   store i32 1, i32* @x
24   ret void
25 }
26
27 ; DSE across seq_cst load (allowed in theory; not implemented ATM)
28 define i32 @test2()  nounwind uwtable ssp {
29 ; CHECK: test2
30 ; CHECK: store i32 0
31 ; CHECK: store i32 1
32 entry:
33   store i32 0, i32* @x
34   %x = load atomic i32* @y seq_cst, align 4
35   store i32 1, i32* @x
36   ret i32 %x
37 }
38
39 ; DSE across seq_cst store (store before atomic store must not be removed)
40 define void @test3()  nounwind uwtable ssp {
41 ; CHECK: test3
42 ; CHECK: store i32
43 ; CHECK: store atomic i32 2
44 entry:
45   store i32 0, i32* @x
46   store atomic i32 2, i32* @y seq_cst, align 4
47   store i32 1, i32* @x
48   ret void
49 }
50
51 ; DSE remove unordered store (allowed)
52 define void @test4()  nounwind uwtable ssp {
53 ; CHECK: test4
54 ; CHECK-NOT: store atomic
55 ; CHECK: store i32 1
56 entry:
57   store atomic i32 0, i32* @x unordered, align 4
58   store i32 1, i32* @x
59   ret void
60 }
61
62 ; DSE unordered store overwriting non-atomic store (allowed)
63 define void @test5()  nounwind uwtable ssp {
64 ; CHECK: test5
65 ; CHECK: store atomic i32 1
66 entry:
67   store i32 0, i32* @x
68   store atomic i32 1, i32* @x unordered, align 4
69   ret void
70 }
71
72 ; DSE no-op unordered atomic store (allowed)
73 define void @test6()  nounwind uwtable ssp {
74 ; CHECK: test6
75 ; CHECK-NOT: store
76 ; CHECK: ret void
77 entry:
78   %x = load atomic i32* @x unordered, align 4
79   store atomic i32 %x, i32* @x unordered, align 4
80   ret void
81 }
82
83 ; DSE seq_cst store (be conservative; DSE doesn't have infrastructure
84 ; to reason about atomic operations).
85 define void @test7()  nounwind uwtable ssp {
86 ; CHECK: test7
87 ; CHECK: store atomic 
88 entry:
89   %a = alloca i32
90   store atomic i32 0, i32* %a seq_cst, align 4
91   ret void
92 }
93
94 ; DSE and seq_cst load (be conservative; DSE doesn't have infrastructure
95 ; to reason about atomic operations).
96 define i32 @test8()  nounwind uwtable ssp {
97 ; CHECK: test8
98 ; CHECK: store
99 ; CHECK: load atomic 
100 entry:
101   %a = alloca i32
102   call void @randomop(i32* %a)
103   store i32 0, i32* %a, align 4
104   %x = load atomic i32* @x seq_cst, align 4
105   ret i32 %x
106 }
107
108 ; DSE across monotonic load (allowed as long as the eliminated store isUnordered)
109 define i32 @test9()  nounwind uwtable ssp {
110 ; CHECK: test9
111 ; CHECK-NOT: store i32 0
112 ; CHECK: store i32 1
113 entry:
114   store i32 0, i32* @x
115   %x = load atomic i32* @y monotonic, align 4
116   store i32 1, i32* @x
117   ret i32 %x
118 }
119
120 ; DSE across monotonic store (allowed as long as the eliminated store isUnordered)
121 define void @test10()  nounwind uwtable ssp {
122 ; CHECK: test10
123 ; CHECK-NOT: store i32 0
124 ; CHECK: store i32 1
125 entry:
126   store i32 0, i32* @x
127   store atomic i32 42, i32* @y monotonic, align 4
128   store i32 1, i32* @x
129   ret void
130 }
131
132 ; DSE across monotonic load (forbidden since the eliminated store is atomic)
133 define i32 @test11()  nounwind uwtable ssp {
134 ; CHECK: test11
135 ; CHECK: store atomic i32 0
136 ; CHECK: store atomic i32 1
137 entry:
138   store atomic i32 0, i32* @x monotonic, align 4
139   %x = load atomic i32* @y monotonic, align 4
140   store atomic i32 1, i32* @x monotonic, align 4
141   ret i32 %x
142 }
143
144 ; DSE across monotonic store (forbidden since the eliminated store is atomic)
145 define void @test12()  nounwind uwtable ssp {
146 ; CHECK: test12
147 ; CHECK: store atomic i32 0
148 ; CHECK: store atomic i32 1
149 entry:
150   store atomic i32 0, i32* @x monotonic, align 4
151   store atomic i32 42, i32* @y monotonic, align 4
152   store atomic i32 1, i32* @x monotonic, align 4
153   ret void
154 }