Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp =================================================================== --- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -827,6 +827,31 @@ uint32_t Mask = CMask->getZExtValue(); const bool IsStrict = II.isStrictFP(); + Value *FNegSrc; + if (match(Src0, m_FNeg(m_Value(FNegSrc)))) { + // is.fpclass (fneg x), mask -> is.fpclass x, (fneg mask) + unsigned NewMask = Mask & fcNan; + if (Mask & fcNegInf) + NewMask |= fcPosInf; + if (Mask & fcNegNormal) + NewMask |= fcPosNormal; + if (Mask & fcNegSubnormal) + NewMask |= fcPosSubnormal; + if (Mask & fcNegZero) + NewMask |= fcPosZero; + if (Mask & fcPosZero) + NewMask |= fcNegZero; + if (Mask & fcPosSubnormal) + NewMask |= fcNegSubnormal; + if (Mask & fcPosNormal) + NewMask |= fcNegNormal; + if (Mask & fcPosInf) + NewMask |= fcNegInf; + + II.setArgOperand(1, ConstantInt::get(Src1->getType(), NewMask)); + return replaceOperand(II, 0, FNegSrc); + } + if (Mask == fcNan && !IsStrict) { // Equivalent of isnan. Replace with standard fcmp if we don't care about FP // exceptions. Index: llvm/test/Transforms/InstCombine/is_fpclass.ll =================================================================== --- llvm/test/Transforms/InstCombine/is_fpclass.ll +++ llvm/test/Transforms/InstCombine/is_fpclass.ll @@ -1064,8 +1064,7 @@ ; -> snan define i1 @test_class_fneg_snan(float %arg) { ; CHECK-LABEL: @test_class_fneg_snan( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 1) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 1) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1076,8 +1075,7 @@ ; -> qnan define i1 @test_class_fneg_qnan(float %arg) { ; CHECK-LABEL: @test_class_fneg_qnan( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 2) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 2) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1088,8 +1086,7 @@ ; -> posinf define i1 @test_class_fneg_neginf(float %arg) { ; CHECK-LABEL: @test_class_fneg_neginf( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 4) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 512) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1100,8 +1097,7 @@ ; -> posnormal define i1 @test_class_fneg_negnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_negnormal( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 8) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 256) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1112,8 +1108,7 @@ ; -> possubnormal define i1 @test_class_fneg_negsubnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_negsubnormal( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 16) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 128) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1124,8 +1119,7 @@ ; -> poszero define i1 @test_class_fneg_negzero(float %arg) { ; CHECK-LABEL: @test_class_fneg_negzero( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 32) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 64) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1136,8 +1130,7 @@ ; -> negzero define i1 @test_class_fneg_poszero(float %arg) { ; CHECK-LABEL: @test_class_fneg_poszero( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 64) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 32) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1148,8 +1141,7 @@ ; -> negsubnormal define i1 @test_class_fneg_possubnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_possubnormal( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 128) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 16) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1160,8 +1152,7 @@ ; -> negnormal define i1 @test_class_fneg_posnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_posnormal( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 256) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 8) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1172,8 +1163,7 @@ ; -> neginf define i1 @test_class_fneg_posinf(float %arg) { ; CHECK-LABEL: @test_class_fneg_posinf( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 512) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 4) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1206,8 +1196,7 @@ ; -> normal define i1 @test_class_fneg_normal(float %arg) { ; CHECK-LABEL: @test_class_fneg_normal( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 264) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 264) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1219,8 +1208,7 @@ define i1 @test_class_fneg_zero(float %arg) { ; ; CHECK-LABEL: @test_class_fneg_zero( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 96) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 96) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1232,8 +1220,7 @@ define i1 @test_class_fneg_subnormal(float %arg) { ; ; CHECK-LABEL: @test_class_fneg_subnormal( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 144) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 144) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1244,8 +1231,7 @@ ; -> normal|pinf define i1 @test_class_fneg_normal_neginf(float %arg) { ; CHECK-LABEL: @test_class_fneg_normal_neginf( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 268) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 776) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1256,8 +1242,7 @@ ; -> normal|ninf define i1 @test_class_fneg_normal_pinf(float %arg) { ; CHECK-LABEL: @test_class_fneg_normal_pinf( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 776) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 268) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1268,8 +1253,7 @@ ; -> pinf|nnormal|pnormal|nzero define i1 @test_class_fneg_neginf_posnormal_negsubnormal_poszero(float %arg) { ; CHECK-LABEL: @test_class_fneg_neginf_posnormal_negsubnormal_poszero( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 340) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 680) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1280,8 +1264,7 @@ ; -> pinf|nnormal|psubnormal|negzero|snan define i1 @test_class_fneg_neginf_posnormal_negsubnormal_poszero_snan(float %arg) { ; CHECK-LABEL: @test_class_fneg_neginf_posnormal_negsubnormal_poszero_snan( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 341) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 681) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1292,8 +1275,7 @@ ; pinf|negnormal|psubnormal|negzero|qnan define i1 @test_class_fneg_neginf_posnormal_negsubnormal_poszero_qnan(float %arg) { ; CHECK-LABEL: @test_class_fneg_neginf_posnormal_negsubnormal_poszero_qnan( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 342) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 682) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1304,8 +1286,7 @@ ; -> 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: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 343) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 683) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1316,8 +1297,7 @@ ; -> ninf|pnormal|negsubnormal|pzero define i1 @test_class_fneg_posinf_negnormal_possubnormal_negzero(float %arg) { ; CHECK-LABEL: @test_class_fneg_posinf_negnormal_possubnormal_negzero( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 680) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 340) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1328,8 +1308,7 @@ ; -> ninf|pnormal|negsubnormal|pzero|snan define i1 @test_class_fneg_posinf_negnormal_possubnormal_negzero_snan(float %arg) { ; CHECK-LABEL: @test_class_fneg_posinf_negnormal_possubnormal_negzero_snan( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 681) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 341) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1340,8 +1319,7 @@ ; -> ninf|pnormal|negsubnormal|pzero|qnan define i1 @test_class_fneg_posinf_negnormal_possubnormal_negzero_qnan(float %arg) { ; CHECK-LABEL: @test_class_fneg_posinf_negnormal_possubnormal_negzero_qnan( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 682) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 342) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1352,8 +1330,7 @@ ; -> 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: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 683) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 343) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1365,8 +1342,7 @@ ; -> ninf|pnormal|negsubnormal|pzero|snan define i1 @test_class_fneg_posinf_negnormal_possubnormal_negzero_snan_strictfp(float %arg) strictfp { ; CHECK-LABEL: @test_class_fneg_posinf_negnormal_possubnormal_negzero_snan_strictfp( -; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 681) #[[ATTR2]] +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 341) #[[ATTR2]] ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1379,7 +1355,7 @@ ; CHECK-LABEL: @test_class_fneg_multiple_use_fneg( ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[ARG:%.*]] ; CHECK-NEXT: store float [[FNEG]], ptr [[PTR:%.*]], align 4 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG]], i32 682) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 342) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fneg = fneg float %arg @@ -1390,8 +1366,7 @@ 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: [[FNEG:%.*]] = fneg <2 x float> [[ARG:%.*]] -; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[FNEG]], i32 683) +; CHECK-NEXT: [[CLASS:%.*]] = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> [[ARG:%.*]], i32 343) ; CHECK-NEXT: ret <2 x i1> [[CLASS]] ; %fneg = fneg <2 x float> %arg @@ -1786,8 +1761,7 @@ define i1 @test_class_fneg_fabs_snan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_snan( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 1) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 1) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1799,8 +1773,7 @@ define i1 @test_class_fneg_fabs_qnan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_qnan( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 2) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 2) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1812,8 +1785,7 @@ define i1 @test_class_fneg_fabs_neginf(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_neginf( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 4) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 512) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1825,8 +1797,7 @@ define i1 @test_class_fneg_fabs_negnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_negnormal( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 8) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 256) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1838,8 +1809,7 @@ define i1 @test_class_fneg_fabs_negsubnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_negsubnormal( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 16) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 128) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1851,8 +1821,7 @@ define i1 @test_class_fneg_fabs_negzero(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_negzero( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 32) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 64) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1864,8 +1833,7 @@ define i1 @test_class_fneg_fabs_poszero(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_poszero( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 64) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 32) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1877,8 +1845,7 @@ define i1 @test_class_fneg_fabs_possubnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_possubnormal( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 128) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 16) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1890,8 +1857,7 @@ define i1 @test_class_fneg_fabs_posnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posnormal( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 256) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 8) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1903,8 +1869,7 @@ define i1 @test_class_fneg_fabs_posinf(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posinf( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 512) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 4) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1938,8 +1903,7 @@ define i1 @test_class_fneg_fabs_normal(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_normal( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 264) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 264) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1951,8 +1915,7 @@ define i1 @test_class_fneg_fabs_zero(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_zero( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 96) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 96) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1964,8 +1927,7 @@ define i1 @test_class_fneg_fabs_subnormal(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_subnormal( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 144) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 144) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1977,8 +1939,7 @@ define i1 @test_class_fneg_fabs_normal_neginf(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_normal_neginf( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 268) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 776) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -1990,8 +1951,7 @@ define i1 @test_class_fneg_fabs_normal_pinf(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_normal_pinf( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 776) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 268) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2003,8 +1963,7 @@ define i1 @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 340) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 680) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2016,8 +1975,7 @@ define i1 @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_snan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_snan( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 341) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 681) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2029,8 +1987,7 @@ define i1 @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_qnan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_neginf_posnormal_negsubnormal_poszero_qnan( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 342) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 682) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2042,8 +1999,7 @@ 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: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 343) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 683) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2055,8 +2011,7 @@ define i1 @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 680) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 340) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2068,8 +2023,7 @@ define i1 @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_snan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_snan( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 681) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 341) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2081,8 +2035,7 @@ define i1 @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_qnan(float %arg) { ; CHECK-LABEL: @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_qnan( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 682) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 342) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2094,8 +2047,7 @@ 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: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 683) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 343) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2108,8 +2060,7 @@ define i1 @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_snan_strictfp(float %arg) strictfp { ; CHECK-LABEL: @test_class_fneg_fabs_posinf_negnormal_possubnormal_negzero_snan_strictfp( ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) -; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 681) #[[ATTR2]] +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 341) #[[ATTR2]] ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg) @@ -2124,7 +2075,7 @@ ; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG:%.*]]) ; CHECK-NEXT: [[FNEG_FABS:%.*]] = fneg float [[FABS]] ; CHECK-NEXT: store float [[FNEG_FABS]], ptr [[PTR:%.*]], align 4 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FNEG_FABS]], i32 682) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[FABS]], i32 342) ; CHECK-NEXT: ret i1 [[CLASS]] ; %fabs = call float @llvm.fabs.f32(float %arg)