Index: runtime/vm/compiler.cc |
=================================================================== |
--- runtime/vm/compiler.cc (revision 7951) |
+++ runtime/vm/compiler.cc (working copy) |
@@ -15,6 +15,7 @@ |
#include "vm/flags.h" |
#include "vm/flow_graph_builder.h" |
#include "vm/flow_graph_compiler.h" |
+#include "vm/flow_graph_optimizer.h" |
#include "vm/longjump.h" |
#include "vm/object.h" |
#include "vm/object_store.h" |
@@ -93,8 +94,9 @@ |
code.ExtractIcDataArraysAtCalls(&computation_ids, ic_data_objs); |
const Array& result = Array::Handle(Array::New(max_id + 1)); |
for (intptr_t i = 0; i < computation_ids.length(); i++) { |
- ASSERT(result.At(i) == Object::null()); |
- result.SetAt(i, Object::Handle(ic_data_objs.At(i))); |
+ intptr_t result_index = computation_ids[i]; |
+ ASSERT(result.At(result_index) == Object::null()); |
+ result.SetAt(result_index, Object::Handle(ic_data_objs.At(i))); |
} |
return result.raw(); |
} |
@@ -153,6 +155,8 @@ |
const ParsedFunction& parsed_function, bool optimized) { |
bool is_compiled = false; |
Isolate* isolate = Isolate::Current(); |
+ const intptr_t prev_cid = isolate->computation_id(); |
+ isolate->set_computation_id(0); |
LongJump* old_base = isolate->long_jump_base(); |
LongJump bailout_jump; |
isolate->set_long_jump_base(&bailout_jump); |
@@ -191,6 +195,10 @@ |
for (intptr_t i = length - 1; i >= 0; --i) { |
block_order.Add(graph_builder.postorder_block_entries()[i]); |
} |
+ if (optimized) { |
+ FlowGraphOptimizer optimizer(block_order); |
+ optimizer.ApplyICData(); |
+ } |
} |
Assembler assembler; |
@@ -240,6 +248,7 @@ |
is_compiled = false; |
} |
isolate->set_long_jump_base(old_base); |
+ isolate->set_computation_id(prev_cid); |
return is_compiled; |
} |