[llvm] [InstCombine] Allow detection of nsz on phi in fcmp+select to min/max (PR #214156)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 5 01:29:09 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: David Green (davemgreen)

<details>
<summary>Changes</summary>

The nsz could be coming from the phi, so check for canIgnoreSignBitOfZero first. Fixes a regression from #<!-- -->213133.

---
Full diff: https://github.com/llvm/llvm-project/pull/214156.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp (+3-2) 
- (modified) llvm/test/Transforms/InstCombine/minmax-fp-loop-carried.ll (+40-1) 


``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 1770ef3be9cc5..39f0d11df4db9 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -4527,13 +4527,14 @@ static bool isSelectZeroSignInsignificant(SelectInst &SI) {
       auto *User = cast<Instruction>(U.getUser());
       if (User == &SI)
         continue;
+      if (canIgnoreSignBitOfZero(U))
+        continue;
       if (isa<PHINode, SelectInst>(User)) {
         if (Visited.insert(User).second)
           Worklist.push_back(User);
         continue;
       }
-      if (!canIgnoreSignBitOfZero(U))
-        return false;
+      return false;
     }
   }
   return true;
diff --git a/llvm/test/Transforms/InstCombine/minmax-fp-loop-carried.ll b/llvm/test/Transforms/InstCombine/minmax-fp-loop-carried.ll
index e42dcf4059c3b..06926a3308fb3 100644
--- a/llvm/test/Transforms/InstCombine/minmax-fp-loop-carried.ll
+++ b/llvm/test/Transforms/InstCombine/minmax-fp-loop-carried.ll
@@ -239,4 +239,43 @@ entry:
   ret i32 %r
 }
 
-declare float @llvm.fabs.f32(float)
+define float @from_phi(ptr %arrayidx.i, i32 %mul, float %acc) {
+; CHECK-LABEL: @from_phi(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[FOR_COND4:%.*]]
+; CHECK:       for.cond4:
+; CHECK-NEXT:    [[ACC_ADDR_1:%.*]] = phi nsz float [ [[ACC_ADDR_0:%.*]], [[FOR_BODY:%.*]] ], [ [[DOTSROA_SPECULATED:%.*]], [[FOR_BODY7:%.*]] ]
+; CHECK-NEXT:    [[HDR_ROW_0:%.*]] = phi ptr [ [[ARRAYIDX_I:%.*]], [[FOR_BODY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_BODY7]] ]
+; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC:%.*]], [[FOR_BODY7]] ]
+; CHECK-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[I_0]], [[MUL:%.*]]
+; CHECK-NEXT:    br i1 [[CMP5]], label [[FOR_BODY7]], label [[FOR_COND_CLEANUP6:%.*]]
+; CHECK:       for.body7:
+; CHECK-NEXT:    [[TMP10:%.*]] = load float, ptr [[HDR_ROW_0]], align 4
+; CHECK-NEXT:    [[DOTSROA_SPECULATED]] = call nnan ninf nsz float @llvm.minnum.f32(float [[TMP10]], float [[ACC_ADDR_1]])
+; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_0]], 1
+; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds nuw i8, ptr [[HDR_ROW_0]], i64 4
+; CHECK-NEXT:    br label [[FOR_COND4]]
+; CHECK:       for.cond.cleanup6:
+; CHECK-NEXT:    ret float [[ACC_ADDR_1]]
+;
+entry:
+  br label %for.cond4
+
+for.cond4:                                        ; preds = %for.body7, %for.body
+  %acc.addr.1 = phi nsz float [ %acc, %entry ], [ %.sroa.speculated, %for.body7 ]
+  %row.0 = phi ptr [ %arrayidx.i, %entry ], [ %incdec.ptr, %for.body7 ]
+  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body7 ]
+  %cmp5 = icmp slt i32 %i.0, %mul
+  br i1 %cmp5, label %for.body7, label %for.cond.cleanup6
+
+for.body7:                                        ; preds = %for.cond4
+  %10 = load float, ptr %row.0, align 4
+  %cmp.i.i.i = fcmp fast olt float %10, %acc.addr.1
+  %.sroa.speculated = select i1 %cmp.i.i.i, float %10, float %acc.addr.1
+  %inc = add nuw nsw i32 %i.0, 1
+  %incdec.ptr = getelementptr inbounds nuw i8, ptr %row.0, i64 4
+  br label %for.cond4
+
+for.cond.cleanup6:                                ; preds = %for.cond4
+  ret float %acc.addr.1
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/214156


More information about the llvm-commits mailing list