1; RUN: opt -basicaa -dse -S < %s | FileCheck %s
2
3target 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"
4target 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
13declare void @randomop(i32*)
14
15; DSE across unordered store (allowed)
16define void @test1()  nounwind uwtable ssp {
17; CHECK: test1
18; CHECK-NOT: store i32 0
19; CHECK: store i32 1
20entry:
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)
28define i32 @test2()  nounwind uwtable ssp {
29; CHECK: test2
30; CHECK: store i32 0
31; CHECK: store i32 1
32entry:
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)
40define void @test3()  nounwind uwtable ssp {
41; CHECK: test3
42; CHECK: store i32
43; CHECK: store atomic i32 2
44entry:
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)
52define void @test4()  nounwind uwtable ssp {
53; CHECK: test4
54; CHECK-NOT: store atomic
55; CHECK: store i32 1
56entry:
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)
63define void @test5()  nounwind uwtable ssp {
64; CHECK: test5
65; CHECK: store atomic i32 1
66entry:
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)
73define void @test6()  nounwind uwtable ssp {
74; CHECK: test6
75; CHECK-NOT: store
76; CHECK: ret void
77entry:
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).
85define void @test7()  nounwind uwtable ssp {
86; CHECK: test7
87; CHECK: store atomic
88entry:
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).
96define i32 @test8()  nounwind uwtable ssp {
97; CHECK: test8
98; CHECK: store
99; CHECK: load atomic
100entry:
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