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