blob: 4e96a53aebb4ab7be22a39332dce0b571f695661 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/compiler/bytecode-branch-analysis.h"
6
7#include "src/interpreter/bytecode-array-iterator.h"
8#include "src/objects-inl.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014BytecodeBranchAnalysis::BytecodeBranchAnalysis(
15 Handle<BytecodeArray> bytecode_array, Zone* zone)
Ben Murdoch097c5b22016-05-18 11:27:45 +010016 : bytecode_array_(bytecode_array),
17 is_backward_target_(bytecode_array->length(), zone),
18 is_forward_target_(bytecode_array->length(), zone),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000019 zone_(zone) {}
20
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000021void BytecodeBranchAnalysis::Analyze() {
22 interpreter::BytecodeArrayIterator iterator(bytecode_array());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000023 while (!iterator.done()) {
24 interpreter::Bytecode bytecode = iterator.current_bytecode();
25 int current_offset = iterator.current_offset();
Ben Murdoch097c5b22016-05-18 11:27:45 +010026 if (interpreter::Bytecodes::IsJump(bytecode)) {
27 AddBranch(current_offset, iterator.GetJumpTargetOffset());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028 }
29 iterator.Advance();
30 }
31}
32
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000033void BytecodeBranchAnalysis::AddBranch(int source_offset, int target_offset) {
Ben Murdoch097c5b22016-05-18 11:27:45 +010034 if (source_offset < target_offset) {
35 is_forward_target_.Add(target_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036 } else {
Ben Murdoch097c5b22016-05-18 11:27:45 +010037 is_backward_target_.Add(target_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039}
40
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000041} // namespace compiler
42} // namespace internal
43} // namespace v8