xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/add-nsw.ll (revision 98e016d99732dc8fef8cfd61d6ce1edd042309a1)
16778e2f4SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
26778e2f4SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
36778e2f4SFlorian Hahn
4f12684d3SFlorian Hahndeclare void @use(i1)
5067b744dSFlorian Hahndeclare void @llvm.assume(i1)
6f12684d3SFlorian Hahn
7f12684d3SFlorian Hahndefine void @test.not.uge.ult(i8 %start, i8 %high) {
86778e2f4SFlorian Hahn; CHECK-LABEL: @test.not.uge.ult(
96778e2f4SFlorian Hahn; CHECK-NEXT:  entry:
106778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], 3
116778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
126778e2f4SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
136778e2f4SFlorian Hahn; CHECK:       if.then:
146778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
156778e2f4SFlorian Hahn; CHECK:       if.end:
166778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
176778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
186778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nsw i8 [[START]], 1
196778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]
206778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
216778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nsw i8 [[START]], 2
226778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]
236778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
246778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nsw i8 [[START]], 3
256778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]]
266778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
276778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nsw i8 [[START]], 4
286778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]]
296778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
306778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
316778e2f4SFlorian Hahn;
326778e2f4SFlorian Hahnentry:
336778e2f4SFlorian Hahn  %add.ptr.i = add nsw i8 %start, 3
346778e2f4SFlorian Hahn  %c.1 = icmp uge i8 %add.ptr.i, %high
356778e2f4SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
366778e2f4SFlorian Hahn
376778e2f4SFlorian Hahnif.then:                                          ; preds = %entry
386778e2f4SFlorian Hahn  ret void
396778e2f4SFlorian Hahn
406778e2f4SFlorian Hahnif.end:                                           ; preds = %entry
416778e2f4SFlorian Hahn  %t.0 = icmp ult i8 %start, %high
426778e2f4SFlorian Hahn  call void @use(i1 %t.0)
436778e2f4SFlorian Hahn  %start.1 = add nsw i8 %start, 1
446778e2f4SFlorian Hahn  %t.1 = icmp ult i8 %start.1, %high
456778e2f4SFlorian Hahn  call void @use(i1 %t.1)
466778e2f4SFlorian Hahn  %start.2 = add nsw i8 %start, 2
476778e2f4SFlorian Hahn  %t.2 = icmp ult i8 %start.2, %high
486778e2f4SFlorian Hahn  call void @use(i1 %t.2)
496778e2f4SFlorian Hahn  %start.3 = add nsw i8 %start, 3
506778e2f4SFlorian Hahn  %t.3 = icmp ult i8 %start.3, %high
516778e2f4SFlorian Hahn  call void @use(i1 %t.3)
526778e2f4SFlorian Hahn  %start.4 = add nsw i8 %start, 4
536778e2f4SFlorian Hahn  %c.4 = icmp ult i8 %start.4, %high
546778e2f4SFlorian Hahn  call void @use(i1 %c.4)
556778e2f4SFlorian Hahn  ret void
566778e2f4SFlorian Hahn}
576778e2f4SFlorian Hahn
58f12684d3SFlorian Hahndefine void @test.not.sge.slt(i8 %start, i8 %high) {
596778e2f4SFlorian Hahn; CHECK-LABEL: @test.not.sge.slt(
606778e2f4SFlorian Hahn; CHECK-NEXT:  entry:
616778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], 3
626778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
636778e2f4SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
646778e2f4SFlorian Hahn; CHECK:       if.then:
656778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
666778e2f4SFlorian Hahn; CHECK:       if.end:
67f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
686778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nsw i8 [[START]], 1
69f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
706778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nsw i8 [[START]], 2
71f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
726778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nsw i8 [[START]], 3
73f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
746778e2f4SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nsw i8 [[START]], 4
756778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]
766778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
776778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
786778e2f4SFlorian Hahn;
796778e2f4SFlorian Hahnentry:
806778e2f4SFlorian Hahn  %add.ptr.i = add nsw i8 %start, 3
816778e2f4SFlorian Hahn  %c.1 = icmp sge i8 %add.ptr.i, %high
826778e2f4SFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
836778e2f4SFlorian Hahn
846778e2f4SFlorian Hahnif.then:                                          ; preds = %entry
856778e2f4SFlorian Hahn  ret void
866778e2f4SFlorian Hahn
876778e2f4SFlorian Hahnif.end:                                           ; preds = %entry
886778e2f4SFlorian Hahn  %t.0 = icmp slt i8 %start, %high
896778e2f4SFlorian Hahn  call void @use(i1 %t.0)
906778e2f4SFlorian Hahn  %start.1 = add nsw i8 %start, 1
916778e2f4SFlorian Hahn  %t.1 = icmp slt i8 %start.1, %high
926778e2f4SFlorian Hahn  call void @use(i1 %t.1)
936778e2f4SFlorian Hahn  %start.2 = add nsw i8 %start, 2
946778e2f4SFlorian Hahn  %t.2 = icmp slt i8 %start.2, %high
956778e2f4SFlorian Hahn  call void @use(i1 %t.2)
966778e2f4SFlorian Hahn  %start.3 = add nsw i8 %start, 3
976778e2f4SFlorian Hahn  %t.3 = icmp slt i8 %start.3, %high
986778e2f4SFlorian Hahn  call void @use(i1 %t.3)
996778e2f4SFlorian Hahn  %start.4 = add nsw i8 %start, 4
1006778e2f4SFlorian Hahn  %c.4 = icmp slt i8 %start.4, %high
1016778e2f4SFlorian Hahn  call void @use(i1 %c.4)
1026778e2f4SFlorian Hahn  ret void
1036778e2f4SFlorian Hahn}
1046778e2f4SFlorian Hahn
1056778e2f4SFlorian Hahndefine void @test.decompose.nonconst(i8 %a, i8 %b, i8 %c, i8 %d) {
1066778e2f4SFlorian Hahn; CHECK-LABEL: @test.decompose.nonconst(
1076778e2f4SFlorian Hahn; CHECK-NEXT:  entry:
1086778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp sge i8 [[A:%.*]], [[C:%.*]]
1096778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[C]]
1106778e2f4SFlorian Hahn; CHECK-NEXT:    [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]]
1116778e2f4SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1126778e2f4SFlorian Hahn; CHECK:       if.then:
1136778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], 0
1146778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i8 [[B]], 0
1156778e2f4SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_2]], [[C_3]]
1166778e2f4SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_1]], label [[IF_THEN_2:%.*]], label [[IF_END]]
1176778e2f4SFlorian Hahn; CHECK:       if.then.2:
1186778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_0:%.*]] = add nsw i8 [[A]], [[B]]
119f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
1206778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i8 [[A]], [[A]]
121f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
1226778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nsw i8 [[A]], [[D:%.*]]
1236778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i8 [[ADD_2]], [[C]]
1246778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
1256778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
1266778e2f4SFlorian Hahn; CHECK:       if.end:
1276778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
1286778e2f4SFlorian Hahn;
1296778e2f4SFlorian Hahnentry:
1306778e2f4SFlorian Hahn  %c.0 = icmp sge i8 %a, %c
1316778e2f4SFlorian Hahn  %c.1 = icmp sge i8 %b, %c
1326778e2f4SFlorian Hahn  %and.0 = and i1 %c.0, %c.1
1336778e2f4SFlorian Hahn  br i1 %and.0, label %if.then, label %if.end
1346778e2f4SFlorian Hahn
1356778e2f4SFlorian Hahnif.then:                                          ; preds = %entry
1366778e2f4SFlorian Hahn  %c.2 = icmp sge i8 %a, 0
1376778e2f4SFlorian Hahn  %c.3 = icmp sge i8 %b, 0
1386778e2f4SFlorian Hahn  %and.1 = and i1 %c.2, %c.3
1396778e2f4SFlorian Hahn  br i1 %and.1, label %if.then.2, label %if.end
1406778e2f4SFlorian Hahn
1416778e2f4SFlorian Hahnif.then.2:
1426778e2f4SFlorian Hahn  %add.0 = add nsw i8 %a, %b
1436778e2f4SFlorian Hahn  %t.0 = icmp sge i8 %add.0, %c
1446778e2f4SFlorian Hahn  call void @use(i1 %t.0)
1456778e2f4SFlorian Hahn  %add.1 = add nsw i8 %a, %a
1466778e2f4SFlorian Hahn  %t.1 = icmp sge i8 %add.0, %c
1476778e2f4SFlorian Hahn  call void @use(i1 %t.1)
1486778e2f4SFlorian Hahn  %add.2 = add nsw i8 %a, %d
1496778e2f4SFlorian Hahn  %c.4 = icmp sge i8 %add.2, %c
1506778e2f4SFlorian Hahn  call void @use(i1 %c.4)
1516778e2f4SFlorian Hahn  ret void
1526778e2f4SFlorian Hahn
1536778e2f4SFlorian Hahnif.end:                                           ; preds = %entry
1546778e2f4SFlorian Hahn  ret void
1556778e2f4SFlorian Hahn}
1566778e2f4SFlorian Hahn
1576778e2f4SFlorian Hahndefine void @test.decompose.nonconst.no.null.check(i8 %a, i8 %b, i8 %c, i8 %d) {
1586778e2f4SFlorian Hahn; CHECK-LABEL: @test.decompose.nonconst.no.null.check(
1596778e2f4SFlorian Hahn; CHECK-NEXT:  entry:
1606778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp sge i8 [[A:%.*]], [[C:%.*]]
1616778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[C]]
1626778e2f4SFlorian Hahn; CHECK-NEXT:    [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]]
1636778e2f4SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
1646778e2f4SFlorian Hahn; CHECK:       if.then:
1656778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_0:%.*]] = add nsw i8 [[A]], [[B]]
1666778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp sge i8 [[ADD_0]], [[C]]
1676778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
1686778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i8 [[A]], [[A]]
1696778e2f4SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp sge i8 [[ADD_0]], [[C]]
1706778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
1716778e2f4SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nsw i8 [[A]], [[D:%.*]]
1726778e2f4SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i8 [[ADD_2]], [[C]]
1736778e2f4SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
1746778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
1756778e2f4SFlorian Hahn; CHECK:       if.end:
1766778e2f4SFlorian Hahn; CHECK-NEXT:    ret void
1776778e2f4SFlorian Hahn;
1786778e2f4SFlorian Hahnentry:
1796778e2f4SFlorian Hahn  %c.0 = icmp sge i8 %a, %c
1806778e2f4SFlorian Hahn  %c.1 = icmp sge i8 %b, %c
1816778e2f4SFlorian Hahn  %and.0 = and i1 %c.0, %c.1
1826778e2f4SFlorian Hahn  br i1 %and.0, label %if.then, label %if.end
1836778e2f4SFlorian Hahn
1846778e2f4SFlorian Hahnif.then:                                          ; preds = %entry
1856778e2f4SFlorian Hahn  %add.0 = add nsw i8 %a, %b
1866778e2f4SFlorian Hahn  %t.0 = icmp sge i8 %add.0, %c
1876778e2f4SFlorian Hahn  call void @use(i1 %t.0)
1886778e2f4SFlorian Hahn  %add.1 = add nsw i8 %a, %a
1896778e2f4SFlorian Hahn  %t.1 = icmp sge i8 %add.0, %c
1906778e2f4SFlorian Hahn  call void @use(i1 %t.1)
1916778e2f4SFlorian Hahn  %add.2 = add nsw i8 %a, %d
1926778e2f4SFlorian Hahn  %c.4 = icmp sge i8 %add.2, %c
1936778e2f4SFlorian Hahn  call void @use(i1 %c.4)
1946778e2f4SFlorian Hahn  ret void
1956778e2f4SFlorian Hahn
1966778e2f4SFlorian Hahnif.end:                                           ; preds = %entry
1976778e2f4SFlorian Hahn  ret void
1986778e2f4SFlorian Hahn}
1996778e2f4SFlorian Hahn
200f12684d3SFlorian Hahndefine void @test.sge.slt.add.neg(i8 %start, i8 %high) {
201f12684d3SFlorian Hahn; CHECK-LABEL: @test.sge.slt.add.neg(
202f12684d3SFlorian Hahn; CHECK-NEXT:  entry:
203f12684d3SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nsw i8 [[START:%.*]], -3
204f12684d3SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt i8 [[ADD_PTR_I]], [[HIGH:%.*]]
205f12684d3SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
206f12684d3SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp slt i8 [[START]], [[HIGH]]
207f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
208f12684d3SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = add nsw i8 [[START]], 1
209f12684d3SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]
210f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
211f12684d3SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = add nsw i8 [[START]], -2
212f12684d3SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]
213f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
214f12684d3SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = add nsw i8 [[START]], -3
215f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
216f12684d3SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = add nsw i8 [[START]], -4
217f12684d3SFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
218f12684d3SFlorian Hahn; CHECK-NEXT:    ret void
219f12684d3SFlorian Hahn;
220f12684d3SFlorian Hahnentry:
221f12684d3SFlorian Hahn  %add.ptr.i = add nsw i8 %start, -3
222f12684d3SFlorian Hahn  %c.1 = icmp slt i8 %add.ptr.i, %high
223f12684d3SFlorian Hahn  call void @llvm.assume(i1 %c.1)
224f12684d3SFlorian Hahn  %c.2 = icmp slt i8 %start, %high
225f12684d3SFlorian Hahn  call void @use(i1 %c.2)
226f12684d3SFlorian Hahn  %start.1 = add nsw i8 %start,  1
227f12684d3SFlorian Hahn  %c.3 = icmp slt i8 %start.1, %high
228f12684d3SFlorian Hahn  call void @use(i1 %c.3)
229f12684d3SFlorian Hahn  %start.2 = add nsw i8 %start, -2
230f12684d3SFlorian Hahn  %c.4 = icmp slt i8 %start.2, %high
231f12684d3SFlorian Hahn  call void @use(i1 %c.4)
232f12684d3SFlorian Hahn  %start.3 = add nsw i8 %start, -3
233f12684d3SFlorian Hahn  %t.1 = icmp slt i8 %start.3, %high
234f12684d3SFlorian Hahn  call void @use(i1 %t.1)
235f12684d3SFlorian Hahn  %start.4 = add nsw i8 %start, -4
236f12684d3SFlorian Hahn  %t.2 = icmp slt i8 %start.4, %high
237f12684d3SFlorian Hahn  call void @use(i1 %t.2)
238f12684d3SFlorian Hahn  ret void
239f12684d3SFlorian Hahn}
240f12684d3SFlorian Hahn
241067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1(i8 %start, i8 %high) {
242067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1(
243067b744dSFlorian Hahn; CHECK-NEXT:  entry:
244067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
245067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
246067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
247067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
248067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
249a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 true
250067b744dSFlorian Hahn;
251067b744dSFlorian Hahnentry:
252067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
253067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
254067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
255067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
256067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
257067b744dSFlorian Hahn
258067b744dSFlorian Hahn  %t = icmp ult i16 %start.ext, %high.ext
259067b744dSFlorian Hahn  ret i1 %t
260067b744dSFlorian Hahn}
261067b744dSFlorian Hahn
262067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1_assume_pos(i8 %start, i8 %high) {
263067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1_assume_pos(
264067b744dSFlorian Hahn; CHECK-NEXT:  entry:
265067b744dSFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
266067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
267067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], 3
268067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
269067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
270a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 true
271067b744dSFlorian Hahn;
272067b744dSFlorian Hahnentry:
273067b744dSFlorian Hahn  %start.pos = icmp sge i8 %start, 0
274067b744dSFlorian Hahn  call void @llvm.assume(i1 %start.pos)
275067b744dSFlorian Hahn  %add = add nsw i8 %start, 3
276067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
277067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
278067b744dSFlorian Hahn
279067b744dSFlorian Hahn  %t = icmp ult i8 %start, %high
280067b744dSFlorian Hahn  ret i1 %t
281067b744dSFlorian Hahn}
282067b744dSFlorian Hahn
283067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1_no_assume_pos(i8 %start, i8 %high) {
284067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1_no_assume_pos(
285067b744dSFlorian Hahn; CHECK-NEXT:  entry:
286067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], 3
287067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
288067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
289067b744dSFlorian Hahn; CHECK-NEXT:    [[T:%.*]] = icmp ult i8 [[START]], [[HIGH]]
290067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[T]]
291067b744dSFlorian Hahn;
292067b744dSFlorian Hahnentry:
293067b744dSFlorian Hahn  %add = add nsw i8 %start, 3
294067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
295067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
296067b744dSFlorian Hahn
297067b744dSFlorian Hahn  %t = icmp ult i8 %start, %high
298067b744dSFlorian Hahn  ret i1 %t
299067b744dSFlorian Hahn}
300067b744dSFlorian Hahn
301067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_1_cmp_no_ext(i8 %start, i8 %high) {
302067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_1_cmp_no_ext(
303067b744dSFlorian Hahn; CHECK-NEXT:  entry:
304067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
305067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
306067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
307067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
308067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
309a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 true
310067b744dSFlorian Hahn;
311067b744dSFlorian Hahnentry:
312067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
313067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
314067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
315067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
316067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
317067b744dSFlorian Hahn
318067b744dSFlorian Hahn  %t = icmp ult i8 %start, %high
319067b744dSFlorian Hahn  ret i1 %t
320067b744dSFlorian Hahn}
321067b744dSFlorian Hahn
322067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_2(i8 %start, i8 %high) {
323067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_2(
324067b744dSFlorian Hahn; CHECK-NEXT:  entry:
325067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
326067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
327067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
328067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
329067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
330a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 false
331067b744dSFlorian Hahn;
332067b744dSFlorian Hahnentry:
333067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
334067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
335067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
336067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
337067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
338067b744dSFlorian Hahn
339067b744dSFlorian Hahn  %f = icmp uge i16 %start.ext, %high.ext
340067b744dSFlorian Hahn  ret i1 %f
341067b744dSFlorian Hahn}
342067b744dSFlorian Hahn
343067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_2_assume_pos(i8 %start, i8 %high) {
344067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_2_assume_pos(
345067b744dSFlorian Hahn; CHECK-NEXT:  entry:
346067b744dSFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
347067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
348067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], 3
349067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
350067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
351a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 false
352067b744dSFlorian Hahn;
353067b744dSFlorian Hahnentry:
354067b744dSFlorian Hahn  %start.pos = icmp sge i8 %start, 0
355067b744dSFlorian Hahn  call void @llvm.assume(i1 %start.pos)
356067b744dSFlorian Hahn  %add = add nsw i8 %start, 3
357067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
358067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
359067b744dSFlorian Hahn
360067b744dSFlorian Hahn  %f = icmp uge i8 %start, %high
361067b744dSFlorian Hahn  ret i1 %f
362067b744dSFlorian Hahn}
363067b744dSFlorian Hahn
364067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_2_cmp_no_ext(i8 %start, i8 %high) {
365067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_2_cmp_no_ext(
366067b744dSFlorian Hahn; CHECK-NEXT:  entry:
367067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
368067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
369067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
370067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
371067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
372a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 false
373067b744dSFlorian Hahn;
374067b744dSFlorian Hahnentry:
375067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
376067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
377067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
378067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
379067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
380067b744dSFlorian Hahn
381067b744dSFlorian Hahn  %c = icmp uge i8 %start, %high
382067b744dSFlorian Hahn  ret i1 %c
383067b744dSFlorian Hahn}
384067b744dSFlorian Hahn
385067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_3(i8 %start, i8 %high) {
386067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_3(
387067b744dSFlorian Hahn; CHECK-NEXT:  entry:
388067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
389067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
390067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
391067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
392067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
393067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_4:%.*]] = add nsw i16 [[START_EXT]], 4
394067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i16 [[ADD_4]], [[HIGH_EXT]]
395067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
396067b744dSFlorian Hahn;
397067b744dSFlorian Hahnentry:
398067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
399067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
400067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
401067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
402067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
403067b744dSFlorian Hahn
404067b744dSFlorian Hahn  %add.4 = add nsw i16 %start.ext, 4
405067b744dSFlorian Hahn  %c = icmp ult i16 %add.4, %high.ext
406067b744dSFlorian Hahn  ret i1 %c
407067b744dSFlorian Hahn}
408067b744dSFlorian Hahn
409067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_3_assume_pos(i8 %start, i8 %high) {
410067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_3_assume_pos(
411067b744dSFlorian Hahn; CHECK-NEXT:  entry:
412067b744dSFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
413067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
414067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], 3
415067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
416067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
417067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_4:%.*]] = add nsw i8 [[START]], 4
418067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[ADD_4]], [[HIGH]]
419067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
420067b744dSFlorian Hahn;
421067b744dSFlorian Hahnentry:
422067b744dSFlorian Hahn  %start.pos = icmp sge i8 %start, 0
423067b744dSFlorian Hahn  call void @llvm.assume(i1 %start.pos)
424067b744dSFlorian Hahn  %add = add nsw i8 %start, 3
425067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
426067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
427067b744dSFlorian Hahn
428067b744dSFlorian Hahn  %add.4 = add nsw i8 %start, 4
429067b744dSFlorian Hahn  %c = icmp ult i8 %add.4, %high
430067b744dSFlorian Hahn  ret i1 %c
431067b744dSFlorian Hahn}
432067b744dSFlorian Hahn
433067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_4(i8 %start, i8 %high) {
434067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_4(
435067b744dSFlorian Hahn; CHECK-NEXT:  entry:
436067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
437067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
438067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
439067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
440067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
441067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nsw i16 [[START_EXT]], 2
442a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 true
443067b744dSFlorian Hahn;
444067b744dSFlorian Hahnentry:
445067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
446067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
447067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
448067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
449067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
450067b744dSFlorian Hahn
451067b744dSFlorian Hahn  %add.2 = add nsw i16 %start.ext, 2
452067b744dSFlorian Hahn  %c = icmp ult i16 %add.2, %high.ext
453067b744dSFlorian Hahn  ret i1 %c
454067b744dSFlorian Hahn}
455067b744dSFlorian Hahn
456067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_pos_4_assume_pos(i8 %start, i8 %high) {
457067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_pos_4_assume_pos(
458067b744dSFlorian Hahn; CHECK-NEXT:  entry:
459067b744dSFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
460067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
461067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], 3
462067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
463067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
464067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add nsw i8 [[START]], 2
465a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 true
466067b744dSFlorian Hahn;
467067b744dSFlorian Hahnentry:
468067b744dSFlorian Hahn  %start.pos = icmp sge i8 %start, 0
469067b744dSFlorian Hahn  call void @llvm.assume(i1 %start.pos)
470067b744dSFlorian Hahn  %add = add nsw i8 %start, 3
471067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
472067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
473067b744dSFlorian Hahn
474067b744dSFlorian Hahn  %add.2 = add nsw i8 %start, 2
475067b744dSFlorian Hahn  %c = icmp ult i8 %add.2, %high
476067b744dSFlorian Hahn  ret i1 %c
477067b744dSFlorian Hahn}
478067b744dSFlorian Hahn
479067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_neg_5(i8 %start, i8 %high) {
480067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_neg_5(
481067b744dSFlorian Hahn; CHECK-NEXT:  entry:
482067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
483067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
484067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add nsw i16 [[START_EXT]], 3
485067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
486067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
487067b744dSFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add nsw i16 [[START_EXT]], -2
488067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i16 [[SUB_2]], [[HIGH_EXT]]
489067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
490067b744dSFlorian Hahn;
491067b744dSFlorian Hahnentry:
492067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
493067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
494067b744dSFlorian Hahn  %add.ext = add nsw i16 %start.ext, 3
495067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
496067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
497067b744dSFlorian Hahn
498067b744dSFlorian Hahn  %sub.2 = add nsw i16 %start.ext, -2
499067b744dSFlorian Hahn  %c = icmp ult i16 %sub.2, %high.ext
500067b744dSFlorian Hahn  ret i1 %c
501067b744dSFlorian Hahn}
502067b744dSFlorian Hahn
503067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_neg_5_assume_pos(i8 %start, i8 %high) {
504067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_neg_5_assume_pos(
505067b744dSFlorian Hahn; CHECK-NEXT:  entry:
506067b744dSFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
507067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
508067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], 3
509067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
510067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
511067b744dSFlorian Hahn; CHECK-NEXT:    [[SUB_2:%.*]] = add nsw i8 [[START]], -2
512067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[SUB_2]], [[HIGH]]
513067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
514067b744dSFlorian Hahn;
515067b744dSFlorian Hahnentry:
516067b744dSFlorian Hahn  %start.pos = icmp sge i8 %start, 0
517067b744dSFlorian Hahn  call void @llvm.assume(i1 %start.pos)
518067b744dSFlorian Hahn  %add = add nsw i8 %start, 3
519067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
520067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
521067b744dSFlorian Hahn
522067b744dSFlorian Hahn  %sub.2 = add nsw i8 %start, -2
523067b744dSFlorian Hahn  %c = icmp ult i8 %sub.2, %high
524067b744dSFlorian Hahn  ret i1 %c
525067b744dSFlorian Hahn}
526067b744dSFlorian Hahn
527067b744dSFlorian Hahndefine i1 @test_ult_add_no_nsw_pos_6(i8 %start, i8 %high) {
528067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_pos_6(
529067b744dSFlorian Hahn; CHECK-NEXT:  entry:
530067b744dSFlorian Hahn; CHECK-NEXT:    [[HIGH_EXT:%.*]] = zext i8 [[HIGH:%.*]] to i16
531067b744dSFlorian Hahn; CHECK-NEXT:    [[START_EXT:%.*]] = zext i8 [[START:%.*]] to i16
532067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_EXT:%.*]] = add i16 [[START_EXT]], 3
533067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i16 [[ADD_EXT]], [[HIGH_EXT]]
534067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
535067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add i16 [[START_EXT]], 2
536067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i16 [[ADD_2]], [[HIGH_EXT]]
537067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
538067b744dSFlorian Hahn;
539067b744dSFlorian Hahnentry:
540067b744dSFlorian Hahn  %high.ext = zext i8 %high to i16
541067b744dSFlorian Hahn  %start.ext = zext i8 %start to i16
542067b744dSFlorian Hahn  %add.ext = add i16 %start.ext, 3
543067b744dSFlorian Hahn  %c.1 = icmp ult i16 %add.ext, %high.ext
544067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
545067b744dSFlorian Hahn
546067b744dSFlorian Hahn  %add.2 = add i16 %start.ext, 2
547067b744dSFlorian Hahn  %c = icmp ult i16 %add.2, %high.ext
548067b744dSFlorian Hahn  ret i1 %c
549067b744dSFlorian Hahn}
550067b744dSFlorian Hahn
551067b744dSFlorian Hahndefine i1 @test_ult_add_no_nsw_pos_6_assume_pos(i8 %start, i8 %high) {
552067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_pos_6_assume_pos(
553067b744dSFlorian Hahn; CHECK-NEXT:  entry:
554067b744dSFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
555067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
556067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START]], 3
557067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
558067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
559067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add i8 [[START]], 2
560067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[ADD_2]], [[HIGH]]
561067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
562067b744dSFlorian Hahn;
563067b744dSFlorian Hahnentry:
564067b744dSFlorian Hahn  %start.pos = icmp sge i8 %start, 0
565067b744dSFlorian Hahn  call void @llvm.assume(i1 %start.pos)
566067b744dSFlorian Hahn  %add = add i8 %start, 3
567067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
568067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
569067b744dSFlorian Hahn
570067b744dSFlorian Hahn  %add.2 = add i8 %start, 2
571067b744dSFlorian Hahn  %c = icmp ult i8 %add.2, %high
572067b744dSFlorian Hahn  ret i1 %c
573067b744dSFlorian Hahn}
574067b744dSFlorian Hahn
575067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_var_7(i8 %start, i8 %off, i8 %high) {
576067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_7(
577067b744dSFlorian Hahn; CHECK-NEXT:  entry:
578067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], [[OFF:%.*]]
579067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
580067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
581067b744dSFlorian Hahn; CHECK-NEXT:    [[OFF_POS:%.*]] = icmp sge i8 [[OFF]], 0
582067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_POS]])
583067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[START]], [[HIGH]]
584067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
585067b744dSFlorian Hahn;
586067b744dSFlorian Hahnentry:
587067b744dSFlorian Hahn  %add = add nsw i8 %start, %off
588067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
589067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
590067b744dSFlorian Hahn  %off.pos = icmp sge i8 %off, 0
591067b744dSFlorian Hahn  call void @llvm.assume(i1 %off.pos)
592067b744dSFlorian Hahn
593067b744dSFlorian Hahn  %c = icmp ult i8 %start, %high
594067b744dSFlorian Hahn  ret i1 %c
595067b744dSFlorian Hahn}
596067b744dSFlorian Hahn
597067b744dSFlorian Hahndefine i1 @test_ult_add_no_nsw_var_7(i8 %start, i8 %off, i8 %high) {
598067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_var_7(
599067b744dSFlorian Hahn; CHECK-NEXT:  entry:
600067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START:%.*]], [[OFF:%.*]]
601067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
602067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
603067b744dSFlorian Hahn; CHECK-NEXT:    [[OFF_POS:%.*]] = icmp sge i8 [[OFF]], 0
604067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_POS]])
605067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[START]], [[HIGH]]
606067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
607067b744dSFlorian Hahn;
608067b744dSFlorian Hahnentry:
609067b744dSFlorian Hahn  %add = add i8 %start, %off
610067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
611067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
612067b744dSFlorian Hahn  %off.pos = icmp sge i8 %off, 0
613067b744dSFlorian Hahn  call void @llvm.assume(i1 %off.pos)
614067b744dSFlorian Hahn
615067b744dSFlorian Hahn  %c = icmp ult i8 %start, %high
616067b744dSFlorian Hahn  ret i1 %c
617067b744dSFlorian Hahn}
618067b744dSFlorian Hahn
619067b744dSFlorian Hahndefine i1 @test_ult_add_nsw_var_8(i8 %start, i8 %off.1, i8 %off.2, i8 %high) {
620067b744dSFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_8(
621067b744dSFlorian Hahn; CHECK-NEXT:  entry:
622067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START:%.*]], [[OFF_2:%.*]]
623067b744dSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
624067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
625067b744dSFlorian Hahn; CHECK-NEXT:    [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0
626067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_POS]])
627067b744dSFlorian Hahn; CHECK-NEXT:    [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0
628067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_2_POS]])
629067b744dSFlorian Hahn; CHECK-NEXT:    [[OFF_1_ULT:%.*]] = icmp ult i8 [[OFF_1]], [[OFF_2]]
630067b744dSFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_ULT]])
631067b744dSFlorian Hahn; CHECK-NEXT:    [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]]
632067b744dSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[ADD_OFF_2]], [[HIGH]]
633067b744dSFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
634067b744dSFlorian Hahn;
635067b744dSFlorian Hahnentry:
636067b744dSFlorian Hahn  %add = add nsw i8 %start, %off.2
637067b744dSFlorian Hahn  %c.1 = icmp ult i8 %add, %high
638067b744dSFlorian Hahn  call void @llvm.assume(i1 %c.1)
639067b744dSFlorian Hahn  %off.1.pos = icmp sge i8 %off.1, 0
640067b744dSFlorian Hahn  call void @llvm.assume(i1 %off.1.pos)
641067b744dSFlorian Hahn  %off.2.pos = icmp sge i8 %off.2, 0
642067b744dSFlorian Hahn  call void @llvm.assume(i1 %off.2.pos)
643067b744dSFlorian Hahn  %off.1.ult = icmp ult i8 %off.1, %off.2
644067b744dSFlorian Hahn  call void @llvm.assume(i1 %off.1.ult)
645067b744dSFlorian Hahn
646067b744dSFlorian Hahn  %add.off.2 = add nsw i8 %start, %off.1
647067b744dSFlorian Hahn  %c = icmp ult i8 %add.off.2, %high
648067b744dSFlorian Hahn  ret i1 %c
649067b744dSFlorian Hahn}
650a4635ec7SFlorian Hahn
651a4635ec7SFlorian Hahndefine i1 @test_ult_add_nsw_var_8_all_pos(i8 %start, i8 %off.1, i8 %off.2, i8 %high) {
652a4635ec7SFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_8_all_pos(
653a4635ec7SFlorian Hahn; CHECK-NEXT:  entry:
654a4635ec7SFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
655a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
656a4635ec7SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], [[OFF_2:%.*]]
657a4635ec7SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
658a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
659a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0
660a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_POS]])
661a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0
662a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_2_POS]])
663a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_1_ULT:%.*]] = icmp ult i8 [[OFF_1]], [[OFF_2]]
664a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_ULT]])
665a4635ec7SFlorian Hahn; CHECK-NEXT:    [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]]
666a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 true
667a4635ec7SFlorian Hahn;
668a4635ec7SFlorian Hahnentry:
669a4635ec7SFlorian Hahn  %start.pos = icmp sge i8 %start, 0
670a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %start.pos)
671a4635ec7SFlorian Hahn  %add = add nsw i8 %start, %off.2
672a4635ec7SFlorian Hahn  %c.1 = icmp ult i8 %add, %high
673a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %c.1)
674a4635ec7SFlorian Hahn  %off.1.pos = icmp sge i8 %off.1, 0
675a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.1.pos)
676a4635ec7SFlorian Hahn  %off.2.pos = icmp sge i8 %off.2, 0
677a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.2.pos)
678a4635ec7SFlorian Hahn  %off.1.ult = icmp ult i8 %off.1, %off.2
679a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.1.ult)
680a4635ec7SFlorian Hahn
681a4635ec7SFlorian Hahn  %add.off.2 = add nsw i8 %start, %off.1
682a4635ec7SFlorian Hahn  %c = icmp ult i8 %add.off.2, %high
683a4635ec7SFlorian Hahn  ret i1 %c
684a4635ec7SFlorian Hahn}
685a4635ec7SFlorian Hahn
686a4635ec7SFlorian Hahndefine i1 @test_ult_add_no_nsw_var_8_all_pos(i8 %start, i8 %off.1, i8 %off.2, i8 %high) {
687a4635ec7SFlorian Hahn; CHECK-LABEL: @test_ult_add_no_nsw_var_8_all_pos(
688a4635ec7SFlorian Hahn; CHECK-NEXT:  entry:
689a4635ec7SFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
690a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
691a4635ec7SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[START]], [[OFF_2:%.*]]
692a4635ec7SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
693a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
694a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0
695a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_POS]])
696a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0
697a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_2_POS]])
698a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_1_ULT:%.*]] = icmp ult i8 [[OFF_1]], [[OFF_2]]
699a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_ULT]])
700a4635ec7SFlorian Hahn; CHECK-NEXT:    [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]]
701a4635ec7SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[ADD_OFF_2]], [[HIGH]]
702a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
703a4635ec7SFlorian Hahn;
704a4635ec7SFlorian Hahnentry:
705a4635ec7SFlorian Hahn  %start.pos = icmp sge i8 %start, 0
706a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %start.pos)
707a4635ec7SFlorian Hahn  %add = add i8 %start, %off.2
708a4635ec7SFlorian Hahn  %c.1 = icmp ult i8 %add, %high
709a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %c.1)
710a4635ec7SFlorian Hahn  %off.1.pos = icmp sge i8 %off.1, 0
711a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.1.pos)
712a4635ec7SFlorian Hahn  %off.2.pos = icmp sge i8 %off.2, 0
713a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.2.pos)
714a4635ec7SFlorian Hahn  %off.1.ult = icmp ult i8 %off.1, %off.2
715a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.1.ult)
716a4635ec7SFlorian Hahn
717a4635ec7SFlorian Hahn  %add.off.2 = add nsw i8 %start, %off.1
718a4635ec7SFlorian Hahn  %c = icmp ult i8 %add.off.2, %high
719a4635ec7SFlorian Hahn  ret i1 %c
720a4635ec7SFlorian Hahn}
721a4635ec7SFlorian Hahn
722a4635ec7SFlorian Hahndefine i1 @test_ult_add_nsw_var_9_all_pos(i8 %start, i8 %off.1, i8 %off.2, i8 %high) {
723a4635ec7SFlorian Hahn; CHECK-LABEL: @test_ult_add_nsw_var_9_all_pos(
724a4635ec7SFlorian Hahn; CHECK-NEXT:  entry:
725a4635ec7SFlorian Hahn; CHECK-NEXT:    [[START_POS:%.*]] = icmp sge i8 [[START:%.*]], 0
726a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[START_POS]])
727a4635ec7SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[START]], [[OFF_2:%.*]]
728a4635ec7SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[ADD]], [[HIGH:%.*]]
729a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])
730a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_1_POS:%.*]] = icmp sge i8 [[OFF_1:%.*]], 0
731a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_1_POS]])
732a4635ec7SFlorian Hahn; CHECK-NEXT:    [[OFF_2_POS:%.*]] = icmp sge i8 [[OFF_2]], 0
733a4635ec7SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[OFF_2_POS]])
734a4635ec7SFlorian Hahn; CHECK-NEXT:    [[ADD_OFF_2:%.*]] = add nsw i8 [[START]], [[OFF_1]]
735a4635ec7SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 [[ADD_OFF_2]], [[HIGH]]
736a4635ec7SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
737a4635ec7SFlorian Hahn;
738a4635ec7SFlorian Hahnentry:
739a4635ec7SFlorian Hahn  %start.pos = icmp sge i8 %start, 0
740a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %start.pos)
741a4635ec7SFlorian Hahn  %add = add nsw i8 %start, %off.2
742a4635ec7SFlorian Hahn  %c.1 = icmp ult i8 %add, %high
743a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %c.1)
744a4635ec7SFlorian Hahn  %off.1.pos = icmp sge i8 %off.1, 0
745a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.1.pos)
746a4635ec7SFlorian Hahn  %off.2.pos = icmp sge i8 %off.2, 0
747a4635ec7SFlorian Hahn  call void @llvm.assume(i1 %off.2.pos)
748a4635ec7SFlorian Hahn
749a4635ec7SFlorian Hahn  %add.off.2 = add nsw i8 %start, %off.1
750a4635ec7SFlorian Hahn  %c = icmp ult i8 %add.off.2, %high
751a4635ec7SFlorian Hahn  ret i1 %c
752a4635ec7SFlorian Hahn}
753b0fb7161SFlorian Hahn
754b0fb7161SFlorian Hahndefine i1 @add_neg_1_known_sge_ult_1(i32 %a) {
755b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_known_sge_ult_1(
756b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
757b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 1
758b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
759b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -1
760b0fb7161SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[SUB]], [[A]]
761b0fb7161SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
762b0fb7161SFlorian Hahn;
763b0fb7161SFlorian Hahnentry:
764b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 1
765b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
766b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -1
767b0fb7161SFlorian Hahn  %c = icmp ult i32 %sub, %a
768b0fb7161SFlorian Hahn  ret i1 %c
769b0fb7161SFlorian Hahn}
770b0fb7161SFlorian Hahn
771b0fb7161SFlorian Hahndefine i1 @add_neg_1_known_sge_uge_1(i32 %a) {
772b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_known_sge_uge_1(
773b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
774b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 1
775b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
776b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -1
777*98e016d9SFlorian Hahn; CHECK-NEXT:    ret i1 true
778b0fb7161SFlorian Hahn;
779b0fb7161SFlorian Hahnentry:
780b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 1
781b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
782b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -1
783b0fb7161SFlorian Hahn  %c = icmp uge i32 %sub, 0
784b0fb7161SFlorian Hahn  ret i1 %c
785b0fb7161SFlorian Hahn}
786b0fb7161SFlorian Hahn
787b0fb7161SFlorian Hahndefine i1 @add_neg_1_not_known_sge_ult_1(i32 %a) {
788b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_not_known_sge_ult_1(
789b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
790b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 0
791b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
792b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -1
793b0fb7161SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[SUB]], [[A]]
794b0fb7161SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
795b0fb7161SFlorian Hahn;
796b0fb7161SFlorian Hahnentry:
797b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 0
798b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
799b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -1
800b0fb7161SFlorian Hahn  %c = icmp ult i32 %sub, %a
801b0fb7161SFlorian Hahn  ret i1 %c
802b0fb7161SFlorian Hahn}
803b0fb7161SFlorian Hahn
804b0fb7161SFlorian Hahndefine i1 @add_neg_1_not_known_sge_uge_1(i32 %a) {
805b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_1_not_known_sge_uge_1(
806b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
807b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 0
808b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
809b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -1
810*98e016d9SFlorian Hahn; CHECK-NEXT:    ret i1 true
811b0fb7161SFlorian Hahn;
812b0fb7161SFlorian Hahnentry:
813b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 0
814b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
815b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -1
816b0fb7161SFlorian Hahn  %c = icmp uge i32 %sub, 0
817b0fb7161SFlorian Hahn  ret i1 %c
818b0fb7161SFlorian Hahn}
819b0fb7161SFlorian Hahn
820b0fb7161SFlorian Hahndefine i1 @add_neg_3_known_sge_ult_1(i32 %a) {
821b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_known_sge_ult_1(
822b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
823b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 3
824b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
825b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -3
826b0fb7161SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[SUB]], [[A]]
827b0fb7161SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
828b0fb7161SFlorian Hahn;
829b0fb7161SFlorian Hahnentry:
830b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 3
831b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
832b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -3
833b0fb7161SFlorian Hahn  %c = icmp ult i32 %sub, %a
834b0fb7161SFlorian Hahn  ret i1 %c
835b0fb7161SFlorian Hahn}
836b0fb7161SFlorian Hahn
837b0fb7161SFlorian Hahndefine i1 @add_neg_3_known_sge_uge_1(i32 %a) {
838b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_known_sge_uge_1(
839b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
840b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 4
841b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
842b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -3
843*98e016d9SFlorian Hahn; CHECK-NEXT:    ret i1 true
844b0fb7161SFlorian Hahn;
845b0fb7161SFlorian Hahnentry:
846b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 4
847b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
848b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -3
849b0fb7161SFlorian Hahn  %c = icmp uge i32 %sub, 0
850b0fb7161SFlorian Hahn  ret i1 %c
851b0fb7161SFlorian Hahn}
852b0fb7161SFlorian Hahn
853b0fb7161SFlorian Hahndefine i1 @add_neg_3_not_known_sge_ult_1(i32 %a) {
854b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_not_known_sge_ult_1(
855b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
856b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 2
857b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
858b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -3
859b0fb7161SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[SUB]], [[A]]
860b0fb7161SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
861b0fb7161SFlorian Hahn;
862b0fb7161SFlorian Hahnentry:
863b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 2
864b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
865b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -3
866b0fb7161SFlorian Hahn  %c = icmp ult i32 %sub, %a
867b0fb7161SFlorian Hahn  ret i1 %c
868b0fb7161SFlorian Hahn}
869b0fb7161SFlorian Hahn
870b0fb7161SFlorian Hahndefine i1 @add_neg_3_not_known_sge_uge_1(i32 %a) {
871b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_not_known_sge_uge_1(
872b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
873b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], 2
874b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
875b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -3
876*98e016d9SFlorian Hahn; CHECK-NEXT:    ret i1 true
877b0fb7161SFlorian Hahn;
878b0fb7161SFlorian Hahnentry:
879b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, 2
880b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
881b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -3
882b0fb7161SFlorian Hahn  %c = icmp uge i32 %sub, 0
883b0fb7161SFlorian Hahn  ret i1 %c
884b0fb7161SFlorian Hahn}
885b0fb7161SFlorian Hahn
886b0fb7161SFlorian Hahndefine i1 @add_neg_3_not_known_sge_ult_2(i32 %a, i32 %b) {
887b0fb7161SFlorian Hahn; CHECK-LABEL: @add_neg_3_not_known_sge_ult_2(
888b0fb7161SFlorian Hahn; CHECK-NEXT:  entry:
889b0fb7161SFlorian Hahn; CHECK-NEXT:    [[A_SGE:%.*]] = icmp sge i32 [[A:%.*]], [[B:%.*]]
890b0fb7161SFlorian Hahn; CHECK-NEXT:    call void @llvm.assume(i1 [[A_SGE]])
891b0fb7161SFlorian Hahn; CHECK-NEXT:    [[SUB:%.*]] = add nsw i32 [[A]], -3
892b0fb7161SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[SUB]], [[A]]
893b0fb7161SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
894b0fb7161SFlorian Hahn;
895b0fb7161SFlorian Hahnentry:
896b0fb7161SFlorian Hahn  %a.sge = icmp sge i32 %a, %b
897b0fb7161SFlorian Hahn  call void @llvm.assume(i1 %a.sge)
898b0fb7161SFlorian Hahn  %sub = add nsw i32 %a, -3
899b0fb7161SFlorian Hahn  %c = icmp ult i32 %sub, %a
900b0fb7161SFlorian Hahn  ret i1 %c
901b0fb7161SFlorian Hahn}
902