@@ -44,10 +44,14 @@ define double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) {
44
44
45
45
; Tests with various predicate types.
46
46
47
+ ; This is not fabs because that could produce a different signbit for a NAN input.
48
+ ; PR59279
49
+
47
50
define double @select_nsz_nfabs_ult (double %x ) {
48
51
; CHECK-LABEL: @select_nsz_nfabs_ult(
49
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
50
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
52
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
53
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
54
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
51
55
; CHECK-NEXT: ret double [[SEL]]
52
56
;
53
57
%cmp = fcmp ult double %x , 0 .000000e+00
@@ -68,10 +72,14 @@ define double @select_nsz_nnan_nfabs_ult(double %x) {
68
72
ret double %sel
69
73
}
70
74
75
+ ; This is not fabs because that could produce a different signbit for a NAN input.
76
+ ; PR59279
77
+
71
78
define double @select_nsz_nfabs_ole (double %x ) {
72
79
; CHECK-LABEL: @select_nsz_nfabs_ole(
73
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
74
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
80
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
81
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
82
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
75
83
; CHECK-NEXT: ret double [[SEL]]
76
84
;
77
85
%cmp = fcmp ole double %x , 0 .000000e+00
@@ -92,10 +100,14 @@ define double @select_nsz_nnan_nfabs_ole(double %x) {
92
100
ret double %sel
93
101
}
94
102
103
+ ; This is not fabs because that could produce a different signbit for a NAN input.
104
+ ; PR59279
105
+
95
106
define double @select_nsz_nfabs_ule (double %x ) {
96
107
; CHECK-LABEL: @select_nsz_nfabs_ule(
97
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
98
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
108
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
109
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
110
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
99
111
; CHECK-NEXT: ret double [[SEL]]
100
112
;
101
113
%cmp = fcmp ule double %x , 0 .000000e+00
@@ -157,11 +169,14 @@ define double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) {
157
169
ret double %sel
158
170
}
159
171
160
- ; Tests with various predicate types.
172
+ ; This is not fabs because that could produce a different signbit for a NAN input.
173
+ ; PR59279
174
+
161
175
define double @select_nsz_nfabs_ogt (double %x ) {
162
176
; CHECK-LABEL: @select_nsz_nfabs_ogt(
163
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
164
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
177
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
178
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
179
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
165
180
; CHECK-NEXT: ret double [[SEL]]
166
181
;
167
182
%cmp = fcmp ogt double %x , 0 .000000e+00
@@ -170,6 +185,8 @@ define double @select_nsz_nfabs_ogt(double %x) {
170
185
ret double %sel
171
186
}
172
187
188
+ ; Tests with various predicate types.
189
+
173
190
define double @select_nsz_nnan_nfabs_ogt (double %x ) {
174
191
; CHECK-LABEL: @select_nsz_nnan_nfabs_ogt(
175
192
; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -182,10 +199,14 @@ define double @select_nsz_nnan_nfabs_ogt(double %x) {
182
199
ret double %sel
183
200
}
184
201
202
+ ; This is not fabs because that could produce a different signbit for a NAN input.
203
+ ; PR59279
204
+
185
205
define double @select_nsz_nfabs_ugt (double %x ) {
186
206
; CHECK-LABEL: @select_nsz_nfabs_ugt(
187
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
188
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
207
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00
208
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
209
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
189
210
; CHECK-NEXT: ret double [[SEL]]
190
211
;
191
212
%cmp = fcmp ugt double %x , 0 .000000e+00
@@ -206,10 +227,14 @@ define double @select_nsz_nnan_nfabs_ugt(double %x) {
206
227
ret double %sel
207
228
}
208
229
230
+ ; This is not fabs because that could produce a different signbit for a NAN input.
231
+ ; PR59279
232
+
209
233
define double @select_nsz_nfabs_oge (double %x ) {
210
234
; CHECK-LABEL: @select_nsz_nfabs_oge(
211
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
212
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
235
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00
236
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
237
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
213
238
; CHECK-NEXT: ret double [[SEL]]
214
239
;
215
240
%cmp = fcmp oge double %x , 0 .000000e+00
@@ -230,10 +255,14 @@ define double @select_nsz_nnan_nfabs_oge(double %x) {
230
255
ret double %sel
231
256
}
232
257
258
+ ; This is not fabs because that could produce a different signbit for a NAN input.
259
+ ; PR59279
260
+
233
261
define double @select_nsz_nfabs_uge (double %x ) {
234
262
; CHECK-LABEL: @select_nsz_nfabs_uge(
235
- ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
236
- ; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
263
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00
264
+ ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
265
+ ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
237
266
; CHECK-NEXT: ret double [[SEL]]
238
267
;
239
268
%cmp = fcmp uge double %x , 0 .000000e+00
0 commit comments