blob: f2b781dfa49b0fa93184aba535bea8115a490027 [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
Vladimír Marko434d9682022-11-04 14:04:17 +000019#include "base/macros.h"
Vladimir Marko0ebe0d82017-09-21 22:50:39 +010020#include "data_type.h"
Aart Bik854a02b2015-07-14 16:07:00 -070021#include "nodes.h"
Aart Bik854a02b2015-07-14 16:07:00 -070022
Vladimír Marko434d9682022-11-04 14:04:17 +000023namespace art HIDDEN {
Aart Bik854a02b2015-07-14 16:07:00 -070024
Vladimir Markod5d2f2c2017-09-26 12:37:26 +010025// Only runtime types other than void are allowed.
26static const DataType::Type kTestTypes[] = {
27 DataType::Type::kReference,
28 DataType::Type::kBool,
29 DataType::Type::kInt8,
30 DataType::Type::kUint16,
31 DataType::Type::kInt16,
32 DataType::Type::kInt32,
33 DataType::Type::kInt64,
34 DataType::Type::kFloat32,
35 DataType::Type::kFloat64,
36};
37
Aart Bik854a02b2015-07-14 16:07:00 -070038/**
39 * Tests for the SideEffects class.
40 */
41
42//
43// Helper methods.
44//
45
Orion Hodson2d455202020-07-28 16:22:10 +010046void testWriteAndReadEffects(SideEffects write, SideEffects read) {
Aart Bik854a02b2015-07-14 16:07:00 -070047 EXPECT_FALSE(write.DoesNothing());
48 EXPECT_FALSE(read.DoesNothing());
49
50 EXPECT_TRUE(write.DoesAnyWrite());
51 EXPECT_FALSE(write.DoesAnyRead());
52 EXPECT_FALSE(read.DoesAnyWrite());
53 EXPECT_TRUE(read.DoesAnyRead());
54
55 // All-dependences.
56 SideEffects all = SideEffects::All();
57 EXPECT_TRUE(all.MayDependOn(write));
58 EXPECT_FALSE(write.MayDependOn(all));
59 EXPECT_FALSE(all.MayDependOn(read));
60 EXPECT_TRUE(read.MayDependOn(all));
61
62 // None-dependences.
63 SideEffects none = SideEffects::None();
64 EXPECT_FALSE(none.MayDependOn(write));
65 EXPECT_FALSE(write.MayDependOn(none));
66 EXPECT_FALSE(none.MayDependOn(read));
67 EXPECT_FALSE(read.MayDependOn(none));
68}
69
70void testWriteAndReadDependence(SideEffects write, SideEffects read) {
Orion Hodson2d455202020-07-28 16:22:10 +010071 testWriteAndReadEffects(write, read);
Aart Bik854a02b2015-07-14 16:07:00 -070072
73 // Dependence only in one direction.
74 EXPECT_FALSE(write.MayDependOn(read));
75 EXPECT_TRUE(read.MayDependOn(write));
76}
77
78void testNoWriteAndReadDependence(SideEffects write, SideEffects read) {
Orion Hodson2d455202020-07-28 16:22:10 +010079 testWriteAndReadEffects(write, read);
Aart Bik854a02b2015-07-14 16:07:00 -070080
81 // No dependence in any direction.
82 EXPECT_FALSE(write.MayDependOn(read));
83 EXPECT_FALSE(read.MayDependOn(write));
84}
85
86//
87// Actual tests.
88//
89
90TEST(SideEffectsTest, All) {
91 SideEffects all = SideEffects::All();
92 EXPECT_TRUE(all.DoesAnyWrite());
93 EXPECT_TRUE(all.DoesAnyRead());
94 EXPECT_FALSE(all.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +010095 EXPECT_TRUE(all.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -070096}
97
98TEST(SideEffectsTest, None) {
99 SideEffects none = SideEffects::None();
100 EXPECT_FALSE(none.DoesAnyWrite());
101 EXPECT_FALSE(none.DoesAnyRead());
102 EXPECT_TRUE(none.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100103 EXPECT_FALSE(none.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -0700104}
105
106TEST(SideEffectsTest, DependencesAndNoDependences) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100107 // Apply test to each individual data type.
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100108 for (DataType::Type type : kTestTypes) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100109 // Same data type and access type: proper write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700110 testWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700111 SideEffects::FieldWriteOfType(type, false),
112 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700113 testWriteAndReadDependence(
114 SideEffects::ArrayWriteOfType(type),
115 SideEffects::ArrayReadOfType(type));
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100116 // Same data type but different access type: no write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700117 testNoWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700118 SideEffects::FieldWriteOfType(type, false),
Aart Bik854a02b2015-07-14 16:07:00 -0700119 SideEffects::ArrayReadOfType(type));
120 testNoWriteAndReadDependence(
121 SideEffects::ArrayWriteOfType(type),
Aart Bik34c3ba92015-07-20 14:08:59 -0700122 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700123 }
124}
125
126TEST(SideEffectsTest, NoDependences) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100127 // Different data type, same access type: no write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700128 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100129 SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
130 SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700131 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100132 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
133 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700134 // Everything different: no write/read dep.
135 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100136 SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
137 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700138 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100139 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
140 SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
Aart Bik34c3ba92015-07-20 14:08:59 -0700141}
142
143TEST(SideEffectsTest, VolatileDependences) {
144 SideEffects volatile_write =
Andreas Gampe3db70682018-12-26 15:12:03 -0800145 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile= */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700146 SideEffects any_write =
Andreas Gampe3db70682018-12-26 15:12:03 -0800147 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile= */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700148 SideEffects volatile_read =
Andreas Gampe3db70682018-12-26 15:12:03 -0800149 SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile= */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700150 SideEffects any_read =
Andreas Gampe3db70682018-12-26 15:12:03 -0800151 SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile= */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700152
153 EXPECT_FALSE(volatile_write.MayDependOn(any_read));
154 EXPECT_TRUE(any_read.MayDependOn(volatile_write));
155 EXPECT_TRUE(volatile_write.MayDependOn(any_write));
156 EXPECT_FALSE(any_write.MayDependOn(volatile_write));
157
158 EXPECT_FALSE(volatile_read.MayDependOn(any_read));
159 EXPECT_TRUE(any_read.MayDependOn(volatile_read));
160 EXPECT_TRUE(volatile_read.MayDependOn(any_write));
161 EXPECT_FALSE(any_write.MayDependOn(volatile_read));
Aart Bik854a02b2015-07-14 16:07:00 -0700162}
163
Aart Bik18b36ab2016-04-13 16:41:35 -0700164TEST(SideEffectsTest, SameWidthTypesNoAlias) {
Aart Bik854a02b2015-07-14 16:07:00 -0700165 // Type I/F.
Aart Bik18b36ab2016-04-13 16:41:35 -0700166 testNoWriteAndReadDependence(
Andreas Gampe3db70682018-12-26 15:12:03 -0800167 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile= */ false),
168 SideEffects::FieldReadOfType(DataType::Type::kFloat32, /* is_volatile= */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700169 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100170 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
171 SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
Aart Bik854a02b2015-07-14 16:07:00 -0700172 // Type L/D.
Aart Bik18b36ab2016-04-13 16:41:35 -0700173 testNoWriteAndReadDependence(
Andreas Gampe3db70682018-12-26 15:12:03 -0800174 SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile= */ false),
175 SideEffects::FieldReadOfType(DataType::Type::kFloat64, /* is_volatile= */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700176 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100177 SideEffects::ArrayWriteOfType(DataType::Type::kInt64),
178 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700179}
180
181TEST(SideEffectsTest, AllWritesAndReads) {
182 SideEffects s = SideEffects::None();
183 // Keep taking the union of different writes and reads.
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100184 for (DataType::Type type : kTestTypes) {
Andreas Gampe3db70682018-12-26 15:12:03 -0800185 s = s.Union(SideEffects::FieldWriteOfType(type, /* is_volatile= */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700186 s = s.Union(SideEffects::ArrayWriteOfType(type));
Andreas Gampe3db70682018-12-26 15:12:03 -0800187 s = s.Union(SideEffects::FieldReadOfType(type, /* is_volatile= */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700188 s = s.Union(SideEffects::ArrayReadOfType(type));
189 }
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100190 EXPECT_TRUE(s.DoesAllReadWrite());
191}
192
193TEST(SideEffectsTest, GC) {
194 SideEffects can_trigger_gc = SideEffects::CanTriggerGC();
195 SideEffects depends_on_gc = SideEffects::DependsOnGC();
196 SideEffects all_changes = SideEffects::AllChanges();
197 SideEffects all_dependencies = SideEffects::AllDependencies();
198
199 EXPECT_TRUE(depends_on_gc.MayDependOn(can_trigger_gc));
200 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(can_trigger_gc));
201 EXPECT_FALSE(can_trigger_gc.MayDependOn(depends_on_gc));
202
203 EXPECT_TRUE(depends_on_gc.MayDependOn(all_changes));
204 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(all_changes));
205 EXPECT_FALSE(can_trigger_gc.MayDependOn(all_changes));
Artem Serovd1aa7d02018-06-22 11:35:46 +0100206 EXPECT_FALSE(can_trigger_gc.MayDependOn(can_trigger_gc));
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100207
208 EXPECT_TRUE(all_changes.Includes(can_trigger_gc));
209 EXPECT_FALSE(all_changes.Includes(depends_on_gc));
210 EXPECT_TRUE(all_dependencies.Includes(depends_on_gc));
211 EXPECT_FALSE(all_dependencies.Includes(can_trigger_gc));
Aart Bik854a02b2015-07-14 16:07:00 -0700212}
213
214TEST(SideEffectsTest, BitStrings) {
215 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100216 "|||||||",
Aart Bik854a02b2015-07-14 16:07:00 -0700217 SideEffects::None().ToString().c_str());
218 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100219 "|GC|DFJISCBZL|DFJISCBZL|GC|DFJISCBZL|DFJISCBZL|",
Aart Bik854a02b2015-07-14 16:07:00 -0700220 SideEffects::All().ToString().c_str());
221 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100222 "|||||DFJISCBZL|DFJISCBZL|",
Aart Bik34c3ba92015-07-20 14:08:59 -0700223 SideEffects::AllWrites().ToString().c_str());
224 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100225 "||DFJISCBZL|DFJISCBZL||||",
Aart Bik34c3ba92015-07-20 14:08:59 -0700226 SideEffects::AllReads().ToString().c_str());
227 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100228 "||||||L|",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100229 SideEffects::FieldWriteOfType(DataType::Type::kReference, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700230 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700231 "||DFJISCBZL|DFJISCBZL||DFJISCBZL|DFJISCBZL|",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100232 SideEffects::FieldWriteOfType(DataType::Type::kReference, true).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700233 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100234 "|||||Z||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100235 SideEffects::ArrayWriteOfType(DataType::Type::kBool).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700236 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700237 "|||||C||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100238 SideEffects::ArrayWriteOfType(DataType::Type::kUint16).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700239 EXPECT_STREQ(
240 "|||||S||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100241 SideEffects::ArrayWriteOfType(DataType::Type::kInt16).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700242 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100243 "|||B||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100244 SideEffects::FieldReadOfType(DataType::Type::kInt8, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700245 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700246 "||D|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100247 SideEffects::ArrayReadOfType(DataType::Type::kFloat64).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700248 EXPECT_STREQ(
249 "||J|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100250 SideEffects::ArrayReadOfType(DataType::Type::kInt64).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700251 EXPECT_STREQ(
252 "||F|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100253 SideEffects::ArrayReadOfType(DataType::Type::kFloat32).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700254 EXPECT_STREQ(
255 "||I|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100256 SideEffects::ArrayReadOfType(DataType::Type::kInt32).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700257 SideEffects s = SideEffects::None();
Andreas Gampe3db70682018-12-26 15:12:03 -0800258 s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kUint16, /* is_volatile= */ false));
259 s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile= */ false));
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100260 s = s.Union(SideEffects::ArrayWriteOfType(DataType::Type::kInt16));
Andreas Gampe3db70682018-12-26 15:12:03 -0800261 s = s.Union(SideEffects::FieldReadOfType(DataType::Type::kInt32, /* is_volatile= */ false));
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100262 s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
263 s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik18b36ab2016-04-13 16:41:35 -0700264 EXPECT_STREQ("||DF|I||S|JC|", s.ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700265}
266
267} // namespace art