xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/constants-unsigned-predicates.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4define i1 @test_ult() {
5; CHECK-LABEL: @test_ult(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
8; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], false
9; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], true
10; CHECK-NEXT:    ret i1 [[RES_3]]
11;
12entry:
13  %t.0 = icmp ult i8 10, 11
14  %f.0 = icmp ult i8 10, 10
15  %res.1 = xor i1 %t.0, %f.0
16  %f.1 = icmp ult i8 10, 9
17  %res.2 = xor i1 %res.1, %f.1
18  %t.1 = icmp ult i8 10, -10
19  %res.3 = xor i1 %res.2, %t.1
20  ret i1 %res.3
21}
22
23; Test cases where lhs - rhs results in constant offset.
24define i1 @test_ult_gep_1(ptr %base) {
25; CHECK-LABEL: @test_ult_gep_1(
26; CHECK-NEXT:  entry:
27; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 1
28; CHECK-NEXT:    [[GEP_0:%.*]] = getelementptr inbounds i8, ptr [[BASE]], i8 0
29; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
30; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], false
31; CHECK-NEXT:    ret i1 [[RES_2]]
32;
33entry:
34  %gep.1 = getelementptr inbounds i8, ptr %base, i8 1
35  %t.0 = icmp ult ptr %base, %gep.1
36  %gep.0 = getelementptr inbounds i8, ptr %base, i8 0
37  %f.0 = icmp ult ptr %base, %gep.0
38  %res.1 = xor i1 %t.0, %f.0
39  %f.1 = icmp ult ptr %gep.1, %base
40  %res.2 = xor i1 %res.1, %f.1
41  ret i1 %res.2
42}
43
44define i1 @test_ult_gep_2(ptr %base) {
45; CHECK-LABEL: @test_ult_gep_2(
46; CHECK-NEXT:    [[GEP_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 -1
47; CHECK-NEXT:    ret i1 false
48;
49  %gep.sub.1 = getelementptr inbounds i8, ptr %base, i8 -1
50  %c.1 = icmp ult ptr %base, %gep.sub.1
51  ret i1 %c.1
52}
53
54define i1 @test_ult_gep_3(ptr %base) {
55; CHECK-LABEL: @test_ult_gep_3(
56; CHECK-NEXT:    [[GEP_1_NOINBOUNDS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i8 1
57; CHECK-NEXT:    [[C_1:%.*]] = icmp ult ptr [[BASE]], [[GEP_1_NOINBOUNDS]]
58; CHECK-NEXT:    ret i1 [[C_1]]
59;
60  %gep.1.noinbounds = getelementptr i8, ptr %base, i8 1
61  %c.1 = icmp ult ptr %base, %gep.1.noinbounds
62  ret i1 %c.1
63}
64
65define i1 @test_eq() {
66; CHECK-LABEL: @test_eq(
67; CHECK-NEXT:  entry:
68; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
69; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], false
70; CHECK-NEXT:    ret i1 [[RES_2]]
71;
72entry:
73  %f.0 = icmp eq i8 10, 11
74  %t.0 = icmp eq i8 10, 10
75  %res.1 = xor i1 %t.0, %f.0
76  %f.1 = icmp eq i8 10, 9
77  %res.2 = xor i1 %res.1, %f.1
78  ret i1 %res.2
79}
80
81define i1 @test_ne() {
82; CHECK-LABEL: @test_ne(
83; CHECK-NEXT:  entry:
84; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
85; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], true
86; CHECK-NEXT:    ret i1 [[RES_2]]
87;
88entry:
89  %t.0 = icmp ne i8 10, 11
90  %f.0 = icmp ne i8 10, 10
91  %res.1 = xor i1 %t.0, %f.0
92  %t.1 = icmp ne i8 10, 9
93  %res.2 = xor i1 %res.1, %t.1
94  ret i1 %res.2
95}
96