blob: 8db5a8a35075917d0886b7d0990be7423d211906 [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());
80 EXPECT_TRUE(all.DoesAll());
81}
82
83TEST(SideEffectsTest, None) {
84 SideEffects none = SideEffects::None();
85 EXPECT_FALSE(none.DoesAnyWrite());
86 EXPECT_FALSE(none.DoesAnyRead());
87 EXPECT_TRUE(none.DoesNothing());
88 EXPECT_FALSE(none.DoesAll());
89}
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 =
132 SideEffects::FieldWriteOfType(Primitive::kPrimInt, true);
133 SideEffects any_write =
134 SideEffects::FieldWriteOfType(Primitive::kPrimInt, false);
135 SideEffects volatile_read =
136 SideEffects::FieldReadOfType(Primitive::kPrimByte, true);
137 SideEffects any_read =
138 SideEffects::FieldReadOfType(Primitive::kPrimByte, false);
139
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
151TEST(SideEffectsTest, SameWidthTypes) {
152 // Type I/F.
153 testWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700154 SideEffects::FieldWriteOfType(Primitive::kPrimInt, false),
155 SideEffects::FieldReadOfType(Primitive::kPrimFloat, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700156 testWriteAndReadDependence(
157 SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
158 SideEffects::ArrayReadOfType(Primitive::kPrimFloat));
159 // Type L/D.
160 testWriteAndReadDependence(
Aart Bik34c3ba92015-07-20 14:08:59 -0700161 SideEffects::FieldWriteOfType(Primitive::kPrimLong, false),
162 SideEffects::FieldReadOfType(Primitive::kPrimDouble, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700163 testWriteAndReadDependence(
164 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)) {
Aart Bik34c3ba92015-07-20 14:08:59 -0700174 s = s.Union(SideEffects::FieldWriteOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700175 s = s.Union(SideEffects::ArrayWriteOfType(type));
Aart Bik34c3ba92015-07-20 14:08:59 -0700176 s = s.Union(SideEffects::FieldReadOfType(type, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700177 s = s.Union(SideEffects::ArrayReadOfType(type));
178 }
179 EXPECT_TRUE(s.DoesAll());
180}
181
182TEST(SideEffectsTest, BitStrings) {
183 EXPECT_STREQ(
184 "|||||",
185 SideEffects::None().ToString().c_str());
186 EXPECT_STREQ(
187 "|DFJISCBZL|DFJISCBZL|DFJISCBZL|DFJISCBZL|",
188 SideEffects::All().ToString().c_str());
189 EXPECT_STREQ(
Aart Bik34c3ba92015-07-20 14:08:59 -0700190 "|||DFJISCBZL|DFJISCBZL|",
191 SideEffects::AllWrites().ToString().c_str());
192 EXPECT_STREQ(
193 "|DFJISCBZL|DFJISCBZL|||",
194 SideEffects::AllReads().ToString().c_str());
195 EXPECT_STREQ(
Aart Bik854a02b2015-07-14 16:07:00 -0700196 "||||L|",
Aart Bik34c3ba92015-07-20 14:08:59 -0700197 SideEffects::FieldWriteOfType(Primitive::kPrimNot, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700198 EXPECT_STREQ(
199 "|||Z||",
200 SideEffects::ArrayWriteOfType(Primitive::kPrimBoolean).ToString().c_str());
201 EXPECT_STREQ(
202 "||B|||",
Aart Bik34c3ba92015-07-20 14:08:59 -0700203 SideEffects::FieldReadOfType(Primitive::kPrimByte, false).ToString().c_str());
Aart Bik854a02b2015-07-14 16:07:00 -0700204 EXPECT_STREQ(
205 "|DJ||||", // note: DJ alias
206 SideEffects::ArrayReadOfType(Primitive::kPrimDouble).ToString().c_str());
207 SideEffects s = SideEffects::None();
Aart Bik34c3ba92015-07-20 14:08:59 -0700208 s = s.Union(SideEffects::FieldWriteOfType(Primitive::kPrimChar, false));
209 s = s.Union(SideEffects::FieldWriteOfType(Primitive::kPrimLong, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700210 s = s.Union(SideEffects::ArrayWriteOfType(Primitive::kPrimShort));
Aart Bik34c3ba92015-07-20 14:08:59 -0700211 s = s.Union(SideEffects::FieldReadOfType(Primitive::kPrimInt, false));
Aart Bik854a02b2015-07-14 16:07:00 -0700212 s = s.Union(SideEffects::ArrayReadOfType(Primitive::kPrimFloat));
213 s = s.Union(SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
214 EXPECT_STREQ(
215 "|DFJI|FI|S|DJC|", // note: DJ/FI alias.
216 s.ToString().c_str());
217}
218
219} // namespace art