@@ -585,6 +585,19 @@ define i16 @smax_smin_to_scmp_i16(i16 %x) {
585
585
ret i16 %cond5
586
586
}
587
587
588
+ ; Test the reversed pattern: smax(smin(X, 1), -1) -> scmp(X, 0)
589
+ define i32 @smin_smax_to_scmp (i32 %x ) {
590
+ ; CHECK-LABEL: define i32 @smin_smax_to_scmp
591
+ ; CHECK-SAME: (i32 [[X:%.*]]) {
592
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
593
+ ; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP1]], i32 1)
594
+ ; CHECK-NEXT: ret i32 [[COND5]]
595
+ ;
596
+ %cond = call i32 @llvm.smin.i32 (i32 %x , i32 1 )
597
+ %cond5 = call i32 @llvm.smax.i32 (i32 %cond , i32 -1 )
598
+ ret i32 %cond5
599
+ }
600
+
588
601
define i32 @test_max_min_neg (i32 %x ) {
589
602
; CHECK-LABEL: define i32 @test_max_min_neg
590
603
; CHECK-SAME: (i32 [[X:%.*]]) {
@@ -597,8 +610,8 @@ define i32 @test_max_min_neg(i32 %x) {
597
610
ret i32 %cond5
598
611
}
599
612
600
- define i32 @test_no_optimization_multiple_uses (i32 %x ) {
601
- ; CHECK-LABEL: define i32 @test_no_optimization_multiple_uses
613
+ define i32 @test_multiple_uses (i32 %x ) {
614
+ ; CHECK-LABEL: define i32 @test_multiple_uses
602
615
; CHECK-SAME: (i32 [[X:%.*]]) {
603
616
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
604
617
; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
0 commit comments