10d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray/* 20d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * Copyright (C) 2014 The Android Open Source Project 30d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * 40d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 50d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * you may not use this file except in compliance with the License. 60d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * You may obtain a copy of the License at 70d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * 80d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 90d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * 100d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software 110d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 120d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * See the License for the specific language governing permissions and 140d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray * limitations under the License. 150d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray */ 160d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 170d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include <fstream> 180d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 19fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell#include "arch/x86/instruction_set_features_x86.h" 20b666f4805c8ae707ea6fd7f6c7f375e0b000dba8Mathieu Chartier#include "base/arena_allocator.h" 210d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "base/stringprintf.h" 220d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "builder.h" 2331d76b42ef5165351499da3f8ee0ac147428c5edNicolas Geoffray#include "code_generator.h" 248a16d97fb8f031822b206e65f9109a071da40563Nicolas Geoffray#include "code_generator_x86.h" 250d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "dex_file.h" 260d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "dex_instruction.h" 27cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle#include "driver/compiler_options.h" 280d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "graph_visualizer.h" 290d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "nodes.h" 300d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "optimizing_unit_test.h" 310d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "pretty_printer.h" 320d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "ssa_liveness_analysis.h" 330d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 3468289a531484d26214e09f1eadd9833531a3bc3cAlex Lightnamespace art { 35d9510dfc32349eeb4f2145c801f7ba1d5bccfb12David Brazdil 364833f5a1990c76bc2be89504225fb13cca22bedfDavid Brazdilclass LinearizeTest : public CommonCompilerTest {}; 374833f5a1990c76bc2be89504225fb13cca22bedfDavid Brazdil 38fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Markotemplate <size_t number_of_blocks> 39fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Markostatic void TestCode(const uint16_t* data, const uint32_t (&expected_order)[number_of_blocks]) { 400d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray ArenaPool pool; 410d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray ArenaAllocator allocator(&pool); 42badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil HGraph* graph = CreateCFG(&allocator, data); 43fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell std::unique_ptr<const X86InstructionSetFeatures> features_x86( 44fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell X86InstructionSetFeatures::FromCppDefines()); 45fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell x86::CodeGeneratorX86 codegen(graph, *features_x86.get(), CompilerOptions()); 460d9f17de8f21a10702de1510b73e89d07b3b9bbfNicolas Geoffray SsaLivenessAnalysis liveness(graph, &codegen); 470d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray liveness.Analyze(); 480d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 49fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko ASSERT_EQ(graph->GetLinearOrder().size(), number_of_blocks); 500d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray for (size_t i = 0; i < number_of_blocks; ++i) { 51fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko ASSERT_EQ(graph->GetLinearOrder()[i]->GetBlockId(), expected_order[i]); 520d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray } 530d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 540d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 554833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG1) { 568f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Structure of this graph (+ are back edges) 570d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 580d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 590d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 600d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 618f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block2 ++++++ 628f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / \ + 638f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block5 Block7 + 648f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | | + 658f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 Block3 + 668f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 670d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block4 Block8 680d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 690d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 700d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 710d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 5, 720d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 730d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00, 740d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID); 750d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 76fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 7, 3, 4, 8, 5, 6}; 77fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 780d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 790d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 804833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG2) { 818f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Structure of this graph (+ are back edges) 820d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 830d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 840d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 850d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 868f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block2 ++++++ 878f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / \ + 888f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block3 Block7 + 898f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | | + 908f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 Block4 + 918f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 920d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block5 Block8 930d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 940d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 950d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 960d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 3, 970d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID, 980d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFD, 990d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00); 1000d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 101fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 7, 4, 5, 8, 3, 6}; 102fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1030d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1040d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1054833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG3) { 1068f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Structure of this graph (+ are back edges) 1070d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 1080d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1090d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 1100d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1118f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block2 ++++++ 1128f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / \ + 1138f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block3 Block8 + 1148f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | | + 1158f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block7 Block5 + 1168f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / + \ + 1178f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 + Block9 1188f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + 1198f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block4 ++ 1200d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 1210d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 1220d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 4, 1230d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID, 1240d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0x0100, 1250d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFC, 1260d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFD00); 1270d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 128fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 8, 5, 6, 4, 9, 3, 7}; 129fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1300d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1310d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1324833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG4) { 1338f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray /* Structure of this graph (+ are back edges) 1340d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 1350d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1360d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 1370d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1380d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block2 1398f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / + \ 1408f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 + Block8 1418f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + | 1428f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block7 + Block3 +++++++ 1438f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 1448f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block9 Block10 + 1458f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + 1468f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block4 + 1478f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 1480d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block5 Block11 1498f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray */ 1500d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 1510d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 1520d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 7, 1530d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 1540d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 1550d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00, 1560d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID); 1570d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 158fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 8, 3, 10, 4, 5, 11, 9, 6, 7}; 159fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1600d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1610d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1624833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG5) { 1638f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray /* Structure of this graph (+ are back edges) 1640d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 1650d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1660d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 1670d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1680d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block2 1698f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / + \ 1708f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block3 + Block8 1718f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + | 1728f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block7 + Block4 +++++++ 1738f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 1748f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block9 Block10 + 1758f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + 1768f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block5 + 1778f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // +/ \ + 1780d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block6 Block11 1798f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray */ 1800d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 1810d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 1820d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 3, 1830d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID, 1840d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFD, 1850d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 1860d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00); 1870d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 188fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 8, 4, 10, 5, 6, 11, 9, 3, 7}; 189fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1900d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1910d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1924833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG6) { 193a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block0 194a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 195a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block1 196a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 197a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block2 ++++++++++++++ 198a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | + 199a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block3 + 200a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // / \ + 201a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block8 Block4 + 202a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | / \ + 203a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block5 <- Block9 Block6 + 204a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 205a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block7 206a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 207a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::CONST_4 | 0 | 0, 208a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0x0100, 209a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0004, 210a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0003, 211a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::RETURN_VOID, 212a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0xFA00); 213a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 214fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 3, 4, 6, 9, 8, 5, 7}; 215fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 216a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray} 217a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 2184833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG7) { 219a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Structure of this graph (+ are back edges) 220a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block0 221a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 222a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block1 223a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 224a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block2 ++++++++ 225a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | + 226a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block3 + 227a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // / \ + 228a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block4 Block8 + 229a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // / \ | + 230a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block5 Block9 - Block6 + 231a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 232a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block7 233a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // 234a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray const uint16_t data[] = ONE_REGISTER_CODE_ITEM( 235a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::CONST_4 | 0 | 0, 236a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0x0100, 237a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0005, 238a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0003, 239a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::RETURN_VOID, 240a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0xFA00); 241a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 242fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 3, 4, 9, 8, 6, 5, 7}; 243fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 244a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray} 245a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 2460d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} // namespace art 247