@@ -3440,3 +3440,79 @@ define i1 @val_is_aligend_pred_mismatch(i32 %num) {
34403440 %_0 = icmp sge i32 %num.masked , %num
34413441 ret i1 %_0
34423442}
3443+
3444+ define i1 @icmp_samesign_with_nsw_add (i32 %arg0 ) {
3445+ ; CHECK-LABEL: @icmp_samesign_with_nsw_add(
3446+ ; CHECK-NEXT: entry:
3447+ ; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 25
3448+ ; CHECK-NEXT: ret i1 [[V1]]
3449+ ;
3450+ entry:
3451+ %v0 = add nsw i32 %arg0 , -18
3452+ %v1 = icmp samesign ugt i32 %v0 , 7
3453+ ret i1 %v1
3454+ }
3455+
3456+ ; Negative test; Fold shouldn't fire since -124 - 12 causes signed overflow
3457+ define i1 @icmp_samesign_with_nsw_add_neg (i8 %arg0 ) {
3458+ ; CHECK-LABEL: @icmp_samesign_with_nsw_add_neg(
3459+ ; CHECK-NEXT: entry:
3460+ ; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[ARG0:%.*]], -121
3461+ ; CHECK-NEXT: [[V1:%.*]] = icmp ult i8 [[TMP0]], 123
3462+ ; CHECK-NEXT: ret i1 [[V1]]
3463+ ;
3464+ entry:
3465+ %v0 = add nsw i8 %arg0 , 12
3466+ %v1 = icmp samesign ugt i8 %v0 , -124
3467+ ret i1 %v1
3468+ }
3469+
3470+ define i1 @icmp_with_nuw_add (i32 %arg0 ) {
3471+ ; CHECK-LABEL: @icmp_with_nuw_add(
3472+ ; CHECK-NEXT: entry:
3473+ ; CHECK-NEXT: [[V1:%.*]] = icmp ult i32 [[ARG0:%.*]], 11
3474+ ; CHECK-NEXT: ret i1 [[V1]]
3475+ ;
3476+ entry:
3477+ %v0 = add nuw i32 %arg0 , 7
3478+ %v1 = icmp ult i32 %v0 , 18
3479+ ret i1 %v1
3480+ }
3481+
3482+ define i1 @icmp_partial_negative_samesign_ult_to_slt (i8 range(i8 -1 , 5 ) %x ) {
3483+ ; CHECK-LABEL: @icmp_partial_negative_samesign_ult_to_slt(
3484+ ; CHECK-NEXT: entry:
3485+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 2
3486+ ; CHECK-NEXT: ret i1 [[CMP]]
3487+ ;
3488+ entry:
3489+ %add = add nsw i8 %x , -5
3490+ %cmp = icmp samesign ult i8 %add , -3
3491+ ret i1 %cmp
3492+ }
3493+
3494+ define i1 @icmp_pos_samesign_slt_to_ult (i8 range(i8 1 , 5 ) %x ) {
3495+ ; CHECK-LABEL: @icmp_pos_samesign_slt_to_ult(
3496+ ; CHECK-NEXT: entry:
3497+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i8 [[X:%.*]], 2
3498+ ; CHECK-NEXT: ret i1 [[CMP]]
3499+ ;
3500+ entry:
3501+ %add = add nsw i8 %x , 1
3502+ %cmp = icmp samesign slt i8 %add , 3
3503+ ret i1 %cmp
3504+ }
3505+
3506+ ; Since higher priority is given to unsigned predicates, the predicate should
3507+ ; not change
3508+ define i1 @icmp_nuw_nsw_samesign (i32 %arg0 ) {
3509+ ; CHECK-LABEL: @icmp_nuw_nsw_samesign(
3510+ ; CHECK-NEXT: entry:
3511+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ARG0:%.*]], 9
3512+ ; CHECK-NEXT: ret i1 [[CMP]]
3513+ ;
3514+ entry:
3515+ %v0 = add nuw nsw i32 %arg0 , 1
3516+ %cmp = icmp samesign ult i32 %v0 , 10
3517+ ret i1 %cmp
3518+ }
0 commit comments