1be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray/* 2be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * Copyright (C) 2014 The Android Open Source Project 3be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * 4be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 5be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * you may not use this file except in compliance with the License. 6be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * You may obtain a copy of the License at 7be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * 8be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 9be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * 10be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * Unless required by applicable law or agreed to in writing, software 11be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 12be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * See the License for the specific language governing permissions and 14be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray * limitations under the License. 15be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray */ 16be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 17b666f4805c8ae707ea6fd7f6c7f375e0b000dba8Mathieu Chartier#include "base/arena_allocator.h" 18be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray#include "builder.h" 19be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray#include "dex_instruction.h" 20be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray#include "nodes.h" 213ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray#include "optimizing_unit_test.h" 22be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 23be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray#include "gtest/gtest.h" 24be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 25be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffraynamespace art { 26be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 27badd826664896d4a9628a5a89b78016894aa414bDavid Brazdilclass OptimizerTest : public CommonCompilerTest {}; 28badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil 29fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Markostatic void TestCode(const uint16_t* data, const uint32_t* blocks, size_t blocks_length) { 30be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray ArenaPool pool; 31be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray ArenaAllocator allocator(&pool); 32badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil HGraph* graph = CreateCFG(&allocator, data); 33fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko ASSERT_EQ(graph->GetBlocks().size(), blocks_length); 34804d09372cc3d80d537da1489da4a45e0e19aa5dNicolas Geoffray for (size_t i = 0, e = blocks_length; i < e; ++i) { 35fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko if (blocks[i] == kInvalidBlockId) { 36ec7802a102d49ab5c17495118d4fe0bcc7287bebVladimir Marko if (graph->GetBlocks()[i] == nullptr) { 37f776b92a0d52bb522043812dacb9c21ac11858e2Nicolas Geoffray // Dead block. 38f776b92a0d52bb522043812dacb9c21ac11858e2Nicolas Geoffray } else { 39f776b92a0d52bb522043812dacb9c21ac11858e2Nicolas Geoffray // Only the entry block has no dominator. 40ec7802a102d49ab5c17495118d4fe0bcc7287bebVladimir Marko ASSERT_EQ(nullptr, graph->GetBlocks()[i]->GetDominator()); 41ec7802a102d49ab5c17495118d4fe0bcc7287bebVladimir Marko ASSERT_TRUE(graph->GetBlocks()[i]->IsEntryBlock()); 42f776b92a0d52bb522043812dacb9c21ac11858e2Nicolas Geoffray } 43be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray } else { 44ec7802a102d49ab5c17495118d4fe0bcc7287bebVladimir Marko ASSERT_NE(nullptr, graph->GetBlocks()[i]->GetDominator()); 45ec7802a102d49ab5c17495118d4fe0bcc7287bebVladimir Marko ASSERT_EQ(blocks[i], graph->GetBlocks()[i]->GetDominator()->GetBlockId()); 46be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray } 47be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray } 48be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 49be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 50badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, ReturnVoid) { 513ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( 523ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID); // Block number 1 53be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 54fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 55fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 56fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 57fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1 58be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 59be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 603ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 61be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 62be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 63badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG1) { 643ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( 65be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO | 0x100, // Block number 1 663ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID); // Block number 2 67be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 68fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 69fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 70fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 71fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 72fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 2 73be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 74be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 753ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 76be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 77be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 78badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG2) { 793ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( 80be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO | 0x100, // Block number 1 81be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO | 0x100, // Block number 2 823ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID); // Block number 3 83be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 84fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 85fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 86fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 87fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 88fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 2, 89fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 3 90be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 91be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 923ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 93be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 94be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 95badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG3) { 963ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data1[] = ZERO_REGISTER_CODE_ITEM( 973ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x200, // Block number 1 983ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID, // Block number 2 993ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0xFF00); // Block number 3 1003ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray 101fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 102fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 103fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 104fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 3, 105fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 106fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 2 107be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 108be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1093ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data1, dominators, sizeof(dominators) / sizeof(int)); 110be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1113ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data2[] = ZERO_REGISTER_CODE_ITEM( 112be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO_16, 3, 113be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::RETURN_VOID, 1143ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO_16, 0xFFFF); 115be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1163ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data2, dominators, sizeof(dominators) / sizeof(int)); 117be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1183ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data3[] = ZERO_REGISTER_CODE_ITEM( 119be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO_32, 4, 0, 120be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::RETURN_VOID, 1213ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO_32, 0xFFFF, 0xFFFF); 122be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1233ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data3, dominators, sizeof(dominators) / sizeof(int)); 124be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 125be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 126badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG4) { 1273ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data1[] = ZERO_REGISTER_CODE_ITEM( 128be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::NOP, 1293ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0xFF00); 130be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 131fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 132fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 133788f2f05c3e5b0e5bda247b00e34f0094585546fNicolas Geoffray 3, 134788f2f05c3e5b0e5bda247b00e34f0094585546fNicolas Geoffray kInvalidBlockId, 135788f2f05c3e5b0e5bda247b00e34f0094585546fNicolas Geoffray 0 136be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 137be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1383ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data1, dominators, sizeof(dominators) / sizeof(int)); 139be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1403ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data2[] = ZERO_REGISTER_CODE_ITEM( 1413ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO_32, 0, 0); 142be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1433ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data2, dominators, sizeof(dominators) / sizeof(int)); 144be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 145be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 146badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG5) { 1473ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( 1483ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID, // Block number 1 1493ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x100, // Dead block 1503ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0xFE00); // Block number 2 1513ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray 152be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 153fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 154fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 155fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 156fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 157fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1 158be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 159be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1603ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 161be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 162be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 163badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG6) { 1643ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 165788aaadd0756a2854a3287ce79a77b031a9abdccNicolas Geoffray Instruction::CONST_4 | 0 | 0, 166be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::IF_EQ, 3, 167be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO | 0x100, 1683ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID); 169be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 170fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 171fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 172fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 173fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 174fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 175fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 3, 176fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, // Synthesized block to avoid critical edge. 177be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 178be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1793ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 180be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 181be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 182badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG7) { 1833ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 184788aaadd0756a2854a3287ce79a77b031a9abdccNicolas Geoffray Instruction::CONST_4 | 0 | 0, 1853ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::IF_EQ, 3, // Block number 1 1863ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x100, // Block number 2 1873ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0xFF00); // Block number 3 188be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 189fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 190fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 191fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 192fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 193fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 194fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, // exit block is not dominated by any block due to the spin loop. 195fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, // block to avoid critical edge. 196fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1 // block to avoid critical edge. 197be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 198be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 1993ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 200be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 201be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 202badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG8) { 2033ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 204788aaadd0756a2854a3287ce79a77b031a9abdccNicolas Geoffray Instruction::CONST_4 | 0 | 0, 2053ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::IF_EQ, 3, // Block number 1 2063ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x200, // Block number 2 2073ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x100, // Block number 3 2083ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0xFF00); // Block number 4 209be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 210fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 211fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 212fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 213fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 214fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 215fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 216fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, // exit block is not dominated by any block due to the spin loop. 217fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1 // block to avoid critical edge. 218be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 219be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 2203ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 221be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 222be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 223badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG9) { 2243ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 225788aaadd0756a2854a3287ce79a77b031a9abdccNicolas Geoffray Instruction::CONST_4 | 0 | 0, 2263ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::IF_EQ, 3, // Block number 1 2273ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x200, // Block number 2 2283ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0x100, // Block number 3 2293ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::GOTO | 0xFE00); // Block number 4 230be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 231fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 232fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 233fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 234fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 235fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 236fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 237fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, // exit block is not dominated by any block due to the spin loop. 238fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1 // block to avoid critical edge. 239be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 240be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 2413ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 242be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 243be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 244badd826664896d4a9628a5a89b78016894aa414bDavid BrazdilTEST_F(OptimizerTest, CFG10) { 245788aaadd0756a2854a3287ce79a77b031a9abdccNicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 246788aaadd0756a2854a3287ce79a77b031a9abdccNicolas Geoffray Instruction::CONST_4 | 0 | 0, 247be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::IF_EQ, 6, // Block number 1 248be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::IF_EQ, 3, // Block number 2 249be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO | 0x100, // Block number 3 250be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray Instruction::GOTO | 0x100, // Block number 4 2513ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray Instruction::RETURN_VOID); // Block number 5 252be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 253fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t dominators[] = { 254fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko kInvalidBlockId, 255fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 0, 256fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 257fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 2, 258fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 2, 259fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, 260fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 5, // Block number 5 dominates exit block 261fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 1, // block to avoid critical edge. 262fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko 2 // block to avoid critical edge. 263be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray }; 264be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 2653ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray TestCode(data, dominators, sizeof(dominators) / sizeof(int)); 266be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} 267be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 268be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray} // namespace art 269