Skip to content

Commit 76a3be7

Browse files
committed
AMDGPU: Add baseline tests for bad bitcasting of atomic load/store
1 parent 2a95022 commit 76a3be7

File tree

2 files changed

+374
-0
lines changed

2 files changed

+374
-0
lines changed
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand %s | FileCheck %s
3+
4+
; Make sure atomic loads are not bitcasted and lose metadata
5+
6+
define float @load_atomic_f32_global_system(ptr addrspace(1) %ptr) {
7+
; CHECK-LABEL: define float @load_atomic_f32_global_system(
8+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
9+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr addrspace(1) [[PTR]] seq_cst, align 4
10+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float
11+
; CHECK-NEXT: ret float [[TMP2]]
12+
;
13+
%ld = load atomic float, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0
14+
ret float %ld
15+
}
16+
17+
define float @load_atomic_f32_global_agent(ptr addrspace(1) %ptr) {
18+
; CHECK-LABEL: define float @load_atomic_f32_global_agent(
19+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
20+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4
21+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float
22+
; CHECK-NEXT: ret float [[TMP2]]
23+
;
24+
%ld = load atomic float, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0
25+
ret float %ld
26+
}
27+
28+
define float @load_atomic_f32_local(ptr addrspace(3) %ptr) {
29+
; CHECK-LABEL: define float @load_atomic_f32_local(
30+
; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) {
31+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr addrspace(3) [[PTR]] seq_cst, align 4
32+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float
33+
; CHECK-NEXT: ret float [[TMP2]]
34+
;
35+
%ld = load atomic float, ptr addrspace(3) %ptr seq_cst, align 4, !some.unknown.md !0
36+
ret float %ld
37+
}
38+
39+
define float @load_atomic_f32_flat_system(ptr %ptr) {
40+
; CHECK-LABEL: define float @load_atomic_f32_flat_system(
41+
; CHECK-SAME: ptr [[PTR:%.*]]) {
42+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[PTR]] seq_cst, align 4
43+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float
44+
; CHECK-NEXT: ret float [[TMP2]]
45+
;
46+
%ld = load atomic float, ptr %ptr seq_cst, align 4, !some.unknown.md !0
47+
ret float %ld
48+
}
49+
50+
define float @load_atomic_f32_flat_agent(ptr %ptr) {
51+
; CHECK-LABEL: define float @load_atomic_f32_flat_agent(
52+
; CHECK-SAME: ptr [[PTR:%.*]]) {
53+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[PTR]] syncscope("agent") seq_cst, align 4
54+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float
55+
; CHECK-NEXT: ret float [[TMP2]]
56+
;
57+
%ld = load atomic float, ptr %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0
58+
ret float %ld
59+
}
60+
61+
define half @load_atomic_f16_global_system(ptr addrspace(1) %ptr) {
62+
; CHECK-LABEL: define half @load_atomic_f16_global_system(
63+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
64+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr addrspace(1) [[PTR]] seq_cst, align 4
65+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to half
66+
; CHECK-NEXT: ret half [[TMP2]]
67+
;
68+
%ld = load atomic half, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0
69+
ret half %ld
70+
}
71+
72+
define half @load_atomic_f16_global_agent(ptr addrspace(1) %ptr) {
73+
; CHECK-LABEL: define half @load_atomic_f16_global_agent(
74+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
75+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4
76+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to half
77+
; CHECK-NEXT: ret half [[TMP2]]
78+
;
79+
%ld = load atomic half, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0
80+
ret half %ld
81+
}
82+
83+
define half @load_atomic_f16_local(ptr addrspace(3) %ptr) {
84+
; CHECK-LABEL: define half @load_atomic_f16_local(
85+
; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) {
86+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr addrspace(3) [[PTR]] seq_cst, align 2
87+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to half
88+
; CHECK-NEXT: ret half [[TMP2]]
89+
;
90+
%ld = load atomic half, ptr addrspace(3) %ptr seq_cst, align 2, !some.unknown.md !0
91+
ret half %ld
92+
}
93+
94+
define bfloat @load_atomic_bf16_global_system(ptr addrspace(1) %ptr) {
95+
; CHECK-LABEL: define bfloat @load_atomic_bf16_global_system(
96+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
97+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr addrspace(1) [[PTR]] seq_cst, align 2
98+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to bfloat
99+
; CHECK-NEXT: ret bfloat [[TMP2]]
100+
;
101+
%ld = load atomic bfloat, ptr addrspace(1) %ptr seq_cst, align 2, !some.unknown.md !0
102+
ret bfloat %ld
103+
}
104+
105+
define bfloat @load_atomic_bf16_global_agent(ptr addrspace(1) %ptr) {
106+
; CHECK-LABEL: define bfloat @load_atomic_bf16_global_agent(
107+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
108+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 2
109+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to bfloat
110+
; CHECK-NEXT: ret bfloat [[TMP2]]
111+
;
112+
%ld = load atomic bfloat, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 2, !some.unknown.md !0
113+
ret bfloat %ld
114+
}
115+
116+
define bfloat @load_atomic_bf16_local(ptr addrspace(3) %ptr) {
117+
; CHECK-LABEL: define bfloat @load_atomic_bf16_local(
118+
; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) {
119+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr addrspace(3) [[PTR]] seq_cst, align 2
120+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to bfloat
121+
; CHECK-NEXT: ret bfloat [[TMP2]]
122+
;
123+
%ld = load atomic bfloat, ptr addrspace(3) %ptr seq_cst, align 2, !some.unknown.md !0
124+
ret bfloat %ld
125+
}
126+
127+
define bfloat @load_atomic_bf16_flat(ptr %ptr) {
128+
; CHECK-LABEL: define bfloat @load_atomic_bf16_flat(
129+
; CHECK-SAME: ptr [[PTR:%.*]]) {
130+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i16, ptr [[PTR]] seq_cst, align 2
131+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i16 [[TMP1]] to bfloat
132+
; CHECK-NEXT: ret bfloat [[TMP2]]
133+
;
134+
%ld = load atomic bfloat, ptr %ptr seq_cst, align 2, !some.unknown.md !0
135+
ret bfloat %ld
136+
}
137+
138+
define double @load_atomic_f64_global_system(ptr addrspace(1) %ptr) {
139+
; CHECK-LABEL: define double @load_atomic_f64_global_system(
140+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
141+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i64, ptr addrspace(1) [[PTR]] seq_cst, align 8
142+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i64 [[TMP1]] to double
143+
; CHECK-NEXT: ret double [[TMP2]]
144+
;
145+
%ld = load atomic double, ptr addrspace(1) %ptr seq_cst, align 8, !some.unknown.md !0
146+
ret double %ld
147+
}
148+
149+
define double @load_atomic_f64_global_agent(ptr addrspace(1) %ptr) {
150+
; CHECK-LABEL: define double @load_atomic_f64_global_agent(
151+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
152+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i64, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 8
153+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i64 [[TMP1]] to double
154+
; CHECK-NEXT: ret double [[TMP2]]
155+
;
156+
%ld = load atomic double, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 8, !some.unknown.md !0
157+
ret double %ld
158+
}
159+
160+
define double @load_atomic_f64_local(ptr addrspace(3) %ptr) {
161+
; CHECK-LABEL: define double @load_atomic_f64_local(
162+
; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) {
163+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i64, ptr addrspace(3) [[PTR]] seq_cst, align 8
164+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i64 [[TMP1]] to double
165+
; CHECK-NEXT: ret double [[TMP2]]
166+
;
167+
%ld = load atomic double, ptr addrspace(3) %ptr seq_cst, align 8, !some.unknown.md !0
168+
ret double %ld
169+
}
170+
171+
define double @load_atomic_f64_flat_system(ptr %ptr) {
172+
; CHECK-LABEL: define double @load_atomic_f64_flat_system(
173+
; CHECK-SAME: ptr [[PTR:%.*]]) {
174+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i64, ptr [[PTR]] seq_cst, align 8
175+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i64 [[TMP1]] to double
176+
; CHECK-NEXT: ret double [[TMP2]]
177+
;
178+
%ld = load atomic double, ptr %ptr seq_cst, align 8, !some.unknown.md !0
179+
ret double %ld
180+
}
181+
182+
define double @load_atomic_f64_flat_agent(ptr %ptr) {
183+
; CHECK-LABEL: define double @load_atomic_f64_flat_agent(
184+
; CHECK-SAME: ptr [[PTR:%.*]]) {
185+
; CHECK-NEXT: [[TMP1:%.*]] = load atomic i64, ptr [[PTR]] syncscope("agent") seq_cst, align 8
186+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i64 [[TMP1]] to double
187+
; CHECK-NEXT: ret double [[TMP2]]
188+
;
189+
%ld = load atomic double, ptr %ptr syncscope("agent") seq_cst, align 8, !some.unknown.md !0
190+
ret double %ld
191+
}
192+
193+
!0 = !{}
194+
195+
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand %s | FileCheck %s
3+
4+
define void @store_atomic_f32_global_system(float %val, ptr addrspace(1) %ptr) {
5+
; CHECK-LABEL: define void @store_atomic_f32_global_system(
6+
; CHECK-SAME: float [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
7+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[VAL]] to i32
8+
; CHECK-NEXT: store atomic i32 [[TMP1]], ptr addrspace(1) [[PTR]] seq_cst, align 4
9+
; CHECK-NEXT: ret void
10+
;
11+
store atomic float %val, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0
12+
ret void
13+
}
14+
15+
define void @store_atomic_f32_global_agent(float %val, ptr addrspace(1) %ptr) {
16+
; CHECK-LABEL: define void @store_atomic_f32_global_agent(
17+
; CHECK-SAME: float [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
18+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[VAL]] to i32
19+
; CHECK-NEXT: store atomic i32 [[TMP1]], ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4
20+
; CHECK-NEXT: ret void
21+
;
22+
store atomic float %val, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0
23+
ret void
24+
}
25+
26+
define void @store_atomic_f32_local(float %val, ptr addrspace(3) %ptr) {
27+
; CHECK-LABEL: define void @store_atomic_f32_local(
28+
; CHECK-SAME: float [[VAL:%.*]], ptr addrspace(3) [[PTR:%.*]]) {
29+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[VAL]] to i32
30+
; CHECK-NEXT: store atomic i32 [[TMP1]], ptr addrspace(3) [[PTR]] seq_cst, align 4
31+
; CHECK-NEXT: ret void
32+
;
33+
store atomic float %val, ptr addrspace(3) %ptr seq_cst, align 4, !some.unknown.md !0
34+
ret void
35+
}
36+
37+
define void @store_atomic_f32_flat(float %val, ptr %ptr) {
38+
; CHECK-LABEL: define void @store_atomic_f32_flat(
39+
; CHECK-SAME: float [[VAL:%.*]], ptr [[PTR:%.*]]) {
40+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[VAL]] to i32
41+
; CHECK-NEXT: store atomic i32 [[TMP1]], ptr [[PTR]] seq_cst, align 4
42+
; CHECK-NEXT: ret void
43+
;
44+
store atomic float %val, ptr %ptr seq_cst, align 4, !some.unknown.md !0
45+
ret void
46+
}
47+
48+
define void @store_atomic_f16_global_system(half %val, ptr addrspace(1) %ptr) {
49+
; CHECK-LABEL: define void @store_atomic_f16_global_system(
50+
; CHECK-SAME: half [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
51+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast half [[VAL]] to i16
52+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr addrspace(1) [[PTR]] seq_cst, align 4
53+
; CHECK-NEXT: ret void
54+
;
55+
store atomic half %val, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0
56+
ret void
57+
}
58+
59+
define void @store_atomic_f16_global_agent(half %val, ptr addrspace(1) %ptr) {
60+
; CHECK-LABEL: define void @store_atomic_f16_global_agent(
61+
; CHECK-SAME: half [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
62+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast half [[VAL]] to i16
63+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4
64+
; CHECK-NEXT: ret void
65+
;
66+
store atomic half %val, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0
67+
ret void
68+
}
69+
70+
define void @store_atomic_f16_local(half %val, ptr addrspace(3) %ptr) {
71+
; CHECK-LABEL: define void @store_atomic_f16_local(
72+
; CHECK-SAME: half [[VAL:%.*]], ptr addrspace(3) [[PTR:%.*]]) {
73+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast half [[VAL]] to i16
74+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr addrspace(3) [[PTR]] seq_cst, align 4
75+
; CHECK-NEXT: ret void
76+
;
77+
store atomic half %val, ptr addrspace(3) %ptr seq_cst, align 4, !some.unknown.md !0
78+
ret void
79+
}
80+
81+
define void @store_atomic_f16_flat(half %val, ptr %ptr) {
82+
; CHECK-LABEL: define void @store_atomic_f16_flat(
83+
; CHECK-SAME: half [[VAL:%.*]], ptr [[PTR:%.*]]) {
84+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast half [[VAL]] to i16
85+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr [[PTR]] seq_cst, align 4
86+
; CHECK-NEXT: ret void
87+
;
88+
store atomic half %val, ptr %ptr seq_cst, align 4, !some.unknown.md !0
89+
ret void
90+
}
91+
92+
define void @store_atomic_bf16_global_system(bfloat %val, ptr addrspace(1) %ptr) {
93+
; CHECK-LABEL: define void @store_atomic_bf16_global_system(
94+
; CHECK-SAME: bfloat [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
95+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast bfloat [[VAL]] to i16
96+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr addrspace(1) [[PTR]] seq_cst, align 4
97+
; CHECK-NEXT: ret void
98+
;
99+
store atomic bfloat %val, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0
100+
ret void
101+
}
102+
103+
define void @store_atomic_bf16_global_agent(bfloat %val, ptr addrspace(1) %ptr) {
104+
; CHECK-LABEL: define void @store_atomic_bf16_global_agent(
105+
; CHECK-SAME: bfloat [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
106+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast bfloat [[VAL]] to i16
107+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4
108+
; CHECK-NEXT: ret void
109+
;
110+
store atomic bfloat %val, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0
111+
ret void
112+
}
113+
114+
define void @store_atomic_bf16_local(bfloat %val, ptr addrspace(3) %ptr) {
115+
; CHECK-LABEL: define void @store_atomic_bf16_local(
116+
; CHECK-SAME: bfloat [[VAL:%.*]], ptr addrspace(3) [[PTR:%.*]]) {
117+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast bfloat [[VAL]] to i16
118+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr addrspace(3) [[PTR]] seq_cst, align 4
119+
; CHECK-NEXT: ret void
120+
;
121+
store atomic bfloat %val, ptr addrspace(3) %ptr seq_cst, align 4, !some.unknown.md !0
122+
ret void
123+
}
124+
125+
define void @store_atomic_bf16_flat(bfloat %val, ptr %ptr) {
126+
; CHECK-LABEL: define void @store_atomic_bf16_flat(
127+
; CHECK-SAME: bfloat [[VAL:%.*]], ptr [[PTR:%.*]]) {
128+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast bfloat [[VAL]] to i16
129+
; CHECK-NEXT: store atomic i16 [[TMP1]], ptr [[PTR]] seq_cst, align 4
130+
; CHECK-NEXT: ret void
131+
;
132+
store atomic bfloat %val, ptr %ptr seq_cst, align 4, !some.unknown.md !0
133+
ret void
134+
}
135+
define void @store_atomic_f64_global_system(double %val, ptr addrspace(1) %ptr) {
136+
; CHECK-LABEL: define void @store_atomic_f64_global_system(
137+
; CHECK-SAME: double [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
138+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[VAL]] to i64
139+
; CHECK-NEXT: store atomic i64 [[TMP1]], ptr addrspace(1) [[PTR]] seq_cst, align 8
140+
; CHECK-NEXT: ret void
141+
;
142+
store atomic double %val, ptr addrspace(1) %ptr seq_cst, align 8, !some.unknown.md !0
143+
ret void
144+
}
145+
146+
define void @store_atomic_f64_global_agent(double %val, ptr addrspace(1) %ptr) {
147+
; CHECK-LABEL: define void @store_atomic_f64_global_agent(
148+
; CHECK-SAME: double [[VAL:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
149+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[VAL]] to i64
150+
; CHECK-NEXT: store atomic i64 [[TMP1]], ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 8
151+
; CHECK-NEXT: ret void
152+
;
153+
store atomic double %val, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 8, !some.unknown.md !0
154+
ret void
155+
}
156+
157+
define void @store_atomic_f64_local(double %val, ptr addrspace(3) %ptr) {
158+
; CHECK-LABEL: define void @store_atomic_f64_local(
159+
; CHECK-SAME: double [[VAL:%.*]], ptr addrspace(3) [[PTR:%.*]]) {
160+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[VAL]] to i64
161+
; CHECK-NEXT: store atomic i64 [[TMP1]], ptr addrspace(3) [[PTR]] seq_cst, align 8
162+
; CHECK-NEXT: ret void
163+
;
164+
store atomic double %val, ptr addrspace(3) %ptr seq_cst, align 8, !some.unknown.md !0
165+
ret void
166+
}
167+
168+
define void @store_atomic_f64_flat(double %val, ptr %ptr) {
169+
; CHECK-LABEL: define void @store_atomic_f64_flat(
170+
; CHECK-SAME: double [[VAL:%.*]], ptr [[PTR:%.*]]) {
171+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[VAL]] to i64
172+
; CHECK-NEXT: store atomic i64 [[TMP1]], ptr [[PTR]] seq_cst, align 8
173+
; CHECK-NEXT: ret void
174+
;
175+
store atomic double %val, ptr %ptr seq_cst, align 8, !some.unknown.md !0
176+
ret void
177+
}
178+
179+
!0 = !{}

0 commit comments

Comments
 (0)