[llvm] [InstCombine] Fold `fpto{s|u}i non-norm` to zero (PR #85569)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 17 07:30:01 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Yingwei Zheng (dtcxzyw)
<details>
<summary>Changes</summary>
This patch enables more optimization after canonicalizing `fmul X, 0.0` into a copysign.
I decide to implement this fold in InstCombine because `computeKnownFPClass` may be expensive.
Alive2: https://alive2.llvm.org/ce/z/ASM8tQ
---
Full diff: https://github.com/llvm/llvm-project/pull/85569.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp (+19)
- (modified) llvm/test/Transforms/InstCombine/fpcast.ll (+61)
``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 381cd858d26293..b19da1e075819c 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -1923,10 +1923,26 @@ Instruction *InstCombinerImpl::foldItoFPtoI(CastInst &FI) {
return replaceInstUsesWith(FI, X);
}
+static Instruction *foldFPtoI(Instruction &FI, InstCombiner &IC) {
+ // fpto{u/s}i non-norm --> 0
+ FPClassTest Mask =
+ FI.getOpcode() == Instruction::FPToUI ? fcPosNormal : fcNormal;
+ KnownFPClass FPClass =
+ computeKnownFPClass(FI.getOperand(0), Mask, /*Depth=*/0,
+ IC.getSimplifyQuery().getWithInstruction(&FI));
+ if (FPClass.isKnownNever(Mask))
+ return IC.replaceInstUsesWith(FI, ConstantInt::getNullValue(FI.getType()));
+
+ return nullptr;
+}
+
Instruction *InstCombinerImpl::visitFPToUI(FPToUIInst &FI) {
if (Instruction *I = foldItoFPtoI(FI))
return I;
+ if (Instruction *I = foldFPtoI(FI, *this))
+ return I;
+
return commonCastTransforms(FI);
}
@@ -1934,6 +1950,9 @@ Instruction *InstCombinerImpl::visitFPToSI(FPToSIInst &FI) {
if (Instruction *I = foldItoFPtoI(FI))
return I;
+ if (Instruction *I = foldFPtoI(FI, *this))
+ return I;
+
return commonCastTransforms(FI);
}
diff --git a/llvm/test/Transforms/InstCombine/fpcast.ll b/llvm/test/Transforms/InstCombine/fpcast.ll
index 88ca556f4d8f8b..7eae44b6abfbec 100644
--- a/llvm/test/Transforms/InstCombine/fpcast.ll
+++ b/llvm/test/Transforms/InstCombine/fpcast.ll
@@ -347,3 +347,64 @@ define double @masked_uint_to_fpext3(i32 %x) {
%r = fpext float %f to double
ret double %r
}
+
+define i32 @fptosi_nonnorm(float nofpclass(norm) %x) {
+; CHECK-LABEL: @fptosi_nonnorm(
+; CHECK-NEXT: ret i32 0
+;
+ %ret = fptosi float %x to i32
+ ret i32 %ret
+}
+
+define i32 @fptoui_nonnorm(float nofpclass(pnorm) %x) {
+; CHECK-LABEL: @fptoui_nonnorm(
+; CHECK-NEXT: ret i32 0
+;
+ %ret = fptoui float %x to i32
+ ret i32 %ret
+}
+
+define i32 @fptosi_nonnorm_copysign(float %x) {
+; CHECK-LABEL: @fptosi_nonnorm_copysign(
+; CHECK-NEXT: ret i32 0
+;
+ %val = call float @llvm.copysign.f32(float 0.0, float %x)
+ %ret = fptosi float %val to i32
+ ret i32 %ret
+}
+
+define i32 @fptosi_nonnorm_fmul(float %x) {
+; CHECK-LABEL: @fptosi_nonnorm_fmul(
+; CHECK-NEXT: [[SEL:%.*]] = fmul float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: [[RET:%.*]] = fptosi float [[SEL]] to i32
+; CHECK-NEXT: ret i32 [[RET]]
+;
+ %sel = fmul float %x, 0.000000e+00
+ %ret = fptosi float %sel to i32
+ ret i32 %ret
+}
+
+define i32 @fptosi_select(i1 %cond) {
+; CHECK-LABEL: @fptosi_select(
+; CHECK-NEXT: [[RET:%.*]] = select i1 [[COND:%.*]], i32 1, i32 -1
+; CHECK-NEXT: ret i32 [[RET]]
+;
+ %sel = select i1 %cond, float 1.0, float -1.0
+ %ret = fptosi float %sel to i32
+ ret i32 %ret
+}
+
+define i32 @mul_pos_zero_convert(i32 %a) {
+; CHECK-LABEL: @mul_pos_zero_convert(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[FP:%.*]] = sitofp i32 [[A:%.*]] to float
+; CHECK-NEXT: [[RET:%.*]] = fmul float [[FP]], 0.000000e+00
+; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[RET]] to i32
+; CHECK-NEXT: ret i32 [[CONV]]
+;
+entry:
+ %fp = sitofp i32 %a to float
+ %ret = fmul float %fp, 0.000000e+00
+ %conv = fptosi float %ret to i32
+ ret i32 %conv
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/85569
More information about the llvm-commits
mailing list