@@ -126,6 +126,20 @@ define i1 @sgt_implies_ge_via_assume(i32 %i, i32 %j) {
126126 ret i1 %i.ge.j
127127}
128128
129+ define i1 @sgt_implies_false_le_via_assume (i32 %i , i32 %j ) {
130+ ; CHECK-LABEL: define i1 @sgt_implies_false_le_via_assume(
131+ ; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]]) {
132+ ; CHECK-NEXT: [[I_SGT_J:%.*]] = icmp sgt i32 [[I]], [[J]]
133+ ; CHECK-NEXT: call void @llvm.assume(i1 [[I_SGT_J]])
134+ ; CHECK-NEXT: [[I_LE_J:%.*]] = icmp samesign ule i32 [[I]], [[J]]
135+ ; CHECK-NEXT: ret i1 [[I_LE_J]]
136+ ;
137+ %i.sgt.j = icmp sgt i32 %i , %j
138+ call void @llvm.assume (i1 %i.sgt.j )
139+ %i.le.j = icmp samesign ule i32 %i , %j
140+ ret i1 %i.le.j
141+ }
142+
129143define i32 @gt_implies_sge_dominating (i32 %a , i32 %len ) {
130144; CHECK-LABEL: define i32 @gt_implies_sge_dominating(
131145; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) {
@@ -150,6 +164,30 @@ end:
150164 ret i32 -1
151165}
152166
167+ define i32 @gt_implies_false_sle_dominating (i32 %a , i32 %len ) {
168+ ; CHECK-LABEL: define i32 @gt_implies_false_sle_dominating(
169+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) {
170+ ; CHECK-NEXT: [[ENTRY:.*:]]
171+ ; CHECK-NEXT: [[A_GT_LEN:%.*]] = icmp samesign ugt i32 [[A]], [[LEN]]
172+ ; CHECK-NEXT: br i1 [[A_GT_LEN]], label %[[TAKEN:.*]], label %[[END:.*]]
173+ ; CHECK: [[TAKEN]]:
174+ ; CHECK-NEXT: ret i32 0
175+ ; CHECK: [[END]]:
176+ ; CHECK-NEXT: ret i32 -1
177+ ;
178+ entry:
179+ %a.gt.len = icmp samesign ugt i32 %a , %len
180+ br i1 %a.gt.len , label %taken , label %end
181+
182+ taken:
183+ %a.sle.len = icmp sle i32 %a , %len
184+ %res = select i1 %a.sle.len , i32 30 , i32 0
185+ ret i32 %res
186+
187+ end:
188+ ret i32 -1
189+ }
190+
153191define i32 @gt_implies_sge_dominating_cr (i32 %a , i32 %len ) {
154192; CHECK-LABEL: define i32 @gt_implies_sge_dominating_cr(
155193; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) {
0 commit comments