[WebAssembly] Don't perform the returned-argument optimization on constants.
[oota-llvm.git] / test / CodeGen / NVPTX / atomics.ll
1 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2
3
4 ; CHECK-LABEL: atom0
5 define i32 @atom0(i32* %addr, i32 %val) {
6 ; CHECK: atom.add.u32
7   %ret = atomicrmw add i32* %addr, i32 %val seq_cst
8   ret i32 %ret
9 }
10
11 ; CHECK-LABEL: atom1
12 define i64 @atom1(i64* %addr, i64 %val) {
13 ; CHECK: atom.add.u64
14   %ret = atomicrmw add i64* %addr, i64 %val seq_cst
15   ret i64 %ret
16 }
17
18 ; CHECK-LABEL: atom2
19 define i32 @atom2(i32* %subr, i32 %val) {
20 ; CHECK: neg.s32
21 ; CHECK: atom.add.u32
22   %ret = atomicrmw sub i32* %subr, i32 %val seq_cst
23   ret i32 %ret
24 }
25
26 ; CHECK-LABEL: atom3
27 define i64 @atom3(i64* %subr, i64 %val) {
28 ; CHECK: neg.s64
29 ; CHECK: atom.add.u64
30   %ret = atomicrmw sub i64* %subr, i64 %val seq_cst
31   ret i64 %ret
32 }
33
34 ; CHECK-LABEL: atom4
35 define i32 @atom4(i32* %subr, i32 %val) {
36 ; CHECK: atom.and.b32
37   %ret = atomicrmw and i32* %subr, i32 %val seq_cst
38   ret i32 %ret
39 }
40
41 ; CHECK-LABEL: atom5
42 define i64 @atom5(i64* %subr, i64 %val) {
43 ; CHECK: atom.and.b64
44   %ret = atomicrmw and i64* %subr, i64 %val seq_cst
45   ret i64 %ret
46 }
47
48 ;; NAND not yet supported
49 ;define i32 @atom6(i32* %subr, i32 %val) {
50 ;  %ret = atomicrmw nand i32* %subr, i32 %val seq_cst
51 ;  ret i32 %ret
52 ;}
53
54 ;define i64 @atom7(i64* %subr, i64 %val) {
55 ;  %ret = atomicrmw nand i64* %subr, i64 %val seq_cst
56 ;  ret i64 %ret
57 ;}
58
59 ; CHECK-LABEL: atom8
60 define i32 @atom8(i32* %subr, i32 %val) {
61 ; CHECK: atom.or.b32
62   %ret = atomicrmw or i32* %subr, i32 %val seq_cst
63   ret i32 %ret
64 }
65
66 ; CHECK-LABEL: atom9
67 define i64 @atom9(i64* %subr, i64 %val) {
68 ; CHECK: atom.or.b64
69   %ret = atomicrmw or i64* %subr, i64 %val seq_cst
70   ret i64 %ret
71 }
72
73 ; CHECK-LABEL: atom10
74 define i32 @atom10(i32* %subr, i32 %val) {
75 ; CHECK: atom.xor.b32
76   %ret = atomicrmw xor i32* %subr, i32 %val seq_cst
77   ret i32 %ret
78 }
79
80 ; CHECK-LABEL: atom11
81 define i64 @atom11(i64* %subr, i64 %val) {
82 ; CHECK: atom.xor.b64
83   %ret = atomicrmw xor i64* %subr, i64 %val seq_cst
84   ret i64 %ret
85 }
86
87 ; CHECK-LABEL: atom12
88 define i32 @atom12(i32* %subr, i32 %val) {
89 ; CHECK: atom.max.s32
90   %ret = atomicrmw max i32* %subr, i32 %val seq_cst
91   ret i32 %ret
92 }
93
94 ; CHECK-LABEL: atom13
95 define i64 @atom13(i64* %subr, i64 %val) {
96 ; CHECK: atom.max.s64
97   %ret = atomicrmw max i64* %subr, i64 %val seq_cst
98   ret i64 %ret
99 }
100
101 ; CHECK-LABEL: atom14
102 define i32 @atom14(i32* %subr, i32 %val) {
103 ; CHECK: atom.min.s32
104   %ret = atomicrmw min i32* %subr, i32 %val seq_cst
105   ret i32 %ret
106 }
107
108 ; CHECK-LABEL: atom15
109 define i64 @atom15(i64* %subr, i64 %val) {
110 ; CHECK: atom.min.s64
111   %ret = atomicrmw min i64* %subr, i64 %val seq_cst
112   ret i64 %ret
113 }
114
115 ; CHECK-LABEL: atom16
116 define i32 @atom16(i32* %subr, i32 %val) {
117 ; CHECK: atom.max.u32
118   %ret = atomicrmw umax i32* %subr, i32 %val seq_cst
119   ret i32 %ret
120 }
121
122 ; CHECK-LABEL: atom17
123 define i64 @atom17(i64* %subr, i64 %val) {
124 ; CHECK: atom.max.u64
125   %ret = atomicrmw umax i64* %subr, i64 %val seq_cst
126   ret i64 %ret
127 }
128
129 ; CHECK-LABEL: atom18
130 define i32 @atom18(i32* %subr, i32 %val) {
131 ; CHECK: atom.min.u32
132   %ret = atomicrmw umin i32* %subr, i32 %val seq_cst
133   ret i32 %ret
134 }
135
136 ; CHECK-LABEL: atom19
137 define i64 @atom19(i64* %subr, i64 %val) {
138 ; CHECK: atom.min.u64
139   %ret = atomicrmw umin i64* %subr, i64 %val seq_cst
140   ret i64 %ret
141 }
142
143 declare float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
144
145 ; CHECK-LABEL: atomic_add_f32_generic
146 define float @atomic_add_f32_generic(float* %addr, float %val) {
147 ; CHECK: atom.add.f32
148   %ret = call float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
149   ret float %ret
150 }
151
152 declare float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
153
154 ; CHECK-LABEL: atomic_add_f32_addrspace1
155 define float @atomic_add_f32_addrspace1(float addrspace(1)* %addr, float %val) {
156 ; CHECK: atom.global.add.f32
157   %ret = call float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
158   ret float %ret
159 }
160
161 declare float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
162
163 ; CHECK-LABEL: atomic_add_f32_addrspace3
164 define float @atomic_add_f32_addrspace3(float addrspace(3)* %addr, float %val) {
165 ; CHECK: atom.shared.add.f32
166   %ret = call float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
167   ret float %ret
168 }
169
170 ; CHECK-LABEL: atomic_cmpxchg_i32
171 define i32 @atomic_cmpxchg_i32(i32* %addr, i32 %cmp, i32 %new) {
172 ; CHECK: atom.cas.b32
173   %pairold = cmpxchg i32* %addr, i32 %cmp, i32 %new seq_cst seq_cst
174   ret i32 %new
175 }
176
177 ; CHECK-LABEL: atomic_cmpxchg_i64
178 define i64 @atomic_cmpxchg_i64(i64* %addr, i64 %cmp, i64 %new) {
179 ; CHECK: atom.cas.b64
180   %pairold = cmpxchg i64* %addr, i64 %cmp, i64 %new seq_cst seq_cst
181   ret i64 %new
182 }