xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/eq.ll (revision 7fb97bee9269f0d4239908ac8def70be696991c6)
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