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