blob: 97317124ef8e4c3090d9a3590faf518b81ffe332 [file] [log] [blame]
Aart Bik854a02b2015-07-14 16:07:00 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not read this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Vladimir Marko0ebe0d82017-09-21 22:50:39 +010017#include <gtest/gtest.h>
18
19#include "data_type.h"
Aart Bik854a02b2015-07-14 16:07:00 -070020#include "nodes.h"
Aart Bik854a02b2015-07-14 16:07:00 -070021
22namespace art {
23
Vladimir Markod5d2f2c2017-09-26 12:37:26 +010024// Only runtime types other than void are allowed.
25static const DataType::Type kTestTypes[] = {
26 DataType::Type::kReference,
27 DataType::Type::kBool,
28 DataType::Type::kInt8,
29 DataType::Type::kUint16,
30 DataType::Type::kInt16,
31 DataType::Type::kInt32,
32 DataType::Type::kInt64,
33 DataType::Type::kFloat32,
34 DataType::Type::kFloat64,
35};
36
Aart Bik854a02b2015-07-14 16:07:00 -070037/**
38 * Tests for the SideEffects class.
39 */
40
41//
42// Helper methods.
43//
44
45void testWriteAndReadSanity(SideEffects write, SideEffects read) {
46 EXPECT_FALSE(write.DoesNothing());
47 EXPECT_FALSE(read.DoesNothing());
48
49 EXPECT_TRUE(write.DoesAnyWrite());
50 EXPECT_FALSE(write.DoesAnyRead());
51 EXPECT_FALSE(read.DoesAnyWrite());
52 EXPECT_TRUE(read.DoesAnyRead());
53
54 // All-dependences.
55 SideEffects all = SideEffects::All();
56 EXPECT_TRUE(all.MayDependOn(write));
57 EXPECT_FALSE(write.MayDependOn(all));
58 EXPECT_FALSE(all.MayDependOn(read));
59 EXPECT_TRUE(read.MayDependOn(all));
60
61 // None-dependences.
62 SideEffects none = SideEffects::None();
63 EXPECT_FALSE(none.MayDependOn(write));
64 EXPECT_FALSE(write.MayDependOn(none));
65 EXPECT_FALSE(none.MayDependOn(read));
66 EXPECT_FALSE(read.MayDependOn(none));
67}
68
69void testWriteAndReadDependence(SideEffects write, SideEffects read) {
70 testWriteAndReadSanity(write, read);
71
72 // Dependence only in one direction.
73 EXPECT_FALSE(write.MayDependOn(read));
74 EXPECT_TRUE(read.MayDependOn(write));
75}
76
77void testNoWriteAndReadDependence(SideEffects write, SideEffects read) {
78 testWriteAndReadSanity(write, read);
79
80 // No dependence in any direction.
81 EXPECT_FALSE(write.MayDependOn(read));
82 EXPECT_FALSE(read.MayDependOn(write));
83}
84
85//
86// Actual tests.
87//
88
89TEST(SideEffectsTest, All) {
90 SideEffects all = SideEffects::All();
91 EXPECT_TRUE(all.DoesAnyWrite());
92 EXPECT_TRUE(all.DoesAnyRead());
93 EXPECT_FALSE(all.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +010094 EXPECT_TRUE(all.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -070095}
96
97TEST(SideEffectsTest, None) {
98 SideEffects none = SideEffects::None();
99 EXPECT_FALSE(none.DoesAnyWrite());
100 EXPECT_FALSE(none.DoesAnyRead());
101 EXPECT_TRUE(none.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100102 EXPECT_FALSE(none.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -0700103}
104
105TEST(SideEffectsTest, DependencesAndNoDependences) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100106 // Apply test to each individual data type.
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100107 for (DataType::Type type : kTestTypes) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100108 // Same data type and access type: proper write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700109 testWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700110 SideEffects::FieldWriteOfType(type, false),
111 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700112 testWriteAndReadDependence(
113 SideEffects::ArrayWriteOfType(type),
114 SideEffects::ArrayReadOfType(type));
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100115 // Same data type but different access type: no write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700116 testNoWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700117 SideEffects::FieldWriteOfType(type, false),
Aart Bik854a02b2015-07-14 16:07:00 -0700118 SideEffects::ArrayReadOfType(type));
119 testNoWriteAndReadDependence(
120 SideEffects::ArrayWriteOfType(type),
Aart Bik34c3ba92015-07-20 14:08:59 -0700121 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700122 }
123}
124
125TEST(SideEffectsTest, NoDependences) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100126 // Different data type, same access type: no write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700127 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100128 SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
129 SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700130 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100131 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
132 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700133 // Everything different: no write/read dep.
134 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100135 SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
136 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700137 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100138 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
139 SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
Aart Bik34c3ba92015-07-20 14:08:59 -0700140}
141
142TEST(SideEffectsTest, VolatileDependences) {
143 SideEffects volatile_write =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100144 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700145 SideEffects any_write =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100146 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700147 SideEffects volatile_read =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100148 SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700149 SideEffects any_read =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100150 SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700151
152 EXPECT_FALSE(volatile_write.MayDependOn(any_read));
153 EXPECT_TRUE(any_read.MayDependOn(volatile_write));
154 EXPECT_TRUE(volatile_write.MayDependOn(any_write));
155 EXPECT_FALSE(any_write.MayDependOn(volatile_write));
156
157 EXPECT_FALSE(volatile_read.MayDependOn(any_read));
158 EXPECT_TRUE(any_read.MayDependOn(volatile_read));
159 EXPECT_TRUE(volatile_read.MayDependOn(any_write));
160 EXPECT_FALSE(any_write.MayDependOn(volatile_read));
Aart Bik854a02b2015-07-14 16:07:00 -0700161}
162
Aart Bik18b36ab2016-04-13 16:41:35 -0700163TEST(SideEffectsTest, SameWidthTypesNoAlias) {
Aart Bik854a02b2015-07-14 16:07:00 -0700164 // Type I/F.
Aart Bik18b36ab2016-04-13 16:41:35 -0700165 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100166 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false),
167 SideEffects::FieldReadOfType(DataType::Type::kFloat32, /* is_volatile */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700168 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100169 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
170 SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
Aart Bik854a02b2015-07-14 16:07:00 -0700171 // Type L/D.
Aart Bik18b36ab2016-04-13 16:41:35 -0700172 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100173 SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false),
174 SideEffects::FieldReadOfType(DataType::Type::kFloat64, /* is_volatile */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700175 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100176 SideEffects::ArrayWriteOfType(DataType::Type::kInt64),
177 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700178}
179
180TEST(SideEffectsTest, AllWritesAndReads) {
181 SideEffects s = SideEffects::None();
182 // Keep taking the union of different writes and reads.
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100183 for (DataType::Type type : kTestTypes) {
Roland Levillain0d5a2812015-11-13 10:07:31 +0000184 s = s.Union(SideEffects::FieldWriteOfType(type, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700185 s = s.Union(SideEffects::ArrayWriteOfType(type));
Roland Levillain0d5a2812015-11-13 10:07:31 +0000186 s = s.Union(SideEffects::FieldReadOfType(type, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700187 s = s.Union(SideEffects::ArrayReadOfType(type));
188 }
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100189 EXPECT_TRUE(s.DoesAllReadWrite());
190}
191
192TEST(SideEffectsTest, GC) {
193 SideEffects can_trigger_gc = SideEffects::CanTriggerGC();
194 SideEffects depends_on_gc = SideEffects::DependsOnGC();
195 SideEffects all_changes = SideEffects::AllChanges();
196 SideEffects all_dependencies = SideEffects::AllDependencies();
197
198 EXPECT_TRUE(depends_on_gc.MayDependOn(can_trigger_gc));
199 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(can_trigger_gc));
200 EXPECT_FALSE(can_trigger_gc.MayDependOn(depends_on_gc));
201
202 EXPECT_TRUE(depends_on_gc.MayDependOn(all_changes));
203 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(all_changes));
204 EXPECT_FALSE(can_trigger_gc.MayDependOn(all_changes));
205
206 EXPECT_TRUE(all_changes.Includes(can_trigger_gc));
207 EXPECT_FALSE(all_changes.Includes(depends_on_gc));
208 EXPECT_TRUE(all_dependencies.Includes(depends_on_gc));
209 EXPECT_FALSE(all_dependencies.Includes(can_trigger_gc));
Aart Bik854a02b2015-07-14 16:07:00 -0700210}
211
212TEST(SideEffectsTest, BitStrings) {
213 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100214 "|||||||",
Aart Bik854a02b2015-07-14 16:07:00 -0700215 SideEffects::None().ToString().c_str());
216 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100217 "|GC|DFJISCBZL|DFJISCBZL|GC|DFJISCBZL|DFJISCBZL|",
Aart Bik854a02b2015-07-14 16:07:00 -0700218 SideEffects::All().ToString().c_str());
219 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100220 "|||||DFJISCBZL|DFJISCBZL|",
Aart Bik34c3ba92015-07-20 14:08:59 -0700221 SideEffects::AllWrites().ToString().c_str());
222 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100223 "||DFJISCBZL|DFJISCBZL||||",
Aart Bik34c3ba92015-07-20 14:08:59 -0700224 SideEffects::AllReads().ToString().c_str());
225 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100226 "||||||L|",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100227 SideEffects::FieldWriteOfType(DataType::Type::kReference, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700228 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700229 "||DFJISCBZL|DFJISCBZL||DFJISCBZL|DFJISCBZL|",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100230 SideEffects::FieldWriteOfType(DataType::Type::kReference, true).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700231 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100232 "|||||Z||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100233 SideEffects::ArrayWriteOfType(DataType::Type::kBool).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700234 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700235 "|||||C||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100236 SideEffects::ArrayWriteOfType(DataType::Type::kUint16).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700237 EXPECT_STREQ(
238 "|||||S||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100239 SideEffects::ArrayWriteOfType(DataType::Type::kInt16).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700240 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100241 "|||B||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100242 SideEffects::FieldReadOfType(DataType::Type::kInt8, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700243 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700244 "||D|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100245 SideEffects::ArrayReadOfType(DataType::Type::kFloat64).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700246 EXPECT_STREQ(
247 "||J|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100248 SideEffects::ArrayReadOfType(DataType::Type::kInt64).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700249 EXPECT_STREQ(
250 "||F|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100251 SideEffects::ArrayReadOfType(DataType::Type::kFloat32).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700252 EXPECT_STREQ(
253 "||I|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100254 SideEffects::ArrayReadOfType(DataType::Type::kInt32).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700255 SideEffects s = SideEffects::None();
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100256 s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kUint16, /* is_volatile */ false));
257 s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false));
258 s = s.Union(SideEffects::ArrayWriteOfType(DataType::Type::kInt16));
259 s = s.Union(SideEffects::FieldReadOfType(DataType::Type::kInt32, /* is_volatile */ false));
260 s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
261 s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik18b36ab2016-04-13 16:41:35 -0700262 EXPECT_STREQ("||DF|I||S|JC|", s.ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700263}
264
265} // namespace art