1854a02b1b488327f80c544ca1119b386b8715c26Aart Bik/*
2854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * Copyright (C) 2015 The Android Open Source Project
3854a02b1b488327f80c544ca1119b386b8715c26Aart Bik *
4854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * Licensed under the Apache License, Version 2.0 (the "License");
5854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * you may not read this file except in compliance with the License.
6854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * You may obtain a copy of the License at
7854a02b1b488327f80c544ca1119b386b8715c26Aart Bik *
8854a02b1b488327f80c544ca1119b386b8715c26Aart Bik *      http://www.apache.org/licenses/LICENSE-2.0
9854a02b1b488327f80c544ca1119b386b8715c26Aart Bik *
10854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * Unless required by applicable law or agreed to in writing, software
11854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * distributed under the License is distributed on an "AS IS" BASIS,
12854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * See the License for the specific language governing permissions and
14854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * limitations under the License.
15854a02b1b488327f80c544ca1119b386b8715c26Aart Bik */
16854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
170ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko#include <gtest/gtest.h>
180ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko
190ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko#include "data_type.h"
20854a02b1b488327f80c544ca1119b386b8715c26Aart Bik#include "nodes.h"
21854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
22854a02b1b488327f80c544ca1119b386b8715c26Aart Biknamespace art {
23854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
24d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko// Only runtime types other than void are allowed.
25d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Markostatic const DataType::Type kTestTypes[] = {
26d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kReference,
27d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kBool,
28d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kInt8,
29d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kUint16,
30d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kInt16,
31d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kInt32,
32d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kInt64,
33d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kFloat32,
34d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko    DataType::Type::kFloat64,
35d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko};
36d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko
37854a02b1b488327f80c544ca1119b386b8715c26Aart Bik/**
38854a02b1b488327f80c544ca1119b386b8715c26Aart Bik * Tests for the SideEffects class.
39854a02b1b488327f80c544ca1119b386b8715c26Aart Bik */
40854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
41854a02b1b488327f80c544ca1119b386b8715c26Aart Bik//
42854a02b1b488327f80c544ca1119b386b8715c26Aart Bik// Helper methods.
43854a02b1b488327f80c544ca1119b386b8715c26Aart Bik//
44854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
45854a02b1b488327f80c544ca1119b386b8715c26Aart Bikvoid testWriteAndReadSanity(SideEffects write, SideEffects read) {
46854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(write.DoesNothing());
47854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(read.DoesNothing());
48854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
49854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(write.DoesAnyWrite());
50854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(write.DoesAnyRead());
51854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(read.DoesAnyWrite());
52854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(read.DoesAnyRead());
53854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
54854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // All-dependences.
55854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  SideEffects all = SideEffects::All();
56854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(all.MayDependOn(write));
57854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(write.MayDependOn(all));
58854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(all.MayDependOn(read));
59854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(read.MayDependOn(all));
60854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
61854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // None-dependences.
62854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  SideEffects none = SideEffects::None();
63854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(none.MayDependOn(write));
64854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(write.MayDependOn(none));
65854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(none.MayDependOn(read));
66854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(read.MayDependOn(none));
67854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
68854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
69854a02b1b488327f80c544ca1119b386b8715c26Aart Bikvoid testWriteAndReadDependence(SideEffects write, SideEffects read) {
70854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  testWriteAndReadSanity(write, read);
71854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
72854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // Dependence only in one direction.
73854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(write.MayDependOn(read));
74854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(read.MayDependOn(write));
75854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
76854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
77854a02b1b488327f80c544ca1119b386b8715c26Aart Bikvoid testNoWriteAndReadDependence(SideEffects write, SideEffects read) {
78854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  testWriteAndReadSanity(write, read);
79854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
80854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // No dependence in any direction.
81854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(write.MayDependOn(read));
82854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(read.MayDependOn(write));
83854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
84854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
85854a02b1b488327f80c544ca1119b386b8715c26Aart Bik//
86854a02b1b488327f80c544ca1119b386b8715c26Aart Bik// Actual tests.
87854a02b1b488327f80c544ca1119b386b8715c26Aart Bik//
88854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
89854a02b1b488327f80c544ca1119b386b8715c26Aart BikTEST(SideEffectsTest, All) {
90854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  SideEffects all = SideEffects::All();
91854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(all.DoesAnyWrite());
92854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(all.DoesAnyRead());
93854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(all.DoesNothing());
9478e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(all.DoesAllReadWrite());
95854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
96854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
97854a02b1b488327f80c544ca1119b386b8715c26Aart BikTEST(SideEffectsTest, None) {
98854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  SideEffects none = SideEffects::None();
99854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(none.DoesAnyWrite());
100854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_FALSE(none.DoesAnyRead());
101854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_TRUE(none.DoesNothing());
10278e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_FALSE(none.DoesAllReadWrite());
103854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
104854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
105854a02b1b488327f80c544ca1119b386b8715c26Aart BikTEST(SideEffectsTest, DependencesAndNoDependences) {
1060ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  // Apply test to each individual data type.
107d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko  for (DataType::Type type : kTestTypes) {
1080ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko    // Same data type and access type: proper write/read dep.
109854a02b1b488327f80c544ca1119b386b8715c26Aart Bik    testWriteAndReadDependence(
11034c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik        SideEffects::FieldWriteOfType(type, false),
11134c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik        SideEffects::FieldReadOfType(type, false));
112854a02b1b488327f80c544ca1119b386b8715c26Aart Bik    testWriteAndReadDependence(
113854a02b1b488327f80c544ca1119b386b8715c26Aart Bik        SideEffects::ArrayWriteOfType(type),
114854a02b1b488327f80c544ca1119b386b8715c26Aart Bik        SideEffects::ArrayReadOfType(type));
1150ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko    // Same data type but different access type: no write/read dep.
116854a02b1b488327f80c544ca1119b386b8715c26Aart Bik    testNoWriteAndReadDependence(
11734c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik        SideEffects::FieldWriteOfType(type, false),
118854a02b1b488327f80c544ca1119b386b8715c26Aart Bik        SideEffects::ArrayReadOfType(type));
119854a02b1b488327f80c544ca1119b386b8715c26Aart Bik    testNoWriteAndReadDependence(
120854a02b1b488327f80c544ca1119b386b8715c26Aart Bik        SideEffects::ArrayWriteOfType(type),
12134c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik        SideEffects::FieldReadOfType(type, false));
122854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  }
123854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
124854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
125854a02b1b488327f80c544ca1119b386b8715c26Aart BikTEST(SideEffectsTest, NoDependences) {
1260ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  // Different data type, same access type: no write/read dep.
127854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  testNoWriteAndReadDependence(
1280ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
1290ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
130854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  testNoWriteAndReadDependence(
1310ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
1320ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
133854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // Everything different: no write/read dep.
134854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  testNoWriteAndReadDependence(
1350ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
1360ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
137854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  testNoWriteAndReadDependence(
1380ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
1390ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
14034c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik}
14134c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik
14234c3ba93e74d14ab832297ff590cb76c3f0f519dAart BikTEST(SideEffectsTest, VolatileDependences) {
14334c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  SideEffects volatile_write =
1440ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ true);
14534c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  SideEffects any_write =
1460ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false);
14734c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  SideEffects volatile_read =
1480ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ true);
14934c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  SideEffects any_read =
1500ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ false);
15134c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik
15234c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_FALSE(volatile_write.MayDependOn(any_read));
15334c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_TRUE(any_read.MayDependOn(volatile_write));
15434c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_TRUE(volatile_write.MayDependOn(any_write));
15534c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_FALSE(any_write.MayDependOn(volatile_write));
15634c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik
15734c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_FALSE(volatile_read.MayDependOn(any_read));
15834c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_TRUE(any_read.MayDependOn(volatile_read));
15934c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_TRUE(volatile_read.MayDependOn(any_write));
16034c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_FALSE(any_write.MayDependOn(volatile_read));
161854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
162854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
16318b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart BikTEST(SideEffectsTest, SameWidthTypesNoAlias) {
164854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // Type I/F.
16518b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  testNoWriteAndReadDependence(
1660ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false),
1670ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kFloat32, /* is_volatile */ false));
16818b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  testNoWriteAndReadDependence(
1690ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
1700ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
171854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // Type L/D.
17218b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  testNoWriteAndReadDependence(
1730ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false),
1740ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kFloat64, /* is_volatile */ false));
17518b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  testNoWriteAndReadDependence(
1760ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kInt64),
1770ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
178854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
179854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
180854a02b1b488327f80c544ca1119b386b8715c26Aart BikTEST(SideEffectsTest, AllWritesAndReads) {
181854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  SideEffects s = SideEffects::None();
182854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // Keep taking the union of different writes and reads.
183d5d2f2ce627aa0f6920d7ae05197abd1a396e035Vladimir Marko  for (DataType::Type type : kTestTypes) {
1840d5a281c671444bfa75d63caf1427a8c0e6e1177Roland Levillain    s = s.Union(SideEffects::FieldWriteOfType(type, /* is_volatile */ false));
185854a02b1b488327f80c544ca1119b386b8715c26Aart Bik    s = s.Union(SideEffects::ArrayWriteOfType(type));
1860d5a281c671444bfa75d63caf1427a8c0e6e1177Roland Levillain    s = s.Union(SideEffects::FieldReadOfType(type, /* is_volatile */ false));
187854a02b1b488327f80c544ca1119b386b8715c26Aart Bik    s = s.Union(SideEffects::ArrayReadOfType(type));
188854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  }
18978e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(s.DoesAllReadWrite());
19078e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames}
19178e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames
19278e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre RamesTEST(SideEffectsTest, GC) {
19378e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  SideEffects can_trigger_gc = SideEffects::CanTriggerGC();
19478e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  SideEffects depends_on_gc = SideEffects::DependsOnGC();
19578e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  SideEffects all_changes = SideEffects::AllChanges();
19678e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  SideEffects all_dependencies = SideEffects::AllDependencies();
19778e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames
19878e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(depends_on_gc.MayDependOn(can_trigger_gc));
19978e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(can_trigger_gc));
20078e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_FALSE(can_trigger_gc.MayDependOn(depends_on_gc));
20178e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames
20278e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(depends_on_gc.MayDependOn(all_changes));
20378e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(depends_on_gc.Union(can_trigger_gc).MayDependOn(all_changes));
20478e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_FALSE(can_trigger_gc.MayDependOn(all_changes));
20578e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames
20678e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(all_changes.Includes(can_trigger_gc));
20778e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_FALSE(all_changes.Includes(depends_on_gc));
20878e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_TRUE(all_dependencies.Includes(depends_on_gc));
20978e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames  EXPECT_FALSE(all_dependencies.Includes(can_trigger_gc));
210854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
211854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
212854a02b1b488327f80c544ca1119b386b8715c26Aart BikTEST(SideEffectsTest, BitStrings) {
213854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_STREQ(
21478e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "|||||||",
215854a02b1b488327f80c544ca1119b386b8715c26Aart Bik      SideEffects::None().ToString().c_str());
216854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_STREQ(
21778e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "|GC|DFJISCBZL|DFJISCBZL|GC|DFJISCBZL|DFJISCBZL|",
218854a02b1b488327f80c544ca1119b386b8715c26Aart Bik      SideEffects::All().ToString().c_str());
219854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_STREQ(
22078e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "|||||DFJISCBZL|DFJISCBZL|",
22134c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik      SideEffects::AllWrites().ToString().c_str());
22234c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_STREQ(
22378e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "||DFJISCBZL|DFJISCBZL||||",
22434c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik      SideEffects::AllReads().ToString().c_str());
22534c3ba93e74d14ab832297ff590cb76c3f0f519dAart Bik  EXPECT_STREQ(
22678e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "||||||L|",
2270ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kReference, false).ToString().c_str());
228854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_STREQ(
22918b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "||DFJISCBZL|DFJISCBZL||DFJISCBZL|DFJISCBZL|",
2300ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldWriteOfType(DataType::Type::kReference, true).ToString().c_str());
23118b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ(
23278e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "|||||Z||",
2330ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kBool).ToString().c_str());
234854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_STREQ(
23518b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "|||||C||",
2360ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kUint16).ToString().c_str());
23718b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ(
23818b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "|||||S||",
2390ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayWriteOfType(DataType::Type::kInt16).ToString().c_str());
24018b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ(
24178e3ef6bc5f8aa149f2f8bf0c78ce854c2f910faAlexandre Rames      "|||B||||",
2420ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::FieldReadOfType(DataType::Type::kInt8, false).ToString().c_str());
243854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  EXPECT_STREQ(
24418b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "||D|||||",
2450ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kFloat64).ToString().c_str());
24618b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ(
24718b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "||J|||||",
2480ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kInt64).ToString().c_str());
24918b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ(
25018b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "||F|||||",
2510ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kFloat32).ToString().c_str());
25218b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ(
25318b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik      "||I|||||",
2540ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko      SideEffects::ArrayReadOfType(DataType::Type::kInt32).ToString().c_str());
255854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  SideEffects s = SideEffects::None();
2560ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kUint16, /* is_volatile */ false));
2570ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false));
2580ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  s = s.Union(SideEffects::ArrayWriteOfType(DataType::Type::kInt16));
2590ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  s = s.Union(SideEffects::FieldReadOfType(DataType::Type::kInt32, /* is_volatile */ false));
2600ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
2610ebe0d83138bba1996e9c8007969b5381d972b32Vladimir Marko  s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
26218b36abc7cc03076fe1c399c0bb8ec8793cc6806Aart Bik  EXPECT_STREQ("||DF|I||S|JC|", s.ToString().c_str());
263854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}
264854a02b1b488327f80c544ca1119b386b8715c26Aart Bik
265854a02b1b488327f80c544ca1119b386b8715c26Aart Bik}  // namespace art
266