// If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
// then canonicalize the operand to 0.0.
if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
- if (!match(Op0, m_PosZeroFP()) && isKnownNeverNaN(Op0, DL, &TLI))
+ if (!match(Op0, m_PosZeroFP()) && isKnownNeverNaN(Op0, DL, &TLI, 0,
+ &AC, &I, &DT, &ORE))
return replaceOperand(I, 0, ConstantFP::getZero(OpType));
- if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, DL, &TLI))
+ if (!match(Op1, m_PosZeroFP()) &&
+ isKnownNeverNaN(Op1, DL, &TLI, 0, &AC, &I, &DT, &ORE))
return replaceOperand(I, 1, ConstantFP::getZero(OpType));
}
; CHECK-LABEL: @test_class_is_nan_assume_ord(
; CHECK-NEXT: [[ORD:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
; CHECK-NEXT: call void @llvm.assume(i1 [[ORD]])
-; CHECK-NEXT: [[CLASS:%.*]] = fcmp uno float [[X]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[CLASS]]
+; CHECK-NEXT: ret i1 false
;
%ord = fcmp ord float %x, 0.0
call void @llvm.assume(i1 %ord)
; CHECK-LABEL: @test_class_is_nan_assume_not_eq_pinf(
; CHECK-NEXT: [[ORD:%.*]] = fcmp oeq float [[X:%.*]], 0x7FF0000000000000
; CHECK-NEXT: call void @llvm.assume(i1 [[ORD]])
-; CHECK-NEXT: [[CLASS:%.*]] = fcmp uno float [[X]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[CLASS]]
+; CHECK-NEXT: ret i1 false
;
%ord = fcmp oeq float %x, 0x7FF0000000000000
call void @llvm.assume(i1 %ord)