Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions llvm/lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5058,6 +5058,11 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
KnownRHS.isKnownNeverPosZero()) &&
(KnownLHS.isKnownNeverPosZero() ||
KnownRHS.isKnownNeverNegZero()))) {
// Don't take sign bit from NaN operands.
if (!KnownLHS.isKnownNeverNaN())
KnownLHS.SignBit = std::nullopt;
if (!KnownRHS.isKnownNeverNaN())
KnownRHS.SignBit = std::nullopt;
if ((IID == Intrinsic::maximum || IID == Intrinsic::maximumnum ||
IID == Intrinsic::maxnum) &&
(KnownLHS.SignBit == false || KnownRHS.SignBit == false))
Expand Down
15 changes: 15 additions & 0 deletions llvm/test/Transforms/InstCombine/is_fpclass.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3922,6 +3922,21 @@ define i1 @test_class_is_not_psub_pnorm_pinf__dynamic(float %arg) #3 {
ret i1 %class
}

; Make sure we don't take sign bit from NaN operands.

define i1 @minnum_qnan(i32 %x) {
; CHECK-LABEL: @minnum_qnan(
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i1 true
;
entry:
%qnan_bits = or i32 %x, -5938
%qnan = bitcast i32 %qnan_bits to float
%min = call float @llvm.minnum.f32(float %qnan, float 0.000000e+00)
%test = call i1 @llvm.is.fpclass.f32(float %min, i32 64)
ret i1 %test
}

declare i1 @llvm.is.fpclass.f32(float, i32 immarg)
declare i1 @llvm.is.fpclass.f64(double, i32 immarg)
declare <2 x i1> @llvm.is.fpclass.v2f32(<2 x float>, i32 immarg)
Expand Down