[llvm] 8503cb6 - InstCombine: Fix wrong insert point for fdiv->copysign simplify (#180839)

via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 11 00:14:43 PST 2026


Author: Matt Arsenault
Date: 2026-02-11T09:14:39+01:00
New Revision: 8503cb6ad5107ea7221d167379cdb65593b799ad

URL: https://github.com/llvm/llvm-project/commit/8503cb6ad5107ea7221d167379cdb65593b799ad
DIFF: https://github.com/llvm/llvm-project/commit/8503cb6ad5107ea7221d167379cdb65593b799ad.diff

LOG: InstCombine: Fix wrong insert point for fdiv->copysign simplify (#180839)

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
    llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 43e61adcbaa59..bc5bdcca08ab2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2711,6 +2711,9 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
       return ConstantFP::getZero(VTy);
 
     if (KnownLHS.isKnownAlways(fcPosZero) && KnownRHS.isKnownNeverNaN()) {
+      IRBuilderBase::InsertPointGuard Guard(Builder);
+      Builder.SetInsertPoint(I);
+
       // nnan +0 / x -> copysign(0, rhs)
       // TODO: -0 / x => copysign(0, fneg(rhs))
       Value *Copysign = Builder.CreateCopySign(X, Y, FMF);
@@ -2726,6 +2729,9 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
                            KnownLHS.isKnownNeverLogicalZero(Mode))) &&
          (KnownRHS.isKnownAlways(fcPosZero) ||
           (FMF.noSignedZeros() && KnownRHS.isKnownAlways(fcZero))))) {
+      IRBuilderBase::InsertPointGuard Guard(Builder);
+      Builder.SetInsertPoint(I);
+
       // nnan x / 0 => copysign(inf, x);
       // nnan nsz x / -0 => copysign(inf, x);
       Value *Copysign =

diff  --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll
index 9132ca2b6f572..bdde6b3a72dad 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll
@@ -826,6 +826,18 @@ define nofpclass(nan) half @ret_no_nan_result__known_pzero__fdiv__not_inf(half n
   ret half %div
 }
 
+define nofpclass(nan) half @ret_no_nan_result__known_pzero__fdiv__not_inf__insert_point(half nofpclass(inf sub norm nzero) %pzero.or.nan, half nofpclass(inf nan) %not.inf.or.nan) {
+; CHECK-LABEL: define nofpclass(nan) half @ret_no_nan_result__known_pzero__fdiv__not_inf__insert_point(
+; CHECK-SAME: half nofpclass(inf nzero sub norm) [[PZERO_OR_NAN:%.*]], half nofpclass(nan inf) [[NOT_INF_OR_NAN:%.*]]) {
+; CHECK-NEXT:    [[DIV:%.*]] = call half @llvm.copysign.f16(half 0xH0000, half [[NOT_INF_OR_NAN]])
+; CHECK-NEXT:    [[BARRIER:%.*]] = call half @llvm.arithmetic.fence.f16(half [[DIV]])
+; CHECK-NEXT:    ret half [[BARRIER]]
+;
+  %div = fdiv half %pzero.or.nan, %not.inf.or.nan
+  %barrier = call half @llvm.arithmetic.fence.f16(half %div)
+  ret half %barrier
+}
+
 ; Should be able to fold to copysign, helped by the lack of nan results.
 define nofpclass(nan) half @ret_no_nan_result__not_inf_or_nan__fdiv__known_pzero_or_nan(half nofpclass(inf) %not.inf.or.nan, half nofpclass(inf sub norm nzero) %pzero.or.nan) {
 ; CHECK-LABEL: define nofpclass(nan) half @ret_no_nan_result__not_inf_or_nan__fdiv__known_pzero_or_nan(
@@ -837,6 +849,18 @@ define nofpclass(nan) half @ret_no_nan_result__not_inf_or_nan__fdiv__known_pzero
   ret half %div
 }
 
+define nofpclass(nan) half @ret_no_nan_result__not_inf_or_nan__fdiv__known_pzero_or_nan__insert_pt(half nofpclass(inf) %not.inf.or.nan, half nofpclass(inf sub norm nzero) %pzero.or.nan) {
+; CHECK-LABEL: define nofpclass(nan) half @ret_no_nan_result__not_inf_or_nan__fdiv__known_pzero_or_nan__insert_pt(
+; CHECK-SAME: half nofpclass(inf) [[NOT_INF_OR_NAN:%.*]], half nofpclass(inf nzero sub norm) [[PZERO_OR_NAN:%.*]]) {
+; CHECK-NEXT:    [[DIV:%.*]] = call half @llvm.copysign.f16(half 0xH7C00, half [[NOT_INF_OR_NAN]])
+; CHECK-NEXT:    [[BARRIER:%.*]] = call half @llvm.arithmetic.fence.f16(half [[DIV]])
+; CHECK-NEXT:    ret half [[BARRIER]]
+;
+  %div = fdiv half %not.inf.or.nan, %pzero.or.nan
+  %barrier = call half @llvm.arithmetic.fence.f16(half %div)
+  ret half %barrier
+}
+
 ; -> fneg, with help of no nan results
 define nofpclass(nan) half @ret_no_nan_result__known_inf_or_nan__fdiv__known_negative_non0(half nofpclass(zero sub norm) %inf.or.nan, half nofpclass(zero pinf pnorm psub) %negative.non0) {
 ; CHECK-LABEL: define nofpclass(nan) half @ret_no_nan_result__known_inf_or_nan__fdiv__known_negative_non0(


        


More information about the llvm-commits mailing list