@@ -156,8 +156,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero1) {
156
156
" %A = select i1 %1, float 0.0, float %a\n "
157
157
" ret float %A\n "
158
158
" }\n " );
159
- // FIXME: The sign of zero doesn't matter in fcmp.
160
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
159
+ // The sign of zero doesn't matter in fcmp.
160
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_NAN, true });
161
161
}
162
162
163
163
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero2) {
@@ -167,8 +167,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero2) {
167
167
" %A = select i1 %1, float 0.0, float %a\n "
168
168
" ret float %A\n "
169
169
" }\n " );
170
- // FIXME: The sign of zero doesn't matter in fcmp.
171
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
170
+ // The sign of zero doesn't matter in fcmp.
171
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_NAN , false });
172
172
}
173
173
174
174
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero3) {
@@ -178,8 +178,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero3) {
178
178
" %A = select i1 %1, float -0.0, float %a\n "
179
179
" ret float %A\n "
180
180
" }\n " );
181
- // FIXME: The sign of zero doesn't matter in fcmp.
182
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
181
+ // The sign of zero doesn't matter in fcmp.
182
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_NAN, true });
183
183
}
184
184
185
185
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero4) {
@@ -189,8 +189,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero4) {
189
189
" %A = select i1 %1, float -0.0, float %a\n "
190
190
" ret float %A\n "
191
191
" }\n " );
192
- // FIXME: The sign of zero doesn't matter in fcmp.
193
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
192
+ // The sign of zero doesn't matter in fcmp.
193
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_NAN , false });
194
194
}
195
195
196
196
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero5) {
@@ -200,8 +200,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero5) {
200
200
" %A = select i1 %1, float %a, float 0.0\n "
201
201
" ret float %A\n "
202
202
" }\n " );
203
- // FIXME: The sign of zero doesn't matter in fcmp.
204
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
203
+ // The sign of zero doesn't matter in fcmp.
204
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_OTHER , false });
205
205
}
206
206
207
207
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero6) {
@@ -211,8 +211,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero6) {
211
211
" %A = select i1 %1, float %a, float 0.0\n "
212
212
" ret float %A\n "
213
213
" }\n " );
214
- // FIXME: The sign of zero doesn't matter in fcmp.
215
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
214
+ // The sign of zero doesn't matter in fcmp.
215
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_OTHER, true });
216
216
}
217
217
218
218
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero7) {
@@ -222,8 +222,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero7) {
222
222
" %A = select i1 %1, float %a, float -0.0\n "
223
223
" ret float %A\n "
224
224
" }\n " );
225
- // FIXME: The sign of zero doesn't matter in fcmp.
226
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
225
+ // The sign of zero doesn't matter in fcmp.
226
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_OTHER , false });
227
227
}
228
228
229
229
TEST_F (MatchSelectPatternTest, FMinMismatchConstantZero8) {
@@ -233,8 +233,8 @@ TEST_F(MatchSelectPatternTest, FMinMismatchConstantZero8) {
233
233
" %A = select i1 %1, float %a, float -0.0\n "
234
234
" ret float %A\n "
235
235
" }\n " );
236
- // FIXME: The sign of zero doesn't matter in fcmp.
237
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
236
+ // The sign of zero doesn't matter in fcmp.
237
+ expectPattern ({SPF_FMINNUM, SPNB_RETURNS_OTHER, true });
238
238
}
239
239
240
240
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero1) {
@@ -244,8 +244,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero1) {
244
244
" %A = select i1 %1, float 0.0, float %a\n "
245
245
" ret float %A\n "
246
246
" }\n " );
247
- // FIXME: The sign of zero doesn't matter in fcmp.
248
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
247
+ // The sign of zero doesn't matter in fcmp.
248
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_NAN, true });
249
249
}
250
250
251
251
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero2) {
@@ -255,8 +255,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero2) {
255
255
" %A = select i1 %1, float 0.0, float %a\n "
256
256
" ret float %A\n "
257
257
" }\n " );
258
- // FIXME: The sign of zero doesn't matter in fcmp.
259
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
258
+ // The sign of zero doesn't matter in fcmp.
259
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_NAN , false });
260
260
}
261
261
262
262
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero3) {
@@ -266,8 +266,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero3) {
266
266
" %A = select i1 %1, float -0.0, float %a\n "
267
267
" ret float %A\n "
268
268
" }\n " );
269
- // FIXME: The sign of zero doesn't matter in fcmp.
270
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
269
+ // The sign of zero doesn't matter in fcmp.
270
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_NAN, true });
271
271
}
272
272
273
273
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero4) {
@@ -277,8 +277,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero4) {
277
277
" %A = select i1 %1, float -0.0, float %a\n "
278
278
" ret float %A\n "
279
279
" }\n " );
280
- // FIXME: The sign of zero doesn't matter in fcmp.
281
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
280
+ // The sign of zero doesn't matter in fcmp.
281
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_NAN , false });
282
282
}
283
283
284
284
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero5) {
@@ -288,8 +288,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero5) {
288
288
" %A = select i1 %1, float %a, float 0.0\n "
289
289
" ret float %A\n "
290
290
" }\n " );
291
- // FIXME: The sign of zero doesn't matter in fcmp.
292
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
291
+ // The sign of zero doesn't matter in fcmp.
292
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_OTHER , false });
293
293
}
294
294
295
295
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero6) {
@@ -299,8 +299,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero6) {
299
299
" %A = select i1 %1, float %a, float 0.0\n "
300
300
" ret float %A\n "
301
301
" }\n " );
302
- // FIXME: The sign of zero doesn't matter in fcmp.
303
- expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
302
+ // The sign of zero doesn't matter in fcmp.
303
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_OTHER, true });
304
304
}
305
305
306
306
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero7) {
@@ -310,8 +310,8 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero7) {
310
310
" %A = select i1 %1, float %a, float -0.0\n "
311
311
" ret float %A\n "
312
312
" }\n " );
313
- // FIXME: The sign of zero doesn't matter in fcmp.
314
- expectPattern ({SPF_UNKNOWN, SPNB_NA , false });
313
+ // The sign of zero doesn't matter in fcmp.
314
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_OTHER , false });
315
315
}
316
316
317
317
TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZero8) {
@@ -321,7 +321,29 @@ TEST_F(MatchSelectPatternTest, FMaxMismatchConstantZero8) {
321
321
" %A = select i1 %1, float %a, float -0.0\n "
322
322
" ret float %A\n "
323
323
" }\n " );
324
- // FIXME: The sign of zero doesn't matter in fcmp.
324
+ // The sign of zero doesn't matter in fcmp.
325
+ expectPattern ({SPF_FMAXNUM, SPNB_RETURNS_OTHER, true });
326
+ }
327
+
328
+ TEST_F (MatchSelectPatternTest, FMinMismatchConstantZeroVecUndef) {
329
+ parseAssembly (
330
+ " define <2 x float> @test(<2 x float> %a) {\n "
331
+ " %1 = fcmp ogt <2 x float> %a, <float -0.0, float -0.0>\n "
332
+ " %A = select <2 x i1> %1, <2 x float> <float undef, float 0.0>, <2 x float> %a\n "
333
+ " ret <2 x float> %A\n "
334
+ " }\n " );
335
+ // An undef in a vector constant can not be back-propagated for this analysis.
336
+ expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
337
+ }
338
+
339
+ TEST_F (MatchSelectPatternTest, FMaxMismatchConstantZeroVecUndef) {
340
+ parseAssembly (
341
+ " define <2 x float> @test(<2 x float> %a) {\n "
342
+ " %1 = fcmp ogt <2 x float> %a, zeroinitializer\n "
343
+ " %A = select <2 x i1> %1, <2 x float> %a, <2 x float> <float -0.0, float undef>\n "
344
+ " ret <2 x float> %A\n "
345
+ " }\n " );
346
+ // An undef in a vector constant can not be back-propagated for this analysis.
325
347
expectPattern ({SPF_UNKNOWN, SPNB_NA, false });
326
348
}
327
349
0 commit comments