Skip to content

Commit 2a84e1e

Browse files
authored
[msan][NFCI] Add tests for vector reduce fadd/fmul (llvm#125597)
Currently handled incorrectly by visitInstruction: - llvm.vector.reduce.fadd - llvm.vector.reduce.fmul Forked from llvm/test/CodeGen/X86/vector-reduce-f{add,mul}.ll
1 parent f8287f6 commit 2a84e1e

File tree

2 files changed

+768
-0
lines changed

2 files changed

+768
-0
lines changed
Lines changed: 397 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,397 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -passes=msan -S | FileCheck %s
3+
;
4+
; Forked from llvm/test/CodeGen/X86/vector-reduce-fadd.ll
5+
;
6+
; Currently handled incorrectly by visitInstruction:
7+
; - llvm.vector.reduce.fadd
8+
9+
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
10+
target triple = "x86_64-unknown-linux-gnu"
11+
12+
define float @test_v2f32(float %a0, <2 x float> %a1) #0 {
13+
; CHECK-LABEL: define float @test_v2f32(
14+
; CHECK-SAME: float [[A0:%.*]], <2 x float> [[A1:%.*]]) #[[ATTR0:[0-9]+]] {
15+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8
16+
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
17+
; CHECK-NEXT: call void @llvm.donothing()
18+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0
19+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i32> [[TMP2]] to i64
20+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP3]], 0
21+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
22+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1:![0-9]+]]
23+
; CHECK: 4:
24+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]
25+
; CHECK-NEXT: unreachable
26+
; CHECK: 5:
27+
; CHECK-NEXT: [[TMP6:%.*]] = call float @llvm.vector.reduce.fadd.v2f32(float [[A0]], <2 x float> [[A1]])
28+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
29+
; CHECK-NEXT: ret float [[TMP6]]
30+
;
31+
%1 = call float @llvm.vector.reduce.fadd.f32.v2f32(float %a0, <2 x float> %a1)
32+
ret float %1
33+
}
34+
35+
define float @test_v4f32(float %a0, <4 x float> %a1) #0 {
36+
; CHECK-LABEL: define float @test_v4f32(
37+
; CHECK-SAME: float [[A0:%.*]], <4 x float> [[A1:%.*]]) #[[ATTR0]] {
38+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8
39+
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
40+
; CHECK-NEXT: call void @llvm.donothing()
41+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0
42+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i32> [[TMP2]] to i128
43+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i128 [[TMP3]], 0
44+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
45+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
46+
; CHECK: 4:
47+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
48+
; CHECK-NEXT: unreachable
49+
; CHECK: 5:
50+
; CHECK-NEXT: [[TMP6:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float [[A0]], <4 x float> [[A1]])
51+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
52+
; CHECK-NEXT: ret float [[TMP6]]
53+
;
54+
%1 = call float @llvm.vector.reduce.fadd.f32.v4f32(float %a0, <4 x float> %a1)
55+
ret float %1
56+
}
57+
58+
define float @test_v8f32(float %a0, <8 x float> %a1) #0 {
59+
; CHECK-LABEL: define float @test_v8f32(
60+
; CHECK-SAME: float [[A0:%.*]], <8 x float> [[A1:%.*]]) #[[ATTR0]] {
61+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8
62+
; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
63+
; CHECK-NEXT: call void @llvm.donothing()
64+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0
65+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[TMP2]] to i256
66+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i256 [[TMP3]], 0
67+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
68+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
69+
; CHECK: 4:
70+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
71+
; CHECK-NEXT: unreachable
72+
; CHECK: 5:
73+
; CHECK-NEXT: [[TMP6:%.*]] = call float @llvm.vector.reduce.fadd.v8f32(float [[A0]], <8 x float> [[A1]])
74+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
75+
; CHECK-NEXT: ret float [[TMP6]]
76+
;
77+
%1 = call float @llvm.vector.reduce.fadd.f32.v8f32(float %a0, <8 x float> %a1)
78+
ret float %1
79+
}
80+
81+
define float @test_v16f32(float %a0, <16 x float> %a1) #0 {
82+
; CHECK-LABEL: define float @test_v16f32(
83+
; CHECK-SAME: float [[A0:%.*]], <16 x float> [[A1:%.*]]) #[[ATTR0]] {
84+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8
85+
; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
86+
; CHECK-NEXT: call void @llvm.donothing()
87+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0
88+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[TMP2]] to i512
89+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i512 [[TMP3]], 0
90+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
91+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
92+
; CHECK: 4:
93+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
94+
; CHECK-NEXT: unreachable
95+
; CHECK: 5:
96+
; CHECK-NEXT: [[TMP6:%.*]] = call float @llvm.vector.reduce.fadd.v16f32(float [[A0]], <16 x float> [[A1]])
97+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
98+
; CHECK-NEXT: ret float [[TMP6]]
99+
;
100+
%1 = call float @llvm.vector.reduce.fadd.f32.v16f32(float %a0, <16 x float> %a1)
101+
ret float %1
102+
}
103+
104+
105+
define float @test_v2f32_zero(<2 x float> %a0) #0 {
106+
; CHECK-LABEL: define float @test_v2f32_zero(
107+
; CHECK-SAME: <2 x float> [[A0:%.*]]) #[[ATTR0]] {
108+
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
109+
; CHECK-NEXT: call void @llvm.donothing()
110+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to i64
111+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP2]], 0
112+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
113+
; CHECK: 3:
114+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
115+
; CHECK-NEXT: unreachable
116+
; CHECK: 4:
117+
; CHECK-NEXT: [[TMP5:%.*]] = call float @llvm.vector.reduce.fadd.v2f32(float -0.000000e+00, <2 x float> [[A0]])
118+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
119+
; CHECK-NEXT: ret float [[TMP5]]
120+
;
121+
%1 = call float @llvm.vector.reduce.fadd.f32.v2f32(float -0.0, <2 x float> %a0)
122+
ret float %1
123+
}
124+
125+
define float @test_v4f32_zero(<4 x float> %a0) #0 {
126+
; CHECK-LABEL: define float @test_v4f32_zero(
127+
; CHECK-SAME: <4 x float> [[A0:%.*]]) #[[ATTR0]] {
128+
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
129+
; CHECK-NEXT: call void @llvm.donothing()
130+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
131+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
132+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
133+
; CHECK: 3:
134+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
135+
; CHECK-NEXT: unreachable
136+
; CHECK: 4:
137+
; CHECK-NEXT: [[TMP5:%.*]] = call float @llvm.vector.reduce.fadd.v4f32(float -0.000000e+00, <4 x float> [[A0]])
138+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
139+
; CHECK-NEXT: ret float [[TMP5]]
140+
;
141+
%1 = call float @llvm.vector.reduce.fadd.f32.v4f32(float -0.0, <4 x float> %a0)
142+
ret float %1
143+
}
144+
145+
define float @test_v8f32_zero(<8 x float> %a0) #0 {
146+
; CHECK-LABEL: define float @test_v8f32_zero(
147+
; CHECK-SAME: <8 x float> [[A0:%.*]]) #[[ATTR0]] {
148+
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i32>, ptr @__msan_param_tls, align 8
149+
; CHECK-NEXT: call void @llvm.donothing()
150+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[TMP1]] to i256
151+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i256 [[TMP2]], 0
152+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
153+
; CHECK: 3:
154+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
155+
; CHECK-NEXT: unreachable
156+
; CHECK: 4:
157+
; CHECK-NEXT: [[TMP5:%.*]] = call float @llvm.vector.reduce.fadd.v8f32(float -0.000000e+00, <8 x float> [[A0]])
158+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
159+
; CHECK-NEXT: ret float [[TMP5]]
160+
;
161+
%1 = call float @llvm.vector.reduce.fadd.f32.v8f32(float -0.0, <8 x float> %a0)
162+
ret float %1
163+
}
164+
165+
define float @test_v16f32_zero(<16 x float> %a0) #0 {
166+
; CHECK-LABEL: define float @test_v16f32_zero(
167+
; CHECK-SAME: <16 x float> [[A0:%.*]]) #[[ATTR0]] {
168+
; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i32>, ptr @__msan_param_tls, align 8
169+
; CHECK-NEXT: call void @llvm.donothing()
170+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[TMP1]] to i512
171+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i512 [[TMP2]], 0
172+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
173+
; CHECK: 3:
174+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
175+
; CHECK-NEXT: unreachable
176+
; CHECK: 4:
177+
; CHECK-NEXT: [[TMP5:%.*]] = call float @llvm.vector.reduce.fadd.v16f32(float -0.000000e+00, <16 x float> [[A0]])
178+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
179+
; CHECK-NEXT: ret float [[TMP5]]
180+
;
181+
%1 = call float @llvm.vector.reduce.fadd.f32.v16f32(float -0.0, <16 x float> %a0)
182+
ret float %1
183+
}
184+
185+
define double @test_v2f64(double %a0, <2 x double> %a1) #0 {
186+
; CHECK-LABEL: define double @test_v2f64(
187+
; CHECK-SAME: double [[A0:%.*]], <2 x double> [[A1:%.*]]) #[[ATTR0]] {
188+
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
189+
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
190+
; CHECK-NEXT: call void @llvm.donothing()
191+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
192+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i64> [[TMP2]] to i128
193+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i128 [[TMP3]], 0
194+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
195+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
196+
; CHECK: 4:
197+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
198+
; CHECK-NEXT: unreachable
199+
; CHECK: 5:
200+
; CHECK-NEXT: [[TMP6:%.*]] = call double @llvm.vector.reduce.fadd.v2f64(double [[A0]], <2 x double> [[A1]])
201+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
202+
; CHECK-NEXT: ret double [[TMP6]]
203+
;
204+
%1 = call double @llvm.vector.reduce.fadd.f64.v2f64(double %a0, <2 x double> %a1)
205+
ret double %1
206+
}
207+
208+
define double @test_v4f64(double %a0, <4 x double> %a1) #0 {
209+
; CHECK-LABEL: define double @test_v4f64(
210+
; CHECK-SAME: double [[A0:%.*]], <4 x double> [[A1:%.*]]) #[[ATTR0]] {
211+
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
212+
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
213+
; CHECK-NEXT: call void @llvm.donothing()
214+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
215+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i64> [[TMP2]] to i256
216+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i256 [[TMP3]], 0
217+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
218+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
219+
; CHECK: 4:
220+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
221+
; CHECK-NEXT: unreachable
222+
; CHECK: 5:
223+
; CHECK-NEXT: [[TMP6:%.*]] = call double @llvm.vector.reduce.fadd.v4f64(double [[A0]], <4 x double> [[A1]])
224+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
225+
; CHECK-NEXT: ret double [[TMP6]]
226+
;
227+
%1 = call double @llvm.vector.reduce.fadd.f64.v4f64(double %a0, <4 x double> %a1)
228+
ret double %1
229+
}
230+
231+
define double @test_v8f64(double %a0, <8 x double> %a1) #0 {
232+
; CHECK-LABEL: define double @test_v8f64(
233+
; CHECK-SAME: double [[A0:%.*]], <8 x double> [[A1:%.*]]) #[[ATTR0]] {
234+
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
235+
; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
236+
; CHECK-NEXT: call void @llvm.donothing()
237+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
238+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i64> [[TMP2]] to i512
239+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i512 [[TMP3]], 0
240+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
241+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
242+
; CHECK: 4:
243+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
244+
; CHECK-NEXT: unreachable
245+
; CHECK: 5:
246+
; CHECK-NEXT: [[TMP6:%.*]] = call double @llvm.vector.reduce.fadd.v8f64(double [[A0]], <8 x double> [[A1]])
247+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
248+
; CHECK-NEXT: ret double [[TMP6]]
249+
;
250+
%1 = call double @llvm.vector.reduce.fadd.f64.v8f64(double %a0, <8 x double> %a1)
251+
ret double %1
252+
}
253+
254+
define double @test_v16f64(double %a0, <16 x double> %a1) #0 {
255+
; CHECK-LABEL: define double @test_v16f64(
256+
; CHECK-SAME: double [[A0:%.*]], <16 x double> [[A1:%.*]]) #[[ATTR0]] {
257+
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
258+
; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i64>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
259+
; CHECK-NEXT: call void @llvm.donothing()
260+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
261+
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i64> [[TMP2]] to i1024
262+
; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i1024 [[TMP3]], 0
263+
; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
264+
; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
265+
; CHECK: 4:
266+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
267+
; CHECK-NEXT: unreachable
268+
; CHECK: 5:
269+
; CHECK-NEXT: [[TMP6:%.*]] = call double @llvm.vector.reduce.fadd.v16f64(double [[A0]], <16 x double> [[A1]])
270+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
271+
; CHECK-NEXT: ret double [[TMP6]]
272+
;
273+
%1 = call double @llvm.vector.reduce.fadd.f64.v16f64(double %a0, <16 x double> %a1)
274+
ret double %1
275+
}
276+
277+
278+
define double @test_v2f64_zero(<2 x double> %a0) #0 {
279+
; CHECK-LABEL: define double @test_v2f64_zero(
280+
; CHECK-SAME: <2 x double> [[A0:%.*]]) #[[ATTR0]] {
281+
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
282+
; CHECK-NEXT: call void @llvm.donothing()
283+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
284+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
285+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
286+
; CHECK: 3:
287+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
288+
; CHECK-NEXT: unreachable
289+
; CHECK: 4:
290+
; CHECK-NEXT: [[TMP5:%.*]] = call double @llvm.vector.reduce.fadd.v2f64(double -0.000000e+00, <2 x double> [[A0]])
291+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
292+
; CHECK-NEXT: ret double [[TMP5]]
293+
;
294+
%1 = call double @llvm.vector.reduce.fadd.f64.v2f64(double -0.0, <2 x double> %a0)
295+
ret double %1
296+
}
297+
298+
define double @test_v4f64_zero(<4 x double> %a0) #0 {
299+
; CHECK-LABEL: define double @test_v4f64_zero(
300+
; CHECK-SAME: <4 x double> [[A0:%.*]]) #[[ATTR0]] {
301+
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i64>, ptr @__msan_param_tls, align 8
302+
; CHECK-NEXT: call void @llvm.donothing()
303+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[TMP1]] to i256
304+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i256 [[TMP2]], 0
305+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
306+
; CHECK: 3:
307+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
308+
; CHECK-NEXT: unreachable
309+
; CHECK: 4:
310+
; CHECK-NEXT: [[TMP5:%.*]] = call double @llvm.vector.reduce.fadd.v4f64(double -0.000000e+00, <4 x double> [[A0]])
311+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
312+
; CHECK-NEXT: ret double [[TMP5]]
313+
;
314+
%1 = call double @llvm.vector.reduce.fadd.f64.v4f64(double -0.0, <4 x double> %a0)
315+
ret double %1
316+
}
317+
318+
define double @test_v8f64_zero(<8 x double> %a0) #0 {
319+
; CHECK-LABEL: define double @test_v8f64_zero(
320+
; CHECK-SAME: <8 x double> [[A0:%.*]]) #[[ATTR0]] {
321+
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i64>, ptr @__msan_param_tls, align 8
322+
; CHECK-NEXT: call void @llvm.donothing()
323+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[TMP1]] to i512
324+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i512 [[TMP2]], 0
325+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
326+
; CHECK: 3:
327+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
328+
; CHECK-NEXT: unreachable
329+
; CHECK: 4:
330+
; CHECK-NEXT: [[TMP5:%.*]] = call double @llvm.vector.reduce.fadd.v8f64(double -0.000000e+00, <8 x double> [[A0]])
331+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
332+
; CHECK-NEXT: ret double [[TMP5]]
333+
;
334+
%1 = call double @llvm.vector.reduce.fadd.f64.v8f64(double -0.0, <8 x double> %a0)
335+
ret double %1
336+
}
337+
338+
define double @test_v16f64_zero(<16 x double> %a0) #0 {
339+
; CHECK-LABEL: define double @test_v16f64_zero(
340+
; CHECK-SAME: <16 x double> [[A0:%.*]]) #[[ATTR0]] {
341+
; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i64>, ptr @__msan_param_tls, align 8
342+
; CHECK-NEXT: call void @llvm.donothing()
343+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i64> [[TMP1]] to i1024
344+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i1024 [[TMP2]], 0
345+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
346+
; CHECK: 3:
347+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
348+
; CHECK-NEXT: unreachable
349+
; CHECK: 4:
350+
; CHECK-NEXT: [[TMP5:%.*]] = call double @llvm.vector.reduce.fadd.v16f64(double -0.000000e+00, <16 x double> [[A0]])
351+
; CHECK-NEXT: store i64 0, ptr @__msan_retval_tls, align 8
352+
; CHECK-NEXT: ret double [[TMP5]]
353+
;
354+
%1 = call double @llvm.vector.reduce.fadd.f64.v16f64(double -0.0, <16 x double> %a0)
355+
ret double %1
356+
}
357+
358+
define float @PR64627() #0 {
359+
; CHECK-LABEL: define float @PR64627(
360+
; CHECK-SAME: ) #[[ATTR0]] {
361+
; CHECK-NEXT: call void @llvm.donothing()
362+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i5 0 to <5 x i1>
363+
; CHECK-NEXT: [[TMP2:%.*]] = select <5 x i1> [[TMP1]], <5 x i32> zeroinitializer, <5 x i32> zeroinitializer
364+
; CHECK-NEXT: [[_MSPROP_SELECT:%.*]] = select <5 x i1> zeroinitializer, <5 x i32> splat (i32 1065353216), <5 x i32> [[TMP2]]
365+
; CHECK-NEXT: [[TMP3:%.*]] = select <5 x i1> [[TMP1]], <5 x float> zeroinitializer, <5 x float> splat (float 1.000000e+00)
366+
; CHECK-NEXT: [[TMP4:%.*]] = bitcast <5 x i32> [[_MSPROP_SELECT]] to i160
367+
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i160 [[TMP4]], 0
368+
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP5:%.*]], label [[TMP6:%.*]], !prof [[PROF1]]
369+
; CHECK: 5:
370+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
371+
; CHECK-NEXT: unreachable
372+
; CHECK: 6:
373+
; CHECK-NEXT: [[TMP7:%.*]] = call float @llvm.vector.reduce.fadd.v5f32(float -0.000000e+00, <5 x float> [[TMP3]])
374+
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
375+
; CHECK-NEXT: ret float [[TMP7]]
376+
;
377+
%1 = bitcast i5 0 to <5 x i1>
378+
%2 = select <5 x i1> %1, <5 x float> zeroinitializer, <5 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>
379+
%3 = call float @llvm.vector.reduce.fadd.v5f32(float -0.0, <5 x float> %2)
380+
ret float %3
381+
}
382+
declare float @llvm.vector.reduce.fadd.v5f32(float, <5 x float>)
383+
384+
declare float @llvm.vector.reduce.fadd.f32.v2f32(float, <2 x float>)
385+
declare float @llvm.vector.reduce.fadd.f32.v4f32(float, <4 x float>)
386+
declare float @llvm.vector.reduce.fadd.f32.v8f32(float, <8 x float>)
387+
declare float @llvm.vector.reduce.fadd.f32.v16f32(float, <16 x float>)
388+
389+
declare double @llvm.vector.reduce.fadd.f64.v2f64(double, <2 x double>)
390+
declare double @llvm.vector.reduce.fadd.f64.v4f64(double, <4 x double>)
391+
declare double @llvm.vector.reduce.fadd.f64.v8f64(double, <8 x double>)
392+
declare double @llvm.vector.reduce.fadd.f64.v16f64(double, <16 x double>)
393+
394+
attributes #0 = { sanitize_memory }
395+
;.
396+
; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}
397+
;.

0 commit comments

Comments
 (0)