@@ -17,6 +17,22 @@ define i1 @incr_sle(i32 %i, i32 %len) {
17
17
ret i1 %res
18
18
}
19
19
20
+ define i1 @incr_sle_no_nsw_nuw (i32 %i , i32 %len ) {
21
+ ; CHECK-LABEL: define i1 @incr_sle_no_nsw_nuw(
22
+ ; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
23
+ ; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1
24
+ ; CHECK-NEXT: [[I_GT_LEN:%.*]] = icmp samesign ugt i32 [[I]], [[LEN]]
25
+ ; CHECK-NEXT: [[I_INCR_SGT_LEN:%.*]] = icmp sgt i32 [[I_INCR]], [[LEN]]
26
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sle i1 [[I_INCR_SGT_LEN]], [[I_GT_LEN]]
27
+ ; CHECK-NEXT: ret i1 [[RES]]
28
+ ;
29
+ %i.incr = add i32 %i , 1
30
+ %i.gt.len = icmp samesign ugt i32 %i , %len
31
+ %i.incr.sgt.len = icmp sgt i32 %i.incr , %len
32
+ %res = icmp sle i1 %i.incr.sgt.len , %i.gt.len
33
+ ret i1 %res
34
+ }
35
+
20
36
define i1 @incr_sge (i32 %i , i32 %len ) {
21
37
; CHECK-LABEL: define i1 @incr_sge(
22
38
; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
@@ -33,6 +49,22 @@ define i1 @incr_sge(i32 %i, i32 %len) {
33
49
ret i1 %res
34
50
}
35
51
52
+ define i1 @incr_sge_no_nsw_nuw (i32 %i , i32 %len ) {
53
+ ; CHECK-LABEL: define i1 @incr_sge_no_nsw_nuw(
54
+ ; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
55
+ ; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1
56
+ ; CHECK-NEXT: [[I_LT_LEN:%.*]] = icmp samesign ult i32 [[I]], [[LEN]]
57
+ ; CHECK-NEXT: [[I_INCR_SLT_LEN:%.*]] = icmp slt i32 [[I_INCR]], [[LEN]]
58
+ ; CHECK-NEXT: [[RES:%.*]] = icmp sge i1 [[I_INCR_SLT_LEN]], [[I_LT_LEN]]
59
+ ; CHECK-NEXT: ret i1 [[RES]]
60
+ ;
61
+ %i.incr = add i32 %i , 1
62
+ %i.lt.len = icmp samesign ult i32 %i , %len
63
+ %i.incr.slt.len = icmp slt i32 %i.incr , %len
64
+ %res = icmp sge i1 %i.incr.slt.len , %i.lt.len
65
+ ret i1 %res
66
+ }
67
+
36
68
define i1 @incr_ule (i32 %i , i32 %len ) {
37
69
; CHECK-LABEL: define i1 @incr_ule(
38
70
; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
@@ -49,6 +81,22 @@ define i1 @incr_ule(i32 %i, i32 %len) {
49
81
ret i1 %res
50
82
}
51
83
84
+ define i1 @incr_ule_no_nsw_nuw (i32 %i , i32 %len ) {
85
+ ; CHECK-LABEL: define i1 @incr_ule_no_nsw_nuw(
86
+ ; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
87
+ ; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1
88
+ ; CHECK-NEXT: [[I_GT_LEN:%.*]] = icmp samesign ugt i32 [[I]], [[LEN]]
89
+ ; CHECK-NEXT: [[I_INCR_SGT_LEN:%.*]] = icmp sgt i32 [[I_INCR]], [[LEN]]
90
+ ; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[I_GT_LEN]], [[I_INCR_SGT_LEN]]
91
+ ; CHECK-NEXT: ret i1 [[RES]]
92
+ ;
93
+ %i.incr = add i32 %i , 1
94
+ %i.gt.len = icmp samesign ugt i32 %i , %len
95
+ %i.incr.sgt.len = icmp sgt i32 %i.incr , %len
96
+ %res = icmp ule i1 %i.gt.len , %i.incr.sgt.len
97
+ ret i1 %res
98
+ }
99
+
52
100
define i1 @incr_uge (i32 %i , i32 %len ) {
53
101
; CHECK-LABEL: define i1 @incr_uge(
54
102
; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
@@ -65,6 +113,22 @@ define i1 @incr_uge(i32 %i, i32 %len) {
65
113
ret i1 %res
66
114
}
67
115
116
+ define i1 @incr_uge_no_nsw_nuw (i32 %i , i32 %len ) {
117
+ ; CHECK-LABEL: define i1 @incr_uge_no_nsw_nuw(
118
+ ; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
119
+ ; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1
120
+ ; CHECK-NEXT: [[I_LT_LEN:%.*]] = icmp samesign ult i32 [[I]], [[LEN]]
121
+ ; CHECK-NEXT: [[I_INCR_SLT_LEN:%.*]] = icmp slt i32 [[I_INCR]], [[LEN]]
122
+ ; CHECK-NEXT: [[RES:%.*]] = icmp uge i1 [[I_LT_LEN]], [[I_INCR_SLT_LEN]]
123
+ ; CHECK-NEXT: ret i1 [[RES]]
124
+ ;
125
+ %i.incr = add i32 %i , 1
126
+ %i.lt.len = icmp samesign ult i32 %i , %len
127
+ %i.incr.slt.len = icmp slt i32 %i.incr , %len
128
+ %res = icmp uge i1 %i.lt.len , %i.incr.slt.len
129
+ ret i1 %res
130
+ }
131
+
68
132
define i1 @sgt_implies_ge_via_assume (i32 %i , i32 %j ) {
69
133
; CHECK-LABEL: define i1 @sgt_implies_ge_via_assume(
70
134
; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]]) {
0 commit comments