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

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

Issue 722243002: Indirectly dispatch all backtracking jumps through the same block. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: const Created 6 years, 1 month 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/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/cpu.h" 8 #include "vm/cpu.h"
9 #include "vm/dart_entry.h" 9 #include "vm/dart_entry.h"
10 #include "vm/flow_graph_allocator.h" 10 #include "vm/flow_graph_allocator.h"
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after
2523 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, 2523 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
2524 GetDeoptId(), 2524 GetDeoptId(),
2525 Scanner::kNoSourcePos); 2525 Scanner::kNoSourcePos);
2526 } 2526 }
2527 if (HasParallelMove()) { 2527 if (HasParallelMove()) {
2528 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); 2528 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
2529 } 2529 }
2530 } 2530 }
2531 2531
2532 2532
2533 void IndirectGotoInstr::ComputeOffsetTable(Isolate* isolate) {
2534 ASSERT(SuccessorCount() == offsets_.Capacity());
2535 offsets_.SetLength(SuccessorCount());
2536 for (intptr_t i = 0; i < SuccessorCount(); i++) {
2537 TargetEntryInstr* target = SuccessorAt(i);
2538
2539 // Optimizations might have modified the immediate target block, but
2540 // it must end with a goto to the indirect entry.
2541 Instruction* instr = target;
Vyacheslav Egorov (Google) 2014/11/13 18:30:04 use target->last_instruction() instead of the loop
zerny-google 2014/11/14 13:29:29 No can do, since it is not set if the target is un
2542 while (instr != NULL && !instr->IsGoto()) {
2543 instr = instr->next();
2544 }
2545 ASSERT(instr->IsGoto());
2546
2547 IndirectEntryInstr* ientry =
2548 instr->AsGoto()->successor()->AsIndirectEntry();
2549 ASSERT(ientry != NULL);
2550 ASSERT(ientry->indirect_id() == i);
2551
2552 // The intermediate block might be compacted, check both it and the
2553 // final indirect entry for a valid offset. If neither are valid, then
2554 // the indirect entry is unreachable.
2555 intptr_t offset =
Vyacheslav Egorov (Google) 2014/11/13 18:30:04 when can the ientry be unreachable? if it is "unr
zerny-google 2014/11/14 13:29:28 It is possible that we never emit a backtracking p
2556 (target->offset() > 0) ? target->offset() : ientry->offset();
2557
2558 if (offset > 0) {
2559 offset -= Assembler::EntryPointToPcMarkerOffset();
2560 offsets_.SetAt(i, Smi::ZoneHandle(isolate, Smi::New(offset)));
2561 }
2562 }
2563 }
2564
2565
2533 LocationSummary* IndirectEntryInstr::MakeLocationSummary( 2566 LocationSummary* IndirectEntryInstr::MakeLocationSummary(
2534 Isolate* isolate, bool optimizing) const { 2567 Isolate* isolate, bool optimizing) const {
2535 return JoinEntryInstr::MakeLocationSummary(isolate, optimizing); 2568 return JoinEntryInstr::MakeLocationSummary(isolate, optimizing);
2536 } 2569 }
2537 2570
2538 2571
2539 void IndirectEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2572 void IndirectEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2540 JoinEntryInstr::EmitNativeCode(compiler); 2573 JoinEntryInstr::EmitNativeCode(compiler);
2541 } 2574 }
2542 2575
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after
3378 case Token::kTRUNCDIV: return 0; 3411 case Token::kTRUNCDIV: return 0;
3379 case Token::kMOD: return 1; 3412 case Token::kMOD: return 1;
3380 default: UNIMPLEMENTED(); return -1; 3413 default: UNIMPLEMENTED(); return -1;
3381 } 3414 }
3382 } 3415 }
3383 3416
3384 3417
3385 #undef __ 3418 #undef __
3386 3419
3387 } // namespace dart 3420 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698