xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/geps-precondition-overflow-check.ll (revision 18170d0f281c2cae5252c501cbcd174783de78b7)
146b05528SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
346b05528SFlorian Hahn
446b05528SFlorian Hahn; Tests for cases with explicit checks that %ptr + x >= %ptr. The information can
546b05528SFlorian Hahn; be used to determine that certain GEPs do not overflow.
646b05528SFlorian Hahn
734e477e9SFlorian Hahndefine i1 @overflow_check_1(ptr %dst) {
846b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_1(
946b05528SFlorian Hahn; CHECK-NEXT:  entry:
1034e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
1134e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
1246b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[DST_5_UGE]], label [[THEN:%.*]], label [[ELSE:%.*]]
1346b05528SFlorian Hahn; CHECK:       then:
1434e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
1534e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
1646b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[TRUE_DST_4_UGE]]
1746b05528SFlorian Hahn; CHECK:       else:
1846b05528SFlorian Hahn; CHECK-NEXT:    ret i1 false
1946b05528SFlorian Hahn;
2046b05528SFlorian Hahnentry:
2134e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
2234e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
2346b05528SFlorian Hahn  br i1 %dst.5.uge, label %then, label %else
2446b05528SFlorian Hahn
2546b05528SFlorian Hahnthen:
2634e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
2734e477e9SFlorian Hahn  %true.dst.4.uge = icmp uge ptr %dst.4, %dst
2846b05528SFlorian Hahn  ret i1 %true.dst.4.uge
2946b05528SFlorian Hahn
3046b05528SFlorian Hahnelse:
3146b05528SFlorian Hahn  ret i1 0
3246b05528SFlorian Hahn}
3346b05528SFlorian Hahn
3434e477e9SFlorian Hahndefine i1 @overflow_check_2_and(ptr %dst) {
3546b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_2_and(
3646b05528SFlorian Hahn; CHECK-NEXT:  entry:
3734e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
3834e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
397cf499c6SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[DST_5_UGE]]
4046b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
4146b05528SFlorian Hahn; CHECK:       then:
4234e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
4334e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
4446b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[TRUE_DST_4_UGE]]
4546b05528SFlorian Hahn; CHECK:       else:
4646b05528SFlorian Hahn; CHECK-NEXT:    ret i1 true
4746b05528SFlorian Hahn;
4846b05528SFlorian Hahnentry:
4934e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
5034e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
5146b05528SFlorian Hahn  %and = and i1 %dst.5.uge, %dst.5.uge
5246b05528SFlorian Hahn  br i1 %and, label %then, label %else
5346b05528SFlorian Hahn
5446b05528SFlorian Hahnthen:
5534e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
5634e477e9SFlorian Hahn  %true.dst.4.uge = icmp uge ptr %dst.4, %dst
5746b05528SFlorian Hahn  ret i1 %true.dst.4.uge
5846b05528SFlorian Hahn
5946b05528SFlorian Hahnelse:
6046b05528SFlorian Hahn  ret i1 true
6146b05528SFlorian Hahn}
6246b05528SFlorian Hahn
6334e477e9SFlorian Hahndefine i1 @overflow_check_3_and(ptr %dst) {
6446b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_3_and(
6546b05528SFlorian Hahn; CHECK-NEXT:  entry:
6634e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
6734e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
687cf499c6SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[DST_5_UGE]]
6946b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
7046b05528SFlorian Hahn; CHECK:       then:
7134e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
7234e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
7346b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[DST_4_UGE]]
7446b05528SFlorian Hahn; CHECK:       else:
7534e477e9SFlorian Hahn; CHECK-NEXT:    [[ELSE_DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
7634e477e9SFlorian Hahn; CHECK-NEXT:    [[ELSE_DST_4_UGE:%.*]] = icmp uge ptr [[ELSE_DST_4]], [[DST]]
7746b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[ELSE_DST_4_UGE]]
7846b05528SFlorian Hahn;
7946b05528SFlorian Hahnentry:
8034e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
8134e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
8246b05528SFlorian Hahn  %and = and i1 %dst.5.uge, %dst.5.uge
8346b05528SFlorian Hahn  br i1 %and, label %then, label %else
8446b05528SFlorian Hahn
8546b05528SFlorian Hahnthen:
8634e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
8734e477e9SFlorian Hahn  %dst.4.uge = icmp uge ptr %dst.4, %dst
8846b05528SFlorian Hahn  ret i1 %dst.4.uge
8946b05528SFlorian Hahn
9046b05528SFlorian Hahnelse:
9134e477e9SFlorian Hahn  %else.dst.4 = getelementptr i32, ptr %dst, i64 4
9234e477e9SFlorian Hahn  %else.dst.4.uge = icmp uge ptr %else.dst.4, %dst
9346b05528SFlorian Hahn  ret i1 %else.dst.4.uge
9446b05528SFlorian Hahn}
9546b05528SFlorian Hahn
9634e477e9SFlorian Hahndefine i1 @overflow_check_4_and(ptr %dst) {
9746b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_4_and(
9846b05528SFlorian Hahn; CHECK-NEXT:  entry:
9934e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
10034e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
1017cf499c6SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[DST_5_UGE]]
10246b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
10346b05528SFlorian Hahn; CHECK:       then:
10434e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
10534e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
10634e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_2:%.*]] = getelementptr i32, ptr [[DST]], i64 5
10734e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_5_UGE:%.*]] = icmp uge ptr [[DST_5_2]], [[DST]]
10846b05528SFlorian Hahn; CHECK-NEXT:    [[RES_0:%.*]] = xor i1 [[TRUE_DST_4_UGE]], [[TRUE_DST_5_UGE]]
10934e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_6:%.*]] = getelementptr i32, ptr [[DST]], i64 6
11034e477e9SFlorian Hahn; CHECK-NEXT:    [[C_DST_6_UGE:%.*]] = icmp uge ptr [[DST_6]], [[DST]]
11146b05528SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[RES_0]], [[C_DST_6_UGE]]
11246b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_1]]
11346b05528SFlorian Hahn; CHECK:       else:
11434e477e9SFlorian Hahn; CHECK-NEXT:    [[ELSE_DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
11534e477e9SFlorian Hahn; CHECK-NEXT:    [[ELSE_DST_4_UGE:%.*]] = icmp uge ptr [[ELSE_DST_4]], [[DST]]
11634e477e9SFlorian Hahn; CHECK-NEXT:    [[ELSE_DST_6:%.*]] = getelementptr i32, ptr [[DST]], i64 6
11734e477e9SFlorian Hahn; CHECK-NEXT:    [[ELSE_DST_6_UGE:%.*]] = icmp uge ptr [[ELSE_DST_6]], [[DST]]
11846b05528SFlorian Hahn; CHECK-NEXT:    [[ELSE_RES_0:%.*]] = xor i1 [[ELSE_DST_4_UGE]], [[ELSE_DST_6_UGE]]
11946b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[ELSE_RES_0]]
12046b05528SFlorian Hahn;
12146b05528SFlorian Hahnentry:
12234e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
12334e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
12446b05528SFlorian Hahn  %and = and i1 %dst.5.uge, %dst.5.uge
12546b05528SFlorian Hahn  br i1 %and, label %then, label %else
12646b05528SFlorian Hahn
12746b05528SFlorian Hahnthen:
12834e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
12934e477e9SFlorian Hahn  %true.dst.4.uge = icmp uge ptr %dst.4, %dst
13034e477e9SFlorian Hahn  %dst.5.2 = getelementptr i32, ptr %dst, i64 5
13134e477e9SFlorian Hahn  %true.dst.5.uge = icmp uge ptr %dst.5.2, %dst
13246b05528SFlorian Hahn  %res.0 = xor i1 %true.dst.4.uge, %true.dst.5.uge
13346b05528SFlorian Hahn
13434e477e9SFlorian Hahn  %dst.6 = getelementptr i32, ptr %dst, i64 6
13534e477e9SFlorian Hahn  %c.dst.6.uge = icmp uge ptr %dst.6, %dst
13646b05528SFlorian Hahn  %res.1 = xor i1 %res.0, %c.dst.6.uge
13746b05528SFlorian Hahn
13846b05528SFlorian Hahn  ret i1 %res.1
13946b05528SFlorian Hahn
14046b05528SFlorian Hahnelse:
14134e477e9SFlorian Hahn  %else.dst.4 = getelementptr i32, ptr %dst, i64 4
14234e477e9SFlorian Hahn  %else.dst.4.uge = icmp uge ptr %else.dst.4, %dst
14334e477e9SFlorian Hahn  %else.dst.6 = getelementptr i32, ptr %dst, i64 6
14434e477e9SFlorian Hahn  %else.dst.6.uge = icmp uge ptr %else.dst.6, %dst
14546b05528SFlorian Hahn  %else.res.0 = xor i1 %else.dst.4.uge, %else.dst.6.uge
14646b05528SFlorian Hahn
14746b05528SFlorian Hahn  ret i1 %else.res.0
14846b05528SFlorian Hahn}
14946b05528SFlorian Hahn
15034e477e9SFlorian Hahndefine i1 @overflow_check_3_or(ptr %dst) {
15146b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_3_or(
15246b05528SFlorian Hahn; CHECK-NEXT:  entry:
15334e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
15434e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
155*18170d0fSFlorian Hahn; CHECK-NEXT:    [[OR:%.*]] = or i1 false, [[DST_5_UGE]]
15646b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
15746b05528SFlorian Hahn; CHECK:       then:
15834e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
15934e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
16046b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[TRUE_DST_4_UGE]]
16146b05528SFlorian Hahn; CHECK:       else:
16246b05528SFlorian Hahn; CHECK-NEXT:    ret i1 false
16346b05528SFlorian Hahn;
16446b05528SFlorian Hahnentry:
16534e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
16634e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
16746b05528SFlorian Hahn  %or = or i1 %dst.5.uge, %dst.5.uge
16846b05528SFlorian Hahn  br i1 %or, label %then, label %else
16946b05528SFlorian Hahn
17046b05528SFlorian Hahnthen:
17134e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
17234e477e9SFlorian Hahn  %true.dst.4.uge = icmp uge ptr %dst.4, %dst
17346b05528SFlorian Hahn  ret i1 %true.dst.4.uge
17446b05528SFlorian Hahn
17546b05528SFlorian Hahnelse:
17646b05528SFlorian Hahn  ret i1 0
17746b05528SFlorian Hahn}
17846b05528SFlorian Hahn
17934e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_1(ptr %dst, i32 %n) {
18046b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_1(
18146b05528SFlorian Hahn; CHECK-NEXT:  entry:
18246b05528SFlorian Hahn; CHECK-NEXT:    [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64
18334e477e9SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[N_EXT]]
18434e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST]], i64 5
18534e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_ULT:%.*]] = icmp ult ptr [[DST_5]], [[UPPER]]
18634e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
18746b05528SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[DST_5_ULT]], [[DST_5_UGE]]
18846b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
18946b05528SFlorian Hahn; CHECK:       then:
19034e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
19134e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_4_ULT:%.*]] = icmp ult ptr [[DST_4]], [[UPPER]]
19234e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
19346b05528SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[TRUE_DST_4_ULT]], [[TRUE_DST_4_UGE]]
19446b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[AND]]
19546b05528SFlorian Hahn; CHECK:       else:
19646b05528SFlorian Hahn; CHECK-NEXT:    ret i1 false
19746b05528SFlorian Hahn;
19846b05528SFlorian Hahnentry:
19946b05528SFlorian Hahn  %n.ext = zext i32 %n to i64
20034e477e9SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 %n.ext
20134e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
20234e477e9SFlorian Hahn  %dst.5.ult = icmp ult ptr %dst.5, %upper
20334e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
20446b05528SFlorian Hahn  %and.1 = and i1 %dst.5.ult, %dst.5.uge
20546b05528SFlorian Hahn  br i1 %and.1, label %then, label %else
20646b05528SFlorian Hahn
20746b05528SFlorian Hahnthen:
20834e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
20934e477e9SFlorian Hahn  %true.dst.4.ult = icmp ult ptr %dst.4, %upper
21034e477e9SFlorian Hahn  %true.dst.4.uge = icmp uge ptr %dst.4, %dst
21146b05528SFlorian Hahn  %and = and i1 %true.dst.4.ult, %true.dst.4.uge
21246b05528SFlorian Hahn  ret i1 %and
21346b05528SFlorian Hahn
21446b05528SFlorian Hahnelse:
21546b05528SFlorian Hahn  ret i1 0
21646b05528SFlorian Hahn}
21746b05528SFlorian Hahn
21834e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_2_dst6(ptr %dst, i32 %n) {
21946b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_2_dst6(
22046b05528SFlorian Hahn; CHECK-NEXT:  entry:
22146b05528SFlorian Hahn; CHECK-NEXT:    [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64
22234e477e9SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[N_EXT]]
22334e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST]], i64 5
22434e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_ULT:%.*]] = icmp ult ptr [[DST_5]], [[UPPER]]
22534e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
22646b05528SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[DST_5_ULT]], [[DST_5_UGE]]
22746b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
22846b05528SFlorian Hahn; CHECK:       then:
22934e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_6:%.*]] = getelementptr i32, ptr [[DST]], i64 6
23034e477e9SFlorian Hahn; CHECK-NEXT:    [[C_DST_6_ULT:%.*]] = icmp ult ptr [[DST_6]], [[UPPER]]
23134e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_6_UGE:%.*]] = icmp uge ptr [[DST_6]], [[DST]]
23246b05528SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i1 [[C_DST_6_ULT]], [[TRUE_DST_6_UGE]]
23346b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES]]
23446b05528SFlorian Hahn; CHECK:       else:
23546b05528SFlorian Hahn; CHECK-NEXT:    ret i1 false
23646b05528SFlorian Hahn;
23746b05528SFlorian Hahnentry:
23846b05528SFlorian Hahn  %n.ext = zext i32 %n to i64
23934e477e9SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 %n.ext
24034e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
24134e477e9SFlorian Hahn  %dst.5.ult = icmp ult ptr %dst.5, %upper
24234e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
24346b05528SFlorian Hahn  %and = and i1 %dst.5.ult, %dst.5.uge
24446b05528SFlorian Hahn  br i1 %and, label %then, label %else
24546b05528SFlorian Hahn
24646b05528SFlorian Hahnthen:
24734e477e9SFlorian Hahn  %dst.6 = getelementptr i32, ptr %dst, i64 6
24834e477e9SFlorian Hahn  %c.dst.6.ult = icmp ult ptr %dst.6, %upper
24934e477e9SFlorian Hahn  %true.dst.6.uge = icmp uge ptr %dst.6, %dst
25046b05528SFlorian Hahn  %res = and i1 %c.dst.6.ult, %true.dst.6.uge
25146b05528SFlorian Hahn  ret i1 %res
25246b05528SFlorian Hahn
25346b05528SFlorian Hahnelse:
25446b05528SFlorian Hahn  ret i1 0
25546b05528SFlorian Hahn}
25646b05528SFlorian Hahn
25734e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_2_dst7(ptr %dst, i32 %n) {
25846b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_2_dst7(
25946b05528SFlorian Hahn; CHECK-NEXT:  entry:
26046b05528SFlorian Hahn; CHECK-NEXT:    [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64
26134e477e9SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[N_EXT]]
26234e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST]], i64 5
26334e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_ULT:%.*]] = icmp ult ptr [[DST_5]], [[UPPER]]
26434e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
26546b05528SFlorian Hahn; CHECK-NEXT:    [[OR_COND:%.*]] = and i1 [[DST_5_ULT]], [[DST_5_UGE]]
26646b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[OR_COND]], label [[THEN:%.*]], label [[ELSE:%.*]]
26746b05528SFlorian Hahn; CHECK:       then:
26834e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_7:%.*]] = getelementptr i32, ptr [[DST]], i64 7
26934e477e9SFlorian Hahn; CHECK-NEXT:    [[C_DST_7_ULT:%.*]] = icmp ult ptr [[DST_7]], [[UPPER]]
27034e477e9SFlorian Hahn; CHECK-NEXT:    [[C_DST_7_UGE:%.*]] = icmp uge ptr [[DST_7]], [[DST]]
27146b05528SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = and i1 [[C_DST_7_ULT]], [[C_DST_7_UGE]]
27246b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES]]
27346b05528SFlorian Hahn; CHECK:       else:
27446b05528SFlorian Hahn; CHECK-NEXT:    ret i1 false
27546b05528SFlorian Hahn;
27646b05528SFlorian Hahnentry:
27746b05528SFlorian Hahn  %n.ext = zext i32 %n to i64
27834e477e9SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 %n.ext
27934e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 5
28034e477e9SFlorian Hahn  %dst.5.ult = icmp ult ptr %dst.5, %upper
28134e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
28246b05528SFlorian Hahn  %or.cond = and i1 %dst.5.ult, %dst.5.uge
28346b05528SFlorian Hahn  br i1 %or.cond, label %then, label %else
28446b05528SFlorian Hahn
28546b05528SFlorian Hahnthen:
28634e477e9SFlorian Hahn  %dst.7 = getelementptr i32, ptr %dst, i64 7
28734e477e9SFlorian Hahn  %c.dst.7.ult = icmp ult ptr %dst.7, %upper
28834e477e9SFlorian Hahn  %c.dst.7.uge = icmp uge ptr %dst.7, %dst
28946b05528SFlorian Hahn  %res = and i1 %c.dst.7.ult, %c.dst.7.uge
29046b05528SFlorian Hahn  ret i1 %res
29146b05528SFlorian Hahn
29246b05528SFlorian Hahnelse:
29346b05528SFlorian Hahn  ret i1 0
29446b05528SFlorian Hahn}
29546b05528SFlorian Hahn
29634e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_lt(ptr %dst, i32 %n) {
29746b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_lt(
29846b05528SFlorian Hahn; CHECK-NEXT:  entry:
29946b05528SFlorian Hahn; CHECK-NEXT:    [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64
30034e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 [[N_EXT]]
30134e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
30246b05528SFlorian Hahn; CHECK-NEXT:    [[N_EXT_UGE:%.*]] = icmp uge i64 [[N_EXT]], 3
30346b05528SFlorian Hahn; CHECK-NEXT:    [[OR_COND:%.*]] = and i1 [[DST_5_UGE]], [[N_EXT_UGE]]
30446b05528SFlorian Hahn; CHECK-NEXT:    br i1 [[OR_COND]], label [[THEN:%.*]], label [[ELSE:%.*]]
30546b05528SFlorian Hahn; CHECK:       then:
30634e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_3:%.*]] = getelementptr i32, ptr [[DST]], i64 3
30734e477e9SFlorian Hahn; CHECK-NEXT:    [[TRUE_DST_3_UGE:%.*]] = icmp uge ptr [[DST_3]], [[DST]]
30834e477e9SFlorian Hahn; CHECK-NEXT:    [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
30934e477e9SFlorian Hahn; CHECK-NEXT:    [[C_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
31046b05528SFlorian Hahn; CHECK-NEXT:    [[RES_0:%.*]] = xor i1 [[TRUE_DST_3_UGE]], [[C_DST_4_UGE]]
31146b05528SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_0]]
31246b05528SFlorian Hahn; CHECK:       else:
31346b05528SFlorian Hahn; CHECK-NEXT:    ret i1 false
31446b05528SFlorian Hahn;
31546b05528SFlorian Hahnentry:
31646b05528SFlorian Hahn  %n.ext = zext i32 %n to i64
31734e477e9SFlorian Hahn  %dst.5 = getelementptr i32, ptr %dst, i64 %n.ext
31834e477e9SFlorian Hahn  %dst.5.uge = icmp uge ptr %dst.5, %dst
31946b05528SFlorian Hahn  %n.ext.uge = icmp uge i64 %n.ext, 3
32046b05528SFlorian Hahn  %or.cond = and i1 %dst.5.uge, %n.ext.uge
32146b05528SFlorian Hahn  br i1 %or.cond, label %then, label %else
32246b05528SFlorian Hahn
32346b05528SFlorian Hahnthen:
32434e477e9SFlorian Hahn  %dst.3 = getelementptr i32, ptr %dst, i64 3
32534e477e9SFlorian Hahn  %true.dst.3.uge = icmp uge ptr %dst.3, %dst
32634e477e9SFlorian Hahn  %dst.4 = getelementptr i32, ptr %dst, i64 4
32734e477e9SFlorian Hahn  %c.dst.4.uge = icmp uge ptr %dst.4, %dst
32846b05528SFlorian Hahn  %res.0 = xor i1 %true.dst.3.uge, %c.dst.4.uge
32946b05528SFlorian Hahn  ret i1 %res.0
33046b05528SFlorian Hahn
33146b05528SFlorian Hahnelse:
33246b05528SFlorian Hahn  ret i1 0
33346b05528SFlorian Hahn}
334