xref: /aosp_15_r20/art/compiler/optimizing/liveness_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "base/arena_allocator.h"
18*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
19*795d594fSAndroid Build Coastguard Worker #include "builder.h"
20*795d594fSAndroid Build Coastguard Worker #include "code_generator.h"
21*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file.h"
22*795d594fSAndroid Build Coastguard Worker #include "dex/dex_instruction.h"
23*795d594fSAndroid Build Coastguard Worker #include "driver/compiler_options.h"
24*795d594fSAndroid Build Coastguard Worker #include "nodes.h"
25*795d594fSAndroid Build Coastguard Worker #include "optimizing_unit_test.h"
26*795d594fSAndroid Build Coastguard Worker #include "prepare_for_register_allocation.h"
27*795d594fSAndroid Build Coastguard Worker #include "ssa_liveness_analysis.h"
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker class LivenessTest : public CommonCompilerTest, public OptimizingUnitTestHelper {
32*795d594fSAndroid Build Coastguard Worker  protected:
33*795d594fSAndroid Build Coastguard Worker   void TestCode(const std::vector<uint16_t>& data, const char* expected);
34*795d594fSAndroid Build Coastguard Worker };
35*795d594fSAndroid Build Coastguard Worker 
DumpBitVector(BitVector * vector,std::ostream & buffer,size_t count,const char * prefix)36*795d594fSAndroid Build Coastguard Worker static void DumpBitVector(BitVector* vector,
37*795d594fSAndroid Build Coastguard Worker                           std::ostream& buffer,
38*795d594fSAndroid Build Coastguard Worker                           size_t count,
39*795d594fSAndroid Build Coastguard Worker                           const char* prefix) {
40*795d594fSAndroid Build Coastguard Worker   buffer << prefix;
41*795d594fSAndroid Build Coastguard Worker   buffer << '(';
42*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < count; ++i) {
43*795d594fSAndroid Build Coastguard Worker     buffer << vector->IsBitSet(i);
44*795d594fSAndroid Build Coastguard Worker   }
45*795d594fSAndroid Build Coastguard Worker   buffer << ")\n";
46*795d594fSAndroid Build Coastguard Worker }
47*795d594fSAndroid Build Coastguard Worker 
TestCode(const std::vector<uint16_t> & data,const char * expected)48*795d594fSAndroid Build Coastguard Worker void LivenessTest::TestCode(const std::vector<uint16_t>& data, const char* expected) {
49*795d594fSAndroid Build Coastguard Worker   HGraph* graph = CreateCFG(data);
50*795d594fSAndroid Build Coastguard Worker   // `Inline` conditions into ifs.
51*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<CompilerOptions> compiler_options =
52*795d594fSAndroid Build Coastguard Worker       CommonCompilerTest::CreateCompilerOptions(kRuntimeISA, "default");
53*795d594fSAndroid Build Coastguard Worker   PrepareForRegisterAllocation(graph, *compiler_options).Run();
54*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<CodeGenerator> codegen = CodeGenerator::Create(graph, *compiler_options);
55*795d594fSAndroid Build Coastguard Worker   SsaLivenessAnalysis liveness(graph, codegen.get(), GetScopedAllocator());
56*795d594fSAndroid Build Coastguard Worker   liveness.Analyze();
57*795d594fSAndroid Build Coastguard Worker 
58*795d594fSAndroid Build Coastguard Worker   std::ostringstream buffer;
59*795d594fSAndroid Build Coastguard Worker   for (HBasicBlock* block : graph->GetBlocks()) {
60*795d594fSAndroid Build Coastguard Worker     buffer << "Block " << block->GetBlockId() << std::endl;
61*795d594fSAndroid Build Coastguard Worker     size_t ssa_values = liveness.GetNumberOfSsaValues();
62*795d594fSAndroid Build Coastguard Worker     BitVector* live_in = liveness.GetLiveInSet(*block);
63*795d594fSAndroid Build Coastguard Worker     DumpBitVector(live_in, buffer, ssa_values, "  live in: ");
64*795d594fSAndroid Build Coastguard Worker     BitVector* live_out = liveness.GetLiveOutSet(*block);
65*795d594fSAndroid Build Coastguard Worker     DumpBitVector(live_out, buffer, ssa_values, "  live out: ");
66*795d594fSAndroid Build Coastguard Worker     BitVector* kill = liveness.GetKillSet(*block);
67*795d594fSAndroid Build Coastguard Worker     DumpBitVector(kill, buffer, ssa_values, "  kill: ");
68*795d594fSAndroid Build Coastguard Worker   }
69*795d594fSAndroid Build Coastguard Worker   ASSERT_STREQ(expected, buffer.str().c_str());
70*795d594fSAndroid Build Coastguard Worker }
71*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,CFG1)72*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, CFG1) {
73*795d594fSAndroid Build Coastguard Worker   const char* expected =
74*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
75*795d594fSAndroid Build Coastguard Worker     "  live in: (0)\n"
76*795d594fSAndroid Build Coastguard Worker     "  live out: (0)\n"
77*795d594fSAndroid Build Coastguard Worker     "  kill: (1)\n"
78*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
79*795d594fSAndroid Build Coastguard Worker     "  live in: (0)\n"
80*795d594fSAndroid Build Coastguard Worker     "  live out: (0)\n"
81*795d594fSAndroid Build Coastguard Worker     "  kill: (0)\n"
82*795d594fSAndroid Build Coastguard Worker     "Block 2\n"
83*795d594fSAndroid Build Coastguard Worker     "  live in: (0)\n"
84*795d594fSAndroid Build Coastguard Worker     "  live out: (0)\n"
85*795d594fSAndroid Build Coastguard Worker     "  kill: (0)\n";
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker   // Constant is not used.
88*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
89*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
90*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN_VOID);
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
93*795d594fSAndroid Build Coastguard Worker }
94*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,CFG2)95*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, CFG2) {
96*795d594fSAndroid Build Coastguard Worker   const char* expected =
97*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
98*795d594fSAndroid Build Coastguard Worker     "  live in: (0)\n"
99*795d594fSAndroid Build Coastguard Worker     "  live out: (1)\n"
100*795d594fSAndroid Build Coastguard Worker     "  kill: (1)\n"
101*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
102*795d594fSAndroid Build Coastguard Worker     "  live in: (1)\n"
103*795d594fSAndroid Build Coastguard Worker     "  live out: (0)\n"
104*795d594fSAndroid Build Coastguard Worker     "  kill: (0)\n"
105*795d594fSAndroid Build Coastguard Worker     "Block 2\n"
106*795d594fSAndroid Build Coastguard Worker     "  live in: (0)\n"
107*795d594fSAndroid Build Coastguard Worker     "  live out: (0)\n"
108*795d594fSAndroid Build Coastguard Worker     "  kill: (0)\n";
109*795d594fSAndroid Build Coastguard Worker 
110*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
111*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
112*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN);
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
115*795d594fSAndroid Build Coastguard Worker }
116*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,CFG3)117*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, CFG3) {
118*795d594fSAndroid Build Coastguard Worker   const char* expected =
119*795d594fSAndroid Build Coastguard Worker     "Block 0\n"  // entry block
120*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
121*795d594fSAndroid Build Coastguard Worker     "  live out: (110)\n"
122*795d594fSAndroid Build Coastguard Worker     "  kill: (110)\n"
123*795d594fSAndroid Build Coastguard Worker     "Block 1\n"  // block with add
124*795d594fSAndroid Build Coastguard Worker     "  live in: (110)\n"
125*795d594fSAndroid Build Coastguard Worker     "  live out: (001)\n"
126*795d594fSAndroid Build Coastguard Worker     "  kill: (001)\n"
127*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // block with return
128*795d594fSAndroid Build Coastguard Worker     "  live in: (001)\n"
129*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
130*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
131*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // exit block
132*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
133*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
134*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n";
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = TWO_REGISTERS_CODE_ITEM(
137*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 3 << 12 | 0,
138*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 1 << 8,
139*795d594fSAndroid Build Coastguard Worker     Instruction::ADD_INT_2ADDR | 1 << 12,
140*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0x100,
141*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN);
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
144*795d594fSAndroid Build Coastguard Worker }
145*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,CFG4)146*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, CFG4) {
147*795d594fSAndroid Build Coastguard Worker   // var a;
148*795d594fSAndroid Build Coastguard Worker   // if (0 == 0) {
149*795d594fSAndroid Build Coastguard Worker   //   a = 5;
150*795d594fSAndroid Build Coastguard Worker   // } else {
151*795d594fSAndroid Build Coastguard Worker   //   a = 4;
152*795d594fSAndroid Build Coastguard Worker   // }
153*795d594fSAndroid Build Coastguard Worker   // return a;
154*795d594fSAndroid Build Coastguard Worker   //
155*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
156*795d594fSAndroid Build Coastguard Worker   // (constant0, constant5, constant4, phi)
157*795d594fSAndroid Build Coastguard Worker   const char* expected =
158*795d594fSAndroid Build Coastguard Worker     "Block 0\n"  // entry block
159*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
160*795d594fSAndroid Build Coastguard Worker     "  live out: (1110)\n"
161*795d594fSAndroid Build Coastguard Worker     "  kill: (1110)\n"
162*795d594fSAndroid Build Coastguard Worker     "Block 1\n"  // block with if
163*795d594fSAndroid Build Coastguard Worker     "  live in: (1110)\n"
164*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
165*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
166*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // else block
167*795d594fSAndroid Build Coastguard Worker     "  live in: (0010)\n"
168*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
169*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
170*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // then block
171*795d594fSAndroid Build Coastguard Worker     "  live in: (0100)\n"
172*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
173*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
174*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // return block
175*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
176*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
177*795d594fSAndroid Build Coastguard Worker     "  kill: (0001)\n"
178*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // exit block
179*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
180*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
181*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n";
182*795d594fSAndroid Build Coastguard Worker 
183*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
184*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
185*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 4,
186*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
187*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0x200,
188*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 5 << 12 | 0,
189*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
190*795d594fSAndroid Build Coastguard Worker 
191*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
192*795d594fSAndroid Build Coastguard Worker }
193*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,CFG5)194*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, CFG5) {
195*795d594fSAndroid Build Coastguard Worker   // var a = 0;
196*795d594fSAndroid Build Coastguard Worker   // if (0 == 0) {
197*795d594fSAndroid Build Coastguard Worker   // } else {
198*795d594fSAndroid Build Coastguard Worker   //   a = 4;
199*795d594fSAndroid Build Coastguard Worker   // }
200*795d594fSAndroid Build Coastguard Worker   // return a;
201*795d594fSAndroid Build Coastguard Worker   //
202*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
203*795d594fSAndroid Build Coastguard Worker   // (constant0, constant4, phi)
204*795d594fSAndroid Build Coastguard Worker   const char* expected =
205*795d594fSAndroid Build Coastguard Worker     "Block 0\n"  // entry block
206*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
207*795d594fSAndroid Build Coastguard Worker     "  live out: (110)\n"
208*795d594fSAndroid Build Coastguard Worker     "  kill: (110)\n"
209*795d594fSAndroid Build Coastguard Worker     "Block 1\n"  // block with if
210*795d594fSAndroid Build Coastguard Worker     "  live in: (110)\n"
211*795d594fSAndroid Build Coastguard Worker     "  live out: (110)\n"
212*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
213*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // else block
214*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
215*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
216*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
217*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // return block
218*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
219*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
220*795d594fSAndroid Build Coastguard Worker     "  kill: (001)\n"
221*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // exit block
222*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
223*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
224*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
225*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // block to avoid critical edge. Predecessor is 1, successor is 3.
226*795d594fSAndroid Build Coastguard Worker     "  live in: (100)\n"
227*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
228*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n";
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
231*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
232*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 3,
233*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
234*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
237*795d594fSAndroid Build Coastguard Worker }
238*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop1)239*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop1) {
240*795d594fSAndroid Build Coastguard Worker   // Simple loop with one preheader and one back edge.
241*795d594fSAndroid Build Coastguard Worker   // var a = 0;
242*795d594fSAndroid Build Coastguard Worker   // while (a == a) {
243*795d594fSAndroid Build Coastguard Worker   //   a = 4;
244*795d594fSAndroid Build Coastguard Worker   // }
245*795d594fSAndroid Build Coastguard Worker   // return;
246*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
247*795d594fSAndroid Build Coastguard Worker   // (constant0, constant4, phi)
248*795d594fSAndroid Build Coastguard Worker   const char* expected =
249*795d594fSAndroid Build Coastguard Worker     "Block 0\n"  // entry block
250*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
251*795d594fSAndroid Build Coastguard Worker     "  live out: (110)\n"
252*795d594fSAndroid Build Coastguard Worker     "  kill: (110)\n"
253*795d594fSAndroid Build Coastguard Worker     "Block 1\n"  // pre header
254*795d594fSAndroid Build Coastguard Worker     "  live in: (110)\n"
255*795d594fSAndroid Build Coastguard Worker     "  live out: (010)\n"
256*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
257*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // loop header
258*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
259*795d594fSAndroid Build Coastguard Worker     "  live out: (010)\n"
260*795d594fSAndroid Build Coastguard Worker     "  kill: (001)\n"
261*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // back edge
262*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
263*795d594fSAndroid Build Coastguard Worker     "  live out: (010)\n"
264*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
265*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // return block
266*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
267*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
268*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
269*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // exit block
270*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
271*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
272*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n";
273*795d594fSAndroid Build Coastguard Worker 
274*795d594fSAndroid Build Coastguard Worker 
275*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
276*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
277*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 4,
278*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
279*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFD00,
280*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN_VOID);
281*795d594fSAndroid Build Coastguard Worker 
282*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
283*795d594fSAndroid Build Coastguard Worker }
284*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop3)285*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop3) {
286*795d594fSAndroid Build Coastguard Worker   // Test that the returned value stays live in a preceding loop.
287*795d594fSAndroid Build Coastguard Worker   // var a = 0;
288*795d594fSAndroid Build Coastguard Worker   // while (a == a) {
289*795d594fSAndroid Build Coastguard Worker   //   a = 4;
290*795d594fSAndroid Build Coastguard Worker   // }
291*795d594fSAndroid Build Coastguard Worker   // return 5;
292*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
293*795d594fSAndroid Build Coastguard Worker   // (constant0, constant5, constant4, phi)
294*795d594fSAndroid Build Coastguard Worker   const char* expected =
295*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
296*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
297*795d594fSAndroid Build Coastguard Worker     "  live out: (1110)\n"
298*795d594fSAndroid Build Coastguard Worker     "  kill: (1110)\n"
299*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
300*795d594fSAndroid Build Coastguard Worker     "  live in: (1110)\n"
301*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
302*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
303*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // loop header
304*795d594fSAndroid Build Coastguard Worker     "  live in: (0110)\n"
305*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
306*795d594fSAndroid Build Coastguard Worker     "  kill: (0001)\n"
307*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // back edge
308*795d594fSAndroid Build Coastguard Worker     "  live in: (0110)\n"
309*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
310*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
311*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // return block
312*795d594fSAndroid Build Coastguard Worker     "  live in: (0100)\n"
313*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
314*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
315*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // exit block
316*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
317*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
318*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n";
319*795d594fSAndroid Build Coastguard Worker 
320*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = TWO_REGISTERS_CODE_ITEM(
321*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
322*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 4,
323*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
324*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFD00,
325*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 5 << 12 | 1 << 8,
326*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 1 << 8);
327*795d594fSAndroid Build Coastguard Worker 
328*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
329*795d594fSAndroid Build Coastguard Worker }
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop4)332*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop4) {
333*795d594fSAndroid Build Coastguard Worker   // Make sure we support a preheader of a loop not being the first predecessor
334*795d594fSAndroid Build Coastguard Worker   // in the predecessor list of the header.
335*795d594fSAndroid Build Coastguard Worker   // var a = 0;
336*795d594fSAndroid Build Coastguard Worker   // while (a == a) {
337*795d594fSAndroid Build Coastguard Worker   //   a = 4;
338*795d594fSAndroid Build Coastguard Worker   // }
339*795d594fSAndroid Build Coastguard Worker   // return a;
340*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
341*795d594fSAndroid Build Coastguard Worker   // (constant0, constant4, phi)
342*795d594fSAndroid Build Coastguard Worker   const char* expected =
343*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
344*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
345*795d594fSAndroid Build Coastguard Worker     "  live out: (110)\n"
346*795d594fSAndroid Build Coastguard Worker     "  kill: (110)\n"
347*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
348*795d594fSAndroid Build Coastguard Worker     "  live in: (110)\n"
349*795d594fSAndroid Build Coastguard Worker     "  live out: (110)\n"
350*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
351*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // loop header
352*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
353*795d594fSAndroid Build Coastguard Worker     "  live out: (011)\n"
354*795d594fSAndroid Build Coastguard Worker     "  kill: (001)\n"
355*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // back edge
356*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
357*795d594fSAndroid Build Coastguard Worker     "  live out: (010)\n"
358*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
359*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // pre loop header
360*795d594fSAndroid Build Coastguard Worker     "  live in: (110)\n"
361*795d594fSAndroid Build Coastguard Worker     "  live out: (010)\n"
362*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
363*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // return block
364*795d594fSAndroid Build Coastguard Worker     "  live in: (001)\n"
365*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
366*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
367*795d594fSAndroid Build Coastguard Worker     "Block 6\n"  // exit block
368*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
369*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
370*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n";
371*795d594fSAndroid Build Coastguard Worker 
372*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
373*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
374*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0x500,
375*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 5,
376*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
377*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFD00,
378*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFC00,
379*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
380*795d594fSAndroid Build Coastguard Worker 
381*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
382*795d594fSAndroid Build Coastguard Worker }
383*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop5)384*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop5) {
385*795d594fSAndroid Build Coastguard Worker   // Make sure we create a preheader of a loop when a header originally has two
386*795d594fSAndroid Build Coastguard Worker   // incoming blocks and one back edge.
387*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
388*795d594fSAndroid Build Coastguard Worker   // (constant0, constant5, constant4, phi in block 8)
389*795d594fSAndroid Build Coastguard Worker   const char* expected =
390*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
391*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
392*795d594fSAndroid Build Coastguard Worker     "  live out: (1110)\n"
393*795d594fSAndroid Build Coastguard Worker     "  kill: (1110)\n"
394*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
395*795d594fSAndroid Build Coastguard Worker     "  live in: (1110)\n"
396*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
397*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
398*795d594fSAndroid Build Coastguard Worker     "Block 2\n"
399*795d594fSAndroid Build Coastguard Worker     "  live in: (0010)\n"
400*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
401*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
402*795d594fSAndroid Build Coastguard Worker     "Block 3\n"
403*795d594fSAndroid Build Coastguard Worker     "  live in: (0100)\n"
404*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
405*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
406*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // loop header
407*795d594fSAndroid Build Coastguard Worker     "  live in: (0001)\n"
408*795d594fSAndroid Build Coastguard Worker     "  live out: (0001)\n"
409*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
410*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // back edge
411*795d594fSAndroid Build Coastguard Worker     "  live in: (0001)\n"
412*795d594fSAndroid Build Coastguard Worker     "  live out: (0001)\n"
413*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
414*795d594fSAndroid Build Coastguard Worker     "Block 6\n"  // return block
415*795d594fSAndroid Build Coastguard Worker     "  live in: (0001)\n"
416*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
417*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
418*795d594fSAndroid Build Coastguard Worker     "Block 7\n"  // exit block
419*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
420*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
421*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
422*795d594fSAndroid Build Coastguard Worker     "Block 8\n"  // synthesized pre header
423*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
424*795d594fSAndroid Build Coastguard Worker     "  live out: (0001)\n"
425*795d594fSAndroid Build Coastguard Worker     "  kill: (0001)\n";
426*795d594fSAndroid Build Coastguard Worker 
427*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
428*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
429*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 4,
430*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
431*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0x200,
432*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 5 << 12 | 0,
433*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 3,
434*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFE00,
435*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
436*795d594fSAndroid Build Coastguard Worker 
437*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
438*795d594fSAndroid Build Coastguard Worker }
439*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop6)440*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop6) {
441*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
442*795d594fSAndroid Build Coastguard Worker   // (constant0, constant4, constant5, phi in block 2)
443*795d594fSAndroid Build Coastguard Worker   const char* expected =
444*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
445*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
446*795d594fSAndroid Build Coastguard Worker     "  live out: (1110)\n"
447*795d594fSAndroid Build Coastguard Worker     "  kill: (1110)\n"
448*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
449*795d594fSAndroid Build Coastguard Worker     "  live in: (1110)\n"
450*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
451*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
452*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // loop header
453*795d594fSAndroid Build Coastguard Worker     "  live in: (0110)\n"
454*795d594fSAndroid Build Coastguard Worker     "  live out: (0111)\n"
455*795d594fSAndroid Build Coastguard Worker     "  kill: (0001)\n"
456*795d594fSAndroid Build Coastguard Worker     "Block 3\n"
457*795d594fSAndroid Build Coastguard Worker     "  live in: (0110)\n"
458*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
459*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
460*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // back edge
461*795d594fSAndroid Build Coastguard Worker     "  live in: (0110)\n"
462*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
463*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
464*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // back edge
465*795d594fSAndroid Build Coastguard Worker     "  live in: (0110)\n"
466*795d594fSAndroid Build Coastguard Worker     "  live out: (0110)\n"
467*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
468*795d594fSAndroid Build Coastguard Worker     "Block 6\n"  // return block
469*795d594fSAndroid Build Coastguard Worker     "  live in: (0001)\n"
470*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
471*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n"
472*795d594fSAndroid Build Coastguard Worker     "Block 7\n"  // exit block
473*795d594fSAndroid Build Coastguard Worker     "  live in: (0000)\n"
474*795d594fSAndroid Build Coastguard Worker     "  live out: (0000)\n"
475*795d594fSAndroid Build Coastguard Worker     "  kill: (0000)\n";
476*795d594fSAndroid Build Coastguard Worker 
477*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
478*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
479*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 8,
480*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
481*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 4,
482*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 5 << 12 | 0,
483*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFA00,
484*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xF900,
485*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
486*795d594fSAndroid Build Coastguard Worker 
487*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
488*795d594fSAndroid Build Coastguard Worker }
489*795d594fSAndroid Build Coastguard Worker 
490*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop7)491*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop7) {
492*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
493*795d594fSAndroid Build Coastguard Worker   // (constant0, constant4, constant5, phi in block 2, phi in block 6)
494*795d594fSAndroid Build Coastguard Worker   const char* expected =
495*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
496*795d594fSAndroid Build Coastguard Worker     "  live in: (00000)\n"
497*795d594fSAndroid Build Coastguard Worker     "  live out: (11100)\n"
498*795d594fSAndroid Build Coastguard Worker     "  kill: (11100)\n"
499*795d594fSAndroid Build Coastguard Worker     "Block 1\n"
500*795d594fSAndroid Build Coastguard Worker     "  live in: (11100)\n"
501*795d594fSAndroid Build Coastguard Worker     "  live out: (01100)\n"
502*795d594fSAndroid Build Coastguard Worker     "  kill: (00000)\n"
503*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // loop header
504*795d594fSAndroid Build Coastguard Worker     "  live in: (01100)\n"
505*795d594fSAndroid Build Coastguard Worker     "  live out: (01110)\n"
506*795d594fSAndroid Build Coastguard Worker     "  kill: (00010)\n"
507*795d594fSAndroid Build Coastguard Worker     "Block 3\n"
508*795d594fSAndroid Build Coastguard Worker     "  live in: (01100)\n"
509*795d594fSAndroid Build Coastguard Worker     "  live out: (01100)\n"
510*795d594fSAndroid Build Coastguard Worker     "  kill: (00000)\n"
511*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // loop exit
512*795d594fSAndroid Build Coastguard Worker     "  live in: (00100)\n"
513*795d594fSAndroid Build Coastguard Worker     "  live out: (00000)\n"
514*795d594fSAndroid Build Coastguard Worker     "  kill: (00000)\n"
515*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // back edge
516*795d594fSAndroid Build Coastguard Worker     "  live in: (01100)\n"
517*795d594fSAndroid Build Coastguard Worker     "  live out: (01100)\n"
518*795d594fSAndroid Build Coastguard Worker     "  kill: (00000)\n"
519*795d594fSAndroid Build Coastguard Worker     "Block 6\n"  // return block
520*795d594fSAndroid Build Coastguard Worker     "  live in: (00000)\n"
521*795d594fSAndroid Build Coastguard Worker     "  live out: (00000)\n"
522*795d594fSAndroid Build Coastguard Worker     "  kill: (00001)\n"
523*795d594fSAndroid Build Coastguard Worker     "Block 7\n"  // exit block
524*795d594fSAndroid Build Coastguard Worker     "  live in: (00000)\n"
525*795d594fSAndroid Build Coastguard Worker     "  live out: (00000)\n"
526*795d594fSAndroid Build Coastguard Worker     "  kill: (00000)\n"
527*795d594fSAndroid Build Coastguard Worker     "Block 8\n"  // synthesized block to avoid critical edge.
528*795d594fSAndroid Build Coastguard Worker     "  live in: (00010)\n"
529*795d594fSAndroid Build Coastguard Worker     "  live out: (00000)\n"
530*795d594fSAndroid Build Coastguard Worker     "  kill: (00000)\n";
531*795d594fSAndroid Build Coastguard Worker 
532*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
533*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
534*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 8,
535*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 4 << 12 | 0,
536*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 4,
537*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 5 << 12 | 0,
538*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0x0200,
539*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xF900,
540*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
541*795d594fSAndroid Build Coastguard Worker 
542*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
543*795d594fSAndroid Build Coastguard Worker }
544*795d594fSAndroid Build Coastguard Worker 
TEST_F(LivenessTest,Loop8)545*795d594fSAndroid Build Coastguard Worker TEST_F(LivenessTest, Loop8) {
546*795d594fSAndroid Build Coastguard Worker   // var a = 0;
547*795d594fSAndroid Build Coastguard Worker   // while (a == a) {
548*795d594fSAndroid Build Coastguard Worker   //   a = a + a;
549*795d594fSAndroid Build Coastguard Worker   // }
550*795d594fSAndroid Build Coastguard Worker   // return a;
551*795d594fSAndroid Build Coastguard Worker   //
552*795d594fSAndroid Build Coastguard Worker   // We want to test that the ins of the loop exit
553*795d594fSAndroid Build Coastguard Worker   // does contain the phi.
554*795d594fSAndroid Build Coastguard Worker   // Bitsets are made of:
555*795d594fSAndroid Build Coastguard Worker   // (constant0, phi, add)
556*795d594fSAndroid Build Coastguard Worker   const char* expected =
557*795d594fSAndroid Build Coastguard Worker     "Block 0\n"
558*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
559*795d594fSAndroid Build Coastguard Worker     "  live out: (100)\n"
560*795d594fSAndroid Build Coastguard Worker     "  kill: (100)\n"
561*795d594fSAndroid Build Coastguard Worker     "Block 1\n"  // pre loop header
562*795d594fSAndroid Build Coastguard Worker     "  live in: (100)\n"
563*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
564*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
565*795d594fSAndroid Build Coastguard Worker     "Block 2\n"  // loop header
566*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
567*795d594fSAndroid Build Coastguard Worker     "  live out: (010)\n"
568*795d594fSAndroid Build Coastguard Worker     "  kill: (010)\n"
569*795d594fSAndroid Build Coastguard Worker     "Block 3\n"  // back edge
570*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
571*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
572*795d594fSAndroid Build Coastguard Worker     "  kill: (001)\n"
573*795d594fSAndroid Build Coastguard Worker     "Block 4\n"  // return block
574*795d594fSAndroid Build Coastguard Worker     "  live in: (010)\n"
575*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
576*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n"
577*795d594fSAndroid Build Coastguard Worker     "Block 5\n"  // exit block
578*795d594fSAndroid Build Coastguard Worker     "  live in: (000)\n"
579*795d594fSAndroid Build Coastguard Worker     "  live out: (000)\n"
580*795d594fSAndroid Build Coastguard Worker     "  kill: (000)\n";
581*795d594fSAndroid Build Coastguard Worker 
582*795d594fSAndroid Build Coastguard Worker   const std::vector<uint16_t> data = ONE_REGISTER_CODE_ITEM(
583*795d594fSAndroid Build Coastguard Worker     Instruction::CONST_4 | 0 | 0,
584*795d594fSAndroid Build Coastguard Worker     Instruction::IF_EQ, 6,
585*795d594fSAndroid Build Coastguard Worker     Instruction::ADD_INT, 0, 0,
586*795d594fSAndroid Build Coastguard Worker     Instruction::GOTO | 0xFB00,
587*795d594fSAndroid Build Coastguard Worker     Instruction::RETURN | 0 << 8);
588*795d594fSAndroid Build Coastguard Worker 
589*795d594fSAndroid Build Coastguard Worker   TestCode(data, expected);
590*795d594fSAndroid Build Coastguard Worker }
591*795d594fSAndroid Build Coastguard Worker 
592*795d594fSAndroid Build Coastguard Worker }  // namespace art
593