annotate llvm/unittests/Analysis/ConstraintSystemTest.cpp @ 235:edfff9242030 cbc-llvm13

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 21 Jul 2021 11:30:30 +0900
parents 2e18cbf3894f
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===--- ConstraintSystemTests.cpp ----------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #include "llvm/Analysis/ConstraintSystem.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "gtest/gtest.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 using namespace llvm;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 namespace {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 TEST(ConstraintSolverTest, TestSolutionChecks) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 // x + y <= 10, x >= 5, y >= 6, x <= 10, y <= 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 CS.addVariableRow({10, 1, 1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 CS.addVariableRow({-5, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 CS.addVariableRow({-6, 0, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 CS.addVariableRow({10, 1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 CS.addVariableRow({10, 0, 1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 EXPECT_FALSE(CS.mayHaveSolution());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 // x + y <= 10, x >= 2, y >= 3, x <= 10, y <= 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 CS.addVariableRow({10, 1, 1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 CS.addVariableRow({-2, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 CS.addVariableRow({-3, 0, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 CS.addVariableRow({10, 1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 CS.addVariableRow({10, 0, 1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 EXPECT_TRUE(CS.mayHaveSolution());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 // x + y <= 10, 10 >= x, 10 >= y; does not have a solution.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 CS.addVariableRow({10, 1, 1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 CS.addVariableRow({-10, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 CS.addVariableRow({-10, 0, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 EXPECT_FALSE(CS.mayHaveSolution());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 // x + y >= 20, 10 >= x, 10 >= y; does HAVE a solution.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 CS.addVariableRow({-20, -1, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 CS.addVariableRow({-10, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 CS.addVariableRow({-10, 0, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 EXPECT_TRUE(CS.mayHaveSolution());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 // 2x + y + 3z <= 10, 2x + y >= 10, y >= 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 CS.addVariableRow({10, 2, 1, 3});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 CS.addVariableRow({-10, -2, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 CS.addVariableRow({-1, 0, 0, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 EXPECT_FALSE(CS.mayHaveSolution());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 // 2x + y + 3z <= 10, 2x + y >= 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 CS.addVariableRow({10, 2, 1, 3});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 CS.addVariableRow({-10, -2, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 EXPECT_TRUE(CS.mayHaveSolution());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 TEST(ConstraintSolverTest, IsConditionImplied) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 // For the test below, we assume we know
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 // x <= 5 && y <= 3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 CS.addVariableRow({5, 1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 CS.addVariableRow({3, 0, 1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 // x + y <= 6 does not hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 EXPECT_FALSE(CS.isConditionImplied({6, 1, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 // x + y <= 7 does not hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 EXPECT_FALSE(CS.isConditionImplied({7, 1, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 // x + y <= 8 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 EXPECT_TRUE(CS.isConditionImplied({8, 1, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 // 2 * x + y <= 12 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 EXPECT_FALSE(CS.isConditionImplied({12, 2, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 // 2 * x + y <= 13 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 EXPECT_TRUE(CS.isConditionImplied({13, 2, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 // x + y <= 12 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 EXPECT_FALSE(CS.isConditionImplied({12, 2, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 // 2 * x + y <= 13 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 EXPECT_TRUE(CS.isConditionImplied({13, 2, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 // x <= y == x - y <= 0 does not hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 EXPECT_FALSE(CS.isConditionImplied({0, 1, -1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 // y <= x == -x + y <= 0 does not hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 EXPECT_FALSE(CS.isConditionImplied({0, -1, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 // For the test below, we assume we know
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 // x + 1 <= y + 1 == x - y <= 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 CS.addVariableRow({0, 1, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 // x <= y == x - y <= 0 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 EXPECT_TRUE(CS.isConditionImplied({0, 1, -1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 // y <= x == -x + y <= 0 does not hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 EXPECT_FALSE(CS.isConditionImplied({0, -1, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 // x <= y + 10 == x - y <= 10 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 EXPECT_TRUE(CS.isConditionImplied({10, 1, -1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 // x + 10 <= y == x - y <= -10 does NOT hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 EXPECT_FALSE(CS.isConditionImplied({-10, 1, -1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 // For the test below, we assume we know
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 // x <= y == x - y <= 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 // y <= z == y - x <= 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 CS.addVariableRow({0, 1, -1, 0});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 CS.addVariableRow({0, 0, 1, -1});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 // z <= y == -y + z <= 0 does not hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 EXPECT_FALSE(CS.isConditionImplied({0, 0, -1, 1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 // x <= z == x - z <= 0 does hold.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 EXPECT_TRUE(CS.isConditionImplied({0, 1, 0, -1}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 TEST(ConstraintSolverTest, IsConditionImpliedOverflow) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 ConstraintSystem CS;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 // Make sure isConditionImplied returns false when there is an overflow.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 int64_t Limit = std::numeric_limits<int64_t>::max();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 CS.addVariableRow({Limit - 1, Limit - 2, Limit - 3});
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 EXPECT_FALSE(CS.isConditionImplied({Limit - 1, Limit - 2, Limit - 3}));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 } // namespace