xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/geps-signed-predicates.ll (revision c5e1ddb6fddef6f0d0ffc9acc9b0a2f3534b303f)
149d6e3ebSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
249d6e3ebSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
349d6e3ebSFlorian Hahn
4*c5e1ddb6SFlorian Hahndefine i32 @test.slt(ptr readonly %src, ptr readnone %min, ptr readnone %max) {
549d6e3ebSFlorian Hahn; CHECK-LABEL: @test.slt(
649d6e3ebSFlorian Hahn; CHECK-NEXT:  check.0.min:
7*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MIN_0:%.*]] = icmp slt ptr [[SRC:%.*]], [[MIN:%.*]]
849d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_MIN_0]], label [[TRAP:%.*]], label [[CHECK_0_MAX:%.*]]
949d6e3ebSFlorian Hahn; CHECK:       trap:
1049d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i32 10
1149d6e3ebSFlorian Hahn; CHECK:       check.0.max:
12*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_0:%.*]] = icmp slt ptr [[SRC]], [[MAX:%.*]]
1349d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_MAX_0]], label [[CHECK_3_MIN:%.*]], label [[TRAP]]
1449d6e3ebSFlorian Hahn; CHECK:       check.3.min:
15*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L0:%.*]] = load i32, ptr [[SRC]], align 4
16*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I36:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3
17*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_3_MIN:%.*]] = icmp slt ptr [[ADD_PTR_I36]], [[MIN]]
1849d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_3_MIN]], label [[TRAP]], label [[CHECK_3_MAX:%.*]]
1949d6e3ebSFlorian Hahn; CHECK:       check.3.max:
20*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp slt ptr [[ADD_PTR_I36]], [[MAX]]
2149d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_3_MAX]], label [[CHECK_1_MIN:%.*]], label [[TRAP]]
2249d6e3ebSFlorian Hahn; CHECK:       check.1.min:
23*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L1:%.*]] = load i32, ptr [[ADD_PTR_I36]], align 4
24*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I29:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1
25*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1_MIN:%.*]] = icmp slt ptr [[ADD_PTR_I29]], [[MIN]]
2649d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1_MIN]], label [[TRAP]], label [[CHECK_1_MAX:%.*]]
2749d6e3ebSFlorian Hahn; CHECK:       check.1.max:
28*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1_MAX:%.*]] = icmp slt ptr [[ADD_PTR_I29]], [[MAX]]
2949d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1_MAX]], label [[CHECK_2_MIN:%.*]], label [[TRAP]]
3049d6e3ebSFlorian Hahn; CHECK:       check.2.min:
31*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L2:%.*]] = load i32, ptr [[ADD_PTR_I29]], align 4
32*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2
33*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_2_MIN:%.*]] = icmp slt ptr [[ADD_PTR_I]], [[MIN]]
3449d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2_MIN]], label [[TRAP]], label [[CHECK_2_MAX:%.*]]
3549d6e3ebSFlorian Hahn; CHECK:       check.2.max:
36*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_2_MAX:%.*]] = icmp slt ptr [[ADD_PTR_I]], [[MAX]]
3749d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2_MAX]], label [[EXIT:%.*]], label [[TRAP]]
3849d6e3ebSFlorian Hahn; CHECK:       exit:
39*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L3:%.*]] = load i32, ptr [[ADD_PTR_I]], align 4
4049d6e3ebSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[L1]], [[L0]]
4149d6e3ebSFlorian Hahn; CHECK-NEXT:    [[ADD8:%.*]] = add nsw i32 [[ADD]], [[L2]]
4249d6e3ebSFlorian Hahn; CHECK-NEXT:    [[ADD9:%.*]] = add nsw i32 [[ADD8]], [[L3]]
4349d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[ADD9]]
4449d6e3ebSFlorian Hahn;
4549d6e3ebSFlorian Hahncheck.0.min:
46*c5e1ddb6SFlorian Hahn  %c.min.0 = icmp slt ptr %src, %min
4749d6e3ebSFlorian Hahn  br i1 %c.min.0, label %trap, label %check.0.max
4849d6e3ebSFlorian Hahn
49*c5e1ddb6SFlorian Hahntrap:
5049d6e3ebSFlorian Hahn  ret i32 10
5149d6e3ebSFlorian Hahn
52*c5e1ddb6SFlorian Hahncheck.0.max:
53*c5e1ddb6SFlorian Hahn  %c.max.0 = icmp slt ptr %src, %max
5449d6e3ebSFlorian Hahn  br i1 %c.max.0, label %check.3.min, label %trap
5549d6e3ebSFlorian Hahn
56*c5e1ddb6SFlorian Hahncheck.3.min:
57*c5e1ddb6SFlorian Hahn  %l0 = load i32, ptr %src, align 4
58*c5e1ddb6SFlorian Hahn  %add.ptr.i36 = getelementptr inbounds i32, ptr %src, i64 3
59*c5e1ddb6SFlorian Hahn  %c.3.min = icmp slt ptr %add.ptr.i36, %min
6049d6e3ebSFlorian Hahn  br i1 %c.3.min, label %trap, label %check.3.max
6149d6e3ebSFlorian Hahn
62*c5e1ddb6SFlorian Hahncheck.3.max:
63*c5e1ddb6SFlorian Hahn  %c.3.max = icmp slt ptr %add.ptr.i36, %max
6449d6e3ebSFlorian Hahn  br i1 %c.3.max, label %check.1.min, label %trap
6549d6e3ebSFlorian Hahn
66*c5e1ddb6SFlorian Hahncheck.1.min:
67*c5e1ddb6SFlorian Hahn  %l1 = load i32, ptr %add.ptr.i36, align 4
68*c5e1ddb6SFlorian Hahn  %add.ptr.i29 = getelementptr inbounds i32, ptr %src, i64 1
69*c5e1ddb6SFlorian Hahn  %c.1.min = icmp slt ptr %add.ptr.i29, %min
7049d6e3ebSFlorian Hahn  br i1 %c.1.min, label %trap, label %check.1.max
7149d6e3ebSFlorian Hahn
72*c5e1ddb6SFlorian Hahncheck.1.max:
73*c5e1ddb6SFlorian Hahn  %c.1.max = icmp slt ptr %add.ptr.i29, %max
7449d6e3ebSFlorian Hahn  br i1 %c.1.max, label %check.2.min, label %trap
7549d6e3ebSFlorian Hahn
76*c5e1ddb6SFlorian Hahncheck.2.min:
77*c5e1ddb6SFlorian Hahn  %l2 = load i32, ptr %add.ptr.i29, align 4
78*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr inbounds i32, ptr %src, i64 2
79*c5e1ddb6SFlorian Hahn  %c.2.min = icmp slt ptr %add.ptr.i, %min
8049d6e3ebSFlorian Hahn  br i1 %c.2.min, label %trap, label %check.2.max
8149d6e3ebSFlorian Hahn
82*c5e1ddb6SFlorian Hahncheck.2.max:
83*c5e1ddb6SFlorian Hahn  %c.2.max = icmp slt ptr %add.ptr.i, %max
8449d6e3ebSFlorian Hahn  br i1 %c.2.max, label %exit, label %trap
8549d6e3ebSFlorian Hahn
86*c5e1ddb6SFlorian Hahnexit:
87*c5e1ddb6SFlorian Hahn  %l3 = load i32, ptr %add.ptr.i, align 4
8849d6e3ebSFlorian Hahn  %add = add nsw i32 %l1, %l0
8949d6e3ebSFlorian Hahn  %add8 = add nsw i32 %add, %l2
9049d6e3ebSFlorian Hahn  %add9 = add nsw i32 %add8, %l3
9149d6e3ebSFlorian Hahn  ret i32 %add9
9249d6e3ebSFlorian Hahn}
9349d6e3ebSFlorian Hahn
9449d6e3ebSFlorian Hahn; Same as test.slt, but without inbounds.
95*c5e1ddb6SFlorian Hahndefine i32 @test.slt_no_inbounds(ptr readonly %src, ptr readnone %min, ptr readnone %max) {
9649d6e3ebSFlorian Hahn; CHECK-LABEL: @test.slt_no_inbounds(
9749d6e3ebSFlorian Hahn; CHECK-NEXT:  check.0.min:
98*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MIN_0:%.*]] = icmp slt ptr [[SRC:%.*]], [[MIN:%.*]]
9949d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_MIN_0]], label [[TRAP:%.*]], label [[CHECK_0_MAX:%.*]]
10049d6e3ebSFlorian Hahn; CHECK:       trap:
10149d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i32 10
10249d6e3ebSFlorian Hahn; CHECK:       check.0.max:
103*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_0:%.*]] = icmp slt ptr [[SRC]], [[MAX:%.*]]
10449d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_MAX_0]], label [[CHECK_3_MIN:%.*]], label [[TRAP]]
10549d6e3ebSFlorian Hahn; CHECK:       check.3.min:
106*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L0:%.*]] = load i32, ptr [[SRC]], align 4
107*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I36:%.*]] = getelementptr i32, ptr [[SRC]], i64 3
108*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_3_MIN:%.*]] = icmp slt ptr [[ADD_PTR_I36]], [[MIN]]
10949d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_3_MIN]], label [[TRAP]], label [[CHECK_3_MAX:%.*]]
11049d6e3ebSFlorian Hahn; CHECK:       check.3.max:
111*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp slt ptr [[ADD_PTR_I36]], [[MAX]]
11249d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_3_MAX]], label [[CHECK_1_MIN:%.*]], label [[TRAP]]
11349d6e3ebSFlorian Hahn; CHECK:       check.1.min:
114*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L1:%.*]] = load i32, ptr [[ADD_PTR_I36]], align 4
115*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I29:%.*]] = getelementptr i32, ptr [[SRC]], i64 1
116*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1_MIN:%.*]] = icmp slt ptr [[ADD_PTR_I29]], [[MIN]]
11749d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1_MIN]], label [[TRAP]], label [[CHECK_1_MAX:%.*]]
11849d6e3ebSFlorian Hahn; CHECK:       check.1.max:
119*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1_MAX:%.*]] = icmp slt ptr [[ADD_PTR_I29]], [[MAX]]
12049d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1_MAX]], label [[CHECK_2_MIN:%.*]], label [[TRAP]]
12149d6e3ebSFlorian Hahn; CHECK:       check.2.min:
122*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L2:%.*]] = load i32, ptr [[ADD_PTR_I29]], align 4
123*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr i32, ptr [[SRC]], i64 2
124*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_2_MIN:%.*]] = icmp slt ptr [[ADD_PTR_I]], [[MIN]]
12549d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2_MIN]], label [[TRAP]], label [[CHECK_2_MAX:%.*]]
12649d6e3ebSFlorian Hahn; CHECK:       check.2.max:
127*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_2_MAX:%.*]] = icmp slt ptr [[ADD_PTR_I]], [[MAX]]
12849d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2_MAX]], label [[EXIT:%.*]], label [[TRAP]]
12949d6e3ebSFlorian Hahn; CHECK:       exit:
130*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[L3:%.*]] = load i32, ptr [[ADD_PTR_I]], align 4
13149d6e3ebSFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[L1]], [[L0]]
13249d6e3ebSFlorian Hahn; CHECK-NEXT:    [[ADD8:%.*]] = add nsw i32 [[ADD]], [[L2]]
13349d6e3ebSFlorian Hahn; CHECK-NEXT:    [[ADD9:%.*]] = add nsw i32 [[ADD8]], [[L3]]
13449d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[ADD9]]
13549d6e3ebSFlorian Hahn;
13649d6e3ebSFlorian Hahncheck.0.min:
137*c5e1ddb6SFlorian Hahn  %c.min.0 = icmp slt ptr %src, %min
13849d6e3ebSFlorian Hahn  br i1 %c.min.0, label %trap, label %check.0.max
13949d6e3ebSFlorian Hahn
140*c5e1ddb6SFlorian Hahntrap:
14149d6e3ebSFlorian Hahn  ret i32 10
14249d6e3ebSFlorian Hahn
143*c5e1ddb6SFlorian Hahncheck.0.max:
144*c5e1ddb6SFlorian Hahn  %c.max.0 = icmp slt ptr %src, %max
14549d6e3ebSFlorian Hahn  br i1 %c.max.0, label %check.3.min, label %trap
14649d6e3ebSFlorian Hahn
147*c5e1ddb6SFlorian Hahncheck.3.min:
148*c5e1ddb6SFlorian Hahn  %l0 = load i32, ptr %src, align 4
149*c5e1ddb6SFlorian Hahn  %add.ptr.i36 = getelementptr i32, ptr %src, i64 3
150*c5e1ddb6SFlorian Hahn  %c.3.min = icmp slt ptr %add.ptr.i36, %min
15149d6e3ebSFlorian Hahn  br i1 %c.3.min, label %trap, label %check.3.max
15249d6e3ebSFlorian Hahn
153*c5e1ddb6SFlorian Hahncheck.3.max:
154*c5e1ddb6SFlorian Hahn  %c.3.max = icmp slt ptr %add.ptr.i36, %max
15549d6e3ebSFlorian Hahn  br i1 %c.3.max, label %check.1.min, label %trap
15649d6e3ebSFlorian Hahn
157*c5e1ddb6SFlorian Hahncheck.1.min:
158*c5e1ddb6SFlorian Hahn  %l1 = load i32, ptr %add.ptr.i36, align 4
159*c5e1ddb6SFlorian Hahn  %add.ptr.i29 = getelementptr i32, ptr %src, i64 1
160*c5e1ddb6SFlorian Hahn  %c.1.min = icmp slt ptr %add.ptr.i29, %min
16149d6e3ebSFlorian Hahn  br i1 %c.1.min, label %trap, label %check.1.max
16249d6e3ebSFlorian Hahn
163*c5e1ddb6SFlorian Hahncheck.1.max:
164*c5e1ddb6SFlorian Hahn  %c.1.max = icmp slt ptr %add.ptr.i29, %max
16549d6e3ebSFlorian Hahn  br i1 %c.1.max, label %check.2.min, label %trap
16649d6e3ebSFlorian Hahn
167*c5e1ddb6SFlorian Hahncheck.2.min:
168*c5e1ddb6SFlorian Hahn  %l2 = load i32, ptr %add.ptr.i29, align 4
169*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr i32, ptr %src, i64 2
170*c5e1ddb6SFlorian Hahn  %c.2.min = icmp slt ptr %add.ptr.i, %min
17149d6e3ebSFlorian Hahn  br i1 %c.2.min, label %trap, label %check.2.max
17249d6e3ebSFlorian Hahn
173*c5e1ddb6SFlorian Hahncheck.2.max:
174*c5e1ddb6SFlorian Hahn  %c.2.max = icmp slt ptr %add.ptr.i, %max
17549d6e3ebSFlorian Hahn  br i1 %c.2.max, label %exit, label %trap
17649d6e3ebSFlorian Hahn
177*c5e1ddb6SFlorian Hahnexit:
178*c5e1ddb6SFlorian Hahn  %l3 = load i32, ptr %add.ptr.i, align 4
17949d6e3ebSFlorian Hahn  %add = add nsw i32 %l1, %l0
18049d6e3ebSFlorian Hahn  %add8 = add nsw i32 %add, %l2
18149d6e3ebSFlorian Hahn  %add9 = add nsw i32 %add8, %l3
18249d6e3ebSFlorian Hahn  ret i32 %add9
18349d6e3ebSFlorian Hahn}
18449d6e3ebSFlorian Hahn
185*c5e1ddb6SFlorian Hahndefine void @test.not.sge.slt(ptr %start, ptr %low, ptr %high) {
18649d6e3ebSFlorian Hahn; CHECK-LABEL: @test.not.sge.slt(
18749d6e3ebSFlorian Hahn; CHECK-NEXT:  entry:
188*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i64 3
189*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
19049d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
19149d6e3ebSFlorian Hahn; CHECK:       if.then:
19249d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
19349d6e3ebSFlorian Hahn; CHECK:       if.end:
194*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp slt ptr [[START]], [[HIGH]]
19549d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
196*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 1
197*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp slt ptr [[START_1]], [[HIGH]]
19849d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
199*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 2
200*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp slt ptr [[START_2]], [[HIGH]]
20149d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
202*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 3
203*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp slt ptr [[START_3]], [[HIGH]]
20449d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
205*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 4
206*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt ptr [[START_4]], [[HIGH]]
20749d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
20849d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
20949d6e3ebSFlorian Hahn;
21049d6e3ebSFlorian Hahnentry:
211*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr inbounds i8, ptr %start, i64 3
212*c5e1ddb6SFlorian Hahn  %c.1 = icmp sge ptr %add.ptr.i, %high
21349d6e3ebSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
21449d6e3ebSFlorian Hahn
215*c5e1ddb6SFlorian Hahnif.then:
21649d6e3ebSFlorian Hahn  ret void
21749d6e3ebSFlorian Hahn
218*c5e1ddb6SFlorian Hahnif.end:
219*c5e1ddb6SFlorian Hahn  %t.0 = icmp slt ptr %start, %high
22049d6e3ebSFlorian Hahn  call void @use(i1 %t.0)
221*c5e1ddb6SFlorian Hahn  %start.1 = getelementptr inbounds i8, ptr %start, i64 1
222*c5e1ddb6SFlorian Hahn  %t.1 = icmp slt ptr %start.1, %high
22349d6e3ebSFlorian Hahn  call void @use(i1 %t.1)
224*c5e1ddb6SFlorian Hahn  %start.2 = getelementptr inbounds i8, ptr %start, i64 2
225*c5e1ddb6SFlorian Hahn  %t.2 = icmp slt ptr %start.2, %high
22649d6e3ebSFlorian Hahn  call void @use(i1 %t.2)
227*c5e1ddb6SFlorian Hahn  %start.3 = getelementptr inbounds i8, ptr %start, i64 3
228*c5e1ddb6SFlorian Hahn  %t.3 = icmp slt ptr %start.3, %high
22949d6e3ebSFlorian Hahn  call void @use(i1 %t.3)
230*c5e1ddb6SFlorian Hahn  %start.4 = getelementptr inbounds i8, ptr %start, i64 4
231*c5e1ddb6SFlorian Hahn  %c.4 = icmp slt ptr %start.4, %high
23249d6e3ebSFlorian Hahn  call void @use(i1 %c.4)
23349d6e3ebSFlorian Hahn  ret void
23449d6e3ebSFlorian Hahn}
23549d6e3ebSFlorian Hahn
23649d6e3ebSFlorian Hahn; Same as test.not.sge.slt, but without inbounds GEPs.
237*c5e1ddb6SFlorian Hahndefine void @test.not.sge.slt_no_inbounds(ptr %start, ptr %low, ptr %high) {
23849d6e3ebSFlorian Hahn; CHECK-LABEL: @test.not.sge.slt_no_inbounds(
23949d6e3ebSFlorian Hahn; CHECK-NEXT:  entry:
240*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr i8, ptr [[START:%.*]], i64 3
241*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
24249d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
24349d6e3ebSFlorian Hahn; CHECK:       if.then:
24449d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
24549d6e3ebSFlorian Hahn; CHECK:       if.end:
246*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp slt ptr [[START]], [[HIGH]]
24749d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
248*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = getelementptr i8, ptr [[START]], i64 1
249*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp slt ptr [[START_1]], [[HIGH]]
25049d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
251*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = getelementptr i8, ptr [[START]], i64 2
252*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp slt ptr [[START_2]], [[HIGH]]
25349d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
254*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = getelementptr i8, ptr [[START]], i64 3
255*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp slt ptr [[START_3]], [[HIGH]]
25649d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
257*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = getelementptr i8, ptr [[START]], i64 4
258*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp slt ptr [[START_4]], [[HIGH]]
25949d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
26049d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
26149d6e3ebSFlorian Hahn;
26249d6e3ebSFlorian Hahnentry:
263*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr i8, ptr %start, i64 3
264*c5e1ddb6SFlorian Hahn  %c.1 = icmp sge ptr %add.ptr.i, %high
26549d6e3ebSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
26649d6e3ebSFlorian Hahn
267*c5e1ddb6SFlorian Hahnif.then:
26849d6e3ebSFlorian Hahn  ret void
26949d6e3ebSFlorian Hahn
270*c5e1ddb6SFlorian Hahnif.end:
271*c5e1ddb6SFlorian Hahn  %t.0 = icmp slt ptr %start, %high
27249d6e3ebSFlorian Hahn  call void @use(i1 %t.0)
273*c5e1ddb6SFlorian Hahn  %start.1 = getelementptr i8, ptr %start, i64 1
274*c5e1ddb6SFlorian Hahn  %t.1 = icmp slt ptr %start.1, %high
27549d6e3ebSFlorian Hahn  call void @use(i1 %t.1)
276*c5e1ddb6SFlorian Hahn  %start.2 = getelementptr i8, ptr %start, i64 2
277*c5e1ddb6SFlorian Hahn  %t.2 = icmp slt ptr %start.2, %high
27849d6e3ebSFlorian Hahn  call void @use(i1 %t.2)
279*c5e1ddb6SFlorian Hahn  %start.3 = getelementptr i8, ptr %start, i64 3
280*c5e1ddb6SFlorian Hahn  %t.3 = icmp slt ptr %start.3, %high
28149d6e3ebSFlorian Hahn  call void @use(i1 %t.3)
282*c5e1ddb6SFlorian Hahn  %start.4 = getelementptr i8, ptr %start, i64 4
283*c5e1ddb6SFlorian Hahn  %c.4 = icmp slt ptr %start.4, %high
28449d6e3ebSFlorian Hahn  call void @use(i1 %c.4)
28549d6e3ebSFlorian Hahn  ret void
28649d6e3ebSFlorian Hahn}
28749d6e3ebSFlorian Hahn
288*c5e1ddb6SFlorian Hahndefine void @test.not.sge.sle(ptr %start, ptr %low, ptr %high) {
28949d6e3ebSFlorian Hahn; CHECK-LABEL: @test.not.sge.sle(
29049d6e3ebSFlorian Hahn; CHECK-NEXT:  entry:
291*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i64 3
292*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
29349d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
29449d6e3ebSFlorian Hahn; CHECK:       if.then:
29549d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
29649d6e3ebSFlorian Hahn; CHECK:       if.end:
297*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp sle ptr [[START]], [[HIGH]]
29849d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
299*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 1
300*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp sle ptr [[START_1]], [[HIGH]]
30149d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
302*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 2
303*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp sle ptr [[START_2]], [[HIGH]]
30449d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
305*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 3
306*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp sle ptr [[START_3]], [[HIGH]]
30749d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
308*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 4
309*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp sle ptr [[START_4]], [[HIGH]]
31049d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_4]])
311*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 5
312*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sle ptr [[START_5]], [[HIGH]]
31349d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
31449d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
31549d6e3ebSFlorian Hahn;
31649d6e3ebSFlorian Hahnentry:
317*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr inbounds i8, ptr %start, i64 3
318*c5e1ddb6SFlorian Hahn  %c.1 = icmp sge ptr %add.ptr.i, %high
31949d6e3ebSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
32049d6e3ebSFlorian Hahn
321*c5e1ddb6SFlorian Hahnif.then:
32249d6e3ebSFlorian Hahn  ret void
32349d6e3ebSFlorian Hahn
324*c5e1ddb6SFlorian Hahnif.end:
325*c5e1ddb6SFlorian Hahn  %t.0 = icmp sle ptr %start, %high
32649d6e3ebSFlorian Hahn  call void @use(i1 %t.0)
327*c5e1ddb6SFlorian Hahn  %start.1 = getelementptr inbounds i8, ptr %start, i64 1
328*c5e1ddb6SFlorian Hahn  %t.1 = icmp sle ptr %start.1, %high
32949d6e3ebSFlorian Hahn  call void @use(i1 %t.1)
330*c5e1ddb6SFlorian Hahn  %start.2 = getelementptr inbounds i8, ptr %start, i64 2
331*c5e1ddb6SFlorian Hahn  %t.2 = icmp sle ptr %start.2, %high
33249d6e3ebSFlorian Hahn  call void @use(i1 %t.2)
333*c5e1ddb6SFlorian Hahn  %start.3 = getelementptr inbounds i8, ptr %start, i64 3
334*c5e1ddb6SFlorian Hahn  %t.3 = icmp sle ptr %start.3, %high
33549d6e3ebSFlorian Hahn  call void @use(i1 %t.3)
336*c5e1ddb6SFlorian Hahn  %start.4 = getelementptr inbounds i8, ptr %start, i64 4
337*c5e1ddb6SFlorian Hahn  %t.4 = icmp sle ptr %start.4, %high
33849d6e3ebSFlorian Hahn  call void @use(i1 %t.4)
339*c5e1ddb6SFlorian Hahn  %start.5 = getelementptr inbounds i8, ptr %start, i64 5
340*c5e1ddb6SFlorian Hahn  %c.5 = icmp sle ptr %start.5, %high
34149d6e3ebSFlorian Hahn  call void @use(i1 %c.5)
34249d6e3ebSFlorian Hahn  ret void
34349d6e3ebSFlorian Hahn}
34449d6e3ebSFlorian Hahn
345*c5e1ddb6SFlorian Hahndefine void @test.not.sge.sgt(ptr %start, ptr %low, ptr %high) {
34649d6e3ebSFlorian Hahn; CHECK-LABEL: @test.not.sge.sgt(
34749d6e3ebSFlorian Hahn; CHECK-NEXT:  entry:
348*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i64 3
349*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
35049d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
35149d6e3ebSFlorian Hahn; CHECK:       if.then:
35249d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
35349d6e3ebSFlorian Hahn; CHECK:       if.end:
354*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp sgt ptr [[START]], [[HIGH]]
35549d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_0]])
356*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 1
357*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp sgt ptr [[START_1]], [[HIGH]]
35849d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_1]])
359*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 2
360*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp sgt ptr [[START_2]], [[HIGH]]
36149d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_2]])
362*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 3
363*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp sgt ptr [[START_3]], [[HIGH]]
36449d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_3]])
365*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 4
366*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_4:%.*]] = icmp sgt ptr [[START_4]], [[HIGH]]
36749d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_4]])
368*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 5
369*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sgt ptr [[START_5]], [[HIGH]]
37049d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
37149d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
37249d6e3ebSFlorian Hahn;
37349d6e3ebSFlorian Hahnentry:
374*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr inbounds i8, ptr %start, i64 3
375*c5e1ddb6SFlorian Hahn  %c.1 = icmp sge ptr %add.ptr.i, %high
37649d6e3ebSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
37749d6e3ebSFlorian Hahn
378*c5e1ddb6SFlorian Hahnif.then:
37949d6e3ebSFlorian Hahn  ret void
38049d6e3ebSFlorian Hahn
381*c5e1ddb6SFlorian Hahnif.end:
382*c5e1ddb6SFlorian Hahn  %f.0 = icmp sgt ptr %start, %high
38349d6e3ebSFlorian Hahn  call void @use(i1 %f.0)
384*c5e1ddb6SFlorian Hahn  %start.1 = getelementptr inbounds i8, ptr %start, i64 1
385*c5e1ddb6SFlorian Hahn  %f.1 = icmp sgt ptr %start.1, %high
38649d6e3ebSFlorian Hahn  call void @use(i1 %f.1)
387*c5e1ddb6SFlorian Hahn  %start.2 = getelementptr inbounds i8, ptr %start, i64 2
388*c5e1ddb6SFlorian Hahn  %f.2 = icmp sgt ptr %start.2, %high
38949d6e3ebSFlorian Hahn  call void @use(i1 %f.2)
390*c5e1ddb6SFlorian Hahn  %start.3 = getelementptr inbounds i8, ptr %start, i64 3
391*c5e1ddb6SFlorian Hahn  %f.3 = icmp sgt ptr %start.3, %high
39249d6e3ebSFlorian Hahn  call void @use(i1 %f.3)
393*c5e1ddb6SFlorian Hahn  %start.4 = getelementptr inbounds i8, ptr %start, i64 4
394*c5e1ddb6SFlorian Hahn  %f.4 = icmp sgt ptr %start.4, %high
39549d6e3ebSFlorian Hahn  call void @use(i1 %f.4)
396*c5e1ddb6SFlorian Hahn  %start.5 = getelementptr inbounds i8, ptr %start, i64 5
397*c5e1ddb6SFlorian Hahn  %c.5 = icmp sgt ptr %start.5, %high
39849d6e3ebSFlorian Hahn  call void @use(i1 %c.5)
39949d6e3ebSFlorian Hahn  ret void
40049d6e3ebSFlorian Hahn}
40149d6e3ebSFlorian Hahn
402*c5e1ddb6SFlorian Hahndefine void @test.not.sge.sge(ptr %start, ptr %low, ptr %high) {
40349d6e3ebSFlorian Hahn; CHECK-LABEL: @test.not.sge.sge(
40449d6e3ebSFlorian Hahn; CHECK-NEXT:  entry:
405*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i64 3
406*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
40749d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
40849d6e3ebSFlorian Hahn; CHECK:       if.then:
40949d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
41049d6e3ebSFlorian Hahn; CHECK:       if.end:
411*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp sgt ptr [[START]], [[HIGH]]
41249d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_0]])
413*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 1
414*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp sge ptr [[START_1]], [[HIGH]]
41549d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_1]])
416*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_2:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 2
417*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp sge ptr [[START_2]], [[HIGH]]
41849d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_2]])
419*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_3:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 3
420*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_3:%.*]] = icmp sge ptr [[START_3]], [[HIGH]]
42149d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_3]])
422*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_4:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 4
423*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp sge ptr [[START_4]], [[HIGH]]
42449d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
425*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_5:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 5
426*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp sge ptr [[START_5]], [[HIGH]]
42749d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
42849d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
42949d6e3ebSFlorian Hahn;
43049d6e3ebSFlorian Hahnentry:
431*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr inbounds i8, ptr %start, i64 3
432*c5e1ddb6SFlorian Hahn  %c.1 = icmp sge ptr %add.ptr.i, %high
43349d6e3ebSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
43449d6e3ebSFlorian Hahn
435*c5e1ddb6SFlorian Hahnif.then:
43649d6e3ebSFlorian Hahn  ret void
43749d6e3ebSFlorian Hahn
438*c5e1ddb6SFlorian Hahnif.end:
439*c5e1ddb6SFlorian Hahn  %f.0 = icmp sgt ptr %start, %high
44049d6e3ebSFlorian Hahn  call void @use(i1 %f.0)
441*c5e1ddb6SFlorian Hahn  %start.1 = getelementptr inbounds i8, ptr %start, i64 1
442*c5e1ddb6SFlorian Hahn  %f.1 = icmp sge ptr %start.1, %high
44349d6e3ebSFlorian Hahn  call void @use(i1 %f.1)
444*c5e1ddb6SFlorian Hahn  %start.2 = getelementptr inbounds i8, ptr %start, i64 2
445*c5e1ddb6SFlorian Hahn  %f.2 = icmp sge ptr %start.2, %high
44649d6e3ebSFlorian Hahn  call void @use(i1 %f.2)
447*c5e1ddb6SFlorian Hahn  %start.3 = getelementptr inbounds i8, ptr %start, i64 3
448*c5e1ddb6SFlorian Hahn  %f.3 = icmp sge ptr %start.3, %high
44949d6e3ebSFlorian Hahn  call void @use(i1 %f.3)
450*c5e1ddb6SFlorian Hahn  %start.4 = getelementptr inbounds i8, ptr %start, i64 4
451*c5e1ddb6SFlorian Hahn  %c.4 = icmp sge ptr %start.4, %high
45249d6e3ebSFlorian Hahn  call void @use(i1 %c.4)
453*c5e1ddb6SFlorian Hahn  %start.5 = getelementptr inbounds i8, ptr %start, i64 5
454*c5e1ddb6SFlorian Hahn  %c.5 = icmp sge ptr %start.5, %high
45549d6e3ebSFlorian Hahn  call void @use(i1 %c.5)
45649d6e3ebSFlorian Hahn  ret void
45749d6e3ebSFlorian Hahn}
45849d6e3ebSFlorian Hahn
459*c5e1ddb6SFlorian Hahndefine void @test.not.sge.sge.nonconst(ptr %start, ptr %low, ptr %high, i8 %off) {
46049d6e3ebSFlorian Hahn; CHECK-LABEL: @test.not.sge.sge.nonconst(
46149d6e3ebSFlorian Hahn; CHECK-NEXT:  entry:
462*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i8 [[OFF:%.*]]
463*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sge ptr [[ADD_PTR_I]], [[HIGH:%.*]]
46449d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
46549d6e3ebSFlorian Hahn; CHECK:       if.then:
466*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_OFF_2:%.*]] = getelementptr inbounds i8, ptr [[START]], i8 [[OFF]]
467*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[T_0:%.*]] = icmp sge ptr [[START_OFF_2]], [[HIGH]]
46849d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_0]])
46949d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
47049d6e3ebSFlorian Hahn; CHECK:       if.end:
471*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_1:%.*]] = getelementptr inbounds i8, ptr [[START]], i64 1
472*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp sge ptr [[START_1]], [[HIGH]]
47349d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_0]])
474*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[START_OFF:%.*]] = getelementptr inbounds i8, ptr [[START]], i8 [[OFF]]
475*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[F_0:%.*]] = icmp sge ptr [[START_OFF]], [[HIGH]]
47649d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_0]])
47749d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
47849d6e3ebSFlorian Hahn;
47949d6e3ebSFlorian Hahnentry:
480*c5e1ddb6SFlorian Hahn  %add.ptr.i = getelementptr inbounds i8, ptr %start, i8 %off
481*c5e1ddb6SFlorian Hahn  %c.1 = icmp sge ptr %add.ptr.i, %high
48249d6e3ebSFlorian Hahn  br i1 %c.1, label %if.then, label %if.end
48349d6e3ebSFlorian Hahn
484*c5e1ddb6SFlorian Hahnif.then:
485*c5e1ddb6SFlorian Hahn  %start.off.2 = getelementptr inbounds i8, ptr %start, i8 %off
486*c5e1ddb6SFlorian Hahn  %t.0 = icmp sge ptr %start.off.2, %high
48749d6e3ebSFlorian Hahn  call void @use(i1 %t.0)
48849d6e3ebSFlorian Hahn  ret void
48949d6e3ebSFlorian Hahn
490*c5e1ddb6SFlorian Hahnif.end:
491*c5e1ddb6SFlorian Hahn  %start.1 = getelementptr inbounds i8, ptr %start, i64 1
492*c5e1ddb6SFlorian Hahn  %c.0 = icmp sge ptr %start.1, %high
49349d6e3ebSFlorian Hahn  call void @use(i1 %c.0)
494*c5e1ddb6SFlorian Hahn  %start.off = getelementptr inbounds i8, ptr %start, i8 %off
495*c5e1ddb6SFlorian Hahn  %f.0 = icmp sge ptr %start.off, %high
49649d6e3ebSFlorian Hahn  call void @use(i1 %f.0)
49749d6e3ebSFlorian Hahn  ret void
49849d6e3ebSFlorian Hahn}
49949d6e3ebSFlorian Hahn
50049d6e3ebSFlorian Hahn; Test which requires decomposing GEP %ptr, SHL().
501*c5e1ddb6SFlorian Hahndefine void @test.slt.gep.shl(ptr readonly %src, ptr readnone %max, i8 %idx) {
50249d6e3ebSFlorian Hahn; CHECK-LABEL: @test.slt.gep.shl(
50349d6e3ebSFlorian Hahn; CHECK-NEXT:  check.0.min:
504*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_10:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i32 10
505*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_ADD_10_MAX:%.*]] = icmp sgt ptr [[ADD_10]], [[MAX:%.*]]
50649d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_ADD_10_MAX]], label [[TRAP:%.*]], label [[CHECK_IDX:%.*]]
50749d6e3ebSFlorian Hahn; CHECK:       trap:
50849d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
50949d6e3ebSFlorian Hahn; CHECK:       check.idx:
51049d6e3ebSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[IDX:%.*]], 5
51149d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[CHECK_MAX:%.*]], label [[TRAP]]
51249d6e3ebSFlorian Hahn; CHECK:       check.max:
51349d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_1:%.*]] = shl nuw i8 [[IDX]], 1
514*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i8 [[IDX_SHL_1]]
515*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_0:%.*]] = icmp slt ptr [[ADD_PTR_SHL_1]], [[MAX]]
51649d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_0]])
51749d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_2:%.*]] = shl nuw i8 [[IDX]], 2
518*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i8 [[IDX_SHL_2]]
519*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_1:%.*]] = icmp slt ptr [[ADD_PTR_SHL_2]], [[MAX]]
52049d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_1]])
52149d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_NOT_NUW:%.*]] = shl i8 [[IDX]], 1
522*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_NOT_NUW:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i8 [[IDX_SHL_NOT_NUW]]
523*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_2:%.*]] = icmp slt ptr [[ADD_PTR_SHL_NOT_NUW]], [[MAX]]
52449d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_2]])
52549d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_3:%.*]] = shl nuw i8 [[IDX]], 3
526*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i8 [[IDX_SHL_3]]
527*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_3:%.*]] = icmp slt ptr [[ADD_PTR_SHL_3]], [[MAX]]
52849d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_3]])
52949d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
53049d6e3ebSFlorian Hahn;
53149d6e3ebSFlorian Hahncheck.0.min:
532*c5e1ddb6SFlorian Hahn  %add.10 = getelementptr inbounds i32, ptr %src, i32 10
533*c5e1ddb6SFlorian Hahn  %c.add.10.max = icmp sgt ptr %add.10, %max
53449d6e3ebSFlorian Hahn  br i1 %c.add.10.max, label %trap, label %check.idx
53549d6e3ebSFlorian Hahn
53649d6e3ebSFlorian Hahntrap:
53749d6e3ebSFlorian Hahn  ret void
53849d6e3ebSFlorian Hahn
539*c5e1ddb6SFlorian Hahncheck.idx:
54049d6e3ebSFlorian Hahn  %cmp = icmp slt i8 %idx, 5
54149d6e3ebSFlorian Hahn  br i1 %cmp, label %check.max, label %trap
54249d6e3ebSFlorian Hahn
543*c5e1ddb6SFlorian Hahncheck.max:
54449d6e3ebSFlorian Hahn  %idx.shl.1 = shl nuw i8 %idx, 1
545*c5e1ddb6SFlorian Hahn  %add.ptr.shl.1 = getelementptr inbounds i32, ptr %src, i8 %idx.shl.1
546*c5e1ddb6SFlorian Hahn  %c.max.0 = icmp slt ptr %add.ptr.shl.1, %max
54749d6e3ebSFlorian Hahn  call void @use(i1 %c.max.0)
54849d6e3ebSFlorian Hahn  %idx.shl.2 = shl nuw i8 %idx, 2
549*c5e1ddb6SFlorian Hahn  %add.ptr.shl.2 = getelementptr inbounds i32, ptr %src, i8 %idx.shl.2
550*c5e1ddb6SFlorian Hahn  %c.max.1 = icmp slt ptr %add.ptr.shl.2, %max
55149d6e3ebSFlorian Hahn  call void @use(i1 %c.max.1)
55249d6e3ebSFlorian Hahn  %idx.shl.not.nuw = shl i8 %idx, 1
553*c5e1ddb6SFlorian Hahn  %add.ptr.shl.not.nuw = getelementptr inbounds i32, ptr %src, i8 %idx.shl.not.nuw
554*c5e1ddb6SFlorian Hahn  %c.max.2 = icmp slt ptr %add.ptr.shl.not.nuw, %max
55549d6e3ebSFlorian Hahn  call void @use(i1 %c.max.2)
55649d6e3ebSFlorian Hahn  %idx.shl.3 = shl nuw i8 %idx, 3
557*c5e1ddb6SFlorian Hahn  %add.ptr.shl.3 = getelementptr inbounds i32, ptr %src, i8 %idx.shl.3
558*c5e1ddb6SFlorian Hahn  %c.max.3 = icmp slt ptr %add.ptr.shl.3, %max
55949d6e3ebSFlorian Hahn  call void @use(i1 %c.max.3)
56049d6e3ebSFlorian Hahn  ret void
56149d6e3ebSFlorian Hahn}
56249d6e3ebSFlorian Hahn
56349d6e3ebSFlorian Hahn; Test which requires decomposing GEP %ptr, ZEXT(SHL()).
564*c5e1ddb6SFlorian Hahndefine void @test.slt.gep.shl.zext(ptr readonly %src, ptr readnone %max, i32 %idx, i32 %j) {
56549d6e3ebSFlorian Hahn; CHECK-LABEL: @test.slt.gep.shl.zext(
56649d6e3ebSFlorian Hahn; CHECK-NEXT:  check.0.min:
567*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_10:%.*]] = getelementptr inbounds i32, ptr [[SRC:%.*]], i32 10
568*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_ADD_10_MAX:%.*]] = icmp sgt ptr [[ADD_10]], [[MAX:%.*]]
56949d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_ADD_10_MAX]], label [[TRAP:%.*]], label [[CHECK_IDX:%.*]]
57049d6e3ebSFlorian Hahn; CHECK:       trap:
57149d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
57249d6e3ebSFlorian Hahn; CHECK:       check.idx:
57349d6e3ebSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[IDX:%.*]], 5
57449d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[CHECK_MAX:%.*]], label [[TRAP]]
57549d6e3ebSFlorian Hahn; CHECK:       check.max:
57649d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL:%.*]] = shl nuw i32 [[IDX]], 1
57749d6e3ebSFlorian Hahn; CHECK-NEXT:    [[EXT_1:%.*]] = zext i32 [[IDX_SHL]] to i64
578*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[EXT_1]]
579*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_0:%.*]] = icmp slt ptr [[ADD_PTR_SHL]], [[MAX]]
58049d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_0]])
58149d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_NOT_NUW:%.*]] = shl i32 [[IDX]], 1
58249d6e3ebSFlorian Hahn; CHECK-NEXT:    [[EXT_2:%.*]] = zext i32 [[IDX_SHL_NOT_NUW]] to i64
583*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_NOT_NUW:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[EXT_2]]
584*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_1:%.*]] = icmp slt ptr [[ADD_PTR_SHL_NOT_NUW]], [[MAX]]
58549d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_1]])
58649d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_3:%.*]] = shl nuw i32 [[IDX]], 2
58749d6e3ebSFlorian Hahn; CHECK-NEXT:    [[EXT_3:%.*]] = zext i32 [[IDX_SHL_3]] to i64
588*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 [[EXT_3]]
589*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_2:%.*]] = icmp slt ptr [[ADD_PTR_SHL_3]], [[MAX]]
59049d6e3ebSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_MAX_2]])
59149d6e3ebSFlorian Hahn; CHECK-NEXT:    ret void
59249d6e3ebSFlorian Hahn;
59349d6e3ebSFlorian Hahncheck.0.min:
594*c5e1ddb6SFlorian Hahn  %add.10 = getelementptr inbounds i32, ptr %src, i32 10
595*c5e1ddb6SFlorian Hahn  %c.add.10.max = icmp sgt ptr %add.10, %max
59649d6e3ebSFlorian Hahn  br i1 %c.add.10.max, label %trap, label %check.idx
59749d6e3ebSFlorian Hahn
59849d6e3ebSFlorian Hahntrap:
59949d6e3ebSFlorian Hahn  ret void
60049d6e3ebSFlorian Hahn
601*c5e1ddb6SFlorian Hahncheck.idx:
60249d6e3ebSFlorian Hahn  %cmp = icmp slt i32 %idx, 5
60349d6e3ebSFlorian Hahn  br i1 %cmp, label %check.max, label %trap
60449d6e3ebSFlorian Hahn
605*c5e1ddb6SFlorian Hahncheck.max:
60649d6e3ebSFlorian Hahn  %idx.shl = shl nuw i32 %idx, 1
60749d6e3ebSFlorian Hahn  %ext.1 = zext i32 %idx.shl to i64
608*c5e1ddb6SFlorian Hahn  %add.ptr.shl = getelementptr inbounds i32, ptr %src, i64 %ext.1
609*c5e1ddb6SFlorian Hahn  %c.max.0 = icmp slt ptr %add.ptr.shl, %max
61049d6e3ebSFlorian Hahn  call void @use(i1 %c.max.0)
61149d6e3ebSFlorian Hahn  %idx.shl.not.nuw = shl i32 %idx, 1
61249d6e3ebSFlorian Hahn  %ext.2 = zext i32 %idx.shl.not.nuw to i64
613*c5e1ddb6SFlorian Hahn  %add.ptr.shl.not.nuw = getelementptr inbounds i32, ptr %src, i64 %ext.2
614*c5e1ddb6SFlorian Hahn  %c.max.1 = icmp slt ptr %add.ptr.shl.not.nuw, %max
61549d6e3ebSFlorian Hahn  call void @use(i1 %c.max.1)
61649d6e3ebSFlorian Hahn  %idx.shl.3 = shl nuw i32 %idx, 2
61749d6e3ebSFlorian Hahn  %ext.3 = zext i32 %idx.shl.3 to i64
618*c5e1ddb6SFlorian Hahn  %add.ptr.shl.3 = getelementptr inbounds i32, ptr %src, i64 %ext.3
619*c5e1ddb6SFlorian Hahn  %c.max.2 = icmp slt ptr %add.ptr.shl.3, %max
62049d6e3ebSFlorian Hahn  call void @use(i1 %c.max.2)
62149d6e3ebSFlorian Hahn  ret void
62249d6e3ebSFlorian Hahn}
62349d6e3ebSFlorian Hahn
62449d6e3ebSFlorian Hahn; Make sure non-constant shift amounts are handled correctly.
625*c5e1ddb6SFlorian Hahndefine i1 @test.slt.gep.shl.nonconst.zext(i16 %B, ptr readonly %src, ptr readnone %max, i16 %idx, i16 %j) {
62649d6e3ebSFlorian Hahn; CHECK-LABEL: @test.slt.gep.shl.nonconst.zext(
62749d6e3ebSFlorian Hahn; CHECK-NEXT:  check.0.min:
628*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_10:%.*]] = getelementptr inbounds i16, ptr [[SRC:%.*]], i16 10
629*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_ADD_10_MAX:%.*]] = icmp sgt ptr [[ADD_10]], [[MAX:%.*]]
63049d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[C_ADD_10_MAX]], label [[EXIT_1:%.*]], label [[CHECK_IDX:%.*]]
63149d6e3ebSFlorian Hahn; CHECK:       exit.1:
63249d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i1 true
63349d6e3ebSFlorian Hahn; CHECK:       check.idx:
63449d6e3ebSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[IDX:%.*]], 5
63549d6e3ebSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[CHECK_MAX:%.*]], label [[TRAP:%.*]]
63649d6e3ebSFlorian Hahn; CHECK:       check.max:
63749d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL:%.*]] = shl nuw i16 [[IDX]], [[B:%.*]]
63849d6e3ebSFlorian Hahn; CHECK-NEXT:    [[EXT:%.*]] = zext i16 [[IDX_SHL]] to i64
639*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL:%.*]] = getelementptr inbounds i16, ptr [[SRC]], i64 [[EXT]]
640*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX:%.*]] = icmp slt ptr [[ADD_PTR_SHL]], [[MAX]]
64149d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_MAX]]
64249d6e3ebSFlorian Hahn; CHECK:       trap:
64349d6e3ebSFlorian Hahn; CHECK-NEXT:    [[IDX_SHL_1:%.*]] = shl nuw i16 [[IDX]], [[B]]
64449d6e3ebSFlorian Hahn; CHECK-NEXT:    [[EXT_1:%.*]] = zext i16 [[IDX_SHL_1]] to i64
645*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[ADD_PTR_SHL_1:%.*]] = getelementptr inbounds i16, ptr [[SRC]], i64 [[EXT_1]]
646*c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[C_MAX_1:%.*]] = icmp slt ptr [[ADD_PTR_SHL_1]], [[MAX]]
64749d6e3ebSFlorian Hahn; CHECK-NEXT:    ret i1 [[C_MAX_1]]
64849d6e3ebSFlorian Hahn;
64949d6e3ebSFlorian Hahncheck.0.min:
650*c5e1ddb6SFlorian Hahn  %add.10 = getelementptr inbounds i16, ptr %src, i16 10
651*c5e1ddb6SFlorian Hahn  %c.add.10.max = icmp sgt ptr %add.10, %max
65249d6e3ebSFlorian Hahn  br i1 %c.add.10.max, label %exit.1, label %check.idx
65349d6e3ebSFlorian Hahn
65449d6e3ebSFlorian Hahnexit.1:
65549d6e3ebSFlorian Hahn  ret i1 true
65649d6e3ebSFlorian Hahn
657*c5e1ddb6SFlorian Hahncheck.idx:
65849d6e3ebSFlorian Hahn  %cmp = icmp slt i16 %idx, 5
65949d6e3ebSFlorian Hahn  br i1 %cmp, label %check.max, label %trap
66049d6e3ebSFlorian Hahn
661*c5e1ddb6SFlorian Hahncheck.max:
66249d6e3ebSFlorian Hahn  %idx.shl = shl nuw i16 %idx, %B
66349d6e3ebSFlorian Hahn  %ext = zext i16 %idx.shl to i64
664*c5e1ddb6SFlorian Hahn  %add.ptr.shl = getelementptr inbounds i16, ptr %src, i64 %ext
665*c5e1ddb6SFlorian Hahn  %c.max = icmp slt ptr %add.ptr.shl, %max
66649d6e3ebSFlorian Hahn  ret i1 %c.max
66749d6e3ebSFlorian Hahn
668*c5e1ddb6SFlorian Hahntrap:
66949d6e3ebSFlorian Hahn  %idx.shl.1 = shl nuw i16 %idx, %B
67049d6e3ebSFlorian Hahn  %ext.1 = zext i16 %idx.shl.1 to i64
671*c5e1ddb6SFlorian Hahn  %add.ptr.shl.1 = getelementptr inbounds i16, ptr %src, i64 %ext.1
672*c5e1ddb6SFlorian Hahn  %c.max.1 = icmp slt ptr %add.ptr.shl.1, %max
67349d6e3ebSFlorian Hahn  ret i1 %c.max.1
67449d6e3ebSFlorian Hahn}
67549d6e3ebSFlorian Hahn
67649d6e3ebSFlorian Hahndeclare void @use(i1)
677