19d5299ebSRamkumar Ramachandra; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 29d5299ebSRamkumar Ramachandra; RUN: opt -passes=instsimplify -S %s | FileCheck %s 39d5299ebSRamkumar Ramachandra 49d5299ebSRamkumar Ramachandradefine i1 @incr_sle(i32 %i, i32 %len) { 59d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_sle( 69d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 7b53e7942SRamkumar Ramachandra; CHECK-NEXT: ret i1 true 89d5299ebSRamkumar Ramachandra; 99d5299ebSRamkumar Ramachandra %i.incr = add nsw nuw i32 %i, 1 109d5299ebSRamkumar Ramachandra %i.gt.len = icmp samesign ugt i32 %i, %len 119d5299ebSRamkumar Ramachandra %i.incr.sgt.len = icmp sgt i32 %i.incr, %len 129d5299ebSRamkumar Ramachandra %res = icmp sle i1 %i.incr.sgt.len, %i.gt.len 139d5299ebSRamkumar Ramachandra ret i1 %res 149d5299ebSRamkumar Ramachandra} 159d5299ebSRamkumar Ramachandra 169d5299ebSRamkumar Ramachandradefine i1 @incr_sle_no_nsw_nuw(i32 %i, i32 %len) { 179d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_sle_no_nsw_nuw( 189d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 199d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1 209d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_GT_LEN:%.*]] = icmp samesign ugt i32 [[I]], [[LEN]] 219d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR_SGT_LEN:%.*]] = icmp sgt i32 [[I_INCR]], [[LEN]] 229d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = icmp sle i1 [[I_INCR_SGT_LEN]], [[I_GT_LEN]] 239d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i1 [[RES]] 249d5299ebSRamkumar Ramachandra; 259d5299ebSRamkumar Ramachandra %i.incr = add i32 %i, 1 269d5299ebSRamkumar Ramachandra %i.gt.len = icmp samesign ugt i32 %i, %len 279d5299ebSRamkumar Ramachandra %i.incr.sgt.len = icmp sgt i32 %i.incr, %len 289d5299ebSRamkumar Ramachandra %res = icmp sle i1 %i.incr.sgt.len, %i.gt.len 299d5299ebSRamkumar Ramachandra ret i1 %res 309d5299ebSRamkumar Ramachandra} 319d5299ebSRamkumar Ramachandra 329d5299ebSRamkumar Ramachandradefine i1 @incr_sge(i32 %i, i32 %len) { 339d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_sge( 349d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 35b53e7942SRamkumar Ramachandra; CHECK-NEXT: ret i1 true 369d5299ebSRamkumar Ramachandra; 379d5299ebSRamkumar Ramachandra %i.incr = add nsw nuw i32 %i, 1 389d5299ebSRamkumar Ramachandra %i.lt.len = icmp samesign ult i32 %i, %len 399d5299ebSRamkumar Ramachandra %i.incr.slt.len = icmp slt i32 %i.incr, %len 409d5299ebSRamkumar Ramachandra %res = icmp sge i1 %i.incr.slt.len, %i.lt.len 419d5299ebSRamkumar Ramachandra ret i1 %res 429d5299ebSRamkumar Ramachandra} 439d5299ebSRamkumar Ramachandra 449d5299ebSRamkumar Ramachandradefine i1 @incr_sge_no_nsw_nuw(i32 %i, i32 %len) { 459d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_sge_no_nsw_nuw( 469d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 479d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1 489d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_LT_LEN:%.*]] = icmp samesign ult i32 [[I]], [[LEN]] 499d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR_SLT_LEN:%.*]] = icmp slt i32 [[I_INCR]], [[LEN]] 509d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = icmp sge i1 [[I_INCR_SLT_LEN]], [[I_LT_LEN]] 519d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i1 [[RES]] 529d5299ebSRamkumar Ramachandra; 539d5299ebSRamkumar Ramachandra %i.incr = add i32 %i, 1 549d5299ebSRamkumar Ramachandra %i.lt.len = icmp samesign ult i32 %i, %len 559d5299ebSRamkumar Ramachandra %i.incr.slt.len = icmp slt i32 %i.incr, %len 569d5299ebSRamkumar Ramachandra %res = icmp sge i1 %i.incr.slt.len, %i.lt.len 579d5299ebSRamkumar Ramachandra ret i1 %res 589d5299ebSRamkumar Ramachandra} 599d5299ebSRamkumar Ramachandra 609d5299ebSRamkumar Ramachandradefine i1 @incr_ule(i32 %i, i32 %len) { 619d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_ule( 629d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 63b53e7942SRamkumar Ramachandra; CHECK-NEXT: ret i1 true 649d5299ebSRamkumar Ramachandra; 659d5299ebSRamkumar Ramachandra %i.incr = add nsw nuw i32 %i, 1 669d5299ebSRamkumar Ramachandra %i.gt.len = icmp samesign ugt i32 %i, %len 679d5299ebSRamkumar Ramachandra %i.incr.sgt.len = icmp sgt i32 %i.incr, %len 689d5299ebSRamkumar Ramachandra %res = icmp ule i1 %i.gt.len, %i.incr.sgt.len 699d5299ebSRamkumar Ramachandra ret i1 %res 709d5299ebSRamkumar Ramachandra} 719d5299ebSRamkumar Ramachandra 729d5299ebSRamkumar Ramachandradefine i1 @incr_ule_no_nsw_nuw(i32 %i, i32 %len) { 739d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_ule_no_nsw_nuw( 749d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 759d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1 769d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_GT_LEN:%.*]] = icmp samesign ugt i32 [[I]], [[LEN]] 779d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR_SGT_LEN:%.*]] = icmp sgt i32 [[I_INCR]], [[LEN]] 789d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = icmp ule i1 [[I_GT_LEN]], [[I_INCR_SGT_LEN]] 799d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i1 [[RES]] 809d5299ebSRamkumar Ramachandra; 819d5299ebSRamkumar Ramachandra %i.incr = add i32 %i, 1 829d5299ebSRamkumar Ramachandra %i.gt.len = icmp samesign ugt i32 %i, %len 839d5299ebSRamkumar Ramachandra %i.incr.sgt.len = icmp sgt i32 %i.incr, %len 849d5299ebSRamkumar Ramachandra %res = icmp ule i1 %i.gt.len, %i.incr.sgt.len 859d5299ebSRamkumar Ramachandra ret i1 %res 869d5299ebSRamkumar Ramachandra} 879d5299ebSRamkumar Ramachandra 889d5299ebSRamkumar Ramachandradefine i1 @incr_uge(i32 %i, i32 %len) { 899d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_uge( 909d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 91b53e7942SRamkumar Ramachandra; CHECK-NEXT: ret i1 true 929d5299ebSRamkumar Ramachandra; 939d5299ebSRamkumar Ramachandra %i.incr = add nsw nuw i32 %i, 1 949d5299ebSRamkumar Ramachandra %i.lt.len = icmp samesign ult i32 %i, %len 959d5299ebSRamkumar Ramachandra %i.incr.slt.len = icmp slt i32 %i.incr, %len 969d5299ebSRamkumar Ramachandra %res = icmp uge i1 %i.lt.len, %i.incr.slt.len 979d5299ebSRamkumar Ramachandra ret i1 %res 989d5299ebSRamkumar Ramachandra} 999d5299ebSRamkumar Ramachandra 1009d5299ebSRamkumar Ramachandradefine i1 @incr_uge_no_nsw_nuw(i32 %i, i32 %len) { 1019d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @incr_uge_no_nsw_nuw( 1029d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[LEN:%.*]]) { 1039d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR:%.*]] = add i32 [[I]], 1 1049d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_LT_LEN:%.*]] = icmp samesign ult i32 [[I]], [[LEN]] 1059d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_INCR_SLT_LEN:%.*]] = icmp slt i32 [[I_INCR]], [[LEN]] 1069d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = icmp uge i1 [[I_LT_LEN]], [[I_INCR_SLT_LEN]] 1079d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i1 [[RES]] 1089d5299ebSRamkumar Ramachandra; 1099d5299ebSRamkumar Ramachandra %i.incr = add i32 %i, 1 1109d5299ebSRamkumar Ramachandra %i.lt.len = icmp samesign ult i32 %i, %len 1119d5299ebSRamkumar Ramachandra %i.incr.slt.len = icmp slt i32 %i.incr, %len 1129d5299ebSRamkumar Ramachandra %res = icmp uge i1 %i.lt.len, %i.incr.slt.len 1139d5299ebSRamkumar Ramachandra ret i1 %res 1149d5299ebSRamkumar Ramachandra} 1159d5299ebSRamkumar Ramachandra 1169d5299ebSRamkumar Ramachandradefine i1 @sgt_implies_ge_via_assume(i32 %i, i32 %j) { 1179d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i1 @sgt_implies_ge_via_assume( 1189d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]]) { 1199d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[I_SGT_J:%.*]] = icmp sgt i32 [[I]], [[J]] 1209d5299ebSRamkumar Ramachandra; CHECK-NEXT: call void @llvm.assume(i1 [[I_SGT_J]]) 121f38c40bfSRamkumar Ramachandra; CHECK-NEXT: ret i1 true 1229d5299ebSRamkumar Ramachandra; 1239d5299ebSRamkumar Ramachandra %i.sgt.j = icmp sgt i32 %i, %j 1249d5299ebSRamkumar Ramachandra call void @llvm.assume(i1 %i.sgt.j) 1259d5299ebSRamkumar Ramachandra %i.ge.j = icmp samesign uge i32 %i, %j 1269d5299ebSRamkumar Ramachandra ret i1 %i.ge.j 1279d5299ebSRamkumar Ramachandra} 1289d5299ebSRamkumar Ramachandra 129f1632d25SRamkumar Ramachandradefine i1 @sgt_implies_false_le_via_assume(i32 %i, i32 %j) { 130f1632d25SRamkumar Ramachandra; CHECK-LABEL: define i1 @sgt_implies_false_le_via_assume( 131f1632d25SRamkumar Ramachandra; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]]) { 132f1632d25SRamkumar Ramachandra; CHECK-NEXT: [[I_SGT_J:%.*]] = icmp sgt i32 [[I]], [[J]] 133f1632d25SRamkumar Ramachandra; CHECK-NEXT: call void @llvm.assume(i1 [[I_SGT_J]]) 134f1632d25SRamkumar Ramachandra; CHECK-NEXT: ret i1 false 135f1632d25SRamkumar Ramachandra; 136f1632d25SRamkumar Ramachandra %i.sgt.j = icmp sgt i32 %i, %j 137f1632d25SRamkumar Ramachandra call void @llvm.assume(i1 %i.sgt.j) 138f1632d25SRamkumar Ramachandra %i.le.j = icmp samesign ule i32 %i, %j 139f1632d25SRamkumar Ramachandra ret i1 %i.le.j 140f1632d25SRamkumar Ramachandra} 141f1632d25SRamkumar Ramachandra 1429d5299ebSRamkumar Ramachandradefine i32 @gt_implies_sge_dominating(i32 %a, i32 %len) { 1439d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i32 @gt_implies_sge_dominating( 1449d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) { 1459d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ENTRY:.*:]] 1469d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[A_GT_LEN:%.*]] = icmp samesign ugt i32 [[A]], [[LEN]] 1479d5299ebSRamkumar Ramachandra; CHECK-NEXT: br i1 [[A_GT_LEN]], label %[[TAKEN:.*]], label %[[END:.*]] 1489d5299ebSRamkumar Ramachandra; CHECK: [[TAKEN]]: 149f38c40bfSRamkumar Ramachandra; CHECK-NEXT: ret i32 30 1509d5299ebSRamkumar Ramachandra; CHECK: [[END]]: 1519d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i32 -1 1529d5299ebSRamkumar Ramachandra; 1539d5299ebSRamkumar Ramachandraentry: 1549d5299ebSRamkumar Ramachandra %a.gt.len = icmp samesign ugt i32 %a, %len 1559d5299ebSRamkumar Ramachandra br i1 %a.gt.len, label %taken, label %end 1569d5299ebSRamkumar Ramachandra 1579d5299ebSRamkumar Ramachandrataken: 1589d5299ebSRamkumar Ramachandra %a.sge.len = icmp sge i32 %a, %len 1599d5299ebSRamkumar Ramachandra %res = select i1 %a.sge.len, i32 30, i32 0 1609d5299ebSRamkumar Ramachandra ret i32 %res 1619d5299ebSRamkumar Ramachandra 1629d5299ebSRamkumar Ramachandraend: 1639d5299ebSRamkumar Ramachandra ret i32 -1 1649d5299ebSRamkumar Ramachandra} 1659d5299ebSRamkumar Ramachandra 166f1632d25SRamkumar Ramachandradefine i32 @gt_implies_false_sle_dominating(i32 %a, i32 %len) { 167f1632d25SRamkumar Ramachandra; CHECK-LABEL: define i32 @gt_implies_false_sle_dominating( 168f1632d25SRamkumar Ramachandra; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) { 169f1632d25SRamkumar Ramachandra; CHECK-NEXT: [[ENTRY:.*:]] 170f1632d25SRamkumar Ramachandra; CHECK-NEXT: [[A_GT_LEN:%.*]] = icmp samesign ugt i32 [[A]], [[LEN]] 171f1632d25SRamkumar Ramachandra; CHECK-NEXT: br i1 [[A_GT_LEN]], label %[[TAKEN:.*]], label %[[END:.*]] 172f1632d25SRamkumar Ramachandra; CHECK: [[TAKEN]]: 173f1632d25SRamkumar Ramachandra; CHECK-NEXT: ret i32 0 174f1632d25SRamkumar Ramachandra; CHECK: [[END]]: 175f1632d25SRamkumar Ramachandra; CHECK-NEXT: ret i32 -1 176f1632d25SRamkumar Ramachandra; 177f1632d25SRamkumar Ramachandraentry: 178f1632d25SRamkumar Ramachandra %a.gt.len = icmp samesign ugt i32 %a, %len 179f1632d25SRamkumar Ramachandra br i1 %a.gt.len, label %taken, label %end 180f1632d25SRamkumar Ramachandra 181f1632d25SRamkumar Ramachandrataken: 182f1632d25SRamkumar Ramachandra %a.sle.len = icmp sle i32 %a, %len 183f1632d25SRamkumar Ramachandra %res = select i1 %a.sle.len, i32 30, i32 0 184f1632d25SRamkumar Ramachandra ret i32 %res 185f1632d25SRamkumar Ramachandra 186f1632d25SRamkumar Ramachandraend: 187f1632d25SRamkumar Ramachandra ret i32 -1 188f1632d25SRamkumar Ramachandra} 189f1632d25SRamkumar Ramachandra 1909d5299ebSRamkumar Ramachandradefine i32 @gt_implies_sge_dominating_cr(i32 %a, i32 %len) { 1919d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i32 @gt_implies_sge_dominating_cr( 1929d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) { 1939d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ENTRY:.*:]] 1949d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[A_GT_20:%.*]] = icmp samesign ugt i32 [[A]], 20 1959d5299ebSRamkumar Ramachandra; CHECK-NEXT: br i1 [[A_GT_20]], label %[[TAKEN:.*]], label %[[END:.*]] 1969d5299ebSRamkumar Ramachandra; CHECK: [[TAKEN]]: 197cfee344dSRamkumar Ramachandra; CHECK-NEXT: ret i32 30 1989d5299ebSRamkumar Ramachandra; CHECK: [[END]]: 1999d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i32 -1 2009d5299ebSRamkumar Ramachandra; 2019d5299ebSRamkumar Ramachandraentry: 2029d5299ebSRamkumar Ramachandra %a.gt.20 = icmp samesign ugt i32 %a, 20 2039d5299ebSRamkumar Ramachandra br i1 %a.gt.20, label %taken, label %end 2049d5299ebSRamkumar Ramachandra 2059d5299ebSRamkumar Ramachandrataken: 2069d5299ebSRamkumar Ramachandra %a.sge.10 = icmp sge i32 %a, 10 2079d5299ebSRamkumar Ramachandra %res = select i1 %a.sge.10, i32 30, i32 0 2089d5299ebSRamkumar Ramachandra ret i32 %res 2099d5299ebSRamkumar Ramachandra 2109d5299ebSRamkumar Ramachandraend: 2119d5299ebSRamkumar Ramachandra ret i32 -1 2129d5299ebSRamkumar Ramachandra} 2139d5299ebSRamkumar Ramachandra 2149d5299ebSRamkumar Ramachandradefine i32 @sgt_implies_ge_dominating_cr(i32 %a, i32 %len) { 2159d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i32 @sgt_implies_ge_dominating_cr( 2169d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[A:%.*]], i32 [[LEN:%.*]]) { 2179d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ENTRY:.*:]] 2189d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[A_SGT_MINUS_10:%.*]] = icmp sgt i32 [[A]], -10 2199d5299ebSRamkumar Ramachandra; CHECK-NEXT: br i1 [[A_SGT_MINUS_10]], label %[[TAKEN:.*]], label %[[END:.*]] 2209d5299ebSRamkumar Ramachandra; CHECK: [[TAKEN]]: 221cfee344dSRamkumar Ramachandra; CHECK-NEXT: ret i32 30 2229d5299ebSRamkumar Ramachandra; CHECK: [[END]]: 2239d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i32 -1 2249d5299ebSRamkumar Ramachandra; 2259d5299ebSRamkumar Ramachandraentry: 2269d5299ebSRamkumar Ramachandra %a.sgt.minus.10 = icmp sgt i32 %a, -10 2279d5299ebSRamkumar Ramachandra br i1 %a.sgt.minus.10, label %taken, label %end 2289d5299ebSRamkumar Ramachandra 2299d5299ebSRamkumar Ramachandrataken: 2309d5299ebSRamkumar Ramachandra %a.ge.minus.20 = icmp samesign uge i32 %a, -20 2319d5299ebSRamkumar Ramachandra %res = select i1 %a.ge.minus.20, i32 30, i32 0 2329d5299ebSRamkumar Ramachandra ret i32 %res 2339d5299ebSRamkumar Ramachandra 2349d5299ebSRamkumar Ramachandraend: 2359d5299ebSRamkumar Ramachandra ret i32 -1 2369d5299ebSRamkumar Ramachandra} 2379d5299ebSRamkumar Ramachandra 2389d5299ebSRamkumar Ramachandradefine i32 @gt_sub_nsw(i32 %x, i32 %y) { 2399d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i32 @gt_sub_nsw( 2409d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 2419d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ENTRY:.*:]] 2429d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[X_GT_Y:%.*]] = icmp samesign ugt i32 [[X]], [[Y]] 2439d5299ebSRamkumar Ramachandra; CHECK-NEXT: br i1 [[X_GT_Y]], label %[[TAKEN:.*]], label %[[END:.*]] 2449d5299ebSRamkumar Ramachandra; CHECK: [[TAKEN]]: 2459d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]] 2469d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[SUB]], 1 24766badf22SRamkumar Ramachandra; CHECK-NEXT: ret i32 [[ADD]] 2489d5299ebSRamkumar Ramachandra; CHECK: [[END]]: 2499d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i32 0 2509d5299ebSRamkumar Ramachandra; 2519d5299ebSRamkumar Ramachandraentry: 2529d5299ebSRamkumar Ramachandra %x.gt.y = icmp samesign ugt i32 %x, %y 2539d5299ebSRamkumar Ramachandra br i1 %x.gt.y, label %taken, label %end 2549d5299ebSRamkumar Ramachandra 2559d5299ebSRamkumar Ramachandrataken: 2569d5299ebSRamkumar Ramachandra %sub = sub nsw i32 %x, %y 2579d5299ebSRamkumar Ramachandra %add = add nsw i32 %sub, 1 2589d5299ebSRamkumar Ramachandra %neg = xor i32 %sub, -1 2599d5299ebSRamkumar Ramachandra %abscond = icmp samesign ult i32 %sub, -1 2609d5299ebSRamkumar Ramachandra %abs = select i1 %abscond, i32 %neg, i32 %add 2619d5299ebSRamkumar Ramachandra ret i32 %abs 2629d5299ebSRamkumar Ramachandra 2639d5299ebSRamkumar Ramachandraend: 2649d5299ebSRamkumar Ramachandra ret i32 0 2659d5299ebSRamkumar Ramachandra} 2669d5299ebSRamkumar Ramachandra 2679d5299ebSRamkumar Ramachandradefine i32 @ge_sub_nsw(i32 %x, i32 %y) { 2689d5299ebSRamkumar Ramachandra; CHECK-LABEL: define i32 @ge_sub_nsw( 2699d5299ebSRamkumar Ramachandra; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 2709d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ENTRY:.*:]] 2719d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[X_GE_Y:%.*]] = icmp samesign uge i32 [[X]], [[Y]] 2729d5299ebSRamkumar Ramachandra; CHECK-NEXT: br i1 [[X_GE_Y]], label %[[TAKEN:.*]], label %[[END:.*]] 2739d5299ebSRamkumar Ramachandra; CHECK: [[TAKEN]]: 2749d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]] 2759d5299ebSRamkumar Ramachandra; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[SUB]], 1 27666badf22SRamkumar Ramachandra; CHECK-NEXT: ret i32 [[ADD]] 2779d5299ebSRamkumar Ramachandra; CHECK: [[END]]: 2789d5299ebSRamkumar Ramachandra; CHECK-NEXT: ret i32 0 2799d5299ebSRamkumar Ramachandra; 2809d5299ebSRamkumar Ramachandraentry: 2819d5299ebSRamkumar Ramachandra %x.ge.y = icmp samesign uge i32 %x, %y 2829d5299ebSRamkumar Ramachandra br i1 %x.ge.y, label %taken, label %end 2839d5299ebSRamkumar Ramachandra 2849d5299ebSRamkumar Ramachandrataken: 2859d5299ebSRamkumar Ramachandra %sub = sub nsw i32 %x, %y 2869d5299ebSRamkumar Ramachandra %add = add nsw i32 %sub, 1 2879d5299ebSRamkumar Ramachandra %neg = xor i32 %sub, -1 2889d5299ebSRamkumar Ramachandra %abscond = icmp samesign ult i32 %sub, -1 2899d5299ebSRamkumar Ramachandra %abs = select i1 %abscond, i32 %neg, i32 %add 2909d5299ebSRamkumar Ramachandra ret i32 %abs 2919d5299ebSRamkumar Ramachandra 2929d5299ebSRamkumar Ramachandraend: 2939d5299ebSRamkumar Ramachandra ret i32 0 2949d5299ebSRamkumar Ramachandra} 295*c546b531SDianQK 296*c546b531SDianQKdefine i1 @gt_sub_nsw_ult(i8 %L0, i8 %L1, i1 %V) { 297*c546b531SDianQK; CHECK-LABEL: define i1 @gt_sub_nsw_ult( 298*c546b531SDianQK; CHECK-SAME: i8 [[L0:%.*]], i8 [[L1:%.*]], i1 [[V:%.*]]) { 299*c546b531SDianQK; CHECK-NEXT: [[LHS:%.*]] = icmp samesign ugt i8 [[L0]], [[L1]] 300*c546b531SDianQK; CHECK-NEXT: br i1 [[LHS]], label %[[LHS_TRUE:.*]], label %[[LHS_FALSE:.*]] 301*c546b531SDianQK; CHECK: [[LHS_TRUE]]: 302*c546b531SDianQK; CHECK-NEXT: [[R0:%.*]] = sub nsw i8 [[L0]], [[L1]] 303*c546b531SDianQK; CHECK-NEXT: [[RHS:%.*]] = icmp ult i8 [[R0]], -1 304*c546b531SDianQK; CHECK-NEXT: ret i1 [[RHS]] 305*c546b531SDianQK; CHECK: [[LHS_FALSE]]: 306*c546b531SDianQK; CHECK-NEXT: ret i1 [[V]] 307*c546b531SDianQK; 308*c546b531SDianQK %LHS = icmp samesign ugt i8 %L0, %L1 309*c546b531SDianQK br i1 %LHS, label %LHS_true, label %LHS_false 310*c546b531SDianQK 311*c546b531SDianQKLHS_true: 312*c546b531SDianQK %R0 = sub nsw i8 %L0, %L1 313*c546b531SDianQK %RHS = icmp ult i8 %R0, -1 314*c546b531SDianQK ret i1 %RHS 315*c546b531SDianQK 316*c546b531SDianQKLHS_false: 317*c546b531SDianQK ret i1 %V 318*c546b531SDianQK} 319*c546b531SDianQK 320*c546b531SDianQKdefine i1 @lt_sub_nsw_ult(i8 %L0, i8 %L1, i1 %V) { 321*c546b531SDianQK; CHECK-LABEL: define i1 @lt_sub_nsw_ult( 322*c546b531SDianQK; CHECK-SAME: i8 [[L0:%.*]], i8 [[L1:%.*]], i1 [[V:%.*]]) { 323*c546b531SDianQK; CHECK-NEXT: [[LHS:%.*]] = icmp samesign ult i8 [[L0]], [[L1]] 324*c546b531SDianQK; CHECK-NEXT: br i1 [[LHS]], label %[[LHS_TRUE:.*]], label %[[LHS_FALSE:.*]] 325*c546b531SDianQK; CHECK: [[LHS_TRUE]]: 326*c546b531SDianQK; CHECK-NEXT: [[R0:%.*]] = sub nsw i8 [[L0]], [[L1]] 327*c546b531SDianQK; CHECK-NEXT: [[RHS:%.*]] = icmp ult i8 [[R0]], 1 328*c546b531SDianQK; CHECK-NEXT: ret i1 [[RHS]] 329*c546b531SDianQK; CHECK: [[LHS_FALSE]]: 330*c546b531SDianQK; CHECK-NEXT: ret i1 [[V]] 331*c546b531SDianQK; 332*c546b531SDianQK %LHS = icmp samesign ult i8 %L0, %L1 333*c546b531SDianQK br i1 %LHS, label %LHS_true, label %LHS_false 334*c546b531SDianQK 335*c546b531SDianQKLHS_true: 336*c546b531SDianQK %R0 = sub nsw i8 %L0, %L1 337*c546b531SDianQK %RHS = icmp ult i8 %R0, 1 338*c546b531SDianQK ret i1 %RHS 339*c546b531SDianQK 340*c546b531SDianQKLHS_false: 341*c546b531SDianQK ret i1 %V 342*c546b531SDianQK} 343