Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp =================================================================== --- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -852,6 +852,12 @@ // TODO: Handle inverted mask cases, e.g. // fp_class (nnan x), ~(qnan|snan) -> true + // fp_class (ninf x), ninf|pinf|other -> fp_class (ninf x), other + if ((Mask & fcInf) && isKnownNeverInfinity(Src0, &getTargetLibraryInfo())) { + return replaceOperand(II, 1, + ConstantInt::get(Src1->getType(), Mask & ~fcInf)); + } + // Clamp mask to used bits if ((Mask & fcAllFlags) != Mask) { CallInst *NewCall = Builder.CreateCall( Index: llvm/test/Transforms/InstCombine/is_fpclass.ll =================================================================== --- llvm/test/Transforms/InstCombine/is_fpclass.ll +++ llvm/test/Transforms/InstCombine/is_fpclass.ll @@ -360,9 +360,7 @@ define i1 @test_class_is_ninf_pinf_ninf_src(float %x) { ; CHECK-LABEL: @test_class_is_ninf_pinf_ninf_src( -; CHECK-NEXT: [[NINF:%.*]] = fadd ninf float [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 516) -; CHECK-NEXT: ret i1 [[CLASS]] +; CHECK-NEXT: ret i1 false ; %ninf = fadd ninf float %x, 1.0 %class = call i1 @llvm.is.fpclass.f32(float %ninf, i32 516) @@ -371,9 +369,7 @@ define i1 @test_class_is_ninf_ninf_src(float %x) { ; CHECK-LABEL: @test_class_is_ninf_ninf_src( -; CHECK-NEXT: [[NINF:%.*]] = fadd ninf float [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 4) -; CHECK-NEXT: ret i1 [[CLASS]] +; CHECK-NEXT: ret i1 false ; %ninf = fadd ninf float %x, 1.0 %class = call i1 @llvm.is.fpclass.f32(float %ninf, i32 4) @@ -382,9 +378,7 @@ define i1 @test_class_is_pinf_ninf_src(float %x) { ; CHECK-LABEL: @test_class_is_pinf_ninf_src( -; CHECK-NEXT: [[NINF:%.*]] = fadd ninf float [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 512) -; CHECK-NEXT: ret i1 [[CLASS]] +; CHECK-NEXT: ret i1 false ; %ninf = fadd ninf float %x, 1.0 %class = call i1 @llvm.is.fpclass.f32(float %ninf, i32 512) @@ -394,7 +388,7 @@ define i1 @test_class_is_ninf_pinf_pnormal_ninf_src(float %x) { ; CHECK-LABEL: @test_class_is_ninf_pinf_pnormal_ninf_src( ; CHECK-NEXT: [[NINF:%.*]] = fadd ninf float [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 772) +; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 256) ; CHECK-NEXT: ret i1 [[CLASS]] ; %ninf = fadd ninf float %x, 1.0