llvm-project icon indicating copy to clipboard operation
llvm-project copied to clipboard

Missed Optimization: Fold Trunc/ZExt around Unsigned Min

Open Leo0506 opened this issue 2 months ago • 2 comments

define i16 @src(i32 %arg1, i32 %arg2, ptr %arg0) {
  %v0 = udiv i32 %arg2, %arg1
  %v1 = load i16, ptr %arg0, align 2
  %v2 = and i32 %v0, 65535
  %v3 = zext i16 %v1 to i32
  %v4 = call i32 @llvm.umin.i32(i32 %v2, i32 %v3)
  %v5 = trunc nuw i32 %v4 to i16
  ret i16 %v5
}

define i16 @tgt(i32 %arg1, i32 %arg2, ptr %arg0) {
  %v0 = udiv i32 %arg2, %arg1
  %v1 = load i16, ptr %arg0, align 2
  %v2 = trunc i32 %v0 to i16
  %v3 = call i16 @llvm.umin.i16(i16 %v2, i16 %v1)
  ret i16 %v3
}

alive2: https://alive2.llvm.org/ce/z/CyiY6W godbolt: https://godbolt.org/z/sffPM5f8K Pattern found in: https://github.com/dtcxzyw/llvm-opt-benchmark/blob/main/bench/linux/optimized/tcp.ll

Leo0506 avatar Nov 08 '25 05:11 Leo0506

Hi, I'm going to investigate why this isn't combining and will try to resolve the issue ;)

Xinlong-Wu avatar Dec 17 '25 07:12 Xinlong-Wu

@Xinlong-Wu Probably adding support for min/max intrinsics to https://github.com/llvm/llvm-project/blob/3186ca25bc6cbd592a7ee25fc89b99354d7fda7e/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp#L486 may help.

nikic avatar Dec 17 '25 11:12 nikic