12ae0f8d6SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 32ae0f8d6SFlorian Hahn 41774c148SAntonio Frighettodeclare void @llvm.assume(i1) 51774c148SAntonio Frighetto 62ae0f8d6SFlorian Hahndefine i1 @test_eq_1(i8 %a, i8 %b) { 72ae0f8d6SFlorian Hahn; CHECK-LABEL: @test_eq_1( 82ae0f8d6SFlorian Hahn; CHECK-NEXT: entry: 92ae0f8d6SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]] 102ae0f8d6SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 112ae0f8d6SFlorian Hahn; CHECK: then: 120b28d756SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true 131774c148SAntonio Frighetto; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true 141774c148SAntonio Frighetto; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], true 150b28d756SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], false 160b28d756SFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], false 172ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[B]], 99 182ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_1]] 192ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_6]] 202ae0f8d6SFlorian Hahn; CHECK: else: 212ae0f8d6SFlorian Hahn; CHECK-NEXT: [[F_3:%.*]] = icmp eq i8 [[A]], [[B]] 222ae0f8d6SFlorian Hahn; CHECK-NEXT: [[F_4:%.*]] = icmp eq i8 [[B]], [[A]] 232ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[F_3]], [[F_4]] 242ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[B]], 99 252ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_2]] 262ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp uge i8 [[A]], [[B]] 272ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], [[C_3]] 282ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 [[A]], [[B]] 292ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_4]] 302ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[B]], [[A]] 312ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_5]] 322ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[B]], [[A]] 332ae0f8d6SFlorian Hahn; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], [[C_6]] 342ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_12]] 352ae0f8d6SFlorian Hahn; 362ae0f8d6SFlorian Hahnentry: 372ae0f8d6SFlorian Hahn %cmp = icmp eq i8 %a, %b 382ae0f8d6SFlorian Hahn br i1 %cmp, label %then, label %else 392ae0f8d6SFlorian Hahn 402ae0f8d6SFlorian Hahnthen: 412ae0f8d6SFlorian Hahn %t.1 = icmp uge i8 %a, %b 422ae0f8d6SFlorian Hahn %t.2 = icmp ule i8 %a, %b 432ae0f8d6SFlorian Hahn %res.1 = xor i1 %t.1, %t.2 442ae0f8d6SFlorian Hahn 452ae0f8d6SFlorian Hahn %t.3 = icmp eq i8 %a, %b 462ae0f8d6SFlorian Hahn %res.2 = xor i1 %res.1, %t.3 472ae0f8d6SFlorian Hahn 482ae0f8d6SFlorian Hahn %t.4 = icmp eq i8 %b, %a 492ae0f8d6SFlorian Hahn %res.3 = xor i1 %res.2, %t.4 502ae0f8d6SFlorian Hahn 512ae0f8d6SFlorian Hahn %f.1 = icmp ugt i8 %b, %a 522ae0f8d6SFlorian Hahn %res.4 = xor i1 %res.3, %f.1 532ae0f8d6SFlorian Hahn 542ae0f8d6SFlorian Hahn %f.2 = icmp ult i8 %b, %a 552ae0f8d6SFlorian Hahn %res.5 = xor i1 %res.4, %f.2 562ae0f8d6SFlorian Hahn 572ae0f8d6SFlorian Hahn %c.1 = icmp ult i8 %b, 99 582ae0f8d6SFlorian Hahn %res.6 = xor i1 %res.5, %c.1 592ae0f8d6SFlorian Hahn ret i1 %res.6 602ae0f8d6SFlorian Hahn 612ae0f8d6SFlorian Hahnelse: 622ae0f8d6SFlorian Hahn %f.3 = icmp eq i8 %a, %b 632ae0f8d6SFlorian Hahn %f.4 = icmp eq i8 %b, %a 642ae0f8d6SFlorian Hahn %res.7 = xor i1 %f.3, %f.4 652ae0f8d6SFlorian Hahn 662ae0f8d6SFlorian Hahn %c.2 = icmp ult i8 %b, 99 672ae0f8d6SFlorian Hahn %res.8 = xor i1 %res.7, %c.2 682ae0f8d6SFlorian Hahn 692ae0f8d6SFlorian Hahn %c.3 = icmp uge i8 %a, %b 702ae0f8d6SFlorian Hahn %res.9 = xor i1 %res.8, %c.3 712ae0f8d6SFlorian Hahn 722ae0f8d6SFlorian Hahn %c.4 = icmp ule i8 %a, %b 732ae0f8d6SFlorian Hahn %res.10 = xor i1 %res.9, %c.4 742ae0f8d6SFlorian Hahn 752ae0f8d6SFlorian Hahn %c.5 = icmp ugt i8 %b, %a 762ae0f8d6SFlorian Hahn %res.11 = xor i1 %res.10, %c.5 772ae0f8d6SFlorian Hahn 782ae0f8d6SFlorian Hahn %c.6 = icmp ult i8 %b, %a 792ae0f8d6SFlorian Hahn %res.12 = xor i1 %res.11, %c.6 802ae0f8d6SFlorian Hahn ret i1 %res.12 812ae0f8d6SFlorian Hahn} 822ae0f8d6SFlorian Hahn 832ae0f8d6SFlorian Hahndefine i1 @test_eq_2(i8 %a, i8 %b) { 842ae0f8d6SFlorian Hahn; CHECK-LABEL: @test_eq_2( 852ae0f8d6SFlorian Hahn; CHECK-NEXT: entry: 862ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]] 872ae0f8d6SFlorian Hahn; CHECK-NEXT: br i1 [[PRE_1]], label [[THEN:%.*]], label [[ELSE:%.*]] 882ae0f8d6SFlorian Hahn; CHECK: then: 892ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_3:%.*]] = icmp ult i8 [[B]], 100 902ae0f8d6SFlorian Hahn; CHECK-NEXT: br i1 [[PRE_3]], label [[THEN_THEN:%.*]], label [[THEN_ELSE:%.*]] 912ae0f8d6SFlorian Hahn; CHECK: then.then: 920b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 930b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], false 942ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], false 950b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], false 962ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[A]], 99 972ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]] 982ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[A]], 98 992ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]] 1002ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_6]] 1012ae0f8d6SFlorian Hahn; CHECK: then.else: 1020b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 false, false 1030b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], true 1042ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_9:%.*]] = xor i1 [[XOR_8]], true 1050b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_10:%.*]] = xor i1 [[XOR_9]], true 1060b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_11:%.*]] = xor i1 [[XOR_10]], false 1070b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_12:%.*]] = xor i1 [[XOR_11]], true 1082ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_12]] 1092ae0f8d6SFlorian Hahn; CHECK: else: 1102ae0f8d6SFlorian Hahn; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], 100 1112ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[CMP_2]] 1122ae0f8d6SFlorian Hahn; 1132ae0f8d6SFlorian Hahnentry: 1142ae0f8d6SFlorian Hahn %pre.1 = icmp eq i8 %a, %b 1152ae0f8d6SFlorian Hahn br i1 %pre.1, label %then, label %else 1162ae0f8d6SFlorian Hahn 1172ae0f8d6SFlorian Hahnthen: 1182ae0f8d6SFlorian Hahn %pre.3 = icmp ult i8 %b, 100 1192ae0f8d6SFlorian Hahn br i1 %pre.3, label %then.then, label %then.else 1202ae0f8d6SFlorian Hahn 1212ae0f8d6SFlorian Hahnthen.then: 1222ae0f8d6SFlorian Hahn %t.1 = icmp ult i8 %a, 100 1232ae0f8d6SFlorian Hahn %t.2 = icmp ult i8 %b, 100 1242ae0f8d6SFlorian Hahn %xor.1 = xor i1 %t.1, %t.2 1252ae0f8d6SFlorian Hahn 1262ae0f8d6SFlorian Hahn %f.1 = icmp uge i8 %a, 100 1272ae0f8d6SFlorian Hahn %xor.2 = xor i1 %xor.1, %f.1 1282ae0f8d6SFlorian Hahn 1292ae0f8d6SFlorian Hahn %f.2 = icmp uge i8 %b, 100 1302ae0f8d6SFlorian Hahn %xor.3 = xor i1 %xor.2, %f.2 1312ae0f8d6SFlorian Hahn 1322ae0f8d6SFlorian Hahn %f.3.1 = icmp ugt i8 %a, 99 1332ae0f8d6SFlorian Hahn %xor.4 = xor i1 %xor.3, %f.3.1 1342ae0f8d6SFlorian Hahn 1352ae0f8d6SFlorian Hahn %c.1 = icmp ult i8 %a, 99 1362ae0f8d6SFlorian Hahn %xor.5 = xor i1 %xor.4, %c.1 1372ae0f8d6SFlorian Hahn 1382ae0f8d6SFlorian Hahn %c.2 = icmp ugt i8 %a, 98 1392ae0f8d6SFlorian Hahn %xor.6 = xor i1 %xor.5, %c.1 1402ae0f8d6SFlorian Hahn 1412ae0f8d6SFlorian Hahn ret i1 %xor.6 1422ae0f8d6SFlorian Hahn 1432ae0f8d6SFlorian Hahnthen.else: 1442ae0f8d6SFlorian Hahn %f.4 = icmp ult i8 %a, 100 1452ae0f8d6SFlorian Hahn %f.5 = icmp ult i8 %b, 100 1462ae0f8d6SFlorian Hahn %xor.7 = xor i1 %f.4, %f.5 1472ae0f8d6SFlorian Hahn 1482ae0f8d6SFlorian Hahn %t.3 = icmp uge i8 %a, 100 1492ae0f8d6SFlorian Hahn %xor.8 = xor i1 %xor.7, %t.3 1502ae0f8d6SFlorian Hahn 1512ae0f8d6SFlorian Hahn %t.4 = icmp uge i8 %b, 100 1522ae0f8d6SFlorian Hahn %xor.9 = xor i1 %xor.8, %t.4 1532ae0f8d6SFlorian Hahn 1542ae0f8d6SFlorian Hahn %t.5 = icmp ugt i8 %a, 99 1552ae0f8d6SFlorian Hahn %xor.10 = xor i1 %xor.9, %t.5 1562ae0f8d6SFlorian Hahn 1572ae0f8d6SFlorian Hahn %c.3 = icmp ult i8 %a, 99 1582ae0f8d6SFlorian Hahn %xor.11 = xor i1 %xor.10, %c.3 1592ae0f8d6SFlorian Hahn 1602ae0f8d6SFlorian Hahn %c.4 = icmp ugt i8 %a, 98 1612ae0f8d6SFlorian Hahn %xor.12 = xor i1 %xor.11, %c.4 1622ae0f8d6SFlorian Hahn 1632ae0f8d6SFlorian Hahn ret i1 %xor.12 1642ae0f8d6SFlorian Hahn 1652ae0f8d6SFlorian Hahnelse: 1662ae0f8d6SFlorian Hahn %cmp.2 = icmp ult i8 %a, 100 1672ae0f8d6SFlorian Hahn ret i1 %cmp.2 1682ae0f8d6SFlorian Hahn} 1692ae0f8d6SFlorian Hahn 1702ae0f8d6SFlorian Hahn; Test of explicitly using uge & ule instead of eq. 1712ae0f8d6SFlorian Hahndefine i1 @test_eq_as_uge_ule_(i8 %a, i8 %b) { 1722ae0f8d6SFlorian Hahn; CHECK-LABEL: @test_eq_as_uge_ule_( 1732ae0f8d6SFlorian Hahn; CHECK-NEXT: entry: 1742ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_1:%.*]] = icmp uge i8 [[A:%.*]], [[B:%.*]] 1752ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_2:%.*]] = icmp ule i8 [[A]], [[B]] 1762ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_AND:%.*]] = and i1 [[PRE_1]], [[PRE_2]] 1772ae0f8d6SFlorian Hahn; CHECK-NEXT: br i1 [[PRE_AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 1782ae0f8d6SFlorian Hahn; CHECK: then: 1792ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_3:%.*]] = icmp ult i8 [[B]], 100 1802ae0f8d6SFlorian Hahn; CHECK-NEXT: br i1 [[PRE_3]], label [[THEN_THEN:%.*]], label [[THEN_ELSE:%.*]] 1812ae0f8d6SFlorian Hahn; CHECK: then.then: 1822ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 1832ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], false 1842ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], false 1852ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], false 1862ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[A]], 99 1872ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]] 1882ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[A]], 98 1892ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]] 1902ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_6]] 1912ae0f8d6SFlorian Hahn; CHECK: then.else: 1922ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 false, false 1932ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], true 1942ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_9:%.*]] = xor i1 [[XOR_8]], true 1952ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_10:%.*]] = xor i1 [[XOR_9]], true 1962ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_11:%.*]] = xor i1 [[XOR_10]], false 1972ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_12:%.*]] = xor i1 [[XOR_11]], true 1982ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_12]] 1992ae0f8d6SFlorian Hahn; CHECK: else: 2002ae0f8d6SFlorian Hahn; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], 100 2012ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[CMP_2]] 2022ae0f8d6SFlorian Hahn; 2032ae0f8d6SFlorian Hahnentry: 2042ae0f8d6SFlorian Hahn %pre.1 = icmp uge i8 %a, %b 2052ae0f8d6SFlorian Hahn %pre.2 = icmp ule i8 %a, %b 2062ae0f8d6SFlorian Hahn %pre.and = and i1 %pre.1, %pre.2 2072ae0f8d6SFlorian Hahn br i1 %pre.and, label %then, label %else 2082ae0f8d6SFlorian Hahn 2092ae0f8d6SFlorian Hahnthen: 2102ae0f8d6SFlorian Hahn %pre.3 = icmp ult i8 %b, 100 2112ae0f8d6SFlorian Hahn br i1 %pre.3, label %then.then, label %then.else 2122ae0f8d6SFlorian Hahn 2132ae0f8d6SFlorian Hahnthen.then: 2142ae0f8d6SFlorian Hahn %t.1 = icmp ult i8 %a, 100 2152ae0f8d6SFlorian Hahn %t.2 = icmp ult i8 %b, 100 2162ae0f8d6SFlorian Hahn %xor.1 = xor i1 %t.1, %t.2 2172ae0f8d6SFlorian Hahn 2182ae0f8d6SFlorian Hahn %f.1 = icmp uge i8 %a, 100 2192ae0f8d6SFlorian Hahn %xor.2 = xor i1 %xor.1, %f.1 2202ae0f8d6SFlorian Hahn 2212ae0f8d6SFlorian Hahn %f.2 = icmp uge i8 %b, 100 2222ae0f8d6SFlorian Hahn %xor.3 = xor i1 %xor.2, %f.2 2232ae0f8d6SFlorian Hahn 2242ae0f8d6SFlorian Hahn %f.3.1 = icmp ugt i8 %a, 99 2252ae0f8d6SFlorian Hahn %xor.4 = xor i1 %xor.3, %f.3.1 2262ae0f8d6SFlorian Hahn 2272ae0f8d6SFlorian Hahn %c.1 = icmp ult i8 %a, 99 2282ae0f8d6SFlorian Hahn %xor.5 = xor i1 %xor.4, %c.1 2292ae0f8d6SFlorian Hahn 2302ae0f8d6SFlorian Hahn %c.2 = icmp ugt i8 %a, 98 2312ae0f8d6SFlorian Hahn %xor.6 = xor i1 %xor.5, %c.1 2322ae0f8d6SFlorian Hahn 2332ae0f8d6SFlorian Hahn ret i1 %xor.6 2342ae0f8d6SFlorian Hahn 2352ae0f8d6SFlorian Hahnthen.else: 2362ae0f8d6SFlorian Hahn %f.4 = icmp ult i8 %a, 100 2372ae0f8d6SFlorian Hahn %f.5 = icmp ult i8 %b, 100 2382ae0f8d6SFlorian Hahn %xor.7 = xor i1 %f.4, %f.5 2392ae0f8d6SFlorian Hahn 2402ae0f8d6SFlorian Hahn %t.3 = icmp uge i8 %a, 100 2412ae0f8d6SFlorian Hahn %xor.8 = xor i1 %xor.7, %t.3 2422ae0f8d6SFlorian Hahn 2432ae0f8d6SFlorian Hahn %t.4 = icmp uge i8 %b, 100 2442ae0f8d6SFlorian Hahn %xor.9 = xor i1 %xor.8, %t.4 2452ae0f8d6SFlorian Hahn 2462ae0f8d6SFlorian Hahn %t.5 = icmp ugt i8 %a, 99 2472ae0f8d6SFlorian Hahn %xor.10 = xor i1 %xor.9, %t.5 2482ae0f8d6SFlorian Hahn 2492ae0f8d6SFlorian Hahn %c.3 = icmp ult i8 %a, 99 2502ae0f8d6SFlorian Hahn %xor.11 = xor i1 %xor.10, %c.3 2512ae0f8d6SFlorian Hahn 2522ae0f8d6SFlorian Hahn %c.4 = icmp ugt i8 %a, 98 2532ae0f8d6SFlorian Hahn %xor.12 = xor i1 %xor.11, %c.4 2542ae0f8d6SFlorian Hahn 2552ae0f8d6SFlorian Hahn ret i1 %xor.12 2562ae0f8d6SFlorian Hahn 2572ae0f8d6SFlorian Hahnelse: 2582ae0f8d6SFlorian Hahn %cmp.2 = icmp ult i8 %a, 100 2592ae0f8d6SFlorian Hahn ret i1 %cmp.2 2602ae0f8d6SFlorian Hahn} 2612ae0f8d6SFlorian Hahn 2622ae0f8d6SFlorian Hahn 2632ae0f8d6SFlorian Hahndefine i1 @test_eq_ult_and(i8 %a, i8 %b) { 2642ae0f8d6SFlorian Hahn; CHECK-LABEL: @test_eq_ult_and( 2652ae0f8d6SFlorian Hahn; CHECK-NEXT: entry: 2662ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]] 2672ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_2:%.*]] = icmp ult i8 [[B]], 100 2682ae0f8d6SFlorian Hahn; CHECK-NEXT: [[PRE_AND:%.*]] = and i1 [[PRE_1]], [[PRE_2]] 2692ae0f8d6SFlorian Hahn; CHECK-NEXT: br i1 [[PRE_AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 2702ae0f8d6SFlorian Hahn; CHECK: then: 2710b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 2720b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], false 2732ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], false 2740b28d756SFlorian Hahn; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], false 2752ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[A]], 99 2762ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]] 2772ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[A]], 98 2782ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]] 2792ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_6]] 2802ae0f8d6SFlorian Hahn; CHECK: else: 2812ae0f8d6SFlorian Hahn; CHECK-NEXT: [[F_4:%.*]] = icmp ult i8 [[A]], 100 2822ae0f8d6SFlorian Hahn; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[B]], 100 2832ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[F_4]], [[F_5]] 2842ae0f8d6SFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp uge i8 [[A]], 100 2852ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[T_3]] 2862ae0f8d6SFlorian Hahn; CHECK-NEXT: [[T_4:%.*]] = icmp uge i8 [[B]], 100 2872ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_9:%.*]] = xor i1 [[XOR_8]], [[T_4]] 2882ae0f8d6SFlorian Hahn; CHECK-NEXT: [[T_5:%.*]] = icmp ugt i8 [[A]], 99 2892ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_10:%.*]] = xor i1 [[XOR_9]], [[T_5]] 2902ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[A]], 99 2912ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_11:%.*]] = xor i1 [[XOR_10]], [[C_3]] 2922ae0f8d6SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[A]], 98 2932ae0f8d6SFlorian Hahn; CHECK-NEXT: [[XOR_12:%.*]] = xor i1 [[XOR_11]], [[C_4]] 2942ae0f8d6SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_12]] 2952ae0f8d6SFlorian Hahn; 2962ae0f8d6SFlorian Hahnentry: 2972ae0f8d6SFlorian Hahn %pre.1 = icmp eq i8 %a, %b 2982ae0f8d6SFlorian Hahn %pre.2 = icmp ult i8 %b, 100 2992ae0f8d6SFlorian Hahn %pre.and = and i1 %pre.1, %pre.2 3002ae0f8d6SFlorian Hahn br i1 %pre.and, label %then, label %else 3012ae0f8d6SFlorian Hahn 3022ae0f8d6SFlorian Hahnthen: 3032ae0f8d6SFlorian Hahn %t.1 = icmp ult i8 %a, 100 3042ae0f8d6SFlorian Hahn %t.2 = icmp ult i8 %b, 100 3052ae0f8d6SFlorian Hahn %xor.1 = xor i1 %t.1, %t.2 3062ae0f8d6SFlorian Hahn 3072ae0f8d6SFlorian Hahn %f.1 = icmp uge i8 %a, 100 3082ae0f8d6SFlorian Hahn %xor.2 = xor i1 %xor.1, %f.1 3092ae0f8d6SFlorian Hahn 3102ae0f8d6SFlorian Hahn %f.2 = icmp uge i8 %b, 100 3112ae0f8d6SFlorian Hahn %xor.3 = xor i1 %xor.2, %f.2 3122ae0f8d6SFlorian Hahn 3132ae0f8d6SFlorian Hahn %f.3.1 = icmp ugt i8 %a, 99 3142ae0f8d6SFlorian Hahn %xor.4 = xor i1 %xor.3, %f.3.1 3152ae0f8d6SFlorian Hahn 3162ae0f8d6SFlorian Hahn %c.1 = icmp ult i8 %a, 99 3172ae0f8d6SFlorian Hahn %xor.5 = xor i1 %xor.4, %c.1 3182ae0f8d6SFlorian Hahn 3192ae0f8d6SFlorian Hahn %c.2 = icmp ugt i8 %a, 98 3202ae0f8d6SFlorian Hahn %xor.6 = xor i1 %xor.5, %c.1 3212ae0f8d6SFlorian Hahn 3222ae0f8d6SFlorian Hahn ret i1 %xor.6 3232ae0f8d6SFlorian Hahn 3242ae0f8d6SFlorian Hahnelse: 3252ae0f8d6SFlorian Hahn %f.4 = icmp ult i8 %a, 100 3262ae0f8d6SFlorian Hahn %f.5 = icmp ult i8 %b, 100 3272ae0f8d6SFlorian Hahn %xor.7 = xor i1 %f.4, %f.5 3282ae0f8d6SFlorian Hahn 3292ae0f8d6SFlorian Hahn %t.3 = icmp uge i8 %a, 100 3302ae0f8d6SFlorian Hahn %xor.8 = xor i1 %xor.7, %t.3 3312ae0f8d6SFlorian Hahn 3322ae0f8d6SFlorian Hahn %t.4 = icmp uge i8 %b, 100 3332ae0f8d6SFlorian Hahn %xor.9 = xor i1 %xor.8, %t.4 3342ae0f8d6SFlorian Hahn 3352ae0f8d6SFlorian Hahn %t.5 = icmp ugt i8 %a, 99 3362ae0f8d6SFlorian Hahn %xor.10 = xor i1 %xor.9, %t.5 3372ae0f8d6SFlorian Hahn 3382ae0f8d6SFlorian Hahn %c.3 = icmp ult i8 %a, 99 3392ae0f8d6SFlorian Hahn %xor.11 = xor i1 %xor.10, %c.3 3402ae0f8d6SFlorian Hahn 3412ae0f8d6SFlorian Hahn %c.4 = icmp ugt i8 %a, 98 3422ae0f8d6SFlorian Hahn %xor.12 = xor i1 %xor.11, %c.4 3432ae0f8d6SFlorian Hahn 3442ae0f8d6SFlorian Hahn ret i1 %xor.12 3452ae0f8d6SFlorian Hahn} 3461774c148SAntonio Frighetto 3471774c148SAntonio Frighettodefine i1 @assume_b_plus_1_ult_a(i64 %a, i64 %b) { 3481774c148SAntonio Frighetto; CHECK-LABEL: @assume_b_plus_1_ult_a( 3491774c148SAntonio Frighetto; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[B:%.*]], 1 3501774c148SAntonio Frighetto; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], [[A:%.*]] 3511774c148SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 3521774c148SAntonio Frighetto; CHECK-NEXT: ret i1 false 3531774c148SAntonio Frighetto; 3541774c148SAntonio Frighetto %1 = add nuw i64 %b, 1 3551774c148SAntonio Frighetto %2 = icmp ult i64 %1, %a 3561774c148SAntonio Frighetto tail call void @llvm.assume(i1 %2) 3571774c148SAntonio Frighetto %3 = icmp eq i64 %a, %b 3581774c148SAntonio Frighetto ret i1 %3 3591774c148SAntonio Frighetto} 3601774c148SAntonio Frighetto 3611774c148SAntonio Frighettodefine i1 @assume_a_plus_1_eq_b(i64 %a, i64 %b) { 3621774c148SAntonio Frighetto; CHECK-LABEL: @assume_a_plus_1_eq_b( 3631774c148SAntonio Frighetto; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[A:%.*]], 1 3641774c148SAntonio Frighetto; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], [[B:%.*]] 3651774c148SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 3661774c148SAntonio Frighetto; CHECK-NEXT: ret i1 false 3671774c148SAntonio Frighetto; 3681774c148SAntonio Frighetto %1 = add nuw i64 %a, 1 3691774c148SAntonio Frighetto %2 = icmp eq i64 %1, %b 3701774c148SAntonio Frighetto tail call void @llvm.assume(i1 %2) 3711774c148SAntonio Frighetto %3 = icmp eq i64 %a, %b 3721774c148SAntonio Frighetto ret i1 %3 3731774c148SAntonio Frighetto} 3741774c148SAntonio Frighetto 3751774c148SAntonio Frighettodefine i1 @assume_a_ge_b_and_b_ge_c(i64 %a, i64 %b, i64 %c) { 3761774c148SAntonio Frighetto; CHECK-LABEL: @assume_a_ge_b_and_b_ge_c( 3771774c148SAntonio Frighetto; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]] 3781774c148SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP1]]) 3791774c148SAntonio Frighetto; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[B]], [[C:%.*]] 3801774c148SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 3811774c148SAntonio Frighetto; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[A]], [[C]] 3821774c148SAntonio Frighetto; CHECK-NEXT: ret i1 [[TMP3]] 3831774c148SAntonio Frighetto; 3841774c148SAntonio Frighetto %1 = icmp uge i64 %a, %b 3851774c148SAntonio Frighetto tail call void @llvm.assume(i1 %1) 3861774c148SAntonio Frighetto %2 = icmp uge i64 %b, %c 3871774c148SAntonio Frighetto tail call void @llvm.assume(i1 %2) 3881774c148SAntonio Frighetto %3 = icmp eq i64 %a, %c 3891774c148SAntonio Frighetto ret i1 %3 3901774c148SAntonio Frighetto} 3911774c148SAntonio Frighetto 3921774c148SAntonio Frighettodefine i1 @test_transitivity_of_equality_and_plus_1(i64 %a, i64 %b, i64 %c) { 3931774c148SAntonio Frighetto; CHECK-LABEL: @test_transitivity_of_equality_and_plus_1( 3941774c148SAntonio Frighetto; CHECK-NEXT: entry: 3951774c148SAntonio Frighetto; CHECK-NEXT: [[PRE_1:%.*]] = icmp eq i64 [[A:%.*]], [[B:%.*]] 3961774c148SAntonio Frighetto; CHECK-NEXT: br i1 [[PRE_1]], label [[AB_EQUAL:%.*]], label [[NOT_EQ:%.*]] 3971774c148SAntonio Frighetto; CHECK: ab_equal: 3981774c148SAntonio Frighetto; CHECK-NEXT: [[BC_EQ:%.*]] = icmp eq i64 [[B]], [[C:%.*]] 3991774c148SAntonio Frighetto; CHECK-NEXT: br i1 [[BC_EQ]], label [[BC_EQUAL:%.*]], label [[NOT_EQ]] 4001774c148SAntonio Frighetto; CHECK: bc_equal: 4011774c148SAntonio Frighetto; CHECK-NEXT: [[A_PLUS_1:%.*]] = add nuw i64 [[A]], 1 4021774c148SAntonio Frighetto; CHECK-NEXT: [[C_PLUS_1:%.*]] = add nuw i64 [[C]], 1 4031774c148SAntonio Frighetto; CHECK-NEXT: [[RESULT:%.*]] = and i1 true, true 4041774c148SAntonio Frighetto; CHECK-NEXT: ret i1 [[RESULT]] 4051774c148SAntonio Frighetto; CHECK: not_eq: 4061774c148SAntonio Frighetto; CHECK-NEXT: ret i1 false 4071774c148SAntonio Frighetto; 4081774c148SAntonio Frighettoentry: 4091774c148SAntonio Frighetto %pre.1 = icmp eq i64 %a, %b 4101774c148SAntonio Frighetto br i1 %pre.1, label %ab_equal, label %not_eq 4111774c148SAntonio Frighetto 4121774c148SAntonio Frighettoab_equal: 4131774c148SAntonio Frighetto %bc_eq = icmp eq i64 %b, %c 4141774c148SAntonio Frighetto br i1 %bc_eq, label %bc_equal, label %not_eq 4151774c148SAntonio Frighetto 4161774c148SAntonio Frighettobc_equal: 4171774c148SAntonio Frighetto %ac_eq = icmp eq i64 %a, %c 4181774c148SAntonio Frighetto %a_plus_1 = add nuw i64 %a, 1 4191774c148SAntonio Frighetto %c_plus_1 = add nuw i64 %c, 1 4201774c148SAntonio Frighetto %ac_plus_1_eq = icmp eq i64 %a_plus_1, %c_plus_1 4211774c148SAntonio Frighetto %result = and i1 %ac_eq, %ac_plus_1_eq 4221774c148SAntonio Frighetto ret i1 %result 4231774c148SAntonio Frighetto 4241774c148SAntonio Frighettonot_eq: 4251774c148SAntonio Frighetto ret i1 false 4261774c148SAntonio Frighetto} 427*7fb97beeSStephen Senran Zhang 428*7fb97beeSStephen Senran Zhangdefine i1 @test_eq_for_signed_cmp(i32 noundef %v0, i32 noundef %v1, i32 noundef %v2) { 429*7fb97beeSStephen Senran Zhang; CHECK-LABEL: @test_eq_for_signed_cmp( 430*7fb97beeSStephen Senran Zhang; CHECK-NEXT: entry: 431*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V2:%.*]], [[V0:%.*]] 432*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V0]], [[V1:%.*]] 433*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]] 434*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]] 435*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[AND1:%.*]] = and i1 false, [[AND0]] 436*7fb97beeSStephen Senran Zhang; CHECK-NEXT: ret i1 [[AND1]] 437*7fb97beeSStephen Senran Zhang; 438*7fb97beeSStephen Senran Zhangentry: 439*7fb97beeSStephen Senran Zhang %cmp = icmp eq i32 %v2, %v0 440*7fb97beeSStephen Senran Zhang %cmp1 = icmp sge i32 %v0, %v1 441*7fb97beeSStephen Senran Zhang %and0 = and i1 %cmp1, %cmp 442*7fb97beeSStephen Senran Zhang %cmp4 = icmp sgt i32 %v1, %v2 443*7fb97beeSStephen Senran Zhang %and1 = and i1 %cmp4, %and0 444*7fb97beeSStephen Senran Zhang ret i1 %and1 445*7fb97beeSStephen Senran Zhang} 446*7fb97beeSStephen Senran Zhang 447*7fb97beeSStephen Senran Zhangdefine i1 @test_eq_for_signed_cmp_with_decompsition(i32 noundef %v0, i32 noundef %v1, i32 noundef %v2, i32 noundef %addend0, i32 noundef %addend1) { 448*7fb97beeSStephen Senran Zhang; CHECK-LABEL: @test_eq_for_signed_cmp_with_decompsition( 449*7fb97beeSStephen Senran Zhang; CHECK-NEXT: entry: 450*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[V0ADD:%.*]] = add nsw i32 [[V0:%.*]], [[ADDEND0:%.*]] 451*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[V1ADD:%.*]] = add nsw i32 [[V1:%.*]], [[ADDEND1:%.*]] 452*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V2:%.*]], [[V0ADD]] 453*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V0ADD]], [[V1ADD]] 454*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[ADDEND0]], 0 455*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[ADDEND0]], [[ADDEND1]] 456*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]] 457*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[AND1:%.*]] = and i1 [[AND0]], [[CMP2]] 458*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMP3]] 459*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]] 460*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[AND3:%.*]] = and i1 false, [[AND2]] 461*7fb97beeSStephen Senran Zhang; CHECK-NEXT: ret i1 [[AND3]] 462*7fb97beeSStephen Senran Zhang; 463*7fb97beeSStephen Senran Zhangentry: 464*7fb97beeSStephen Senran Zhang %v0add = add nsw i32 %v0, %addend0 465*7fb97beeSStephen Senran Zhang %v1add = add nsw i32 %v1, %addend1 466*7fb97beeSStephen Senran Zhang %cmp = icmp eq i32 %v2, %v0add 467*7fb97beeSStephen Senran Zhang %cmp1 = icmp sge i32 %v0add, %v1add 468*7fb97beeSStephen Senran Zhang %cmp2 = icmp sge i32 %addend0, 0 469*7fb97beeSStephen Senran Zhang %cmp3 = icmp slt i32 %addend0, %addend1 470*7fb97beeSStephen Senran Zhang %and0 = and i1 %cmp1, %cmp 471*7fb97beeSStephen Senran Zhang %and1 = and i1 %and0, %cmp2 472*7fb97beeSStephen Senran Zhang %and2 = and i1 %and1, %cmp3 473*7fb97beeSStephen Senran Zhang %cmp4 = icmp sgt i32 %v1, %v2 474*7fb97beeSStephen Senran Zhang %and3 = and i1 %cmp4, %and2 475*7fb97beeSStephen Senran Zhang ret i1 %and3 476*7fb97beeSStephen Senran Zhang} 477