[llvm] 27c3158 - [InstCombine] Use context in select-to-umin nonzero check (#225381)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 29 05:47:29 PDT 2026


Author: Nopileos Isemados
Date: 2026-09-29T14:47:23+02:00
New Revision: 27c315830887f3da871d3ccdb4bb403d8be034b6

URL: https://github.com/llvm/llvm-project/commit/27c315830887f3da871d3ccdb4bb403d8be034b6
DIFF: https://github.com/llvm/llvm-project/commit/27c315830887f3da871d3ccdb4bb403d8be034b6.diff

LOG: [InstCombine] Use context in select-to-umin nonzero check (#225381)

foldSelectICmpMinMax() queries whether W is nonzero without an
instruction context, missing facts from a preceding llvm.assume or
dominating branch. Querying at the comparison enables the existing
select-to-umin fold.

Fix #225345

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
    llvm/test/Transforms/InstCombine/minmax-fold.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index e4d95eb2beb19..877b5ab0caddb 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2462,7 +2462,8 @@ Instruction *InstCombinerImpl::foldSelectInstWithICmp(SelectInst &SI,
     return &SI;
   }
 
-  if (Value *V = foldSelectICmpMinMax(ICI, TrueVal, FalseVal, Builder, SQ))
+  if (Value *V = foldSelectICmpMinMax(ICI, TrueVal, FalseVal, Builder,
+                                      SQ.getWithInstruction(&SI)))
     return replaceInstUsesWith(SI, V);
 
   if (Value *V = foldSelectICmpAndZeroShl(ICI, TrueVal, FalseVal, Builder))

diff  --git a/llvm/test/Transforms/InstCombine/minmax-fold.ll b/llvm/test/Transforms/InstCombine/minmax-fold.ll
index 3234ed5055f80..9e035a00f264f 100644
--- a/llvm/test/Transforms/InstCombine/minmax-fold.ll
+++ b/llvm/test/Transforms/InstCombine/minmax-fold.ll
@@ -1647,6 +1647,61 @@ define i32 @test_umin_sub1_nuw(i32 %x, i32 range(i32 1, 0) %w) {
   ret i32 %r
 }
 
+define i32 @test_umin_sub1_assume_nonzero(i32 %x, i32 %w) {
+; CHECK-LABEL: @test_umin_sub1_assume_nonzero(
+; CHECK-NEXT:    [[NONZERO:%.*]] = icmp ne i32 [[W:%.*]], 0
+; CHECK-NEXT:    call void @llvm.assume(i1 [[NONZERO]])
+; CHECK-NEXT:    [[SUB:%.*]] = add i32 [[W]], -1
+; CHECK-NEXT:    [[R:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 [[SUB]])
+; CHECK-NEXT:    ret i32 [[R]]
+;
+  %nonzero = icmp ne i32 %w, 0
+  call void @llvm.assume(i1 %nonzero)
+  %cmp = icmp ult i32 %x, %w
+  %sub = add i32 %w, -1
+  %r = select i1 %cmp, i32 %x, i32 %sub
+  ret i32 %r
+}
+
+define i32 @test_umin_sub1_guard_nonzero(i32 %x, i32 %w) {
+; CHECK-LABEL: @test_umin_sub1_guard_nonzero(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[ZERO:%.*]] = icmp eq i32 [[W:%.*]], 0
+; CHECK-NEXT:    br i1 [[ZERO]], label [[ZERO_BB:%.*]], label [[USE:%.*]]
+; CHECK:       zero.bb:
+; CHECK-NEXT:    ret i32 0
+; CHECK:       use:
+; CHECK-NEXT:    [[SUB:%.*]] = add i32 [[W]], -1
+; CHECK-NEXT:    [[R:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 [[SUB]])
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  %zero = icmp eq i32 %w, 0
+  br i1 %zero, label %zero.bb, label %use
+
+zero.bb:
+  ret i32 0
+
+use:
+  %cmp = icmp ult i32 %x, %w
+  %sub = add i32 %w, -1
+  %r = select i1 %cmp, i32 %x, i32 %sub
+  ret i32 %r
+}
+
+define i32 @test_umin_sub1_unknown_nonzero(i32 %x, i32 %w) {
+; CHECK-LABEL: @test_umin_sub1_unknown_nonzero(
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], [[W:%.*]]
+; CHECK-NEXT:    [[SUB:%.*]] = add i32 [[W]], -1
+; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP]], i32 [[X]], i32 [[SUB]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+  %cmp = icmp ult i32 %x, %w
+  %sub = add i32 %w, -1
+  %r = select i1 %cmp, i32 %x, i32 %sub
+  ret i32 %r
+}
+
 define i32 @test_smin_sub1_nsw_swapped(i32 %x, i32 %w) {
 ; CHECK-LABEL: @test_smin_sub1_nsw_swapped(
 ; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[W:%.*]], -1


        


More information about the llvm-commits mailing list