Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(327)

Side by Side Diff: runtime/vm/flow_graph_optimizer.cc

Issue 23072026: fix cpp11 compile errors (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/flow_graph_optimizer.h" 5 #include "vm/flow_graph_optimizer.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/cha.h" 8 #include "vm/cha.h"
9 #include "vm/dart_entry.h" 9 #include "vm/dart_entry.h"
10 #include "vm/flow_graph_builder.h" 10 #include "vm/flow_graph_builder.h"
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 Instruction* replacement, 296 Instruction* replacement,
297 FlowGraph* graph) { 297 FlowGraph* graph) {
298 Definition* current_defn = current->AsDefinition(); 298 Definition* current_defn = current->AsDefinition();
299 if ((replacement != NULL) && (current_defn != NULL)) { 299 if ((replacement != NULL) && (current_defn != NULL)) {
300 Definition* replacement_defn = replacement->AsDefinition(); 300 Definition* replacement_defn = replacement->AsDefinition();
301 ASSERT(replacement_defn != NULL); 301 ASSERT(replacement_defn != NULL);
302 current_defn->ReplaceUsesWith(replacement_defn); 302 current_defn->ReplaceUsesWith(replacement_defn);
303 EnsureSSATempIndex(graph, current_defn, replacement_defn); 303 EnsureSSATempIndex(graph, current_defn, replacement_defn);
304 304
305 if (FLAG_trace_optimization) { 305 if (FLAG_trace_optimization) {
306 OS::Print("Replacing v%"Pd" with v%"Pd"\n", 306 OS::Print("Replacing v%" Pd " with v%" Pd "\n",
307 current_defn->ssa_temp_index(), 307 current_defn->ssa_temp_index(),
308 replacement_defn->ssa_temp_index()); 308 replacement_defn->ssa_temp_index());
309 } 309 }
310 } else if (FLAG_trace_optimization) { 310 } else if (FLAG_trace_optimization) {
311 if (current_defn == NULL) { 311 if (current_defn == NULL) {
312 OS::Print("Removing %s\n", current->DebugName()); 312 OS::Print("Removing %s\n", current->DebugName());
313 } else { 313 } else {
314 ASSERT(!current_defn->HasUses()); 314 ASSERT(!current_defn->HasUses());
315 OS::Print("Removing v%"Pd".\n", current_defn->ssa_temp_index()); 315 OS::Print("Removing v%" Pd ".\n", current_defn->ssa_temp_index());
316 } 316 }
317 } 317 }
318 iterator->RemoveCurrentFromGraph(); 318 iterator->RemoveCurrentFromGraph();
319 } 319 }
320 320
321 321
322 bool FlowGraphOptimizer::Canonicalize() { 322 bool FlowGraphOptimizer::Canonicalize() {
323 bool changed = false; 323 bool changed = false;
324 for (intptr_t i = 0; i < block_order_.length(); ++i) { 324 for (intptr_t i = 0; i < block_order_.length(); ++i) {
325 BlockEntryInstr* entry = block_order_[i]; 325 BlockEntryInstr* entry = block_order_[i];
(...skipping 3492 matching lines...) Expand 10 before | Expand all | Expand 10 after
3818 ASSERT(flow_graph->is_licm_allowed()); 3818 ASSERT(flow_graph->is_licm_allowed());
3819 } 3819 }
3820 3820
3821 3821
3822 void LICM::Hoist(ForwardInstructionIterator* it, 3822 void LICM::Hoist(ForwardInstructionIterator* it,
3823 BlockEntryInstr* pre_header, 3823 BlockEntryInstr* pre_header,
3824 Instruction* current) { 3824 Instruction* current) {
3825 // TODO(fschneider): Avoid repeated deoptimization when 3825 // TODO(fschneider): Avoid repeated deoptimization when
3826 // speculatively hoisting checks. 3826 // speculatively hoisting checks.
3827 if (FLAG_trace_optimization) { 3827 if (FLAG_trace_optimization) {
3828 OS::Print("Hoisting instruction %s:%"Pd" from B%"Pd" to B%"Pd"\n", 3828 OS::Print("Hoisting instruction %s:%" Pd " from B%" Pd " to B%" Pd "\n",
3829 current->DebugName(), 3829 current->DebugName(),
3830 current->GetDeoptId(), 3830 current->GetDeoptId(),
3831 current->GetBlock()->block_id(), 3831 current->GetBlock()->block_id(),
3832 pre_header->block_id()); 3832 pre_header->block_id());
3833 } 3833 }
3834 // Move the instruction out of the loop. 3834 // Move the instruction out of the loop.
3835 current->RemoveEnvironment(); 3835 current->RemoveEnvironment();
3836 it->RemoveCurrentFromGraph(); 3836 it->RemoveCurrentFromGraph();
3837 GotoInstr* last = pre_header->last_instruction()->AsGoto(); 3837 GotoInstr* last = pre_header->last_instruction()->AsGoto();
3838 // Using kind kEffect will not assign a fresh ssa temporary index. 3838 // Using kind kEffect will not assign a fresh ssa temporary index.
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
4167 switch (kind_) { 4167 switch (kind_) {
4168 case kNone: 4168 case kNone:
4169 return "<none>"; 4169 return "<none>";
4170 4170
4171 case kField: { 4171 case kField: {
4172 const char* field_name = String::Handle(field().name()).ToCString(); 4172 const char* field_name = String::Handle(field().name()).ToCString();
4173 if (instance() == NULL) { 4173 if (instance() == NULL) {
4174 return field_name; 4174 return field_name;
4175 } 4175 }
4176 return Isolate::Current()->current_zone()->PrintToString( 4176 return Isolate::Current()->current_zone()->PrintToString(
4177 "<v%"Pd".%s>", instance()->ssa_temp_index(), field_name); 4177 "<v%" Pd ".%s>", instance()->ssa_temp_index(), field_name);
4178 } 4178 }
4179 4179
4180 case kVMField: { 4180 case kVMField: {
4181 return Isolate::Current()->current_zone()->PrintToString( 4181 return Isolate::Current()->current_zone()->PrintToString(
4182 "<v%"Pd"@%"Pd">", instance()->ssa_temp_index(), offset_in_bytes()); 4182 "<v%" Pd "@%" Pd ">", instance()->ssa_temp_index(), offset_in_bytes( ));
siva 2013/08/20 19:54:51 "<v%" Pd "@%" Pd ">", instance()->ssa_temp_index()
Jacob 2013/08/20 20:32:15 Done.
4183 } 4183 }
4184 4184
4185 case kIndexed: { 4185 case kIndexed: {
4186 return Isolate::Current()->current_zone()->PrintToString( 4186 return Isolate::Current()->current_zone()->PrintToString(
4187 "<v%"Pd"[v%"Pd"]>", 4187 "<v%" Pd "[v%" Pd "]>",
4188 instance()->ssa_temp_index(), 4188 instance()->ssa_temp_index(),
4189 index()->ssa_temp_index()); 4189 index()->ssa_temp_index());
4190 } 4190 }
4191 4191
4192 case kContext: 4192 case kContext:
4193 return "<context>"; 4193 return "<context>";
4194 } 4194 }
4195 UNREACHABLE(); 4195 UNREACHABLE();
4196 return "<?>"; 4196 return "<?>";
4197 } 4197 }
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
4632 for (intptr_t j = 0; j < phi->InputCount(); j++) { 4632 for (intptr_t j = 0; j < phi->InputCount(); j++) {
4633 input_place.set_instance(phi->InputAt(j)->definition()); 4633 input_place.set_instance(phi->InputAt(j)->definition());
4634 4634
4635 Place* result = map->Lookup(&input_place); 4635 Place* result = map->Lookup(&input_place);
4636 if (result == NULL) { 4636 if (result == NULL) {
4637 input_place.set_id(places->length()); 4637 input_place.set_id(places->length());
4638 result = Place::Wrap(input_place); 4638 result = Place::Wrap(input_place);
4639 map->Insert(result); 4639 map->Insert(result);
4640 places->Add(result); 4640 places->Add(result);
4641 if (FLAG_trace_optimization) { 4641 if (FLAG_trace_optimization) {
4642 OS::Print(" adding place %s as %"Pd"\n", 4642 OS::Print(" adding place %s as %" Pd "\n",
4643 result->ToCString(), 4643 result->ToCString(),
4644 result->id()); 4644 result->id());
4645 } 4645 }
4646 } 4646 }
4647 4647
4648 phi_moves->CreateOutgoingMove(block->PredecessorAt(j), 4648 phi_moves->CreateOutgoingMove(block->PredecessorAt(j),
4649 result->id(), 4649 result->id(),
4650 place->id()); 4650 place->id());
4651 } 4651 }
4652 } 4652 }
(...skipping 25 matching lines...) Expand all
4678 } 4678 }
4679 4679
4680 Place* result = map->Lookup(&place); 4680 Place* result = map->Lookup(&place);
4681 if (result == NULL) { 4681 if (result == NULL) {
4682 place.set_id(places->length()); 4682 place.set_id(places->length());
4683 result = Place::Wrap(place); 4683 result = Place::Wrap(place);
4684 map->Insert(result); 4684 map->Insert(result);
4685 places->Add(result); 4685 places->Add(result);
4686 4686
4687 if (FLAG_trace_optimization) { 4687 if (FLAG_trace_optimization) {
4688 OS::Print("numbering %s as %"Pd"\n", 4688 OS::Print("numbering %s as %" Pd "\n",
4689 result->ToCString(), 4689 result->ToCString(),
4690 result->id()); 4690 result->id());
4691 } 4691 }
4692 } 4692 }
4693 4693
4694 instr->set_place_id(result->id()); 4694 instr->set_place_id(result->id());
4695 } 4695 }
4696 } 4696 }
4697 4697
4698 if (!has_loads) { 4698 if (!has_loads) {
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
4924 } 4924 }
4925 4925
4926 const intptr_t place_id = defn->place_id(); 4926 const intptr_t place_id = defn->place_id();
4927 if (gen->Contains(place_id)) { 4927 if (gen->Contains(place_id)) {
4928 // This is a locally redundant load. 4928 // This is a locally redundant load.
4929 ASSERT((out_values != NULL) && ((*out_values)[place_id] != NULL)); 4929 ASSERT((out_values != NULL) && ((*out_values)[place_id] != NULL));
4930 4930
4931 Definition* replacement = (*out_values)[place_id]; 4931 Definition* replacement = (*out_values)[place_id];
4932 EnsureSSATempIndex(graph_, defn, replacement); 4932 EnsureSSATempIndex(graph_, defn, replacement);
4933 if (FLAG_trace_optimization) { 4933 if (FLAG_trace_optimization) {
4934 OS::Print("Replacing load v%"Pd" with v%"Pd"\n", 4934 OS::Print("Replacing load v%" Pd " with v%" Pd "\n",
4935 defn->ssa_temp_index(), 4935 defn->ssa_temp_index(),
4936 replacement->ssa_temp_index()); 4936 replacement->ssa_temp_index());
4937 } 4937 }
4938 4938
4939 defn->ReplaceUsesWith(replacement); 4939 defn->ReplaceUsesWith(replacement);
4940 instr_it.RemoveCurrentFromGraph(); 4940 instr_it.RemoveCurrentFromGraph();
4941 forwarded_ = true; 4941 forwarded_ = true;
4942 continue; 4942 continue;
4943 } else if (!kill->Contains(place_id)) { 4943 } else if (!kill->Contains(place_id)) {
4944 // This is an exposed load: it is the first representative of a 4944 // This is an exposed load: it is the first representative of a
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
5134 for (intptr_t i = 0; i < phi_moves->length(); i++) { 5134 for (intptr_t i = 0; i < phi_moves->length(); i++) {
5135 const intptr_t from = (*phi_moves)[i].from(); 5135 const intptr_t from = (*phi_moves)[i].from();
5136 const intptr_t to = (*phi_moves)[i].to(); 5136 const intptr_t to = (*phi_moves)[i].to();
5137 if (from == to) continue; 5137 if (from == to) continue;
5138 5138
5139 (*block_out_values)[to] = (*temp_forwarded_values)[to]; 5139 (*block_out_values)[to] = (*temp_forwarded_values)[to];
5140 } 5140 }
5141 } 5141 }
5142 5142
5143 if (FLAG_trace_load_optimization) { 5143 if (FLAG_trace_load_optimization) {
5144 OS::Print("B%"Pd"\n", block->block_id()); 5144 OS::Print("B%" Pd "\n", block->block_id());
5145 OS::Print(" IN: "); 5145 OS::Print(" IN: ");
5146 aliased_set_->PrintSet(in_[preorder_number]); 5146 aliased_set_->PrintSet(in_[preorder_number]);
5147 OS::Print("\n"); 5147 OS::Print("\n");
5148 5148
5149 OS::Print(" KILL: "); 5149 OS::Print(" KILL: ");
5150 aliased_set_->PrintSet(kill_[preorder_number]); 5150 aliased_set_->PrintSet(kill_[preorder_number]);
5151 OS::Print("\n"); 5151 OS::Print("\n");
5152 5152
5153 OS::Print(" OUT: "); 5153 OS::Print(" OUT: ");
5154 aliased_set_->PrintSet(out_[preorder_number]); 5154 aliased_set_->PrintSet(out_[preorder_number]);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
5198 5198
5199 for (BitVector::Iterator loop_it(header->loop_info()); 5199 for (BitVector::Iterator loop_it(header->loop_info());
5200 !loop_it.Done(); 5200 !loop_it.Done();
5201 loop_it.Advance()) { 5201 loop_it.Advance()) {
5202 const intptr_t preorder_number = loop_it.Current(); 5202 const intptr_t preorder_number = loop_it.Current();
5203 loop_gen->RemoveAll(kill_[preorder_number]); 5203 loop_gen->RemoveAll(kill_[preorder_number]);
5204 } 5204 }
5205 5205
5206 if (FLAG_trace_optimization) { 5206 if (FLAG_trace_optimization) {
5207 for (BitVector::Iterator it(loop_gen); !it.Done(); it.Advance()) { 5207 for (BitVector::Iterator it(loop_gen); !it.Done(); it.Advance()) {
5208 OS::Print("place %s is loop invariant for B%"Pd"\n", 5208 OS::Print("place %s is loop invariant for B%" Pd "\n",
5209 aliased_set_->places()[it.Current()]->ToCString(), 5209 aliased_set_->places()[it.Current()]->ToCString(),
5210 header->block_id()); 5210 header->block_id());
5211 } 5211 }
5212 } 5212 }
5213 5213
5214 invariant_loads->Add(loop_gen); 5214 invariant_loads->Add(loop_gen);
5215 } 5215 }
5216 5216
5217 graph_->set_loop_invariant_loads(invariant_loads); 5217 graph_->set_loop_invariant_loads(invariant_loads);
5218 } 5218 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
5269 Definition* replacement = (*pred_out_values)[place_id]->Replacement(); 5269 Definition* replacement = (*pred_out_values)[place_id]->Replacement();
5270 Value* input = new Value(replacement); 5270 Value* input = new Value(replacement);
5271 phi->SetInputAt(i, input); 5271 phi->SetInputAt(i, input);
5272 replacement->AddInputUse(input); 5272 replacement->AddInputUse(input);
5273 } 5273 }
5274 5274
5275 phi->set_ssa_temp_index(graph_->alloc_ssa_temp_index()); 5275 phi->set_ssa_temp_index(graph_->alloc_ssa_temp_index());
5276 phis_.Add(phi); // Postpone phi insertion until after load forwarding. 5276 phis_.Add(phi); // Postpone phi insertion until after load forwarding.
5277 5277
5278 if (FLAG_trace_load_optimization) { 5278 if (FLAG_trace_load_optimization) {
5279 OS::Print("created pending phi %s for %s at B%"Pd"\n", 5279 OS::Print("created pending phi %s for %s at B%" Pd "\n",
5280 phi->ToCString(), 5280 phi->ToCString(),
5281 aliased_set_->places()[place_id]->ToCString(), 5281 aliased_set_->places()[place_id]->ToCString(),
5282 block->block_id()); 5282 block->block_id());
5283 } 5283 }
5284 } 5284 }
5285 5285
5286 // Iterate over basic blocks and replace exposed loads with incoming 5286 // Iterate over basic blocks and replace exposed loads with incoming
5287 // values. 5287 // values.
5288 void ForwardLoads() { 5288 void ForwardLoads() {
5289 for (BlockIterator block_it = graph_->reverse_postorder_iterator(); 5289 for (BlockIterator block_it = graph_->reverse_postorder_iterator();
(...skipping 18 matching lines...) Expand all
5308 // they might contain values that were replace and removed 5308 // they might contain values that were replace and removed
5309 // from the graph by this iteration. 5309 // from the graph by this iteration.
5310 // To prevent using them we additionally mark definitions themselves 5310 // To prevent using them we additionally mark definitions themselves
5311 // as replaced and store a pointer to the replacement. 5311 // as replaced and store a pointer to the replacement.
5312 replacement = replacement->Replacement(); 5312 replacement = replacement->Replacement();
5313 5313
5314 if (load != replacement) { 5314 if (load != replacement) {
5315 EnsureSSATempIndex(graph_, load, replacement); 5315 EnsureSSATempIndex(graph_, load, replacement);
5316 5316
5317 if (FLAG_trace_optimization) { 5317 if (FLAG_trace_optimization) {
5318 OS::Print("Replacing load v%"Pd" with v%"Pd"\n", 5318 OS::Print("Replacing load v%" Pd " with v%" Pd "\n",
5319 load->ssa_temp_index(), 5319 load->ssa_temp_index(),
5320 replacement->ssa_temp_index()); 5320 replacement->ssa_temp_index());
5321 } 5321 }
5322 5322
5323 load->ReplaceUsesWith(replacement); 5323 load->ReplaceUsesWith(replacement);
5324 load->RemoveFromGraph(); 5324 load->RemoveFromGraph();
5325 load->SetReplacement(replacement); 5325 load->SetReplacement(replacement);
5326 forwarded_ = true; 5326 forwarded_ = true;
5327 } 5327 }
5328 } 5328 }
(...skipping 1437 matching lines...) Expand 10 before | Expand all | Expand 10 after
6766 // instructions, previous pointers, predecessors, etc. after eliminating 6766 // instructions, previous pointers, predecessors, etc. after eliminating
6767 // unreachable code. We do not maintain those properties during the 6767 // unreachable code. We do not maintain those properties during the
6768 // transformation. 6768 // transformation.
6769 for (BlockIterator b = graph_->reverse_postorder_iterator(); 6769 for (BlockIterator b = graph_->reverse_postorder_iterator();
6770 !b.Done(); 6770 !b.Done();
6771 b.Advance()) { 6771 b.Advance()) {
6772 BlockEntryInstr* block = b.Current(); 6772 BlockEntryInstr* block = b.Current();
6773 JoinEntryInstr* join = block->AsJoinEntry(); 6773 JoinEntryInstr* join = block->AsJoinEntry();
6774 if (!reachable_->Contains(block->preorder_number())) { 6774 if (!reachable_->Contains(block->preorder_number())) {
6775 if (FLAG_trace_constant_propagation) { 6775 if (FLAG_trace_constant_propagation) {
6776 OS::Print("Unreachable B%"Pd"\n", block->block_id()); 6776 OS::Print("Unreachable B%" Pd "\n", block->block_id());
6777 } 6777 }
6778 // Remove all uses in unreachable blocks. 6778 // Remove all uses in unreachable blocks.
6779 if (join != NULL) { 6779 if (join != NULL) {
6780 for (PhiIterator it(join); !it.Done(); it.Advance()) { 6780 for (PhiIterator it(join); !it.Done(); it.Advance()) {
6781 it.Current()->UnuseAllInputs(); 6781 it.Current()->UnuseAllInputs();
6782 } 6782 }
6783 } 6783 }
6784 block->UnuseAllInputs(); 6784 block->UnuseAllInputs();
6785 for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) { 6785 for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
6786 it.Current()->UnuseAllInputs(); 6786 it.Current()->UnuseAllInputs();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
6846 if ((defn != NULL) && 6846 if ((defn != NULL) &&
6847 IsConstant(defn->constant_value()) && 6847 IsConstant(defn->constant_value()) &&
6848 (defn->constant_value().IsSmi() || defn->constant_value().IsOld()) && 6848 (defn->constant_value().IsSmi() || defn->constant_value().IsOld()) &&
6849 !defn->IsConstant() && 6849 !defn->IsConstant() &&
6850 !defn->IsPushArgument() && 6850 !defn->IsPushArgument() &&
6851 !defn->IsStoreIndexed() && 6851 !defn->IsStoreIndexed() &&
6852 !defn->IsStoreInstanceField() && 6852 !defn->IsStoreInstanceField() &&
6853 !defn->IsStoreStaticField() && 6853 !defn->IsStoreStaticField() &&
6854 !defn->IsStoreVMField()) { 6854 !defn->IsStoreVMField()) {
6855 if (FLAG_trace_constant_propagation) { 6855 if (FLAG_trace_constant_propagation) {
6856 OS::Print("Constant v%"Pd" = %s\n", 6856 OS::Print("Constant v%" Pd " = %s\n",
6857 defn->ssa_temp_index(), 6857 defn->ssa_temp_index(),
6858 defn->constant_value().ToCString()); 6858 defn->constant_value().ToCString());
6859 } 6859 }
6860 ConstantInstr* constant = graph_->GetConstant(defn->constant_value()); 6860 ConstantInstr* constant = graph_->GetConstant(defn->constant_value());
6861 defn->ReplaceUsesWith(constant); 6861 defn->ReplaceUsesWith(constant);
6862 i.RemoveCurrentFromGraph(); 6862 i.RemoveCurrentFromGraph();
6863 } 6863 }
6864 } 6864 }
6865 6865
6866 // Replace branches where one target is unreachable with jumps. 6866 // Replace branches where one target is unreachable with jumps.
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
7316 return true; 7316 return true;
7317 } 7317 }
7318 7318
7319 7319
7320 // Remove the given allocation from the graph. It is not observable. 7320 // Remove the given allocation from the graph. It is not observable.
7321 // If deoptimization occurs the object will be materialized. 7321 // If deoptimization occurs the object will be materialized.
7322 static void EliminateAllocation(AllocateObjectInstr* alloc) { 7322 static void EliminateAllocation(AllocateObjectInstr* alloc) {
7323 ASSERT(IsAllocationSinkingCandidate(alloc)); 7323 ASSERT(IsAllocationSinkingCandidate(alloc));
7324 7324
7325 if (FLAG_trace_optimization) { 7325 if (FLAG_trace_optimization) {
7326 OS::Print("removing allocation from the graph: v%"Pd"\n", 7326 OS::Print("removing allocation from the graph: v%" Pd "\n",
7327 alloc->ssa_temp_index()); 7327 alloc->ssa_temp_index());
7328 } 7328 }
7329 7329
7330 // As an allocation sinking candidate it is only used in stores to its own 7330 // As an allocation sinking candidate it is only used in stores to its own
7331 // fields. Remove these stores. 7331 // fields. Remove these stores.
7332 for (Value* use = alloc->input_use_list(); 7332 for (Value* use = alloc->input_use_list();
7333 use != NULL; 7333 use != NULL;
7334 use = alloc->input_use_list()) { 7334 use = alloc->input_use_list()) {
7335 use->instruction()->RemoveFromGraph(); 7335 use->instruction()->RemoveFromGraph();
7336 } 7336 }
(...skipping 18 matching lines...) Expand all
7355 // Collect sinking candidates. 7355 // Collect sinking candidates.
7356 const GrowableArray<BlockEntryInstr*>& postorder = flow_graph_->postorder(); 7356 const GrowableArray<BlockEntryInstr*>& postorder = flow_graph_->postorder();
7357 for (BlockIterator block_it(postorder); 7357 for (BlockIterator block_it(postorder);
7358 !block_it.Done(); 7358 !block_it.Done();
7359 block_it.Advance()) { 7359 block_it.Advance()) {
7360 BlockEntryInstr* block = block_it.Current(); 7360 BlockEntryInstr* block = block_it.Current();
7361 for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) { 7361 for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
7362 AllocateObjectInstr* alloc = it.Current()->AsAllocateObject(); 7362 AllocateObjectInstr* alloc = it.Current()->AsAllocateObject();
7363 if ((alloc != NULL) && IsAllocationSinkingCandidate(alloc)) { 7363 if ((alloc != NULL) && IsAllocationSinkingCandidate(alloc)) {
7364 if (FLAG_trace_optimization) { 7364 if (FLAG_trace_optimization) {
7365 OS::Print("discovered allocation sinking candidate: v%"Pd"\n", 7365 OS::Print("discovered allocation sinking candidate: v%" Pd "\n",
7366 alloc->ssa_temp_index()); 7366 alloc->ssa_temp_index());
7367 } 7367 }
7368 7368
7369 // All sinking candidate are known to be not aliased. 7369 // All sinking candidate are known to be not aliased.
7370 alloc->set_identity(AllocateObjectInstr::kNotAliased); 7370 alloc->set_identity(AllocateObjectInstr::kNotAliased);
7371 7371
7372 candidates.Add(alloc); 7372 candidates.Add(alloc);
7373 } 7373 }
7374 } 7374 }
7375 } 7375 }
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
7537 } 7537 }
7538 7538
7539 // Insert materializations at environment uses. 7539 // Insert materializations at environment uses.
7540 for (intptr_t i = 0; i < exits.length(); i++) { 7540 for (intptr_t i = 0; i < exits.length(); i++) {
7541 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields); 7541 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields);
7542 } 7542 }
7543 } 7543 }
7544 7544
7545 7545
7546 } // namespace dart 7546 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698