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