Index: runtime/vm/intermediate_language_mips.cc |
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc |
index a1d5b188cc92b3fbf160f3efae9974d4b1db8c92..39311217845e3c036af8ef4c1cb4e197a700cd80 100644 |
--- a/runtime/vm/intermediate_language_mips.cc |
+++ b/runtime/vm/intermediate_language_mips.cc |
@@ -3868,6 +3868,26 @@ LocationSummary* GotoInstr::MakeLocationSummary() const { |
void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ TraceSimMsg("GotoInstr"); |
+ if (!compiler->is_optimizing()) { |
+ // Add deoptimization descriptor for deoptimizing instructions that may |
+ // be inserted before this instruction. |
+ compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
+ GetDeoptId(), |
+ 0); // No token position. |
+ // Add an edge counter. |
+ const Array& counter = Array::ZoneHandle(Array::New(1, Heap::kOld)); |
+ counter.SetAt(0, Smi::Handle(Smi::New(0))); |
+ Label done; |
+ __ Comment("Edge counter"); |
+ __ LoadObject(T0, counter); |
+ __ lw(T1, FieldAddress(T0, Array::element_offset(0))); |
+ __ AddImmediateDetectOverflow(T1, T1, Smi::RawValue(1), CMPRES, T2); |
+ __ bgez(CMPRES, &done); |
+ __ delay_slot()->sw(T1, FieldAddress(T0, Array::element_offset(0))); |
+ __ LoadImmediate(TMP1, Smi::RawValue(Smi::kMaxValue)); |
+ __ sw(TMP1, FieldAddress(T0, Array::element_offset(0))); // If overflow. |
+ __ Bind(&done); |
+ } |
if (HasParallelMove()) { |
compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
} |