OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 #include "test/cctest/cctest.h" | 6 #include "test/cctest/cctest.h" |
7 | 7 |
8 #include "src/compiler/code-generator.h" | 8 #include "src/compiler/code-generator.h" |
9 #include "src/compiler/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 TestInstr* instr = TestInstr::New(zone(), opcode); | 86 TestInstr* instr = TestInstr::New(zone(), opcode); |
87 return code->AddInstruction(instr); | 87 return code->AddInstruction(instr); |
88 } | 88 } |
89 | 89 |
90 UnallocatedOperand* NewUnallocated(int vreg) { | 90 UnallocatedOperand* NewUnallocated(int vreg) { |
91 UnallocatedOperand* unallocated = | 91 UnallocatedOperand* unallocated = |
92 new (zone()) UnallocatedOperand(UnallocatedOperand::ANY); | 92 new (zone()) UnallocatedOperand(UnallocatedOperand::ANY); |
93 unallocated->set_virtual_register(vreg); | 93 unallocated->set_virtual_register(vreg); |
94 return unallocated; | 94 return unallocated; |
95 } | 95 } |
| 96 |
| 97 InstructionBlock* BlockAt(BasicBlock* block) { |
| 98 return code->InstructionBlockAt(block->GetRpoNumber()); |
| 99 } |
| 100 BasicBlock* GetBasicBlock(int instruction_index) { |
| 101 const InstructionBlock* block = |
| 102 code->GetInstructionBlock(instruction_index); |
| 103 return schedule.rpo_order()->at(block->rpo_number().ToSize()); |
| 104 } |
| 105 int first_instruction_index(BasicBlock* block) { |
| 106 return BlockAt(block)->first_instruction_index(); |
| 107 } |
| 108 int last_instruction_index(BasicBlock* block) { |
| 109 return BlockAt(block)->last_instruction_index(); |
| 110 } |
96 }; | 111 }; |
97 | 112 |
98 | 113 |
99 TEST(InstructionBasic) { | 114 TEST(InstructionBasic) { |
100 InstructionTester R; | 115 InstructionTester R; |
101 | 116 |
102 for (int i = 0; i < 10; i++) { | 117 for (int i = 0; i < 10; i++) { |
103 R.Int32Constant(i); // Add some nodes to the graph. | 118 R.Int32Constant(i); // Add some nodes to the graph. |
104 } | 119 } |
105 | 120 |
106 BasicBlock* last = R.schedule.start(); | 121 BasicBlock* last = R.schedule.start(); |
107 for (int i = 0; i < 5; i++) { | 122 for (int i = 0; i < 5; i++) { |
108 BasicBlock* block = R.schedule.NewBasicBlock(); | 123 BasicBlock* block = R.schedule.NewBasicBlock(); |
109 R.schedule.AddGoto(last, block); | 124 R.schedule.AddGoto(last, block); |
110 last = block; | 125 last = block; |
111 } | 126 } |
112 | 127 |
113 R.allocCode(); | 128 R.allocCode(); |
114 | 129 |
115 CHECK_EQ(R.graph.NodeCount(), R.code->node_count()); | 130 CHECK_EQ(R.graph.NodeCount(), R.code->node_count()); |
116 | 131 |
117 BasicBlockVector* blocks = R.schedule.rpo_order(); | 132 BasicBlockVector* blocks = R.schedule.rpo_order(); |
118 CHECK_EQ(static_cast<int>(blocks->size()), R.code->BasicBlockCount()); | 133 CHECK_EQ(static_cast<int>(blocks->size()), R.code->BasicBlockCount()); |
119 | 134 |
120 int index = 0; | 135 int index = 0; |
121 for (BasicBlockVectorIter i = blocks->begin(); i != blocks->end(); | 136 for (BasicBlockVectorIter i = blocks->begin(); i != blocks->end(); |
122 i++, index++) { | 137 i++, index++) { |
123 BasicBlock* block = *i; | 138 BasicBlock* block = *i; |
124 CHECK_EQ(block, R.code->BlockAt(index)); | 139 CHECK_EQ(block->rpo_number(), R.BlockAt(block)->rpo_number().ToInt()); |
| 140 CHECK_EQ(block->id().ToInt(), R.BlockAt(block)->id().ToInt()); |
125 CHECK_EQ(-1, block->loop_end()); | 141 CHECK_EQ(-1, block->loop_end()); |
126 } | 142 } |
127 } | 143 } |
128 | 144 |
129 | 145 |
130 TEST(InstructionGetBasicBlock) { | 146 TEST(InstructionGetBasicBlock) { |
131 InstructionTester R; | 147 InstructionTester R; |
132 | 148 |
133 BasicBlock* b0 = R.schedule.start(); | 149 BasicBlock* b0 = R.schedule.start(); |
134 BasicBlock* b1 = R.schedule.NewBasicBlock(); | 150 BasicBlock* b1 = R.schedule.NewBasicBlock(); |
(...skipping 17 matching lines...) Expand all Loading... |
152 int i5 = R.NewInstr(); | 168 int i5 = R.NewInstr(); |
153 R.code->EndBlock(b1); | 169 R.code->EndBlock(b1); |
154 R.code->StartBlock(b2); | 170 R.code->StartBlock(b2); |
155 int i6 = R.NewInstr(); | 171 int i6 = R.NewInstr(); |
156 int i7 = R.NewInstr(); | 172 int i7 = R.NewInstr(); |
157 int i8 = R.NewInstr(); | 173 int i8 = R.NewInstr(); |
158 R.code->EndBlock(b2); | 174 R.code->EndBlock(b2); |
159 R.code->StartBlock(b3); | 175 R.code->StartBlock(b3); |
160 R.code->EndBlock(b3); | 176 R.code->EndBlock(b3); |
161 | 177 |
162 CHECK_EQ(b0, R.code->GetBasicBlock(i0)); | 178 CHECK_EQ(b0, R.GetBasicBlock(i0)); |
163 CHECK_EQ(b0, R.code->GetBasicBlock(i1)); | 179 CHECK_EQ(b0, R.GetBasicBlock(i1)); |
164 | 180 |
165 CHECK_EQ(b1, R.code->GetBasicBlock(i2)); | 181 CHECK_EQ(b1, R.GetBasicBlock(i2)); |
166 CHECK_EQ(b1, R.code->GetBasicBlock(i3)); | 182 CHECK_EQ(b1, R.GetBasicBlock(i3)); |
167 CHECK_EQ(b1, R.code->GetBasicBlock(i4)); | 183 CHECK_EQ(b1, R.GetBasicBlock(i4)); |
168 CHECK_EQ(b1, R.code->GetBasicBlock(i5)); | 184 CHECK_EQ(b1, R.GetBasicBlock(i5)); |
169 | 185 |
170 CHECK_EQ(b2, R.code->GetBasicBlock(i6)); | 186 CHECK_EQ(b2, R.GetBasicBlock(i6)); |
171 CHECK_EQ(b2, R.code->GetBasicBlock(i7)); | 187 CHECK_EQ(b2, R.GetBasicBlock(i7)); |
172 CHECK_EQ(b2, R.code->GetBasicBlock(i8)); | 188 CHECK_EQ(b2, R.GetBasicBlock(i8)); |
173 | 189 |
174 CHECK_EQ(b0, R.code->GetBasicBlock(R.code->first_instruction_index(b0))); | 190 CHECK_EQ(b0, R.GetBasicBlock(R.first_instruction_index(b0))); |
175 CHECK_EQ(b0, R.code->GetBasicBlock(R.code->last_instruction_index(b0))); | 191 CHECK_EQ(b0, R.GetBasicBlock(R.last_instruction_index(b0))); |
176 | 192 |
177 CHECK_EQ(b1, R.code->GetBasicBlock(R.code->first_instruction_index(b1))); | 193 CHECK_EQ(b1, R.GetBasicBlock(R.first_instruction_index(b1))); |
178 CHECK_EQ(b1, R.code->GetBasicBlock(R.code->last_instruction_index(b1))); | 194 CHECK_EQ(b1, R.GetBasicBlock(R.last_instruction_index(b1))); |
179 | 195 |
180 CHECK_EQ(b2, R.code->GetBasicBlock(R.code->first_instruction_index(b2))); | 196 CHECK_EQ(b2, R.GetBasicBlock(R.first_instruction_index(b2))); |
181 CHECK_EQ(b2, R.code->GetBasicBlock(R.code->last_instruction_index(b2))); | 197 CHECK_EQ(b2, R.GetBasicBlock(R.last_instruction_index(b2))); |
182 | 198 |
183 CHECK_EQ(b3, R.code->GetBasicBlock(R.code->first_instruction_index(b3))); | 199 CHECK_EQ(b3, R.GetBasicBlock(R.first_instruction_index(b3))); |
184 CHECK_EQ(b3, R.code->GetBasicBlock(R.code->last_instruction_index(b3))); | 200 CHECK_EQ(b3, R.GetBasicBlock(R.last_instruction_index(b3))); |
185 } | 201 } |
186 | 202 |
187 | 203 |
188 TEST(InstructionIsGapAt) { | 204 TEST(InstructionIsGapAt) { |
189 InstructionTester R; | 205 InstructionTester R; |
190 | 206 |
191 BasicBlock* b0 = R.schedule.start(); | 207 BasicBlock* b0 = R.schedule.start(); |
192 R.schedule.AddReturn(b0, R.Int32Constant(1)); | 208 R.schedule.AddReturn(b0, R.Int32Constant(1)); |
193 | 209 |
194 R.allocCode(); | 210 R.allocCode(); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 CHECK_EQ(inputs[z], m->InputAt(z)); | 357 CHECK_EQ(inputs[z], m->InputAt(z)); |
342 } | 358 } |
343 | 359 |
344 for (size_t z = 0; z < k; z++) { | 360 for (size_t z = 0; z < k; z++) { |
345 CHECK_EQ(temps[z], m->TempAt(z)); | 361 CHECK_EQ(temps[z], m->TempAt(z)); |
346 } | 362 } |
347 } | 363 } |
348 } | 364 } |
349 } | 365 } |
350 } | 366 } |
OLD | NEW |