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