blob: b01bc1ca0dbf04a9e7305520b515b48b0a9b3493 [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
17#include "gtest/gtest.h"
18#include "nodes.h"
19#include "primitive.h"
20
21namespace art {
22
23/**
24 * Tests for the SideEffects class.
25 */
26
27//
28// Helper methods.
29//
30
31void testWriteAndReadSanity(SideEffects write, SideEffects read) {
32 EXPECT_FALSE(write.DoesNothing());
33 EXPECT_FALSE(read.DoesNothing());
34
35 EXPECT_TRUE(write.DoesAnyWrite());
36 EXPECT_FALSE(write.DoesAnyRead());
37 EXPECT_FALSE(read.DoesAnyWrite());
38 EXPECT_TRUE(read.DoesAnyRead());
39
40 // All-dependences.
41 SideEffects all = SideEffects::All();
42 EXPECT_TRUE(all.MayDependOn(write));
43 EXPECT_FALSE(write.MayDependOn(all));
44 EXPECT_FALSE(all.MayDependOn(read));
45 EXPECT_TRUE(read.MayDependOn(all));
46
47 // None-dependences.
48 SideEffects none = SideEffects::None();
49 EXPECT_FALSE(none.MayDependOn(write));
50 EXPECT_FALSE(write.MayDependOn(none));
51 EXPECT_FALSE(none.MayDependOn(read));
52 EXPECT_FALSE(read.MayDependOn(none));
53}
54
55void testWriteAndReadDependence(SideEffects write, SideEffects read) {
56 testWriteAndReadSanity(write, read);
57
58 // Dependence only in one direction.
59 EXPECT_FALSE(write.MayDependOn(read));
60 EXPECT_TRUE(read.MayDependOn(write));
61}
62
63void testNoWriteAndReadDependence(SideEffects write, SideEffects read) {
64 testWriteAndReadSanity(write, read);
65
66 // No dependence in any direction.
67 EXPECT_FALSE(write.MayDependOn(read));
68 EXPECT_FALSE(read.MayDependOn(write));
69}
70
71//
72// Actual tests.
73//
74
75TEST(SideEffectsTest, All) {
76 SideEffects all = SideEffects::All();
77 EXPECT_TRUE(all.DoesAnyWrite());
78 EXPECT_TRUE(all.DoesAnyRead());
79 EXPECT_FALSE(all.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +010080 EXPECT_TRUE(all.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -070081}
82
83TEST(SideEffectsTest, None) {
84 SideEffects none = SideEffects::None();
85 EXPECT_FALSE(none.DoesAnyWrite());
86 EXPECT_FALSE(none.DoesAnyRead());
87 EXPECT_TRUE(none.DoesNothing());
Alexandre Rames78e3ef62015-08-12 13:43:29 +010088 EXPECT_FALSE(none.DoesAllReadWrite());
Aart Bik854a02b2015-07-14 16:07:00 -070089}
90
91TEST(SideEffectsTest, DependencesAndNoDependences) {
92 // Apply test to each individual primitive type.
93 for (Primitive::Type type = Primitive::kPrimNot;
94 type < Primitive::kPrimVoid;
95 type = Primitive::Type(type + 1)) {
96 // Same primitive type and access type: proper write/read dep.
97 testWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -070098 SideEffects::FieldWriteOfType(type, false),
99 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700100 testWriteAndReadDependence(
101 SideEffects::ArrayWriteOfType(type),
102 SideEffects::ArrayReadOfType(type));
103 // Same primitive type but different access type: no write/read dep.
104 testNoWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700105 SideEffects::FieldWriteOfType(type, false),
Aart Bik854a02b2015-07-14 16:07:00 -0700106 SideEffects::ArrayReadOfType(type));
107 testNoWriteAndReadDependence(
108 SideEffects::ArrayWriteOfType(type),
Aart Bik34c3ba92015-07-20 14:08:59 -0700109 SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700110 }
111}
112
113TEST(SideEffectsTest, NoDependences) {
114 // Different primitive type, same access type: no write/read dep.
115 testNoWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700116 SideEffects::FieldWriteOfType(Primitive::kPrimInt, false),
117 SideEffects::FieldReadOfType(Primitive::kPrimDouble, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700118 testNoWriteAndReadDependence(
119 SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
120 SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
121 // Everything different: no write/read dep.
122 testNoWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700123 SideEffects::FieldWriteOfType(Primitive::kPrimInt, false),
Aart Bik854a02b2015-07-14 16:07:00 -0700124 SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
125 testNoWriteAndReadDependence(
126 SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
Aart Bik34c3ba92015-07-20 14:08:59 -0700127 SideEffects::FieldReadOfType(Primitive::kPrimDouble, false));
128}
129
130TEST(SideEffectsTest, VolatileDependences) {
131 SideEffects volatile_write =
Roland Levillain0d5a2812015-11-13 10:07:31 +0000132 SideEffects::FieldWriteOfType(Primitive::kPrimInt, /* is_volatile */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700133 SideEffects any_write =
Roland Levillain0d5a2812015-11-13 10:07:31 +0000134 SideEffects::FieldWriteOfType(Primitive::kPrimInt, /* is_volatile */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700135 SideEffects volatile_read =
Roland Levillain0d5a2812015-11-13 10:07:31 +0000136 SideEffects::FieldReadOfType(Primitive::kPrimByte, /* is_volatile */ true);
Aart Bik34c3ba92015-07-20 14:08:59 -0700137 SideEffects any_read =
Roland Levillain0d5a2812015-11-13 10:07:31 +0000138 SideEffects::FieldReadOfType(Primitive::kPrimByte, /* is_volatile */ false);
Aart Bik34c3ba92015-07-20 14:08:59 -0700139
140 EXPECT_FALSE(volatile_write.MayDependOn(any_read));
141 EXPECT_TRUE(any_read.MayDependOn(volatile_write));
142 EXPECT_TRUE(volatile_write.MayDependOn(any_write));
143 EXPECT_FALSE(any_write.MayDependOn(volatile_write));
144
145 EXPECT_FALSE(volatile_read.MayDependOn(any_read));
146 EXPECT_TRUE(any_read.MayDependOn(volatile_read));
147 EXPECT_TRUE(volatile_read.MayDependOn(any_write));
148 EXPECT_FALSE(any_write.MayDependOn(volatile_read));
Aart Bik854a02b2015-07-14 16:07:00 -0700149}
150
Aart Bik18b36ab2016-04-13 16:41:35 -0700151TEST(SideEffectsTest, SameWidthTypesNoAlias) {
Aart Bik854a02b2015-07-14 16:07:00 -0700152 // Type I/F.
Aart Bik18b36ab2016-04-13 16:41:35 -0700153 testNoWriteAndReadDependence(
Roland Levillain0d5a2812015-11-13 10:07:31 +0000154 SideEffects::FieldWriteOfType(Primitive::kPrimInt, /* is_volatile */ false),
155 SideEffects::FieldReadOfType(Primitive::kPrimFloat, /* is_volatile */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700156 testNoWriteAndReadDependence(
Aart Bik854a02b2015-07-14 16:07:00 -0700157 SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
158 SideEffects::ArrayReadOfType(Primitive::kPrimFloat));
159 // Type L/D.
Aart Bik18b36ab2016-04-13 16:41:35 -0700160 testNoWriteAndReadDependence(
Roland Levillain0d5a2812015-11-13 10:07:31 +0000161 SideEffects::FieldWriteOfType(Primitive::kPrimLong, /* is_volatile */ false),
162 SideEffects::FieldReadOfType(Primitive::kPrimDouble, /* is_volatile */ false));
Aart Bik18b36ab2016-04-13 16:41:35 -0700163 testNoWriteAndReadDependence(
Aart Bik854a02b2015-07-14 16:07:00 -0700164 SideEffects::ArrayWriteOfType(Primitive::kPrimLong),
165 SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
166}
167
168TEST(SideEffectsTest, AllWritesAndReads) {
169 SideEffects s = SideEffects::None();
170 // Keep taking the union of different writes and reads.
171 for (Primitive::Type type = Primitive::kPrimNot;
172 type < Primitive::kPrimVoid;
173 type = Primitive::Type(type + 1)) {
Roland Levillain0d5a2812015-11-13 10:07:31 +0000174 s = s.Union(SideEffects::FieldWriteOfType(type, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700175 s = s.Union(SideEffects::ArrayWriteOfType(type));
Roland Levillain0d5a2812015-11-13 10:07:31 +0000176 s = s.Union(SideEffects::FieldReadOfType(type, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700177 s = s.Union(SideEffects::ArrayReadOfType(type));
178 }
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100179 EXPECT_TRUE(s.DoesAllReadWrite());
180}
181
182TEST(SideEffectsTest, GC) {
183 SideEffects can_trigger_gc = SideEffects::CanTriggerGC();
184 SideEffects depends_on_gc = SideEffects::DependsOnGC();
185 SideEffects all_changes = SideEffects::AllChanges();
186 SideEffects all_dependencies = SideEffects::AllDependencies();
187
188 EXPECT_TRUE(depends_on_gc.MayDependOn(can_trigger_gc));
189 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(can_trigger_gc));
190 EXPECT_FALSE(can_trigger_gc.MayDependOn(depends_on_gc));
191
192 EXPECT_TRUE(depends_on_gc.MayDependOn(all_changes));
193 EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(all_changes));
194 EXPECT_FALSE(can_trigger_gc.MayDependOn(all_changes));
195
196 EXPECT_TRUE(all_changes.Includes(can_trigger_gc));
197 EXPECT_FALSE(all_changes.Includes(depends_on_gc));
198 EXPECT_TRUE(all_dependencies.Includes(depends_on_gc));
199 EXPECT_FALSE(all_dependencies.Includes(can_trigger_gc));
Aart Bik854a02b2015-07-14 16:07:00 -0700200}
201
202TEST(SideEffectsTest, BitStrings) {
203 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100204 "|||||||",
Aart Bik854a02b2015-07-14 16:07:00 -0700205 SideEffects::None().ToString().c_str());
206 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100207 "|GC|DFJISCBZL|DFJISCBZL|GC|DFJISCBZL|DFJISCBZL|",
Aart Bik854a02b2015-07-14 16:07:00 -0700208 SideEffects::All().ToString().c_str());
209 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100210 "|||||DFJISCBZL|DFJISCBZL|",
Aart Bik34c3ba92015-07-20 14:08:59 -0700211 SideEffects::AllWrites().ToString().c_str());
212 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100213 "||DFJISCBZL|DFJISCBZL||||",
Aart Bik34c3ba92015-07-20 14:08:59 -0700214 SideEffects::AllReads().ToString().c_str());
215 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100216 "||||||L|",
Aart Bik34c3ba92015-07-20 14:08:59 -0700217 SideEffects::FieldWriteOfType(Primitive::kPrimNot, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700218 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700219 "||DFJISCBZL|DFJISCBZL||DFJISCBZL|DFJISCBZL|",
220 SideEffects::FieldWriteOfType(Primitive::kPrimNot, true).ToString().c_str());
221 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100222 "|||||Z||",
Aart Bik854a02b2015-07-14 16:07:00 -0700223 SideEffects::ArrayWriteOfType(Primitive::kPrimBoolean).ToString().c_str());
224 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700225 "|||||C||",
226 SideEffects::ArrayWriteOfType(Primitive::kPrimChar).ToString().c_str());
227 EXPECT_STREQ(
228 "|||||S||",
229 SideEffects::ArrayWriteOfType(Primitive::kPrimShort).ToString().c_str());
230 EXPECT_STREQ(
Alexandre Rames78e3ef62015-08-12 13:43:29 +0100231 "|||B||||",
Aart Bik34c3ba92015-07-20 14:08:59 -0700232 SideEffects::FieldReadOfType(Primitive::kPrimByte, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700233 EXPECT_STREQ(
Aart Bik18b36ab2016-04-13 16:41:35 -0700234 "||D|||||",
Aart Bik854a02b2015-07-14 16:07:00 -0700235 SideEffects::ArrayReadOfType(Primitive::kPrimDouble).ToString().c_str());
Aart Bik18b36ab2016-04-13 16:41:35 -0700236 EXPECT_STREQ(
237 "||J|||||",
238 SideEffects::ArrayReadOfType(Primitive::kPrimLong).ToString().c_str());
239 EXPECT_STREQ(
240 "||F|||||",
241 SideEffects::ArrayReadOfType(Primitive::kPrimFloat).ToString().c_str());
242 EXPECT_STREQ(
243 "||I|||||",
244 SideEffects::ArrayReadOfType(Primitive::kPrimInt).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700245 SideEffects s = SideEffects::None();
Roland Levillain0d5a2812015-11-13 10:07:31 +0000246 s = s.Union(SideEffects::FieldWriteOfType(Primitive::kPrimChar, /* is_volatile */ false));
247 s = s.Union(SideEffects::FieldWriteOfType(Primitive::kPrimLong, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700248 s = s.Union(SideEffects::ArrayWriteOfType(Primitive::kPrimShort));
Roland Levillain0d5a2812015-11-13 10:07:31 +0000249 s = s.Union(SideEffects::FieldReadOfType(Primitive::kPrimInt, /* is_volatile */ false));
Aart Bik854a02b2015-07-14 16:07:00 -0700250 s = s.Union(SideEffects::ArrayReadOfType(Primitive::kPrimFloat));
251 s = s.Union(SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
Aart Bik18b36ab2016-04-13 16:41:35 -0700252 EXPECT_STREQ("||DF|I||S|JC|", s.ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700253}
254
255} // namespace art