2
2
; RUN: opt < %s -passes=msan -S | FileCheck %s
3
3
;
4
4
; Forked from llvm/test/CodeGen/AArch64/arm64-fminv.ll
5
- ;
6
- ; Currently handled (suboptimally) by handleUnknownInstruction:
7
- ; - llvm.aarch64.neon.fmaxv
8
- ; - llvm.aarch64.neon.fminv
9
- ; - llvm.aarch64.neon.fmaxnmv
10
- ; - llvm.aarch64.neon.fminnmv
11
5
12
6
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
13
7
target triple = "aarch64--linux-android9001"
@@ -17,15 +11,9 @@ define float @test_fminv_v2f32(<2 x float> %in) #0 {
17
11
; CHECK-SAME: <2 x float> [[IN:%.*]]) #[[ATTR0:[0-9]+]] {
18
12
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
19
13
; CHECK-NEXT: call void @llvm.donothing()
20
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to i64
21
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP2]], 0
22
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1:![0-9]+]]
23
- ; CHECK: 3:
24
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3:[0-9]+]]
25
- ; CHECK-NEXT: unreachable
26
- ; CHECK: 4:
14
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> [[TMP1]])
27
15
; CHECK-NEXT: [[MIN:%.*]] = call float @llvm.aarch64.neon.fminv.f32.v2f32(<2 x float> [[IN]])
28
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
16
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
29
17
; CHECK-NEXT: ret float [[MIN]]
30
18
;
31
19
%min = call float @llvm.aarch64.neon.fminv.f32.v2f32 (<2 x float > %in )
@@ -37,15 +25,9 @@ define float @test_fminv_v4f32(<4 x float> %in) #0 {
37
25
; CHECK-SAME: <4 x float> [[IN:%.*]]) #[[ATTR0]] {
38
26
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
39
27
; CHECK-NEXT: call void @llvm.donothing()
40
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
41
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
42
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
43
- ; CHECK: 3:
44
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
45
- ; CHECK-NEXT: unreachable
46
- ; CHECK: 4:
28
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP1]])
47
29
; CHECK-NEXT: [[MIN:%.*]] = call float @llvm.aarch64.neon.fminv.f32.v4f32(<4 x float> [[IN]])
48
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
30
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
49
31
; CHECK-NEXT: ret float [[MIN]]
50
32
;
51
33
%min = call float @llvm.aarch64.neon.fminv.f32.v4f32 (<4 x float > %in )
@@ -57,15 +39,9 @@ define double @test_fminv_v2f64(<2 x double> %in) #0 {
57
39
; CHECK-SAME: <2 x double> [[IN:%.*]]) #[[ATTR0]] {
58
40
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
59
41
; CHECK-NEXT: call void @llvm.donothing()
60
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
61
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
62
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
63
- ; CHECK: 3:
64
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
65
- ; CHECK-NEXT: unreachable
66
- ; CHECK: 4:
42
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> [[TMP1]])
67
43
; CHECK-NEXT: [[MIN:%.*]] = call double @llvm.aarch64.neon.fminv.f64.v2f64(<2 x double> [[IN]])
68
- ; CHECK-NEXT: store i64 0 , ptr @__msan_retval_tls, align 8
44
+ ; CHECK-NEXT: store i64 [[TMP2]] , ptr @__msan_retval_tls, align 8
69
45
; CHECK-NEXT: ret double [[MIN]]
70
46
;
71
47
%min = call double @llvm.aarch64.neon.fminv.f64.v2f64 (<2 x double > %in )
@@ -81,15 +57,9 @@ define float @test_fmaxv_v2f32(<2 x float> %in) #0 {
81
57
; CHECK-SAME: <2 x float> [[IN:%.*]]) #[[ATTR0]] {
82
58
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
83
59
; CHECK-NEXT: call void @llvm.donothing()
84
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to i64
85
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP2]], 0
86
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
87
- ; CHECK: 3:
88
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
89
- ; CHECK-NEXT: unreachable
90
- ; CHECK: 4:
60
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> [[TMP1]])
91
61
; CHECK-NEXT: [[MAX:%.*]] = call float @llvm.aarch64.neon.fmaxv.f32.v2f32(<2 x float> [[IN]])
92
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
62
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
93
63
; CHECK-NEXT: ret float [[MAX]]
94
64
;
95
65
%max = call float @llvm.aarch64.neon.fmaxv.f32.v2f32 (<2 x float > %in )
@@ -101,15 +71,9 @@ define float @test_fmaxv_v4f32(<4 x float> %in) #0 {
101
71
; CHECK-SAME: <4 x float> [[IN:%.*]]) #[[ATTR0]] {
102
72
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
103
73
; CHECK-NEXT: call void @llvm.donothing()
104
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
105
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
106
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
107
- ; CHECK: 3:
108
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
109
- ; CHECK-NEXT: unreachable
110
- ; CHECK: 4:
74
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP1]])
111
75
; CHECK-NEXT: [[MAX:%.*]] = call float @llvm.aarch64.neon.fmaxv.f32.v4f32(<4 x float> [[IN]])
112
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
76
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
113
77
; CHECK-NEXT: ret float [[MAX]]
114
78
;
115
79
%max = call float @llvm.aarch64.neon.fmaxv.f32.v4f32 (<4 x float > %in )
@@ -121,15 +85,9 @@ define double @test_fmaxv_v2f64(<2 x double> %shareholder_value) #0 {
121
85
; CHECK-SAME: <2 x double> [[SHAREHOLDER_VALUE:%.*]]) #[[ATTR0]] {
122
86
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
123
87
; CHECK-NEXT: call void @llvm.donothing()
124
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
125
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
126
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
127
- ; CHECK: 3:
128
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
129
- ; CHECK-NEXT: unreachable
130
- ; CHECK: 4:
88
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> [[TMP1]])
131
89
; CHECK-NEXT: [[MAX:%.*]] = call double @llvm.aarch64.neon.fmaxv.f64.v2f64(<2 x double> [[SHAREHOLDER_VALUE]])
132
- ; CHECK-NEXT: store i64 0 , ptr @__msan_retval_tls, align 8
90
+ ; CHECK-NEXT: store i64 [[TMP2]] , ptr @__msan_retval_tls, align 8
133
91
; CHECK-NEXT: ret double [[MAX]]
134
92
;
135
93
%max_sv = call double @llvm.aarch64.neon.fmaxv.f64.v2f64 (<2 x double > %shareholder_value )
@@ -145,15 +103,9 @@ define float @test_fminnmv_v2f32(<2 x float> %in) #0 {
145
103
; CHECK-SAME: <2 x float> [[IN:%.*]]) #[[ATTR0]] {
146
104
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
147
105
; CHECK-NEXT: call void @llvm.donothing()
148
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to i64
149
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP2]], 0
150
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
151
- ; CHECK: 3:
152
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
153
- ; CHECK-NEXT: unreachable
154
- ; CHECK: 4:
106
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> [[TMP1]])
155
107
; CHECK-NEXT: [[MINNM:%.*]] = call float @llvm.aarch64.neon.fminnmv.f32.v2f32(<2 x float> [[IN]])
156
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
108
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
157
109
; CHECK-NEXT: ret float [[MINNM]]
158
110
;
159
111
%minnm = call float @llvm.aarch64.neon.fminnmv.f32.v2f32 (<2 x float > %in )
@@ -165,15 +117,9 @@ define float @test_fminnmv_v4f32(<4 x float> %in) #0 {
165
117
; CHECK-SAME: <4 x float> [[IN:%.*]]) #[[ATTR0]] {
166
118
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
167
119
; CHECK-NEXT: call void @llvm.donothing()
168
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
169
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
170
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
171
- ; CHECK: 3:
172
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
173
- ; CHECK-NEXT: unreachable
174
- ; CHECK: 4:
120
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP1]])
175
121
; CHECK-NEXT: [[MINNM:%.*]] = call float @llvm.aarch64.neon.fminnmv.f32.v4f32(<4 x float> [[IN]])
176
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
122
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
177
123
; CHECK-NEXT: ret float [[MINNM]]
178
124
;
179
125
%minnm = call float @llvm.aarch64.neon.fminnmv.f32.v4f32 (<4 x float > %in )
@@ -185,15 +131,9 @@ define double @test_fminnmv_v2f64(<2 x double> %in) #0 {
185
131
; CHECK-SAME: <2 x double> [[IN:%.*]]) #[[ATTR0]] {
186
132
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
187
133
; CHECK-NEXT: call void @llvm.donothing()
188
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
189
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
190
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
191
- ; CHECK: 3:
192
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
193
- ; CHECK-NEXT: unreachable
194
- ; CHECK: 4:
134
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> [[TMP1]])
195
135
; CHECK-NEXT: [[MINNM:%.*]] = call double @llvm.aarch64.neon.fminnmv.f64.v2f64(<2 x double> [[IN]])
196
- ; CHECK-NEXT: store i64 0 , ptr @__msan_retval_tls, align 8
136
+ ; CHECK-NEXT: store i64 [[TMP2]] , ptr @__msan_retval_tls, align 8
197
137
; CHECK-NEXT: ret double [[MINNM]]
198
138
;
199
139
%minnm = call double @llvm.aarch64.neon.fminnmv.f64.v2f64 (<2 x double > %in )
@@ -209,15 +149,9 @@ define float @test_fmaxnmv_v2f32(<2 x float> %in) #0 {
209
149
; CHECK-SAME: <2 x float> [[IN:%.*]]) #[[ATTR0]] {
210
150
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 8
211
151
; CHECK-NEXT: call void @llvm.donothing()
212
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to i64
213
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP2]], 0
214
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
215
- ; CHECK: 3:
216
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
217
- ; CHECK-NEXT: unreachable
218
- ; CHECK: 4:
152
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> [[TMP1]])
219
153
; CHECK-NEXT: [[MAXNM:%.*]] = call float @llvm.aarch64.neon.fmaxnmv.f32.v2f32(<2 x float> [[IN]])
220
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
154
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
221
155
; CHECK-NEXT: ret float [[MAXNM]]
222
156
;
223
157
%maxnm = call float @llvm.aarch64.neon.fmaxnmv.f32.v2f32 (<2 x float > %in )
@@ -229,15 +163,9 @@ define float @test_fmaxnmv_v4f32(<4 x float> %in) #0 {
229
163
; CHECK-SAME: <4 x float> [[IN:%.*]]) #[[ATTR0]] {
230
164
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
231
165
; CHECK-NEXT: call void @llvm.donothing()
232
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
233
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
234
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
235
- ; CHECK: 3:
236
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
237
- ; CHECK-NEXT: unreachable
238
- ; CHECK: 4:
166
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> [[TMP1]])
239
167
; CHECK-NEXT: [[MAXNM:%.*]] = call float @llvm.aarch64.neon.fmaxnmv.f32.v4f32(<4 x float> [[IN]])
240
- ; CHECK-NEXT: store i32 0 , ptr @__msan_retval_tls, align 8
168
+ ; CHECK-NEXT: store i32 [[TMP2]] , ptr @__msan_retval_tls, align 8
241
169
; CHECK-NEXT: ret float [[MAXNM]]
242
170
;
243
171
%maxnm = call float @llvm.aarch64.neon.fmaxnmv.f32.v4f32 (<4 x float > %in )
@@ -249,15 +177,9 @@ define double @test_fmaxnmv_v2f64(<2 x double> %in) #0 {
249
177
; CHECK-SAME: <2 x double> [[IN:%.*]]) #[[ATTR0]] {
250
178
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
251
179
; CHECK-NEXT: call void @llvm.donothing()
252
- ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
253
- ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
254
- ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
255
- ; CHECK: 3:
256
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3]]
257
- ; CHECK-NEXT: unreachable
258
- ; CHECK: 4:
180
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> [[TMP1]])
259
181
; CHECK-NEXT: [[MAXNM:%.*]] = call double @llvm.aarch64.neon.fmaxnmv.f64.v2f64(<2 x double> [[IN]])
260
- ; CHECK-NEXT: store i64 0 , ptr @__msan_retval_tls, align 8
182
+ ; CHECK-NEXT: store i64 [[TMP2]] , ptr @__msan_retval_tls, align 8
261
183
; CHECK-NEXT: ret double [[MAXNM]]
262
184
;
263
185
%maxnm = call double @llvm.aarch64.neon.fmaxnmv.f64.v2f64 (<2 x double > %in )
@@ -269,6 +191,3 @@ declare float @llvm.aarch64.neon.fmaxnmv.f32.v4f32(<4 x float>)
269
191
declare double @llvm.aarch64.neon.fmaxnmv.f64.v2f64 (<2 x double >)
270
192
271
193
attributes #0 = { sanitize_memory }
272
- ;.
273
- ; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}
274
- ;.
0 commit comments