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