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 "builder.h" 2231d76b42ef5165351499da3f8ee0ac147428c5edNicolas Geoffray#include "code_generator.h" 238a16d97fb8f031822b206e65f9109a071da40563Nicolas Geoffray#include "code_generator_x86.h" 249e734c7ab4599d7747a05db0dc73c7b668cb6683David Sehr#include "dex/dex_file.h" 259e734c7ab4599d7747a05db0dc73c7b668cb6683David Sehr#include "dex/dex_instruction.h" 26cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle#include "driver/compiler_options.h" 270d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "graph_visualizer.h" 280d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "nodes.h" 290d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "optimizing_unit_test.h" 300d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "pretty_printer.h" 310d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray#include "ssa_liveness_analysis.h" 320d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 3368289a531484d26214e09f1eadd9833531a3bc3cAlex Lightnamespace art { 34d9510dfc32349eeb4f2145c801f7ba1d5bccfb12David Brazdil 35ca6fff898afcb62491458ae8bcd428bfb3043da1Vladimir Markoclass LinearizeTest : public OptimizingUnitTest { 36ca6fff898afcb62491458ae8bcd428bfb3043da1Vladimir Marko protected: 37ca6fff898afcb62491458ae8bcd428bfb3043da1Vladimir Marko template <size_t number_of_blocks> 38fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier void TestCode(const std::vector<uint16_t>& data, 39fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const uint32_t (&expected_order)[number_of_blocks]); 40ca6fff898afcb62491458ae8bcd428bfb3043da1Vladimir Marko}; 414833f5a1990c76bc2be89504225fb13cca22bedfDavid Brazdil 42fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Markotemplate <size_t number_of_blocks> 43fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartiervoid LinearizeTest::TestCode(const std::vector<uint16_t>& data, 44ca6fff898afcb62491458ae8bcd428bfb3043da1Vladimir Marko const uint32_t (&expected_order)[number_of_blocks]) { 45ca6fff898afcb62491458ae8bcd428bfb3043da1Vladimir Marko HGraph* graph = CreateCFG(data); 46fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell std::unique_ptr<const X86InstructionSetFeatures> features_x86( 47fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell X86InstructionSetFeatures::FromCppDefines()); 48fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell x86::CodeGeneratorX86 codegen(graph, *features_x86.get(), CompilerOptions()); 49e764d2e50c544c2cb98ee61a15d613161ac6bd17Vladimir Marko SsaLivenessAnalysis liveness(graph, &codegen, GetScopedAllocator()); 500d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray liveness.Analyze(); 510d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 52fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko ASSERT_EQ(graph->GetLinearOrder().size(), number_of_blocks); 530d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray for (size_t i = 0; i < number_of_blocks; ++i) { 54fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko ASSERT_EQ(graph->GetLinearOrder()[i]->GetBlockId(), expected_order[i]); 550d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray } 560d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 570d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 584833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG1) { 598f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Structure of this graph (+ are back edges) 600d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 610d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 620d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 630d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 648f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block2 ++++++ 658f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / \ + 668f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block5 Block7 + 678f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | | + 688f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 Block3 + 698f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 700d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block4 Block8 710d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 72fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 730d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 740d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 5, 750d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 760d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00, 770d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID); 780d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 79fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 7, 3, 4, 8, 5, 6}; 80fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 810d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 820d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 834833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG2) { 848f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Structure of this graph (+ are back edges) 850d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 860d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 870d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 880d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 898f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block2 ++++++ 908f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / \ + 918f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block3 Block7 + 928f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | | + 938f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 Block4 + 948f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 950d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block5 Block8 960d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 97fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 980d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 990d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 3, 1000d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID, 1010d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFD, 1020d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00); 1030d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 104fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 7, 4, 5, 8, 3, 6}; 105fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1060d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1070d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1084833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG3) { 1098f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Structure of this graph (+ are back edges) 1100d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 1110d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1120d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 1130d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1148f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block2 ++++++ 1158f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / \ + 1168f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block3 Block8 + 1178f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | | + 1188f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block7 Block5 + 1198f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / + \ + 1208f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 + Block9 1218f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + 1228f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block4 ++ 123fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 1240d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 1250d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 4, 1260d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID, 1270d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0x0100, 1280d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFC, 1290d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFD00); 1300d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 131fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 8, 5, 6, 4, 9, 3, 7}; 132fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1330d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1340d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1354833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG4) { 1368f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray /* Structure of this graph (+ are back edges) 1370d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 1380d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1390d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 1400d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1410d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block2 1428f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / + \ 1438f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block6 + Block8 1448f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + | 1458f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block7 + Block3 +++++++ 1468f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 1478f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block9 Block10 + 1488f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + 1498f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block4 + 1508f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 1510d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block5 Block11 1528f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray */ 153fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 1540d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 1550d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 7, 1560d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 1570d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 1580d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00, 1590d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID); 1600d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 161fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 8, 3, 10, 4, 5, 11, 9, 6, 7}; 162fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1630d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1640d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1654833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG5) { 1668f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray /* Structure of this graph (+ are back edges) 1670d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block0 1680d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1690d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block1 1700d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // | 1710d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block2 1728f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // / + \ 1738f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block3 + Block8 1748f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + | 1758f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block7 + Block4 +++++++ 1768f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // + / \ + 1778f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block9 Block10 + 1788f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // | + 1798f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // Block5 + 1808f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray // +/ \ + 1810d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray // Block6 Block11 1828f1a4d4e92e9572dc1b5eaf33f03d390c4ff801aNicolas Geoffray */ 183fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 1840d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::CONST_4 | 0 | 0, 1850d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 3, 1860d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::RETURN_VOID, 1870d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFD, 1880d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::IF_EQ, 0xFFFE, 1890d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray Instruction::GOTO | 0xFE00); 1900d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 191fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 8, 4, 10, 5, 6, 11, 9, 3, 7}; 192fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 1930d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} 1940d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray 1954833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG6) { 196a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block0 197a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 198a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block1 199a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 200a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block2 ++++++++++++++ 201a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | + 202a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block3 + 203a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // / \ + 204a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block8 Block4 + 205a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | / \ + 206a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block5 <- Block9 Block6 + 207a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 208a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block7 209fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 210a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::CONST_4 | 0 | 0, 211a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0x0100, 212a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0004, 213a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0003, 214a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::RETURN_VOID, 215a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0xFA00); 216a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 217fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 3, 4, 6, 9, 8, 5, 7}; 218fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 219a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray} 220a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 2214833f5a1990c76bc2be89504225fb13cca22bedfDavid BrazdilTEST_F(LinearizeTest, CFG7) { 222a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Structure of this graph (+ are back edges) 223a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block0 224a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 225a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block1 226a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 227a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block2 ++++++++ 228a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | + 229a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block3 + 230a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // / \ + 231a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block4 Block8 + 232a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // / \ | + 233a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block5 Block9 - Block6 + 234a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // | 235a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // Block7 236a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray // 237fa3db3d377bfaceb51c9a97864b17ce02538b7e0Mathieu Chartier const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM( 238a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::CONST_4 | 0 | 0, 239a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0x0100, 240a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0005, 241a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::IF_EQ, 0x0003, 242a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::RETURN_VOID, 243a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray Instruction::GOTO | 0xFA00); 244a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 245fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko const uint32_t blocks[] = {0, 1, 2, 3, 4, 9, 8, 6, 5, 7}; 246fa6b93c4b69e6d7ddfa2a4ed0aff01b0608c5a3aVladimir Marko TestCode(data, blocks); 247a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray} 248a8eed3acbc39c71ec22dc2943e71eaa07c6507ddNicolas Geoffray 2490d3f578909d0d1ea072ca68d78301b6fb7a44451Nicolas Geoffray} // namespace art 250