[EarlyCSE] Value forwarding for unordered atomics
[oota-llvm.git] / test / Transforms / EarlyCSE / atomics.ll
1 ; RUN: opt < %s -S -early-cse | FileCheck %s
2
3 ; CHECK-LABEL: @test12(
4 define i32 @test12(i1 %B, i32* %P1, i32* %P2) {
5   %load0 = load i32, i32* %P1
6   %1 = load atomic i32, i32* %P2 seq_cst, align 4
7   %load1 = load i32, i32* %P1
8   %sel = select i1 %B, i32 %load0, i32 %load1
9   ret i32 %sel
10   ; CHECK: load i32, i32* %P1
11   ; CHECK: load i32, i32* %P1
12 }
13
14 ; CHECK-LABEL: @test13(
15 ; atomic to non-atomic forwarding is legal
16 define i32 @test13(i1 %B, i32* %P1) {
17   %a = load atomic i32, i32* %P1 seq_cst, align 4
18   %b = load i32, i32* %P1
19   %res = sub i32 %a, %b
20   ret i32 %res
21   ; CHECK: load atomic i32, i32* %P1
22   ; CHECK: ret i32 0
23 }
24
25 ; CHECK-LABEL: @test14(
26 ; atomic to unordered atomic forwarding is legal
27 define i32 @test14(i1 %B, i32* %P1) {
28   %a = load atomic i32, i32* %P1 seq_cst, align 4
29   %b = load atomic i32, i32* %P1 unordered, align 4
30   %res = sub i32 %a, %b
31   ret i32 %res
32   ; CHECK: load atomic i32, i32* %P1
33   ; CHECK: ret i32 0
34 }
35
36 ; CHECK-LABEL: @test15(
37 ; implementation restiction: can't forward to stonger
38 ; than unordered
39 define i32 @test15(i1 %B, i32* %P1, i32* %P2) {
40   %a = load atomic i32, i32* %P1 seq_cst, align 4
41   %b = load atomic i32, i32* %P1 seq_cst, align 4
42   %res = sub i32 %a, %b
43   ret i32 %res
44   ; CHECK: load atomic i32, i32* %P1
45   ; CHECK: load atomic i32, i32* %P1
46 }
47
48 ; CHECK-LABEL: @test16(
49 ; forwarding non-atomic to atomic is wrong! (However,
50 ; it would be legal to use the later value in place of the
51 ; former in this particular example.  We just don't
52 ; do that right now.)
53 define i32 @test16(i1 %B, i32* %P1, i32* %P2) {
54   %a = load i32, i32* %P1, align 4
55   %b = load atomic i32, i32* %P1 unordered, align 4
56   %res = sub i32 %a, %b
57   ret i32 %res
58   ; CHECK: load i32, i32* %P1
59   ; CHECK: load atomic i32, i32* %P1
60 }
61
62 ; Can't DSE across a full fence
63 define void @test17(i1 %B, i32* %P1, i32* %P2) {
64 ; CHECK-LABEL: @test17
65 ; CHECK: store
66 ; CHECK: store atomic
67 ; CHECK: store
68   store i32 0, i32* %P1, align 4
69   store atomic i32 0, i32* %P2 seq_cst, align 4
70   store i32 0, i32* %P1, align 4
71   ret void
72 }
73
74 ; Can't remove a volatile load
75 define i32 @test18(i1 %B, i32* %P1, i32* %P2) {
76   %a = load i32, i32* %P1, align 4
77   %b = load volatile i32, i32* %P1, align 4
78   %res = sub i32 %a, %b
79   ret i32 %res
80   ; CHECK-LABEL: @test18
81   ; CHECK: load i32, i32* %P1
82   ; CHECK: load volatile i32, i32* %P1
83 }
84
85 ; Can't DSE a volatile store
86 define void @test19(i1 %B, i32* %P1, i32* %P2) {
87 ; CHECK-LABEL: @test19
88 ; CHECK: store volatile
89 ; CHECK: store
90   store volatile i32 0, i32* %P1, align 4
91   store i32 3, i32* %P1, align 4
92   ret void
93 }
94
95 ; Can value forward from volailes
96 define i32 @test20(i1 %B, i32* %P1, i32* %P2) {
97   %a = load volatile i32, i32* %P1, align 4
98   %b = load i32, i32* %P1, align 4
99   %res = sub i32 %a, %b
100   ret i32 %res
101   ; CHECK-LABEL: @test20
102   ; CHECK: load volatile i32, i32* %P1
103   ; CHECK: ret i32 0
104 }
105
106 ; Can DSE a non-volatile store in favor of a volatile one
107 ; currently a missed optimization
108 define void @test21(i1 %B, i32* %P1, i32* %P2) {
109 ; CHECK-LABEL: @test21
110 ; CHECK: store 
111 ; CHECK: store volatile
112   store i32 0, i32* %P1, align 4
113   store volatile i32 3, i32* %P1, align 4
114   ret void
115 }
116
117 ; Can DSE a normal store in favor of a unordered one
118 define void @test22(i1 %B, i32* %P1, i32* %P2) {
119 ; CHECK-LABEL: @test22
120 ; CHECK-NEXT: store atomic
121   store i32 0, i32* %P1, align 4
122   store atomic i32 3, i32* %P1 unordered, align 4
123   ret void
124 }
125
126
127