[llvm] [InstCombine] smin(smax(X, -1), 1) -> scmp(X, 0) and smax(smin(X, 1), -1) -> scmp(X, 0) (PR #145736)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 27 14:13:05 PDT 2025
- Previous message: [llvm] [InstCombine] smin(smax(X, -1), 1) -> scmp(X, 0) and smax(smin(X, 1), -1) -> scmp(X, 0) (PR #145736)
- Next message: [llvm] [InstCombine] smin(smax(X, -1), 1) -> scmp(X, 0) and smax(smin(X, 1), -1) -> scmp(X, 0) (PR #145736)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
================
@@ -560,3 +560,73 @@ unreached:
call void @use(i32 %result)
ret void
}
+
+define i32 @smax_smin_to_scmp(i32 %x) {
+; CHECK-LABEL: define i32 @smax_smin_to_scmp
+; CHECK-SAME: (i32 [[X:%.*]]) {
+; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[X]], i32 0)
+; CHECK-NEXT: ret i32 [[COND5]]
+;
+ %cond = call i32 @llvm.smax.i32(i32 %x, i32 -1)
+ %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)
+ ret i32 %cond5
+}
+
+define i16 @smax_smin_to_scmp_i16(i16 %x) {
+; CHECK-LABEL: define i16 @smax_smin_to_scmp_i16
+; CHECK-SAME: (i16 [[X:%.*]]) {
+; CHECK-NEXT: [[COND5:%.*]] = call i16 @llvm.scmp.i16.i16(i16 [[X]], i16 0)
+; CHECK-NEXT: ret i16 [[COND5]]
+;
+ %cond = call i16 @llvm.smax.i16(i16 %x, i16 -1)
+ %cond5 = call i16 @llvm.smin.i16(i16 %cond, i16 1)
+ ret i16 %cond5
+}
+
+; Test the reversed pattern: smax(smin(X, 1), -1) -> scmp(X, 0)
+define i32 @smin_smax_to_scmp(i32 %x) {
+; CHECK-LABEL: define i32 @smin_smax_to_scmp
+; CHECK-SAME: (i32 [[X:%.*]]) {
+; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[X]], i32 0)
+; CHECK-NEXT: ret i32 [[COND5]]
+;
+ %cond = call i32 @llvm.smin.i32(i32 %x, i32 1)
+ %cond5 = call i32 @llvm.smax.i32(i32 %cond, i32 -1)
+ ret i32 %cond5
+}
+
+define i32 @test_max_min_neg(i32 %x) {
+; CHECK-LABEL: define i32 @test_max_min_neg
+; CHECK-SAME: (i32 [[X:%.*]]) {
+; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -2)
+; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
+; CHECK-NEXT: ret i32 [[COND5]]
+;
+ %cond = call i32 @llvm.smax.i32(i32 %x, i32 -2)
+ %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)
+ ret i32 %cond5
+}
+
+define i32 @test_max_min_neg_2(i32 %x) {
+; CHECK-LABEL: define i32 @test_max_min_neg_2
+; CHECK-SAME: (i32 [[X:%.*]]) {
+; CHECK-NEXT: ret i32 -1
+;
+ %cond = call i32 @llvm.smax.i32(i32 %x, i32 2)
+ %cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 -1)
----------------
AZero13 wrote:
Okay well that's addressed now!
https://github.com/llvm/llvm-project/pull/145736
- Previous message: [llvm] [InstCombine] smin(smax(X, -1), 1) -> scmp(X, 0) and smax(smin(X, 1), -1) -> scmp(X, 0) (PR #145736)
- Next message: [llvm] [InstCombine] smin(smax(X, -1), 1) -> scmp(X, 0) and smax(smin(X, 1), -1) -> scmp(X, 0) (PR #145736)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the llvm-commits
mailing list