xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/mixed-signed-unsigned-predicates.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
1972212d2SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3972212d2SFlorian Hahn
4972212d2SFlorian Hahndefine i1 @test_add_nuw(i8 %start, i8 %low, i8 %high) {
5972212d2SFlorian Hahn; CHECK-LABEL: @test_add_nuw(
6972212d2SFlorian Hahn; CHECK-NEXT:  entry:
7972212d2SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3
8972212d2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
9972212d2SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
10972212d2SFlorian Hahn; CHECK:       if.then:
11972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_3:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
12972212d2SFlorian Hahn; CHECK-NEXT:    [[START_1_1:%.*]] = add nuw i8 [[START]], 1
13972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_4:%.*]] = icmp uge i8 [[START_1_1]], [[HIGH]]
14972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[UC_3]], [[UC_4]]
15972212d2SFlorian Hahn; CHECK-NEXT:    [[START_3_1:%.*]] = add nuw i8 [[START]], 3
16972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], true
17972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_5:%.*]] = icmp ugt i8 [[START_3_1]], [[HIGH]]
18972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], [[UC_5]]
19972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_8:%.*]] = icmp sge i8 [[START_1_1]], [[HIGH]]
20972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], [[SC_8]]
21972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_9:%.*]] = icmp sge i8 [[START_3_1]], [[HIGH]]
22972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], [[SC_9]]
23972212d2SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_15]]
24972212d2SFlorian Hahn; CHECK:       if.else:
25972212d2SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1
26972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_0:%.*]] = xor i1 false, false
27972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_1:%.*]] = icmp sgt i8 [[START]], [[HIGH]]
28972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[RES_0]], [[SC_1]]
29972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_2:%.*]] = icmp sge i8 [[START_1]], [[HIGH]]
30972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[SC_2]]
31972212d2SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2
32972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], false
33972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_3:%.*]] = icmp sge i8 [[START_2]], [[HIGH]]
34972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[SC_3]]
35972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_4:%.*]] = icmp sle i8 [[START_2]], [[START_1]]
36972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], [[SC_4]]
37972212d2SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3
38972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], false
39972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_5:%.*]] = icmp sge i8 [[START_3]], [[START_1]]
40972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[SC_5]]
41972212d2SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4
42972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_2:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
43972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[UC_2]]
44972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_6:%.*]] = icmp sge i8 [[START_4]], [[START_1]]
45972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 [[RES_8]], [[SC_6]]
46972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_7:%.*]] = icmp sge i8 [[START_4]], [[HIGH]]
47972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[SC_7]]
48972212d2SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_10]]
49972212d2SFlorian Hahn;
50972212d2SFlorian Hahnentry:
51972212d2SFlorian Hahn  %add.ptr.i = add nuw i8 %start, 3
52972212d2SFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
53972212d2SFlorian Hahn  br i1 %c.1, label %if.then, label %if.else
54972212d2SFlorian Hahn
55972212d2SFlorian Hahn
56972212d2SFlorian Hahnif.then:
57972212d2SFlorian Hahn  %uc.3 = icmp ugt i8 %start, %high
58972212d2SFlorian Hahn  %start.1.1 = add nuw i8 %start, 1
59972212d2SFlorian Hahn  %uc.4 = icmp uge i8 %start.1.1, %high
60972212d2SFlorian Hahn  %res.11 = xor i1 %uc.3, %uc.4
61972212d2SFlorian Hahn
62972212d2SFlorian Hahn  %start.3.1 = add nuw i8 %start, 3
63972212d2SFlorian Hahn  %t.0 = icmp uge i8 %start.3.1, %high
64972212d2SFlorian Hahn  %res.12 = xor i1 %res.11, %t.0
65972212d2SFlorian Hahn
66972212d2SFlorian Hahn  %uc.5 = icmp ugt i8 %start.3.1, %high
67972212d2SFlorian Hahn  %res.13 = xor i1 %res.12, %uc.5
68972212d2SFlorian Hahn
69972212d2SFlorian Hahn  %sc.8 = icmp sge i8 %start.1.1, %high
70972212d2SFlorian Hahn  %res.14 = xor i1 %res.13, %sc.8
71972212d2SFlorian Hahn
72972212d2SFlorian Hahn  %sc.9 = icmp sge i8 %start.3.1, %high
73972212d2SFlorian Hahn  %res.15 = xor i1 %res.14, %sc.9
74972212d2SFlorian Hahn
75972212d2SFlorian Hahn  ret i1 %res.15
76972212d2SFlorian Hahn
77972212d2SFlorian Hahnif.else:
78972212d2SFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
79972212d2SFlorian Hahn  %start.1 = add nuw i8 %start, 1
80972212d2SFlorian Hahn  %f.1 = icmp uge i8 %start.1, %high
81972212d2SFlorian Hahn  %res.0 = xor i1 %f.0, %f.1
82972212d2SFlorian Hahn
83972212d2SFlorian Hahn  %sc.1 = icmp sgt i8 %start, %high
84972212d2SFlorian Hahn  %res.1 = xor i1 %res.0, %sc.1
85972212d2SFlorian Hahn
86972212d2SFlorian Hahn  %sc.2 = icmp sge i8 %start.1, %high
87972212d2SFlorian Hahn  %res.2 = xor i1 %res.1, %sc.2
88972212d2SFlorian Hahn
89972212d2SFlorian Hahn  %start.2 = add nuw i8 %start, 2
90972212d2SFlorian Hahn  %f.2 = icmp uge i8 %start.2, %high
91972212d2SFlorian Hahn  %res.3 = xor i1 %res.2, %f.2
92972212d2SFlorian Hahn
93972212d2SFlorian Hahn  %sc.3 = icmp sge i8 %start.2, %high
94972212d2SFlorian Hahn  %res.4 = xor i1 %res.3, %sc.3
95972212d2SFlorian Hahn
96972212d2SFlorian Hahn  %sc.4 = icmp sle i8 %start.2, %start.1
97972212d2SFlorian Hahn  %res.5 = xor i1 %res.4, %sc.4
98972212d2SFlorian Hahn
99972212d2SFlorian Hahn  %start.3 = add nuw i8 %start, 3
100972212d2SFlorian Hahn  %f.3 = icmp uge i8 %start.3, %high
101972212d2SFlorian Hahn  %res.6 = xor i1 %res.5, %f.3
102972212d2SFlorian Hahn
103972212d2SFlorian Hahn  %sc.5 = icmp sge i8 %start.3, %start.1
104972212d2SFlorian Hahn  %res.7 = xor i1 %res.6, %sc.5
105972212d2SFlorian Hahn
106972212d2SFlorian Hahn  %start.4 = add nuw i8 %start, 4
107972212d2SFlorian Hahn  %uc.2 = icmp uge i8 %start.4, %high
108972212d2SFlorian Hahn  %res.8 = xor i1 %res.7, %uc.2
109972212d2SFlorian Hahn
110972212d2SFlorian Hahn  %sc.6 = icmp sge i8 %start.4, %start.1
111972212d2SFlorian Hahn  %res.9 = xor i1 %res.8, %sc.6
112972212d2SFlorian Hahn
113972212d2SFlorian Hahn  %sc.7 = icmp sge i8 %start.4, %high
114972212d2SFlorian Hahn  %res.10 = xor i1 %res.9, %sc.7
115972212d2SFlorian Hahn
116972212d2SFlorian Hahn  ret i1 %res.10
117972212d2SFlorian Hahn}
118972212d2SFlorian Hahn
1196778e2f4SFlorian Hahndefine i1 @test_add_nsw(i8 %start, i8 %low, i8 %high) {
1206778e2f4SFlorian Hahn; CHECK-LABEL: @test_add_nsw(
1216778e2f4SFlorian Hahn; CHECK-NEXT:  entry:
1226778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], 3
1236778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
1246778e2f4SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1256778e2f4SFlorian Hahn; CHECK:       if.then:
1266778e2f4SFlorian Hahn; CHECK-NEXT:    [[UC_3:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
1276778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_1_1:%.*]] = add nuw i8 [[START]], 1
1286778e2f4SFlorian Hahn; CHECK-NEXT:    [[UC_4:%.*]] = icmp uge i8 [[START_1_1]], [[HIGH]]
1296778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[UC_3]], [[UC_4]]
1306778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_3_1:%.*]] = add nuw i8 [[START]], 3
1316778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp uge i8 [[START_3_1]], [[HIGH]]
1326778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], [[T_0]]
1336778e2f4SFlorian Hahn; CHECK-NEXT:    [[UC_5:%.*]] = icmp ugt i8 [[START_3_1]], [[HIGH]]
1346778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], [[UC_5]]
1356778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_8:%.*]] = icmp sge i8 [[START_1_1]], [[HIGH]]
1366778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], [[SC_8]]
1376778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_9:%.*]] = icmp sge i8 [[START_3_1]], [[HIGH]]
1386778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], [[SC_9]]
1396778e2f4SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_15]]
1406778e2f4SFlorian Hahn; CHECK:       if.else:
1416778e2f4SFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
1426778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1
1436778e2f4SFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
1446778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_0:%.*]] = xor i1 [[F_0]], [[F_1]]
145*f12684d3SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[RES_0]], false
1466778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_2:%.*]] = icmp sge i8 [[START_1]], [[HIGH]]
1476778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[SC_2]]
1486778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2
1496778e2f4SFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
1506778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[F_2]]
1516778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_3:%.*]] = icmp sge i8 [[START_2]], [[HIGH]]
1526778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[SC_3]]
1536778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_4:%.*]] = icmp sle i8 [[START_2]], [[START_1]]
1546778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], [[SC_4]]
1556778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3
1566778e2f4SFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]]
1576778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[F_3]]
1586778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_5:%.*]] = icmp sge i8 [[START_3]], [[START_1]]
1596778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[SC_5]]
1606778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4
1616778e2f4SFlorian Hahn; CHECK-NEXT:    [[UC_2:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
1626778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[UC_2]]
1636778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_6:%.*]] = icmp sge i8 [[START_4]], [[START_1]]
1646778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 [[RES_8]], [[SC_6]]
1656778e2f4SFlorian Hahn; CHECK-NEXT:    [[SC_7:%.*]] = icmp sge i8 [[START_4]], [[HIGH]]
1666778e2f4SFlorian Hahn; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[SC_7]]
1676778e2f4SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_10]]
1686778e2f4SFlorian Hahn;
1696778e2f4SFlorian Hahnentry:
1706778e2f4SFlorian Hahn  %add.ptr.i = add nsw i8 %start, 3
1716778e2f4SFlorian Hahn  %c.1 = icmp sge i8 %add.ptr.i, %high
1726778e2f4SFlorian Hahn  br i1 %c.1, label %if.then, label %if.else
1736778e2f4SFlorian Hahn
1746778e2f4SFlorian Hahnif.then:
1756778e2f4SFlorian Hahn  %uc.3 = icmp ugt i8 %start, %high
1766778e2f4SFlorian Hahn  %start.1.1 = add nuw i8 %start, 1
1776778e2f4SFlorian Hahn  %uc.4 = icmp uge i8 %start.1.1, %high
1786778e2f4SFlorian Hahn  %res.11 = xor i1 %uc.3, %uc.4
1796778e2f4SFlorian Hahn
1806778e2f4SFlorian Hahn  %start.3.1 = add nuw i8 %start, 3
1816778e2f4SFlorian Hahn  %t.0 = icmp uge i8 %start.3.1, %high
1826778e2f4SFlorian Hahn  %res.12 = xor i1 %res.11, %t.0
1836778e2f4SFlorian Hahn
1846778e2f4SFlorian Hahn  %uc.5 = icmp ugt i8 %start.3.1, %high
1856778e2f4SFlorian Hahn  %res.13 = xor i1 %res.12, %uc.5
1866778e2f4SFlorian Hahn
1876778e2f4SFlorian Hahn  %sc.8 = icmp sge i8 %start.1.1, %high
1886778e2f4SFlorian Hahn  %res.14 = xor i1 %res.13, %sc.8
1896778e2f4SFlorian Hahn
1906778e2f4SFlorian Hahn  %sc.9 = icmp sge i8 %start.3.1, %high
1916778e2f4SFlorian Hahn  %res.15 = xor i1 %res.14, %sc.9
1926778e2f4SFlorian Hahn
1936778e2f4SFlorian Hahn  ret i1 %res.15
1946778e2f4SFlorian Hahn
1956778e2f4SFlorian Hahnif.else:
1966778e2f4SFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
1976778e2f4SFlorian Hahn  %start.1 = add nuw i8 %start, 1
1986778e2f4SFlorian Hahn  %f.1 = icmp uge i8 %start.1, %high
1996778e2f4SFlorian Hahn  %res.0 = xor i1 %f.0, %f.1
2006778e2f4SFlorian Hahn
2016778e2f4SFlorian Hahn  %sc.1 = icmp sgt i8 %start, %high
2026778e2f4SFlorian Hahn  %res.1 = xor i1 %res.0, %sc.1
2036778e2f4SFlorian Hahn
2046778e2f4SFlorian Hahn  %sc.2 = icmp sge i8 %start.1, %high
2056778e2f4SFlorian Hahn  %res.2 = xor i1 %res.1, %sc.2
2066778e2f4SFlorian Hahn
2076778e2f4SFlorian Hahn  %start.2 = add nuw i8 %start, 2
2086778e2f4SFlorian Hahn  %f.2 = icmp uge i8 %start.2, %high
2096778e2f4SFlorian Hahn  %res.3 = xor i1 %res.2, %f.2
2106778e2f4SFlorian Hahn
2116778e2f4SFlorian Hahn  %sc.3 = icmp sge i8 %start.2, %high
2126778e2f4SFlorian Hahn  %res.4 = xor i1 %res.3, %sc.3
2136778e2f4SFlorian Hahn
2146778e2f4SFlorian Hahn  %sc.4 = icmp sle i8 %start.2, %start.1
2156778e2f4SFlorian Hahn  %res.5 = xor i1 %res.4, %sc.4
2166778e2f4SFlorian Hahn
2176778e2f4SFlorian Hahn  %start.3 = add nuw i8 %start, 3
2186778e2f4SFlorian Hahn  %f.3 = icmp uge i8 %start.3, %high
2196778e2f4SFlorian Hahn  %res.6 = xor i1 %res.5, %f.3
2206778e2f4SFlorian Hahn
2216778e2f4SFlorian Hahn  %sc.5 = icmp sge i8 %start.3, %start.1
2226778e2f4SFlorian Hahn  %res.7 = xor i1 %res.6, %sc.5
2236778e2f4SFlorian Hahn
2246778e2f4SFlorian Hahn  %start.4 = add nuw i8 %start, 4
2256778e2f4SFlorian Hahn  %uc.2 = icmp uge i8 %start.4, %high
2266778e2f4SFlorian Hahn  %res.8 = xor i1 %res.7, %uc.2
2276778e2f4SFlorian Hahn
2286778e2f4SFlorian Hahn  %sc.6 = icmp sge i8 %start.4, %start.1
2296778e2f4SFlorian Hahn  %res.9 = xor i1 %res.8, %sc.6
2306778e2f4SFlorian Hahn
2316778e2f4SFlorian Hahn  %sc.7 = icmp sge i8 %start.4, %high
2326778e2f4SFlorian Hahn  %res.10 = xor i1 %res.9, %sc.7
2336778e2f4SFlorian Hahn
2346778e2f4SFlorian Hahn  ret i1 %res.10
2356778e2f4SFlorian Hahn}
2366778e2f4SFlorian Hahn
2376778e2f4SFlorian Hahn
238cd79ca61SFlorian Hahndefine i1 @test_sub_nuw(i8 %start, i8 %low, i8 %high) {
239cd79ca61SFlorian Hahn; CHECK-LABEL: @test_sub_nuw(
240cd79ca61SFlorian Hahn; CHECK-NEXT:  entry:
241cd79ca61SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3
242cd79ca61SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
243cd79ca61SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
244cd79ca61SFlorian Hahn; CHECK:       if.then:
245cd79ca61SFlorian Hahn; CHECK-NEXT:    [[START_1_1:%.*]] = sub nuw i8 [[START]], 1
246cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 true, true
247cd79ca61SFlorian Hahn; CHECK-NEXT:    [[START_3_1:%.*]] = add nuw i8 [[START]], 3
248cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], true
249cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], true
250cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_8:%.*]] = icmp sge i8 [[START_1_1]], [[HIGH]]
251cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], [[SC_8]]
252cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_9:%.*]] = icmp sge i8 [[START_3_1]], [[HIGH]]
253cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], [[SC_9]]
254cd79ca61SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_15]]
255cd79ca61SFlorian Hahn; CHECK:       if.else:
256cd79ca61SFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
257cd79ca61SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = sub nuw i8 [[START]], 1
258cd79ca61SFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
259cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_0:%.*]] = xor i1 [[F_0]], [[F_1]]
260cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_1:%.*]] = icmp sgt i8 [[START]], [[HIGH]]
261cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[RES_0]], [[SC_1]]
262cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_2:%.*]] = icmp sge i8 [[START_1]], [[HIGH]]
263cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[SC_2]]
264cd79ca61SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = sub nuw i8 [[START]], 2
265cd79ca61SFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
266cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[F_2]]
267cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_3:%.*]] = icmp sge i8 [[START_2]], [[HIGH]]
268cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[SC_3]]
269cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_4:%.*]] = icmp sle i8 [[START_2]], [[START_1]]
270cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], [[SC_4]]
271cd79ca61SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = sub nuw i8 [[START]], 3
272cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], false
273cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_5:%.*]] = icmp sge i8 [[START_3]], [[START_1]]
274cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[SC_5]]
275cd79ca61SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = sub nuw i8 [[START]], 4
276cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], false
277cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_6:%.*]] = icmp sge i8 [[START_4]], [[START_1]]
278cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 [[RES_8]], [[SC_6]]
279cd79ca61SFlorian Hahn; CHECK-NEXT:    [[SC_7:%.*]] = icmp sge i8 [[START_4]], [[HIGH]]
280cd79ca61SFlorian Hahn; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[SC_7]]
281cd79ca61SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_10]]
282cd79ca61SFlorian Hahn;
283cd79ca61SFlorian Hahnentry:
284cd79ca61SFlorian Hahn  %add.ptr.i = sub nuw i8 %start, 3
285cd79ca61SFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
286cd79ca61SFlorian Hahn  br i1 %c.1, label %if.then, label %if.else
287cd79ca61SFlorian Hahn
288cd79ca61SFlorian Hahn
289cd79ca61SFlorian Hahnif.then:
290cd79ca61SFlorian Hahn  %uc.3 = icmp ugt i8 %start, %high
291cd79ca61SFlorian Hahn  %start.1.1 = sub nuw i8 %start, 1
292cd79ca61SFlorian Hahn  %uc.4 = icmp uge i8 %start.1.1, %high
293cd79ca61SFlorian Hahn  %res.11 = xor i1 %uc.3, %uc.4
294cd79ca61SFlorian Hahn
295cd79ca61SFlorian Hahn  %start.3.1 = add nuw i8 %start, 3
296cd79ca61SFlorian Hahn  %t.0 = icmp uge i8 %start.3.1, %high
297cd79ca61SFlorian Hahn  %res.12 = xor i1 %res.11, %t.0
298cd79ca61SFlorian Hahn
299cd79ca61SFlorian Hahn  %uc.5 = icmp ugt i8 %start.3.1, %high
300cd79ca61SFlorian Hahn  %res.13 = xor i1 %res.12, %uc.5
301cd79ca61SFlorian Hahn
302cd79ca61SFlorian Hahn  %sc.8 = icmp sge i8 %start.1.1, %high
303cd79ca61SFlorian Hahn  %res.14 = xor i1 %res.13, %sc.8
304cd79ca61SFlorian Hahn
305cd79ca61SFlorian Hahn  %sc.9 = icmp sge i8 %start.3.1, %high
306cd79ca61SFlorian Hahn  %res.15 = xor i1 %res.14, %sc.9
307cd79ca61SFlorian Hahn
308cd79ca61SFlorian Hahn  ret i1 %res.15
309cd79ca61SFlorian Hahn
310cd79ca61SFlorian Hahnif.else:
311cd79ca61SFlorian Hahn  %f.0 = icmp ugt i8 %start, %high
312cd79ca61SFlorian Hahn  %start.1 = sub nuw i8 %start, 1
313cd79ca61SFlorian Hahn  %f.1 = icmp uge i8 %start.1, %high
314cd79ca61SFlorian Hahn  %res.0 = xor i1 %f.0, %f.1
315cd79ca61SFlorian Hahn
316cd79ca61SFlorian Hahn  %sc.1 = icmp sgt i8 %start, %high
317cd79ca61SFlorian Hahn  %res.1 = xor i1 %res.0, %sc.1
318cd79ca61SFlorian Hahn
319cd79ca61SFlorian Hahn  %sc.2 = icmp sge i8 %start.1, %high
320cd79ca61SFlorian Hahn  %res.2 = xor i1 %res.1, %sc.2
321cd79ca61SFlorian Hahn
322cd79ca61SFlorian Hahn  %start.2 = sub nuw i8 %start, 2
323cd79ca61SFlorian Hahn  %f.2 = icmp uge i8 %start.2, %high
324cd79ca61SFlorian Hahn  %res.3 = xor i1 %res.2, %f.2
325cd79ca61SFlorian Hahn
326cd79ca61SFlorian Hahn  %sc.3 = icmp sge i8 %start.2, %high
327cd79ca61SFlorian Hahn  %res.4 = xor i1 %res.3, %sc.3
328cd79ca61SFlorian Hahn
329cd79ca61SFlorian Hahn  %sc.4 = icmp sle i8 %start.2, %start.1
330cd79ca61SFlorian Hahn  %res.5 = xor i1 %res.4, %sc.4
331cd79ca61SFlorian Hahn
332cd79ca61SFlorian Hahn  %start.3 = sub nuw i8 %start, 3
333cd79ca61SFlorian Hahn  %f.3 = icmp uge i8 %start.3, %high
334cd79ca61SFlorian Hahn  %res.6 = xor i1 %res.5, %f.3
335cd79ca61SFlorian Hahn
336cd79ca61SFlorian Hahn  %sc.5 = icmp sge i8 %start.3, %start.1
337cd79ca61SFlorian Hahn  %res.7 = xor i1 %res.6, %sc.5
338cd79ca61SFlorian Hahn
339cd79ca61SFlorian Hahn  %start.4 = sub nuw i8 %start, 4
340cd79ca61SFlorian Hahn  %uc.2 = icmp uge i8 %start.4, %high
341cd79ca61SFlorian Hahn  %res.8 = xor i1 %res.7, %uc.2
342cd79ca61SFlorian Hahn
343cd79ca61SFlorian Hahn  %sc.6 = icmp sge i8 %start.4, %start.1
344cd79ca61SFlorian Hahn  %res.9 = xor i1 %res.8, %sc.6
345cd79ca61SFlorian Hahn
346cd79ca61SFlorian Hahn  %sc.7 = icmp sge i8 %start.4, %high
347cd79ca61SFlorian Hahn  %res.10 = xor i1 %res.9, %sc.7
348cd79ca61SFlorian Hahn
349cd79ca61SFlorian Hahn  ret i1 %res.10
350cd79ca61SFlorian Hahn}
351cd79ca61SFlorian Hahn
352972212d2SFlorian Hahndefine i1 @test_and_ule_sge(i32 %x, i32 %y, i32 %z, i32 %a) {
353972212d2SFlorian Hahn; CHECK-LABEL: @test_and_ule_sge(
354972212d2SFlorian Hahn; CHECK-NEXT:  entry:
355972212d2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], [[Y:%.*]]
356972212d2SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sle i32 [[Y]], [[Z:%.*]]
357972212d2SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
358972212d2SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
359972212d2SFlorian Hahn; CHECK:       then:
360972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_1:%.*]] = icmp ule i32 [[X]], [[Z]]
361972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[UC_1]], true
362972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_3:%.*]] = icmp ule i32 [[Y]], [[Z]]
363972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[UC_3]]
364972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_4:%.*]] = icmp ule i32 [[X]], [[A:%.*]]
365972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_2]], [[UC_4]]
366972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_1:%.*]] = icmp sle i32 [[X]], [[Z]]
367972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], [[SC_1]]
368972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_2:%.*]] = icmp sle i32 [[X]], [[Y]]
369972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[SC_2]]
3700a781d98SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], true
371972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_4:%.*]] = icmp sle i32 [[X]], [[A]]
372972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[SC_4]]
373972212d2SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_8]]
374972212d2SFlorian Hahn; CHECK:       else:
375972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_5:%.*]] = icmp ule i32 [[X]], [[Z]]
376972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_6:%.*]] = icmp ule i32 [[X]], [[A]]
377972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 [[UC_5]], [[UC_6]]
378972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_7:%.*]] = icmp ule i32 [[X]], [[Y]]
379972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[UC_7]]
380972212d2SFlorian Hahn; CHECK-NEXT:    [[UC_8:%.*]] = icmp ule i32 [[Y]], [[Z]]
381972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[RES_10]], [[UC_8]]
382972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_5:%.*]] = icmp sle i32 [[X]], [[Z]]
383972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], [[SC_5]]
384972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_6:%.*]] = icmp sle i32 [[X]], [[A]]
385972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], [[SC_6]]
386972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_7:%.*]] = icmp sle i32 [[X]], [[Y]]
387972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], [[SC_7]]
388972212d2SFlorian Hahn; CHECK-NEXT:    [[SC_8:%.*]] = icmp sle i32 [[Y]], [[Z]]
389972212d2SFlorian Hahn; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], [[SC_8]]
390972212d2SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_15]]
391972212d2SFlorian Hahn;
392972212d2SFlorian Hahnentry:
393972212d2SFlorian Hahn  %c.1 = icmp ule i32 %x, %y
394972212d2SFlorian Hahn  %c.2 = icmp sle i32 %y, %z
395972212d2SFlorian Hahn  %and = and i1 %c.1, %c.2
396972212d2SFlorian Hahn  br i1 %and, label %then, label %else
397972212d2SFlorian Hahn
398972212d2SFlorian Hahnthen:
399972212d2SFlorian Hahn  %uc.1 = icmp ule i32 %x, %z
400972212d2SFlorian Hahn  %uc.2 = icmp ule i32 %x, %y
401972212d2SFlorian Hahn  %res.1 = xor i1 %uc.1, %uc.2
402972212d2SFlorian Hahn
403972212d2SFlorian Hahn  %uc.3 = icmp ule i32 %y, %z
404972212d2SFlorian Hahn  %res.2 = xor i1 %res.1, %uc.3
405972212d2SFlorian Hahn
406972212d2SFlorian Hahn  %uc.4 = icmp ule i32 %x, %a
407972212d2SFlorian Hahn  %res.4 = xor i1 %res.2, %uc.4
408972212d2SFlorian Hahn
409972212d2SFlorian Hahn  %sc.1 = icmp sle i32 %x, %z
410972212d2SFlorian Hahn  %res.5 = xor i1 %res.4, %sc.1
411972212d2SFlorian Hahn
412972212d2SFlorian Hahn  %sc.2 = icmp sle i32 %x, %y
413972212d2SFlorian Hahn  %res.6 = xor i1 %res.5, %sc.2
414972212d2SFlorian Hahn
415972212d2SFlorian Hahn  %sc.3 = icmp sle i32 %y, %z
416972212d2SFlorian Hahn  %res.7 = xor i1 %res.6, %sc.3
417972212d2SFlorian Hahn
418972212d2SFlorian Hahn  %sc.4 = icmp sle i32 %x, %a
419972212d2SFlorian Hahn  %res.8 = xor i1 %res.7, %sc.4
420972212d2SFlorian Hahn
421972212d2SFlorian Hahn  ret i1 %res.8
422972212d2SFlorian Hahn
423972212d2SFlorian Hahnelse:
424972212d2SFlorian Hahn  %uc.5 = icmp ule i32 %x, %z
425972212d2SFlorian Hahn  %uc.6 = icmp ule i32 %x, %a
426972212d2SFlorian Hahn  %res.9 = xor i1 %uc.5, %uc.6
427972212d2SFlorian Hahn
428972212d2SFlorian Hahn  %uc.7 = icmp ule i32 %x, %y
429972212d2SFlorian Hahn  %res.10 = xor i1 %res.9, %uc.7
430972212d2SFlorian Hahn
431972212d2SFlorian Hahn  %uc.8 = icmp ule i32 %y, %z
432972212d2SFlorian Hahn  %res.11 = xor i1 %res.10, %uc.8
433972212d2SFlorian Hahn
434972212d2SFlorian Hahn  %sc.5 = icmp sle i32 %x, %z
435972212d2SFlorian Hahn  %res.12 = xor i1 %res.11, %sc.5
436972212d2SFlorian Hahn
437972212d2SFlorian Hahn  %sc.6 = icmp sle i32 %x, %a
438972212d2SFlorian Hahn  %res.13 = xor i1 %res.12, %sc.6
439972212d2SFlorian Hahn
440972212d2SFlorian Hahn  %sc.7 = icmp sle i32 %x, %y
441972212d2SFlorian Hahn  %res.14 = xor i1 %res.13, %sc.7
442972212d2SFlorian Hahn
443972212d2SFlorian Hahn  %sc.8 = icmp sle i32 %y, %z
444972212d2SFlorian Hahn  %res.15 = xor i1 %res.14, %sc.8
445972212d2SFlorian Hahn
446972212d2SFlorian Hahn  ret i1 %res.15
447972212d2SFlorian Hahn}
448