@@ -17,6 +17,22 @@ define i1 @incr_sle(i32 %i, i32 %len) {
1717 ret i1 %res
1818}
1919
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+
2036define i1 @incr_sge (i32 %i , i32 %len ) {
2137; CHECK-LABEL: define i1 @incr_sge(
2238; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
@@ -33,6 +49,22 @@ define i1 @incr_sge(i32 %i, i32 %len) {
3349 ret i1 %res
3450}
3551
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+
3668define i1 @incr_ule (i32 %i , i32 %len ) {
3769; CHECK-LABEL: define i1 @incr_ule(
3870; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
@@ -49,6 +81,22 @@ define i1 @incr_ule(i32 %i, i32 %len) {
4981 ret i1 %res
5082}
5183
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+
52100define i1 @incr_uge (i32 %i , i32 %len ) {
53101; CHECK-LABEL: define i1 @incr_uge(
54102; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) {
@@ -65,6 +113,22 @@ define i1 @incr_uge(i32 %i, i32 %len) {
65113 ret i1 %res
66114}
67115
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+
68132define i1 @sgt_implies_ge_via_assume (i32 %i , i32 %j ) {
69133; CHECK-LABEL: define i1 @sgt_implies_ge_via_assume(
70134; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]]) {
0 commit comments