diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index e576eea4ca36a..32c4555677c2d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -1522,9 +1522,21 @@ Value *InstCombinerImpl::foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS, if (ClassValLHS == ClassValRHS) { unsigned CombinedMask = IsAnd ? (ClassMaskLHS & ClassMaskRHS) : (ClassMaskLHS | ClassMaskRHS); - return Builder.CreateIntrinsic( - Intrinsic::is_fpclass, {ClassValLHS->getType()}, - {ClassValLHS, Builder.getInt32(CombinedMask)}); + unsigned InverseCombinedMask = ~CombinedMask & fcAllFlags; + + // If the number of bits set in the combined mask is greater than the + // number of the unset bits, it is more efficient to use the inverse + // mask and invert the result. + bool IsInverse = popcount(CombinedMask) > popcount(InverseCombinedMask); + auto *MaskVal = + Builder.getInt32(IsInverse ? InverseCombinedMask : CombinedMask); + + auto *II = Builder.CreateIntrinsic(Intrinsic::is_fpclass, + {ClassValLHS->getType()}, + {ClassValLHS, MaskVal}); + if (IsInverse) + return Builder.CreateNot(II); + return II; } } } @@ -1610,10 +1622,25 @@ Instruction *InstCombinerImpl::foldLogicOfIsFPClass(BinaryOperator &BO, bool IsRHSClass = match(Op1, m_OneUse(m_Intrinsic( m_Value(ClassVal1), m_ConstantInt(ClassMask1)))); - if ((((IsLHSClass || matchIsFPClassLikeFCmp(Op0, ClassVal0, ClassMask0)) && - (IsRHSClass || matchIsFPClassLikeFCmp(Op1, ClassVal1, ClassMask1)))) && + + bool IsLHSInverseClass = + match(Op0, m_OneUse(m_Not(m_OneUse(m_Intrinsic( + m_Value(ClassVal0), m_ConstantInt(ClassMask0)))))); + bool IsRHSInverseClass = + match(Op1, m_OneUse(m_Not(m_OneUse(m_Intrinsic( + m_Value(ClassVal1), m_ConstantInt(ClassMask1)))))); + + if ((((IsLHSClass || IsLHSInverseClass || + matchIsFPClassLikeFCmp(Op0, ClassVal0, ClassMask0)) && + (IsRHSClass || IsRHSInverseClass || + matchIsFPClassLikeFCmp(Op1, ClassVal1, ClassMask1)))) && ClassVal0 == ClassVal1) { unsigned NewClassMask; + if (IsLHSInverseClass) + ClassMask0 = ~ClassMask0 & fcAllFlags; + if (IsRHSInverseClass) + ClassMask1 = ~ClassMask1 & fcAllFlags; + switch (BO.getOpcode()) { case Instruction::And: NewClassMask = ClassMask0 & ClassMask1; @@ -4651,10 +4678,17 @@ Instruction *InstCombinerImpl::foldNot(BinaryOperator &I) { if (II->getIntrinsicID() == Intrinsic::is_fpclass) { ConstantInt *ClassMask = cast(II->getArgOperand(1)); - II->setArgOperand( - 1, ConstantInt::get(ClassMask->getType(), - ~ClassMask->getZExtValue() & fcAllFlags)); - return replaceInstUsesWith(I, II); + auto ClassMaskValue = ClassMask->getZExtValue(); + auto InverseMaskValue = ~ClassMaskValue & fcAllFlags; + + // If the number of set bits in the class mask is less than the number of + // set bits in the inverse mask, it's more efficient to keep the "not" + // instruction instead of inverting the class mask. + if (popcount(ClassMaskValue) > popcount(InverseMaskValue)) { + II->setArgOperand( + 1, ConstantInt::get(ClassMask->getType(), InverseMaskValue)); + return replaceInstUsesWith(I, II); + } } } diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index fd38738e3be80..2c656a8c98c7a 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1050,6 +1050,20 @@ Instruction *InstCombinerImpl::foldIntrinsicIsFPClass(IntrinsicInst &II) { if (Mask == Known.KnownFPClasses) return replaceInstUsesWith(II, ConstantInt::get(II.getType(), true)); + // If the number of set bits in the mask is greater than the number of the + // unset bits, it's more efficient to inverse the mask and the intrinsic + // result: + // if.fpclass(x, mask) -> !if.fpclass(x, ~mask) + // + auto InverseMask = ~Mask & fcAllFlags; + if (popcount(Mask) > popcount(InverseMask)) { + auto *NewII = + Builder.CreateIntrinsic(Intrinsic::is_fpclass, {Src0->getType()}, + {Src0, Builder.getInt32(InverseMask)}); + auto *Not = Builder.CreateNot(NewII); + return replaceInstUsesWith(II, Not); + } + return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/combine-is.fpclass-and-fcmp.ll b/llvm/test/Transforms/InstCombine/combine-is.fpclass-and-fcmp.ll index dcd79f5839002..4b52eb9d34af3 100644 --- a/llvm/test/Transforms/InstCombine/combine-is.fpclass-and-fcmp.ll +++ b/llvm/test/Transforms/InstCombine/combine-is.fpclass-and-fcmp.ll @@ -189,7 +189,8 @@ define i1 @fcmp_issubnormal_and_class_finite(half %x) { define i1 @class_inf_or_fcmp_issubnormal(half %x) { ; CHECK-LABEL: @class_inf_or_fcmp_issubnormal( -; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 756) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 267) +; CHECK-NEXT: [[OR:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[OR]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -289,7 +290,8 @@ define i1 @class_normal_or_fcmp_oeq_zero(half %x) { define i1 @fcmp_ueq_zero_or_class_normal(half %x) { ; CHECK-LABEL: @fcmp_ueq_zero_or_class_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 363) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 660) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %ueq.inf = fcmp ueq half %x, 0.0 @@ -300,7 +302,8 @@ define i1 @fcmp_ueq_zero_or_class_normal(half %x) { define i1 @class_normal_or_fcmp_ueq_zero(half %x) { ; CHECK-LABEL: @class_normal_or_fcmp_ueq_zero( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 363) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 660) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %ueq.inf = fcmp ueq half %x, 0.0 diff --git a/llvm/test/Transforms/InstCombine/create-class-from-logic-fcmp.ll b/llvm/test/Transforms/InstCombine/create-class-from-logic-fcmp.ll index 9a723e8bc89ff..765596165ea04 100644 --- a/llvm/test/Transforms/InstCombine/create-class-from-logic-fcmp.ll +++ b/llvm/test/Transforms/InstCombine/create-class-from-logic-fcmp.ll @@ -10,7 +10,8 @@ ; Base pattern !isfinite(x) || x == 0.0 define i1 @not_isfinite_or_zero_f16(half %x) { ; CHECK-LABEL: @not_isfinite_or_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -23,7 +24,8 @@ define i1 @not_isfinite_or_zero_f16(half %x) { ; Base pattern x == 0.0 || !isfinite(x) define i1 @not_isfinite_or_zero_f16_commute_or(half %x) { ; CHECK-LABEL: @not_isfinite_or_zero_f16_commute_or( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -36,7 +38,8 @@ define i1 @not_isfinite_or_zero_f16_commute_or(half %x) { ; Base pattern !isfinite(x) || x == -0.0 define i1 @not_isfinite_or_zero_f16_negzero(half %x) { ; CHECK-LABEL: @not_isfinite_or_zero_f16_negzero( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -48,7 +51,8 @@ define i1 @not_isfinite_or_zero_f16_negzero(half %x) { define i1 @not_isfinite_or_fabs_oeq_zero_f16(half %x) { ; CHECK-LABEL: @not_isfinite_or_fabs_oeq_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -61,7 +65,8 @@ define i1 @not_isfinite_or_fabs_oeq_zero_f16(half %x) { ; Base pattern !isfinite(x) || x == 0.0 define <2 x i1> @not_isfinite_or_zero_v2f16(<2 x half> %x) { ; CHECK-LABEL: @not_isfinite_or_zero_v2f16( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %x) @@ -74,7 +79,8 @@ define <2 x i1> @not_isfinite_or_zero_v2f16(<2 x half> %x) { ; Base pattern !isfinite(x) || x == <0.0, -0.0> define <2 x i1> @not_isfinite_or_zero_v2f16_pos0_neg0_vec(<2 x half> %x) { ; CHECK-LABEL: @not_isfinite_or_zero_v2f16_pos0_neg0_vec( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %x) @@ -87,7 +93,8 @@ define <2 x i1> @not_isfinite_or_zero_v2f16_pos0_neg0_vec(<2 x half> %x) { ; Base pattern x == 0.0 || !isfinite(x) define <2 x i1> @not_isfinite_or_zero_v2f16_commute_or(<2 x half> %x) { ; CHECK-LABEL: @not_isfinite_or_zero_v2f16_commute_or( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f16(<2 x half> [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %x) @@ -163,7 +170,8 @@ define i1 @not_isfinite_or_zero_f16_not_inf(half %x) { ; Positive test define i1 @ueq_inf_or_ueq_zero(half %x) { ; CHECK-LABEL: @ueq_inf_or_ueq_zero( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 615) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 408) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -237,7 +245,8 @@ define i1 @not_isfinite_or_zero_f16_neg_inf(half %x) { ; Negative test define i1 @olt_0_or_fabs_ueq_inf(half %x) { ; CHECK-LABEL: @olt_0_or_fabs_ueq_inf( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 543) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 480) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -455,7 +464,8 @@ define i1 @negated_isfinite_or_zero_f16_multi_use_cmp1(half %x, ptr %ptr) { ; Negative test define i1 @negated_isfinite_or_zero_f16_multi_use_cmp0_not_one_inf(half %x) { ; CHECK-LABEL: @negated_isfinite_or_zero_f16_multi_use_cmp0_not_one_inf( -; CHECK-NEXT: [[NOT_CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 411) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 612) +; CHECK-NEXT: [[NOT_CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[NOT_CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -509,7 +519,8 @@ define i1 @fcmp_one_0_and_fcmp_une_fabs_inf(half %x) { define i1 @fcmp_une_0_and_fcmp_une_fabs_inf(half %x) { ; CHECK-LABEL: @fcmp_une_0_and_fcmp_une_fabs_inf( -; CHECK-NEXT: [[AND:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 411) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 612) +; CHECK-NEXT: [[AND:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[AND]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -531,7 +542,8 @@ define i1 @fcmp_une_0_and_fcmp_une_neginf(half %x) { define i1 @issubnormal_or_inf(half %x) { ; CHECK-LABEL: @issubnormal_or_inf( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 756) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 267) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -543,7 +555,8 @@ define i1 @issubnormal_or_inf(half %x) { define i1 @olt_smallest_normal_or_inf(half %x) { ; CHECK-LABEL: @olt_smallest_normal_or_inf( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 764) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 259) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -567,7 +580,8 @@ define i1 @not_issubnormal_or_inf(half %x) { define i1 @issubnormal_uge_or_inf(half %x) { ; CHECK-LABEL: @issubnormal_uge_or_inf( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 783) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 240) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -638,7 +652,8 @@ define i1 @issubnormal_or_finite_olt(half %x) { ; inf | nan | zero | subnormal define i1 @issubnormal_or_finite_uge(half %x) { ; CHECK-LABEL: @issubnormal_or_finite_uge( -; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 759) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 264) +; CHECK-NEXT: [[OR:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[OR]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -674,7 +689,8 @@ define i1 @not_zero_and_subnormal(half %x) { define i1 @fcmp_fabs_uge_inf_or_fabs_uge_smallest_norm(half %x) { ; CHECK-LABEL: @fcmp_fabs_uge_inf_or_fabs_uge_smallest_norm( -; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 783) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 240) +; CHECK-NEXT: [[OR:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[OR]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -811,7 +827,8 @@ entry: define i1 @isnormal_uge_or_zero_oeq(half %x) #0 { ; CHECK-LABEL: @isnormal_uge_or_zero_oeq( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 879) +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 144) +; CHECK-NEXT: [[OR:%.*]] = xor i1 [[TMP0]], true ; CHECK-NEXT: ret i1 [[OR]] ; entry: @@ -1018,7 +1035,8 @@ define i1 @not_isnormalinf_or_uno_nofabs(half %x) #0 { ; -> ~pnormal define i1 @not_negisnormalinf_or_inf(half %x) #0 { ; CHECK-LABEL: @not_negisnormalinf_or_inf( -; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 767) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 256) +; CHECK-NEXT: [[OR:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[OR]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -1031,7 +1049,8 @@ define i1 @not_negisnormalinf_or_inf(half %x) #0 { ; -> ~pnormal define i1 @not_negisnormalinf_or_posinf(half %x) #0 { ; CHECK-LABEL: @not_negisnormalinf_or_posinf( -; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 767) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 256) +; CHECK-NEXT: [[OR:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[OR]] ; %not.is.pos.normal.inf = fcmp ult half %x, 0xH0400 @@ -1068,7 +1087,8 @@ define i1 @olt_smallest_normal_or_ord(half %x) #0 { ; -> ~pinf define i1 @olt_smallest_normal_or_uno(half %x) #0 { ; CHECK-LABEL: @olt_smallest_normal_or_uno( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 255) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 768) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %uno = fcmp uno half %x, 0.0 @@ -1138,7 +1158,8 @@ define i1 @olt_infinity_or_finite(half %x) #0 { ; -> zero|subnormal|normal define i1 @olt_infinity_and_finite(half %x) #0 { ; bustttedddd ; CHECK-LABEL: @olt_infinity_and_finite( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 252) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 771) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %lt.infinity = fcmp olt half %x, 0xH7C00 @@ -1235,7 +1256,8 @@ define i1 @olt_infinity_or_ueq_inf(half %x) #0 { ; -> pnormal define i1 @olt_smallest_normal_or_ueq_inf(half %x) #0 { ; CHECK-LABEL: @olt_smallest_normal_or_ueq_inf( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 767) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 256) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %lt.normal = fcmp olt half %x, 0xH0400 @@ -1259,7 +1281,8 @@ define i1 @olt_smallest_normal_or_une_inf(half %x) #0 { ; -> ninf | nnormal | subnormal | zero define i1 @olt_smallest_normal_and_une_inf(half %x) #0 { ; CHECK-LABEL: @olt_smallest_normal_and_une_inf( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 252) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 771) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %lt.normal = fcmp olt half %x, 0xH0400 @@ -1270,7 +1293,8 @@ define i1 @olt_smallest_normal_and_une_inf(half %x) #0 { define i1 @olt_smallest_normal_and_une_inf_or_oeq_smallest_normal(half %x) #0 { ; CHECK-LABEL: @olt_smallest_normal_and_une_inf_or_oeq_smallest_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 252) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 771) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %lt.normal = fcmp olt half %x, 0xH0400 @@ -1283,7 +1307,8 @@ define i1 @olt_smallest_normal_and_une_inf_or_oeq_smallest_normal(half %x) #0 { define i1 @olt_smallest_normal_and_une_inf_or_one_smallest_normal(half %x) #0 { ; CHECK-LABEL: @olt_smallest_normal_and_une_inf_or_one_smallest_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 252) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 771) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %lt.normal = fcmp olt half %x, 0xH0400 @@ -1408,7 +1433,8 @@ define i1 @oeq_neginfinity_or_oeq_smallest_normal(half %x) #0 { ; -> ninf | fcZero | fcSubnormal define i1 @oeq_neginfinity_or_olt_smallest_normal(half %x) #0 { ; CHECK-LABEL: @oeq_neginfinity_or_olt_smallest_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 252) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 771) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %oeq.neg.infinity = fcmp oeq half %x, 0xHFC00 @@ -1575,7 +1601,8 @@ define i1 @one_neginfinity_and_uge_smallest_normal(half %x) #0 { ; -> ~(pnormal|pinf) define i1 @ueq_neginfinity_or_olt_smallest_normal(half %x) #0 { ; CHECK-LABEL: @ueq_neginfinity_or_olt_smallest_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 255) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 768) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %ueq.neg.infinity = fcmp ueq half %x, 0xHFC00 @@ -1748,7 +1775,8 @@ define i1 @fabs_one_neginfinity_or_olt_smallest_normal(half %x) #0 { ; -> ~(zero|subnormal) define i1 @fabs_ueq_neginfinity_or_fabs_uge_smallest_normal(half %x) #0 { ; CHECK-LABEL: @fabs_ueq_neginfinity_or_fabs_uge_smallest_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 783) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 240) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call half @llvm.fabs.f16(half %x) @@ -1893,7 +1921,8 @@ define i1 @subnormal_or_zero_dynamic(half %x) #2 { define i1 @issubnormal_or_inf_nnan_logical_select(half %x) { ; CHECK-LABEL: @issubnormal_or_inf_nnan_logical_select( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 756) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 267) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call nnan half @llvm.fabs.f16(half %x) @@ -1917,7 +1946,8 @@ define i1 @issubnormal_and_ninf_nnan_logical_select(half %x) { define i1 @fcmp_ueq_neginf_or_oge_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_ueq_neginf_or_oge_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 999) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 24) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp ueq half %x, 0xHFC00 @@ -1928,7 +1958,8 @@ define i1 @fcmp_ueq_neginf_or_oge_zero_f16(half %x) { define i1 @fcmp_oeq_neginf_or_oge_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_oeq_neginf_or_oge_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 996) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 27) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp oeq half %x, 0xHFC00 @@ -1976,7 +2007,8 @@ define i1 @fcmp_oeq_neginf_or_ogt_zero_f16(half %x) { define i1 @fcmp_ueq_neginf_or_ogt_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_ueq_neginf_or_ogt_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 903) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 120) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp ueq half %x, 0xHFC00 @@ -2013,7 +2045,8 @@ define i1 @fcmp_oeq_neginf_or_ogt_zero_f16_daz(half %x) #1 { define i1 @fcmp_oeq_neginf_or_ugt_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_oeq_neginf_or_ugt_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 903) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 120) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp oeq half %x, 0xHFC00 @@ -2050,7 +2083,8 @@ define i1 @fcmp_oeq_neginf_or_ugt_zero_f16_daz(half %x) #1 { define i1 @fcmp_ueq_posinf_or_ole_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_ueq_posinf_or_ole_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 639) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 384) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp ueq half %x, 0xH7C00 @@ -2061,7 +2095,8 @@ define i1 @fcmp_ueq_posinf_or_ole_zero_f16(half %x) { define i1 @fcmp_oeq_posinf_or_ole_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_oeq_posinf_or_ole_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 636) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 387) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp oeq half %x, 0xH7C00 @@ -2122,7 +2157,8 @@ define i1 @fcmp_oeq_posinf_or_olt_zero_f16_daz(half %x) #1 { define i1 @fcmp_ueq_posinf_or_ult_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_ueq_posinf_or_ult_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 543) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 480) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp ueq half %x, 0xH7C00 @@ -2133,7 +2169,8 @@ define i1 @fcmp_ueq_posinf_or_ult_zero_f16(half %x) { define i1 @fcmp_oeq_posinf_or_ult_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_oeq_posinf_or_ult_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 543) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 480) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp oeq half %x, 0xH7C00 @@ -2170,7 +2207,8 @@ define i1 @fcmp_oeq_posinf_or_ult_zero_f16_daz(half %x) #1 { define i1 @fcmp_ueq_posinf_or_ule_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_ueq_posinf_or_ule_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 639) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 384) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp ueq half %x, 0xH7C00 @@ -2207,7 +2245,8 @@ define i1 @fcmp_oeq_posinf_or_ule_zero_f16_daz(half %x) #1 { define i1 @fcmp_ueq_posinf_or_olt_zero_f16(half %x) { ; CHECK-LABEL: @fcmp_ueq_posinf_or_olt_zero_f16( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 543) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f16(half [[X:%.*]], i32 480) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %cmpinf = fcmp ueq half %x, 0xH7C00 diff --git a/llvm/test/Transforms/InstCombine/fpclass-check-idioms.ll b/llvm/test/Transforms/InstCombine/fpclass-check-idioms.ll index 66970a9d48ddf..f3c8c9510df85 100644 --- a/llvm/test/Transforms/InstCombine/fpclass-check-idioms.ll +++ b/llvm/test/Transforms/InstCombine/fpclass-check-idioms.ll @@ -42,7 +42,8 @@ define i1 @f32_not_fcnan_fcinf(float %a) { define i1 @f32_not_fcnan_fcinf_strictfp(float %a) strictfp { ; CHECK-LABEL: define i1 @f32_not_fcnan_fcinf_strictfp( ; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 504) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 519) +; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CMP]] ; %i32 = bitcast float %a to i32 @@ -401,7 +402,8 @@ define i1 @f32_fcnan_fcinf_wrong_pred(float %a) { define i1 @f32_fcnan_fcinf_wrong_pred_strictfp(float %a) strictfp { ; CHECK-LABEL: define i1 @f32_fcnan_fcinf_wrong_pred_strictfp( ; CHECK-SAME: float [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[CMP:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 504) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A]], i32 519) +; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CMP]] ; %i32 = bitcast float %a to i32 diff --git a/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll b/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll index 78329faf34172..7c08fba46aab4 100644 --- a/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll +++ b/llvm/test/Transforms/InstCombine/fpclass-from-dom-cond.ll @@ -324,7 +324,8 @@ define i1 @test1_no_dominating(float %x, i1 %c) { ; CHECK: if.then: ; CHECK-NEXT: ret i1 false ; CHECK: if.else: -; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783) +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 240) +; CHECK-NEXT: [[RET:%.*]] = xor i1 [[TMP0]], true ; CHECK-NEXT: ret i1 [[RET]] ; entry0: diff --git a/llvm/test/Transforms/InstCombine/is_fpclass.ll b/llvm/test/Transforms/InstCombine/is_fpclass.ll index c1809b8bec61c..1dc58c8b53262 100644 --- a/llvm/test/Transforms/InstCombine/is_fpclass.ll +++ b/llvm/test/Transforms/InstCombine/is_fpclass.ll @@ -188,7 +188,8 @@ define <2 x i1> @test_class_is_p0_n0_or_nan_v2f32_daz(<2 x float> %x) "denormal- define i1 @test_class_is_p0_n0_or_sub_or_nan_f32(float %x) { ; CHECK-LABEL: @test_class_is_p0_n0_or_sub_or_nan_f32( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 243) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 780) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; ;` @@ -198,7 +199,8 @@ define i1 @test_class_is_p0_n0_or_sub_or_nan_f32(float %x) { define <2 x i1> @test_class_is_p0_n0_or_sub_or_nan_v2f32(<2 x float> %x) { ; CHECK-LABEL: @test_class_is_p0_n0_or_sub_or_nan_v2f32( -; CHECK-NEXT: [[VAL:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[X:%.*]], i32 243) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[X:%.*]], i32 780) +; CHECK-NEXT: [[VAL:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[VAL]] ; %val = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %x, i32 243) ; fcZero|fcNan|fcSubnormal @@ -252,7 +254,8 @@ define i1 @test_class_is_not_p0_n0_or_nan_f32(float %x) { define i1 @test_class_is_not_p0_n0_or_qnan_f32(float %x) { ; CHECK-LABEL: @test_class_is_not_p0_n0_or_qnan_f32( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 926) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 97) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 926) ; ~fcZero & ~fcSNan & fcAllFlags @@ -261,7 +264,8 @@ define i1 @test_class_is_not_p0_n0_or_qnan_f32(float %x) { define i1 @test_class_is_not_p0_n0_or_snan_f32(float %x) { ; CHECK-LABEL: @test_class_is_not_p0_n0_or_snan_f32( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 925) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 98) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 925) ; ~fcZero & ~fcQNan & fcAllFlags @@ -270,7 +274,8 @@ define i1 @test_class_is_not_p0_n0_or_snan_f32(float %x) { define i1 @test_class_is_not_p0_n0_or_nan_f32_daz(float %x) "denormal-fp-math-f32"="ieee,preserve-sign" { ; CHECK-LABEL: @test_class_is_not_p0_n0_or_nan_f32_daz( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 924) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 99) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 924) ; ~fcZero & ~fcNan & fcAllFlags @@ -279,7 +284,8 @@ define i1 @test_class_is_not_p0_n0_or_nan_f32_daz(float %x) "denormal-fp-math-f3 define i1 @test_class_is_not_p0_n0_or_sub_or_nan_f32(float %x) { ; CHECK-LABEL: @test_class_is_not_p0_n0_or_sub_or_nan_f32( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 783) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 240) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 783) ; ~(fcZero|fcSubnormal) | fcNan @@ -333,7 +339,8 @@ define <2 x i1> @test_class_is_not_p0_n0_v2f32(<2 x float> %x) { define i1 @test_class_is_not_p0_n0_f32_strict(float %x) strictfp { ; CHECK-LABEL: @test_class_is_not_p0_n0_f32_strict( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 927) #[[ATTR0]] +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 96) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 927) strictfp ; ~fcZero & fcAllFlags @@ -342,7 +349,8 @@ define i1 @test_class_is_not_p0_n0_f32_strict(float %x) strictfp { define i1 @test_class_is_not_p0_n0_f32_daz(float %x) "denormal-fp-math"="ieee,preserve-sign" { ; CHECK-LABEL: @test_class_is_not_p0_n0_f32_daz( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 927) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 96) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 927) ; ~fcZero & fcAllFlags @@ -351,7 +359,8 @@ define i1 @test_class_is_not_p0_n0_f32_daz(float %x) "denormal-fp-math"="ieee,pr define i1 @test_class_is_not_p0_n0_f32_dynamic(float %x) "denormal-fp-math"="ieee,dynamic" { ; CHECK-LABEL: @test_class_is_not_p0_n0_f32_dynamic( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 927) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 96) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 927) ; ~fcZero & fcAllFlags @@ -378,7 +387,8 @@ define i1 @test_class_is_not_p0_n0_psub_nsub_f32_dapz(float %x) "denormal-fp-mat define i1 @test_class_is_not_p0_n0_psub_nsub_f32_dynamic(float %x) "denormal-fp-math"="ieee,dynamic" { ; CHECK-LABEL: @test_class_is_not_p0_n0_psub_nsub_f32_dynamic( -; CHECK-NEXT: [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 783) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 240) +; CHECK-NEXT: [[VAL:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[VAL]] ; %val = call i1 @llvm.is.fpclass.f32(float %x, i32 783) ; ~(fcZero|fcSubnormal) & fcAllFlags @@ -963,7 +973,8 @@ define i1 @test_class_not_is_inf_nan(float %x) { define i1 @test_class_not_is_normal(float %x) { ; CHECK-LABEL: @test_class_not_is_normal( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 759) +; CHECK-NEXT: [[CLASS1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 264) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[CLASS1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %x, i32 264) @@ -983,7 +994,8 @@ define i1 @test_class_xor_false(float %x) { define <2 x i1> @test_class_not_vector(<2 x float> %x) { ; CHECK-LABEL: @test_class_not_vector( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[X:%.*]], i32 990) +; CHECK-NEXT: [[CLASS1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[X:%.*]], i32 33) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[CLASS1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %class = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %x, i32 33) @@ -1132,6 +1144,49 @@ define <2 x i1> @test_fold_or_class_v2f32(<2 x float> %a) { ret <2 x i1> %or } +; -------------------------------------------------------------------- +; or llvm.is.fpclass, (not llvm.is.fpclass) +; or (not llvm.is.fpclass), llvm.is.fpclass +; or (not llvm.is.fpclass), (not llvm.is.fpclass) +; -------------------------------------------------------------------- + +define i1 @test_fold_or_not_class_f32_0(float %a) { +; CHECK-LABEL: @test_fold_or_not_class_f32_0( +; CHECK-NEXT: [[OR:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A:%.*]], i32 11) +; CHECK-NEXT: ret i1 [[OR]] +; + %class0 = call i1 @llvm.is.fpclass.f32(float %a, i32 1020) + %notclass0 = xor i1 %class0, true + %class1 = call i1 @llvm.is.fpclass.f32(float %a, i32 8) + %or = or i1 %notclass0, %class1 + ret i1 %or +} + +define i1 @test_fold_or_not_class_f32_1(float %a) { +; CHECK-LABEL: @test_fold_or_not_class_f32_1( +; CHECK-NEXT: [[OR:%.*]] = fcmp ord float [[A:%.*]], 0.000000e+00 +; CHECK-NEXT: ret i1 [[OR]] +; + %class0 = call i1 @llvm.is.fpclass.f32(float %a, i32 4) + %class1 = call i1 @llvm.is.fpclass.f32(float %a, i32 7) + %notclass1 = xor i1 %class1, true + %or = or i1 %class0, %notclass1 + ret i1 %or +} + +define i1 @test_fold_or_not_class_f32_2(float %a) { +; CHECK-LABEL: @test_fold_or_not_class_f32_2( +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[A:%.*]], i32 12) +; CHECK-NEXT: ret i1 [[TMP1]] +; + %class0 = call i1 @llvm.is.fpclass.f32(float %a, i32 1019) + %notclass0 = xor i1 %class0, true + %class1 = call i1 @llvm.is.fpclass.f32(float %a, i32 1015) + %notclass1 = xor i1 %class1, true + %or = or i1 %notclass0, %notclass1 + ret i1 %or +} + ; -------------------------------------------------------------------- ; and llvm.is.fpclass, llvm.is.fpclass ; -------------------------------------------------------------------- @@ -1687,7 +1742,8 @@ define i1 @test_class_fneg_neginf_posnormal_negsubnormal_poszero_qnan(float %arg ; -> pinf | nnormal|psubnormal|nzero|nan define i1 @test_class_fneg_neginf_posnormal_negsubnormal_poszero_nan(float %arg) { ; CHECK-LABEL: @test_class_fneg_neginf_posnormal_negsubnormal_poszero_nan( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 683) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 340) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1731,7 +1787,8 @@ define i1 @test_class_fneg_posinf_negnormal_possubnormal_negzero_qnan(float %arg ; -> ninf|pnormal|negsubnormal|pzero define i1 @test_class_fneg_posinf_negnormal_possubnormal_negzero_nan(float %arg) { ; CHECK-LABEL: @test_class_fneg_posinf_negnormal_possubnormal_negzero_nan( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 343) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 680) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1767,7 +1824,8 @@ define i1 @test_class_fneg_multiple_use_fneg(float %arg, ptr %ptr) { define <2 x i1> @test_class_fneg_posinf_negnormal_possubnormal_negzero_nan_vector(<2 x float> %arg) { ; CHECK-LABEL: @test_class_fneg_posinf_negnormal_possubnormal_negzero_nan_vector( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 343) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 680) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fneg = fneg <2 x float> %arg @@ -2019,7 +2077,8 @@ define i1 @test_class_fabs_neginf_posnormal_negsubnormal_poszero_qnan(float %arg ; -> pnormal|pzero|nan define i1 @test_class_fabs_neginf_posnormal_negsubnormal_poszero_nan(float %arg) { ; CHECK-LABEL: @test_class_fabs_neginf_posnormal_negsubnormal_poszero_nan( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 363) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 660) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2063,7 +2122,8 @@ define i1 @test_class_fabs_posinf_negnormal_possubnormal_negzero_qnan(float %arg ; -> pinf|psubnormal|nan define i1 @test_class_fabs_posinf_negnormal_possubnormal_negzero_nan(float %arg) { ; CHECK-LABEL: @test_class_fabs_posinf_negnormal_possubnormal_negzero_nan( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 663) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 360) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2099,7 +2159,8 @@ define i1 @test_class_fabs_multiple_use_fabs(float %arg, ptr %ptr) { define <2 x i1> @test_class_fabs_posinf_negnormal_possubnormal_negzero_nan_vector(<2 x float> %arg) { ; CHECK-LABEL: @test_class_fabs_posinf_negnormal_possubnormal_negzero_nan_vector( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 663) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 360) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %arg) @@ -2350,7 +2411,8 @@ define i1 @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_qnan(float define i1 @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_nan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_nan( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 663) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 360) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2394,7 +2456,8 @@ define i1 @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_qnan(float define i1 @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_nan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_nan( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 363) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 660) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2433,7 +2496,8 @@ define i1 @test_class_fneg_fabs_multiple_use_fabs(float %arg, ptr %ptr) { define <2 x i1> @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_nan_vector(<2 x float> %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_nan_vector( -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 663) +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 360) +; CHECK-NEXT: [[CLASS:%.*]] = xor <2 x i1> [[TMP1]], splat (i1 true) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %arg) @@ -2784,7 +2848,8 @@ define i1 @test_class_is_pzero_psub_pnorm_pinf_qnan__ieee(float %arg) #0 { define i1 @test_class_is_pzero_psub_pnorm_pinf_nan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_pzero_psub_pnorm_pinf_nan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 963) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 60) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 963) @@ -2865,7 +2930,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf__ieee(float %arg) #0 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 993) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 30) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 993) @@ -2874,7 +2940,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__ieee(float %arg) #0 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 994) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 29) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 994) @@ -2892,7 +2959,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__ieee(float %arg) #0 { define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1017) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 6) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1017) @@ -2901,7 +2969,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__ieee(float %arg) #0 { define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1009) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 14) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1009) @@ -2910,7 +2979,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__ieee(float %arg) define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1010) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 13) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1010) @@ -2919,7 +2989,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__ieee(float %arg) define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_nan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_nan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1011) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 12) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1011) @@ -2947,7 +3018,8 @@ define i1 @test_class_is_nzero_nsub_pnorm_pinf__ieee(float %arg) #0 { define i1 @test_class_is_not_pzero_psub_pnorm_pinf__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_pzero_psub_pnorm_pinf__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 63) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 960) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 63) @@ -2992,7 +3064,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf__ieee(float %arg) #0 { define i1 @test_class_is_not_psub_pnorm_pinf_snan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf_snan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 126) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 897) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 126) @@ -3001,7 +3074,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf_snan__ieee(float %arg) #0 { define i1 @test_class_is_not_psub_pnorm_pinf_qnan__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf_qnan__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 125) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 898) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 125) @@ -3019,7 +3093,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf_nan__ieee(float %arg) #0 { define i1 @test_class_is_not_pnorm_pinf__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_pnorm_pinf__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 255) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 768) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 255) @@ -3028,7 +3103,8 @@ define i1 @test_class_is_not_pnorm_pinf__ieee(float %arg) #0 { define i1 @test_class_is_not_pzero_pnorm_pinf__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_pzero_pnorm_pinf__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 319) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 704) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 319) @@ -3118,7 +3194,8 @@ define i1 @test_class_is_not_nsub_nzero_pzero_psub_pnorm_pinf_nan__ieee(float %a define i1 @test_class_is_not_nzero_psub_pnorm_pinf__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_nzero_psub_pnorm_pinf__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 95) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 928) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 95) @@ -3127,7 +3204,8 @@ define i1 @test_class_is_not_nzero_psub_pnorm_pinf__ieee(float %arg) #0 { define i1 @test_class_is_not_nzero_nsub_pnorm_pinf__ieee(float %arg) #0 { ; CHECK-LABEL: @test_class_is_not_nzero_nsub_pnorm_pinf__ieee( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 207) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 816) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 207) @@ -3167,7 +3245,8 @@ define i1 @test_class_is_pzero_psub_pnorm_pinf_qnan__daz(float %arg) #1 { define i1 @test_class_is_pzero_psub_pnorm_pinf_nan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_pzero_psub_pnorm_pinf_nan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 963) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 60) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 963) @@ -3248,7 +3327,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf__daz(float %arg) #1 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 993) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 30) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 993) @@ -3257,7 +3337,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__daz(float %arg) #1 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 994) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 29) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 994) @@ -3266,7 +3347,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__daz(float %arg) #1 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 995) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 28) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 995) @@ -3275,7 +3357,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__daz(float %arg) #1 { define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1017) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 6) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1017) @@ -3284,7 +3367,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__daz(float %arg) #1 { define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1009) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 14) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1009) @@ -3293,7 +3377,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__daz(float %arg) define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1010) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 13) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1010) @@ -3330,7 +3415,8 @@ define i1 @test_class_is_nzero_nsub_pnorm_pinf__daz(float %arg) #1 { define i1 @test_class_is_not_pzero_psub_pnorm_pinf__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_pzero_psub_pnorm_pinf__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 63) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 960) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 63) @@ -3366,7 +3452,8 @@ define i1 @test_class_is_not_pzero_psub_pnorm_pinf_nan__daz(float %arg) #1 { define i1 @test_class_is_not_psub_pnorm_pinf__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 127) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 896) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 127) @@ -3375,7 +3462,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf__daz(float %arg) #1 { define i1 @test_class_is_not_psub_pnorm_pinf_snan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf_snan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 126) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 897) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 126) @@ -3384,7 +3472,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf_snan__daz(float %arg) #1 { define i1 @test_class_is_not_psub_pnorm_pinf_qnan__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf_qnan__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 125) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 898) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 125) @@ -3411,7 +3500,8 @@ define i1 @test_class_is_not_pnorm_pinf__daz(float %arg) #1 { define i1 @test_class_is_not_pzero_pnorm_pinf__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_pzero_pnorm_pinf__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 319) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 704) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 319) @@ -3501,7 +3591,8 @@ define i1 @test_class_is_not_nsub_nzero_pzero_psub_pnorm_pinf_nan__daz(float %ar define i1 @test_class_is_not_nzero_psub_pnorm_pinf__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_nzero_psub_pnorm_pinf__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 95) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 928) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 95) @@ -3510,7 +3601,8 @@ define i1 @test_class_is_not_nzero_psub_pnorm_pinf__daz(float %arg) #1 { define i1 @test_class_is_not_nzero_nsub_pnorm_pinf__daz(float %arg) #1 { ; CHECK-LABEL: @test_class_is_not_nzero_nsub_pnorm_pinf__daz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 207) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 816) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 207) @@ -3550,7 +3642,8 @@ define i1 @test_class_is_pzero_psub_pnorm_pinf_qnan__dapz(float %arg) #2 { define i1 @test_class_is_pzero_psub_pnorm_pinf_nan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_pzero_psub_pnorm_pinf_nan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 963) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 60) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 963) @@ -3631,7 +3724,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf__dapz(float %arg) #2 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 993) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 30) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 993) @@ -3640,7 +3734,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_snan__dapz(float %arg) #2 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 994) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 29) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 994) @@ -3649,7 +3744,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_qnan__dapz(float %arg) #2 { define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 995) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 28) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 995) @@ -3658,7 +3754,8 @@ define i1 @test_class_is_nzero_pzero_psub_pnorm_pinf_nan__dapz(float %arg) #2 { define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1017) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 6) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1017) @@ -3667,7 +3764,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf__dapz(float %arg) #2 { define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1009) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 14) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1009) @@ -3676,7 +3774,8 @@ define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_snan__dapz(float %arg) define i1 @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_nsub_nzero_pzero_psub_pnorm_pinf_qnan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1010) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 13) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 1010) @@ -3713,7 +3812,8 @@ define i1 @test_class_is_nzero_nsub_pnorm_pinf__dapz(float %arg) #2 { define i1 @test_class_is_not_pzero_psub_pnorm_pinf__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_pzero_psub_pnorm_pinf__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 63) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 960) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 63) @@ -3749,7 +3849,8 @@ define i1 @test_class_is_not_pzero_psub_pnorm_pinf_nan__dapz(float %arg) #2 { define i1 @test_class_is_not_psub_pnorm_pinf__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 127) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 896) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 127) @@ -3758,7 +3859,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf__dapz(float %arg) #2 { define i1 @test_class_is_not_psub_pnorm_pinf_snan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf_snan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 126) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 897) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 126) @@ -3767,7 +3869,8 @@ define i1 @test_class_is_not_psub_pnorm_pinf_snan__dapz(float %arg) #2 { define i1 @test_class_is_not_psub_pnorm_pinf_qnan__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf_qnan__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 125) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 898) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 125) @@ -3794,7 +3897,8 @@ define i1 @test_class_is_not_pnorm_pinf__dapz(float %arg) #2 { define i1 @test_class_is_not_pzero_pnorm_pinf__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_pzero_pnorm_pinf__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 319) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 704) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 319) @@ -3884,7 +3988,8 @@ define i1 @test_class_is_not_nsub_nzero_pzero_psub_pnorm_pinf_nan__dapz(float %a define i1 @test_class_is_not_nzero_psub_pnorm_pinf__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_nzero_psub_pnorm_pinf__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 95) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 928) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 95) @@ -3893,7 +3998,8 @@ define i1 @test_class_is_not_nzero_psub_pnorm_pinf__dapz(float %arg) #2 { define i1 @test_class_is_not_nzero_nsub_pnorm_pinf__dapz(float %arg) #2 { ; CHECK-LABEL: @test_class_is_not_nzero_nsub_pnorm_pinf__dapz( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 207) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 816) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 207) @@ -3915,7 +4021,8 @@ define i1 @test_class_is_psub_pnorm_pinf__dynamic(float %arg) #3 { define i1 @test_class_is_not_psub_pnorm_pinf__dynamic(float %arg) #3 { ; CHECK-LABEL: @test_class_is_not_psub_pnorm_pinf__dynamic( -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 127) +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 896) +; CHECK-NEXT: [[CLASS:%.*]] = xor i1 [[TMP1]], true ; CHECK-NEXT: ret i1 [[CLASS]] ; %class = call i1 @llvm.is.fpclass.f32(float %arg, i32 127)