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

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

Issue 653073002: Fix bug with captured parameters and optimized try-catch. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 2 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
« no previous file with comments | « runtime/vm/flow_graph.h ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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.h" 5 #include "vm/flow_graph.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/flow_graph_builder.h" 8 #include "vm/flow_graph_builder.h"
9 #include "vm/intermediate_language.h" 9 #include "vm/intermediate_language.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 23 matching lines...) Expand all
34 postorder_(), 34 postorder_(),
35 reverse_postorder_(), 35 reverse_postorder_(),
36 optimized_block_order_(), 36 optimized_block_order_(),
37 constant_null_(NULL), 37 constant_null_(NULL),
38 constant_dead_(NULL), 38 constant_dead_(NULL),
39 block_effects_(NULL), 39 block_effects_(NULL),
40 licm_allowed_(true), 40 licm_allowed_(true),
41 loop_headers_(NULL), 41 loop_headers_(NULL),
42 loop_invariant_loads_(NULL), 42 loop_invariant_loads_(NULL),
43 guarded_fields_(builder.guarded_fields()), 43 guarded_fields_(builder.guarded_fields()),
44 deferred_prefixes_(builder.deferred_prefixes()) { 44 deferred_prefixes_(builder.deferred_prefixes()),
45 captured_parameters_(
46 new(isolate_) BitVector(isolate_, variable_count())) {
45 DiscoverBlocks(); 47 DiscoverBlocks();
46 } 48 }
47 49
48 50
49 void FlowGraph::AddToGuardedFields( 51 void FlowGraph::AddToGuardedFields(
50 ZoneGrowableArray<const Field*>* array, 52 ZoneGrowableArray<const Field*>* array,
51 const Field* field) { 53 const Field* field) {
52 if ((field->guarded_cid() == kDynamicCid) || 54 if ((field->guarded_cid() == kDynamicCid) ||
53 (field->guarded_cid() == kIllegalCid)) { 55 (field->guarded_cid() == kIllegalCid)) {
54 return; 56 return;
(...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 954
953 PhiInstr* phi = result->AsPhi(); 955 PhiInstr* phi = result->AsPhi();
954 if ((phi != NULL) && !phi->is_alive()) { 956 if ((phi != NULL) && !phi->is_alive()) {
955 phi->mark_alive(); 957 phi->mark_alive();
956 live_phis->Add(phi); 958 live_phis->Add(phi);
957 } 959 }
958 960
959 if (variable_liveness->IsLastLoad(block_entry, load)) { 961 if (variable_liveness->IsLastLoad(block_entry, load)) {
960 (*env)[index] = constant_dead(); 962 (*env)[index] = constant_dead();
961 } 963 }
964
965 // Record captured parameters so that they can be skipped when
966 // emitting sync code inside optimized try-blocks.
967 if (load->local().is_captured_parameter()) {
968 intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
969 captured_parameters_->Add(index);
970 }
971
962 } else if (push != NULL) { 972 } else if (push != NULL) {
963 result = push->value()->definition(); 973 result = push->value()->definition();
964 env->Add(result); 974 env->Add(result);
965 it.RemoveCurrentFromGraph(); 975 it.RemoveCurrentFromGraph();
966 continue; 976 continue;
967 } else if (drop != NULL) { 977 } else if (drop != NULL) {
968 // Drop temps from the environment. 978 // Drop temps from the environment.
969 for (intptr_t j = 0; j < drop->num_temps(); j++) { 979 for (intptr_t j = 0; j < drop->num_temps(); j++) {
970 env->RemoveLast(); 980 env->RemoveLast();
971 } 981 }
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
1298 } 1308 }
1299 1309
1300 1310
1301 bool BlockEffects::IsSideEffectFreePath(BlockEntryInstr* from, 1311 bool BlockEffects::IsSideEffectFreePath(BlockEntryInstr* from,
1302 BlockEntryInstr* to) const { 1312 BlockEntryInstr* to) const {
1303 return available_at_[to->postorder_number()]->Contains( 1313 return available_at_[to->postorder_number()]->Contains(
1304 from->postorder_number()); 1314 from->postorder_number());
1305 } 1315 }
1306 1316
1307 } // namespace dart 1317 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph.h ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698