blob: ac5eb15228d490c261c2a758f67aa7259654c218 [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
24/**
25 * Tests for the SideEffects class.
26 */
27
28//
29// Helper methods.
30//
31
32void testWriteAndReadSanity(SideEffects write, SideEffects read) {
33 EXPECT_FALSE(write.DoesNothing());
34 EXPECT_FALSE(read.DoesNothing());
35
36 EXPECT_TRUE(write.DoesAnyWrite());
37 EXPECT_FALSE(write.DoesAnyRead());
38 EXPECT_FALSE(read.DoesAnyWrite());
39 EXPECT_TRUE(read.DoesAnyRead());
40
41 // All-dependences.
42 SideEffects all = SideEffects::All();
43 EXPECT_TRUE(all.MayDependOn(write));
44 EXPECT_FALSE(write.MayDependOn(all));
45 EXPECT_FALSE(all.MayDependOn(read));
46 EXPECT_TRUE(read.MayDependOn(all));
47
48 // None-dependences.
49 SideEffects none = SideEffects::None();
50 EXPECT_FALSE(none.MayDependOn(write));
51 EXPECT_FALSE(write.MayDependOn(none));
52 EXPECT_FALSE(none.MayDependOn(read));
53 EXPECT_FALSE(read.MayDependOn(none));
54}
55
56void testWriteAndReadDependence(SideEffects write, SideEffects read) {
57 testWriteAndReadSanity(write, read);
58
59 // Dependence only in one direction.
60 EXPECT_FALSE(write.MayDependOn(read));
61 EXPECT_TRUE(read.MayDependOn(write));
62}
63
64void testNoWriteAndReadDependence(SideEffects write, SideEffects read) {
65 testWriteAndReadSanity(write, read);
66
67 // No dependence in any direction.
68 EXPECT_FALSE(write.MayDependOn(read));
69 EXPECT_FALSE(read.MayDependOn(write));
70}
71
72//
73// Actual tests.
74//
75
76TEST(SideEffectsTest, All) {
77 SideEffects all = SideEffects::All();
78 EXPECT_TRUE(all.DoesAnyWrite());
79 EXPECT_TRUE(all.DoesAnyRead());
80 EXPECT_FALSE(all.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +010081 EXPECT_TRUE(all.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -070082}
83
84TEST(SideEffectsTest, None) {
85 SideEffects none = SideEffects::None();
86 EXPECT_FALSE(none.DoesAnyWrite());
87 EXPECT_FALSE(none.DoesAnyRead());
88 EXPECT_TRUE(none.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +010089 EXPECT_FALSE(none.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -070090}
91
92TEST(SideEffectsTest, DependencesAndNoDependences) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +010093 // Apply test to each individual data type.
94 for (DataType::Type type = DataType::Type::kReference;
95 type < DataType::Type::kVoid;
96 type = static_cast<DataType::Type>(static_cast<uint8_t>(type) + 1u)) {
97 // Same data type and access type: proper write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -070098 testWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -070099 SideEffects::FieldWriteOfType(type, false),
100 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700101 testWriteAndReadDependence(
102 SideEffects::ArrayWriteOfType(type),
103 SideEffects::ArrayReadOfType(type));
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100104 // Same data type but different access type: no write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700105 testNoWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700106 SideEffects::FieldWriteOfType(type, false),
Aart Bik854a02b2015-07-14 16:07:00 -0700107 SideEffects::ArrayReadOfType(type));
108 testNoWriteAndReadDependence(
109 SideEffects::ArrayWriteOfType(type),
Aart Bik34c3ba92015-07-20 14:08:59 -0700110 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700111 }
112}
113
114TEST(SideEffectsTest, NoDependences) {
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100115 // Different data type, same access type: no write/read dep.
Aart Bik854a02b2015-07-14 16:07:00 -0700116 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100117 SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
118 SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700119 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100120 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
121 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700122 // Everything different: no write/read dep.
123 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100124 SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
125 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700126 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100127 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
128 SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
Aart Bik34c3ba92015-07-20 14:08:59 -0700129}
130
131TEST(SideEffectsTest, VolatileDependences) {
132 SideEffects volatile_write =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100133 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700134 SideEffects any_write =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100135 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700136 SideEffects volatile_read =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100137 SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700138 SideEffects any_read =
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100139 SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700140
141 EXPECT_FALSE(volatile_write.MayDependOn(any_read));
142 EXPECT_TRUE(any_read.MayDependOn(volatile_write));
143 EXPECT_TRUE(volatile_write.MayDependOn(any_write));
144 EXPECT_FALSE(any_write.MayDependOn(volatile_write));
145
146 EXPECT_FALSE(volatile_read.MayDependOn(any_read));
147 EXPECT_TRUE(any_read.MayDependOn(volatile_read));
148 EXPECT_TRUE(volatile_read.MayDependOn(any_write));
149 EXPECT_FALSE(any_write.MayDependOn(volatile_read));
Aart Bik854a02b2015-07-14 16:07:00 -0700150}
151
Aart Bik18b36ab2016-04-13 16:41:35 -0700152TEST(SideEffectsTest, SameWidthTypesNoAlias) {
Aart Bik854a02b2015-07-14 16:07:00 -0700153 // Type I/F.
Aart Bik18b36ab2016-04-13 16:41:35 -0700154 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100155 SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false),
156 SideEffects::FieldReadOfType(DataType::Type::kFloat32, /* is_volatile */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700157 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100158 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
159 SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
Aart Bik854a02b2015-07-14 16:07:00 -0700160 // Type L/D.
Aart Bik18b36ab2016-04-13 16:41:35 -0700161 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100162 SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false),
163 SideEffects::FieldReadOfType(DataType::Type::kFloat64, /* is_volatile */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700164 testNoWriteAndReadDependence(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100165 SideEffects::ArrayWriteOfType(DataType::Type::kInt64),
166 SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik854a02b2015-07-14 16:07:00 -0700167}
168
169TEST(SideEffectsTest, AllWritesAndReads) {
170 SideEffects s = SideEffects::None();
171 // Keep taking the union of different writes and reads.
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100172 for (DataType::Type type = DataType::Type::kReference;
173 type < DataType::Type::kVoid;
174 type = static_cast<DataType::Type>(static_cast<uint8_t>(type) + 1u)) {
Roland Levillain0d5a2812015-11-13 10:07:31 +0000175 s = s.Union(SideEffects::FieldWriteOfType(type, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700176 s = s.Union(SideEffects::ArrayWriteOfType(type));
Roland Levillain0d5a2812015-11-13 10:07:31 +0000177 s = s.Union(SideEffects::FieldReadOfType(type, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700178 s = s.Union(SideEffects::ArrayReadOfType(type));
179 }
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100180 EXPECT_TRUE(s.DoesAllReadWrite());
181}
182
183TEST(SideEffectsTest, GC) {
184 SideEffects can_trigger_gc = SideEffects::CanTriggerGC();
185 SideEffects depends_on_gc = SideEffects::DependsOnGC();
186 SideEffects all_changes = SideEffects::AllChanges();
187 SideEffects all_dependencies = SideEffects::AllDependencies();
188
189 EXPECT_TRUE(depends_on_gc.MayDependOn(can_trigger_gc));
190 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(can_trigger_gc));
191 EXPECT_FALSE(can_trigger_gc.MayDependOn(depends_on_gc));
192
193 EXPECT_TRUE(depends_on_gc.MayDependOn(all_changes));
194 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(all_changes));
195 EXPECT_FALSE(can_trigger_gc.MayDependOn(all_changes));
196
197 EXPECT_TRUE(all_changes.Includes(can_trigger_gc));
198 EXPECT_FALSE(all_changes.Includes(depends_on_gc));
199 EXPECT_TRUE(all_dependencies.Includes(depends_on_gc));
200 EXPECT_FALSE(all_dependencies.Includes(can_trigger_gc));
Aart Bik854a02b2015-07-14 16:07:00 -0700201}
202
203TEST(SideEffectsTest, BitStrings) {
204 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100205 "|||||||",
Aart Bik854a02b2015-07-14 16:07:00 -0700206 SideEffects::None().ToString().c_str());
207 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100208 "|GC|DFJISCBZL|DFJISCBZL|GC|DFJISCBZL|DFJISCBZL|",
Aart Bik854a02b2015-07-14 16:07:00 -0700209 SideEffects::All().ToString().c_str());
210 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100211 "|||||DFJISCBZL|DFJISCBZL|",
Aart Bik34c3ba92015-07-20 14:08:59 -0700212 SideEffects::AllWrites().ToString().c_str());
213 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100214 "||DFJISCBZL|DFJISCBZL||||",
Aart Bik34c3ba92015-07-20 14:08:59 -0700215 SideEffects::AllReads().ToString().c_str());
216 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100217 "||||||L|",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100218 SideEffects::FieldWriteOfType(DataType::Type::kReference, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700219 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700220 "||DFJISCBZL|DFJISCBZL||DFJISCBZL|DFJISCBZL|",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100221 SideEffects::FieldWriteOfType(DataType::Type::kReference, true).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700222 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100223 "|||||Z||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100224 SideEffects::ArrayWriteOfType(DataType::Type::kBool).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700225 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700226 "|||||C||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100227 SideEffects::ArrayWriteOfType(DataType::Type::kUint16).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700228 EXPECT_STREQ(
229 "|||||S||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100230 SideEffects::ArrayWriteOfType(DataType::Type::kInt16).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700231 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100232 "|||B||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100233 SideEffects::FieldReadOfType(DataType::Type::kInt8, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700234 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700235 "||D|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100236 SideEffects::ArrayReadOfType(DataType::Type::kFloat64).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700237 EXPECT_STREQ(
238 "||J|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100239 SideEffects::ArrayReadOfType(DataType::Type::kInt64).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700240 EXPECT_STREQ(
241 "||F|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100242 SideEffects::ArrayReadOfType(DataType::Type::kFloat32).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700243 EXPECT_STREQ(
244 "||I|||||",
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100245 SideEffects::ArrayReadOfType(DataType::Type::kInt32).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700246 SideEffects s = SideEffects::None();
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100247 s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kUint16, /* is_volatile */ false));
248 s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false));
249 s = s.Union(SideEffects::ArrayWriteOfType(DataType::Type::kInt16));
250 s = s.Union(SideEffects::FieldReadOfType(DataType::Type::kInt32, /* is_volatile */ false));
251 s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
252 s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
Aart Bik18b36ab2016-04-13 16:41:35 -0700253 EXPECT_STREQ("||DF|I||S|JC|", s.ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700254}
255
256} // namespace art