Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / AtomicExpand / AMDGPU / expand-atomic-rmw-fmax.ll
blob9dfbe9b4eb7413d180b9a10297a1dcd8c7cf67ca
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -atomic-expand %s | FileCheck -check-prefix=GCN %s
3 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -atomic-expand %s | FileCheck -check-prefix=GCN %s
5 define float @test_atomicrmw_fmax_f32_flat(ptr %ptr, float %value) {
6 ; GCN-LABEL: @test_atomicrmw_fmax_f32_flat(
7 ; GCN-NEXT:    [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4
8 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
9 ; GCN:       atomicrmw.start:
10 ; GCN-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
11 ; GCN-NEXT:    [[TMP2:%.*]] = call float @llvm.maxnum.f32(float [[LOADED]], float [[VALUE:%.*]])
12 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast float [[TMP2]] to i32
13 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
14 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4
15 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
16 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
17 ; GCN-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
18 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
19 ; GCN:       atomicrmw.end:
20 ; GCN-NEXT:    ret float [[TMP6]]
22   %res = atomicrmw fmax ptr %ptr, float %value seq_cst
23   ret float %res
26 define float @test_atomicrmw_fmax_f32_global(ptr addrspace(1) %ptr, float %value) {
27 ; GCN-LABEL: @test_atomicrmw_fmax_f32_global(
28 ; GCN-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(1) [[PTR:%.*]], align 4
29 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
30 ; GCN:       atomicrmw.start:
31 ; GCN-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
32 ; GCN-NEXT:    [[TMP2:%.*]] = call float @llvm.maxnum.f32(float [[LOADED]], float [[VALUE:%.*]])
33 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast float [[TMP2]] to i32
34 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
35 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4
36 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
37 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
38 ; GCN-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
39 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
40 ; GCN:       atomicrmw.end:
41 ; GCN-NEXT:    ret float [[TMP6]]
43   %res = atomicrmw fmax ptr addrspace(1) %ptr, float %value seq_cst
44   ret float %res
47 define float @test_atomicrmw_fmax_f32_local(ptr addrspace(3) %ptr, float %value) {
48 ; GCN-LABEL: @test_atomicrmw_fmax_f32_local(
49 ; GCN-NEXT:    [[TMP1:%.*]] = load float, ptr addrspace(3) [[PTR:%.*]], align 4
50 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
51 ; GCN:       atomicrmw.start:
52 ; GCN-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
53 ; GCN-NEXT:    [[TMP2:%.*]] = call float @llvm.maxnum.f32(float [[LOADED]], float [[VALUE:%.*]])
54 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast float [[TMP2]] to i32
55 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
56 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(3) [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4
57 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
58 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
59 ; GCN-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
60 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
61 ; GCN:       atomicrmw.end:
62 ; GCN-NEXT:    ret float [[TMP6]]
64   %res = atomicrmw fmax ptr addrspace(3) %ptr, float %value seq_cst
65   ret float %res
68 define half @test_atomicrmw_fmax_f16_flat(ptr %ptr, half %value) {
69 ; GCN-LABEL: @test_atomicrmw_fmax_f16_flat(
70 ; GCN-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)
71 ; GCN-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i64
72 ; GCN-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3
73 ; GCN-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3
74 ; GCN-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32
75 ; GCN-NEXT:    [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]
76 ; GCN-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1
77 ; GCN-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 4
78 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
79 ; GCN:       atomicrmw.start:
80 ; GCN-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
81 ; GCN-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]
82 ; GCN-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
83 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast i16 [[EXTRACTED]] to half
84 ; GCN-NEXT:    [[TMP5:%.*]] = call half @llvm.maxnum.f16(half [[TMP4]], half [[VALUE:%.*]])
85 ; GCN-NEXT:    [[TMP6:%.*]] = bitcast half [[TMP5]] to i16
86 ; GCN-NEXT:    [[EXTENDED:%.*]] = zext i16 [[TMP6]] to i32
87 ; GCN-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]
88 ; GCN-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
89 ; GCN-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]
90 ; GCN-NEXT:    [[TMP7:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
91 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 1
92 ; GCN-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 0
93 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
94 ; GCN:       atomicrmw.end:
95 ; GCN-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]
96 ; GCN-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i16
97 ; GCN-NEXT:    [[TMP8:%.*]] = bitcast i16 [[EXTRACTED3]] to half
98 ; GCN-NEXT:    ret half [[TMP8]]
100   %res = atomicrmw fmax ptr %ptr, half %value seq_cst
101   ret half %res
104 define half @test_atomicrmw_fmax_f16_global(ptr addrspace(1) %ptr, half %value) {
105 ; GCN-LABEL: @test_atomicrmw_fmax_f16_global(
106 ; GCN-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)
107 ; GCN-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64
108 ; GCN-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3
109 ; GCN-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3
110 ; GCN-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32
111 ; GCN-NEXT:    [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]
112 ; GCN-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1
113 ; GCN-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4
114 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
115 ; GCN:       atomicrmw.start:
116 ; GCN-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
117 ; GCN-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]
118 ; GCN-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
119 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast i16 [[EXTRACTED]] to half
120 ; GCN-NEXT:    [[TMP5:%.*]] = call half @llvm.maxnum.f16(half [[TMP4]], half [[VALUE:%.*]])
121 ; GCN-NEXT:    [[TMP6:%.*]] = bitcast half [[TMP5]] to i16
122 ; GCN-NEXT:    [[EXTENDED:%.*]] = zext i16 [[TMP6]] to i32
123 ; GCN-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]
124 ; GCN-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
125 ; GCN-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]
126 ; GCN-NEXT:    [[TMP7:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
127 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 1
128 ; GCN-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 0
129 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
130 ; GCN:       atomicrmw.end:
131 ; GCN-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]
132 ; GCN-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i16
133 ; GCN-NEXT:    [[TMP8:%.*]] = bitcast i16 [[EXTRACTED3]] to half
134 ; GCN-NEXT:    ret half [[TMP8]]
136   %res = atomicrmw fmax ptr addrspace(1) %ptr, half %value seq_cst
137   ret half %res
140 define half @test_atomicrmw_fmax_f16_global_align4(ptr addrspace(1) %ptr, half %value) {
141 ; GCN-LABEL: @test_atomicrmw_fmax_f16_global_align4(
142 ; GCN-NEXT:    [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 4
143 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
144 ; GCN:       atomicrmw.start:
145 ; GCN-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
146 ; GCN-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i16
147 ; GCN-NEXT:    [[TMP2:%.*]] = bitcast i16 [[EXTRACTED]] to half
148 ; GCN-NEXT:    [[TMP3:%.*]] = call half @llvm.maxnum.f16(half [[TMP2]], half [[VALUE:%.*]])
149 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast half [[TMP3]] to i16
150 ; GCN-NEXT:    [[EXTENDED:%.*]] = zext i16 [[TMP4]] to i32
151 ; GCN-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], -65536
152 ; GCN-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]
153 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
154 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
155 ; GCN-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0
156 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
157 ; GCN:       atomicrmw.end:
158 ; GCN-NEXT:    [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i16
159 ; GCN-NEXT:    [[TMP6:%.*]] = bitcast i16 [[EXTRACTED1]] to half
160 ; GCN-NEXT:    ret half [[TMP6]]
162   %res = atomicrmw fmax ptr addrspace(1) %ptr, half %value seq_cst, align 4
163   ret half %res
166 define half @test_atomicrmw_fmax_f16_local(ptr addrspace(3) %ptr, half %value) {
167 ; GCN-LABEL: @test_atomicrmw_fmax_f16_local(
168 ; GCN-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[PTR:%.*]], i32 -4)
169 ; GCN-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(3) [[PTR]] to i32
170 ; GCN-NEXT:    [[PTRLSB:%.*]] = and i32 [[TMP1]], 3
171 ; GCN-NEXT:    [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3
172 ; GCN-NEXT:    [[MASK:%.*]] = shl i32 65535, [[TMP2]]
173 ; GCN-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1
174 ; GCN-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(3) [[ALIGNEDADDR]], align 4
175 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
176 ; GCN:       atomicrmw.start:
177 ; GCN-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
178 ; GCN-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]
179 ; GCN-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
180 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast i16 [[EXTRACTED]] to half
181 ; GCN-NEXT:    [[TMP5:%.*]] = call half @llvm.maxnum.f16(half [[TMP4]], half [[VALUE:%.*]])
182 ; GCN-NEXT:    [[TMP6:%.*]] = bitcast half [[TMP5]] to i16
183 ; GCN-NEXT:    [[EXTENDED:%.*]] = zext i16 [[TMP6]] to i32
184 ; GCN-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]
185 ; GCN-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]
186 ; GCN-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]
187 ; GCN-NEXT:    [[TMP7:%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4
188 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 1
189 ; GCN-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 0
190 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
191 ; GCN:       atomicrmw.end:
192 ; GCN-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]
193 ; GCN-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i16
194 ; GCN-NEXT:    [[TMP8:%.*]] = bitcast i16 [[EXTRACTED3]] to half
195 ; GCN-NEXT:    ret half [[TMP8]]
197   %res = atomicrmw fmax ptr addrspace(3) %ptr, half %value seq_cst
198   ret half %res
201 define double @test_atomicrmw_fmax_f64_flat(ptr %ptr, double %value) {
202 ; GCN-LABEL: @test_atomicrmw_fmax_f64_flat(
203 ; GCN-NEXT:    [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8
204 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
205 ; GCN:       atomicrmw.start:
206 ; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
207 ; GCN-NEXT:    [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]])
208 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[TMP2]] to i64
209 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
210 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8
211 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
212 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
213 ; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
214 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
215 ; GCN:       atomicrmw.end:
216 ; GCN-NEXT:    ret double [[TMP6]]
218   %res = atomicrmw fmax ptr %ptr, double %value seq_cst
219   ret double %res
222 define double @test_atomicrmw_fmax_f64_global(ptr addrspace(1) %ptr, double %value) {
223 ; GCN-LABEL: @test_atomicrmw_fmax_f64_global(
224 ; GCN-NEXT:    [[TMP1:%.*]] = load double, ptr addrspace(1) [[PTR:%.*]], align 8
225 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
226 ; GCN:       atomicrmw.start:
227 ; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
228 ; GCN-NEXT:    [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]])
229 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[TMP2]] to i64
230 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
231 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8
232 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
233 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
234 ; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
235 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
236 ; GCN:       atomicrmw.end:
237 ; GCN-NEXT:    ret double [[TMP6]]
239   %res = atomicrmw fmax ptr addrspace(1) %ptr, double %value seq_cst
240   ret double %res
243 define double @test_atomicrmw_fmax_f64_local(ptr addrspace(3) %ptr, double %value) {
244 ; GCN-LABEL: @test_atomicrmw_fmax_f64_local(
245 ; GCN-NEXT:    [[TMP1:%.*]] = load double, ptr addrspace(3) [[PTR:%.*]], align 8
246 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
247 ; GCN:       atomicrmw.start:
248 ; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
249 ; GCN-NEXT:    [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]])
250 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[TMP2]] to i64
251 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
252 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(3) [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8
253 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
254 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
255 ; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
256 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
257 ; GCN:       atomicrmw.end:
258 ; GCN-NEXT:    ret double [[TMP6]]
260   %res = atomicrmw fmax ptr addrspace(3) %ptr, double %value seq_cst
261   ret double %res
264 define double @test_atomicrmw_fmax_f64_global_strictfp(ptr addrspace(1) %ptr, double %value) strictfp {
265 ; GCN-LABEL: @test_atomicrmw_fmax_f64_global_strictfp(
266 ; GCN-NEXT:    [[TMP1:%.*]] = load double, ptr addrspace(1) [[PTR:%.*]], align 8
267 ; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
268 ; GCN:       atomicrmw.start:
269 ; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
270 ; GCN-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]], metadata !"fpexcept.strict") #[[ATTR4:[0-9]+]]
271 ; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[TMP2]] to i64
272 ; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
273 ; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8
274 ; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
275 ; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
276 ; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
277 ; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
278 ; GCN:       atomicrmw.end:
279 ; GCN-NEXT:    ret double [[TMP6]]
281   %res = atomicrmw fmax ptr addrspace(1) %ptr, double %value seq_cst
282   ret double %res