@@ -224,6 +224,34 @@ return:
224
224
ret double %retval
225
225
}
226
226
227
+ ; Denormals may be flushed to zero in some cases by the backend.
228
+ ; Hence, treat denormals as 0.
229
+ define float @fcmp_oeq_denormal (float %x , float %y ) {
230
+ ; CHECK-LABEL: define float @fcmp_oeq_denormal(
231
+ ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
232
+ ; CHECK-NEXT: [[ENTRY:.*]]:
233
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[Y]], 0x3800000000000000
234
+ ; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
235
+ ; CHECK: [[IF]]:
236
+ ; CHECK-NEXT: [[DIV:%.*]] = fdiv float [[X]], [[Y]]
237
+ ; CHECK-NEXT: br label %[[RETURN]]
238
+ ; CHECK: [[RETURN]]:
239
+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi float [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
240
+ ; CHECK-NEXT: ret float [[RETVAL]]
241
+ ;
242
+ entry:
243
+ %cmp = fcmp oeq float %y , 0x3800000000000000
244
+ br i1 %cmp , label %if , label %return
245
+
246
+ if:
247
+ %div = fdiv float %x , %y
248
+ br label %return
249
+
250
+ return:
251
+ %retval = phi float [ %div , %if ], [ %x , %entry ]
252
+ ret float %retval
253
+ }
254
+
227
255
define double @fcmp_une_zero (double %x , double %y ) {
228
256
; CHECK-LABEL: define double @fcmp_une_zero(
229
257
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
@@ -251,7 +279,7 @@ return:
251
279
}
252
280
253
281
; We also cannot propagate a value if it's not a constant.
254
- ; This is because the value could be 0.0 or -0.0.
282
+ ; This is because the value could be 0.0, -0.0, or a denormal .
255
283
256
284
define double @fcmp_oeq_maybe_zero (double %x , double %y , double %z1 , double %z2 ) {
257
285
; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
0 commit comments