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