From 5ccbd07dd607bac8a05016d80e3fa34f2d393279 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 16 Nov 2022 20:51:40 -0800 Subject: [PATCH] InstCombine: Fold out is_fpclass inf checks from test mask for known finite sources Make the partner transform already done for nnan sources. --- .../Transforms/InstCombine/InstCombineCalls.cpp | 12 ++++++++++++ llvm/test/Transforms/InstCombine/is_fpclass.ll | 22 ++++++---------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index bb98693..2fe8dbe 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -866,6 +866,18 @@ Instruction *InstCombinerImpl::foldIntrinsicIsFPClass(IntrinsicInst &II) { return replaceInstUsesWith(II, ConstantInt::get(II.getType(), true)); } + // fp_class (ninf x), ninf|pinf|other -> fp_class (ninf x), other + if ((Mask & fcInf) && isKnownNeverInfinity(Src0, &getTargetLibraryInfo())) { + II.setArgOperand(1, ConstantInt::get(Src1->getType(), Mask & ~fcInf)); + return ⅈ + } + + // fp_class (ninf x), ~(ninf|pinf) -> true + if (Mask == (~fcInf & fcAllFlags) && + isKnownNeverInfinity(Src0, &getTargetLibraryInfo())) { + return replaceInstUsesWith(II, ConstantInt::get(II.getType(), true)); + } + return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/is_fpclass.ll b/llvm/test/Transforms/InstCombine/is_fpclass.ll index fae4162..605f075 100644 --- a/llvm/test/Transforms/InstCombine/is_fpclass.ll +++ b/llvm/test/Transforms/InstCombine/is_fpclass.ll @@ -469,9 +469,7 @@ define i1 @test_class_is_not_nan_nnan_src_strict(float %x) { 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) @@ -480,9 +478,7 @@ define i1 @test_class_is_ninf_pinf_ninf_src(float %x) { 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) @@ -491,9 +487,7 @@ define i1 @test_class_is_ninf_ninf_src(float %x) { 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) @@ -503,7 +497,7 @@ define i1 @test_class_is_pinf_ninf_src(float %x) { 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 @@ -513,9 +507,7 @@ define i1 @test_class_is_ninf_pinf_pnormal_ninf_src(float %x) { define i1 @test_class_is_not_inf_ninf_src(float %x) { ; CHECK-LABEL: @test_class_is_not_inf_ninf_src( -; CHECK-NEXT: [[NINF:%.*]] = fadd ninf float [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 507) -; CHECK-NEXT: ret i1 [[CLASS]] +; CHECK-NEXT: ret i1 true ; %ninf = fadd ninf float %x, 1.0 %class = call i1 @llvm.is.fpclass.f32(float %ninf, i32 507) ; ~fcInf & fcAllFlags @@ -524,9 +516,7 @@ define i1 @test_class_is_not_inf_ninf_src(float %x) { define i1 @test_class_is_not_inf_ninf_src_strict(float %x) { ; CHECK-LABEL: @test_class_is_not_inf_ninf_src_strict( -; CHECK-NEXT: [[NINF:%.*]] = fadd ninf float [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[CLASS:%.*]] = call i1 @llvm.is.fpclass.f32(float [[NINF]], i32 507) #[[ATTR2]] -; CHECK-NEXT: ret i1 [[CLASS]] +; CHECK-NEXT: ret i1 true ; %ninf = fadd ninf float %x, 1.0 %class = call i1 @llvm.is.fpclass.f32(float %ninf, i32 507) strictfp ; ~fcInf & fcAllFlags -- 2.7.4