66 size_t n_blocks =
schedule->RpoBlockCount();
71 if (
v8_flags.turbo_profiling_verbose) {
72 std::ostringstream os;
74 data->SetSchedule(os);
79 bool on_heap_counters = isolate && isolate->IsGeneratingEmbeddedBuiltins();
83 Node* counters_array =
nullptr;
84 if (on_heap_counters) {
95 ReadOnlyRoots(isolate).basic_block_counters_marker(), isolate)));
97 counters_array = graph->NewNode(
PointerConstant(&common, data->counts()));
102 size_t block_number = 0;
104 ++it, ++block_number) {
106 if (block ==
schedule->end())
continue;
108 DCHECK_EQ(block->rpo_number(), block_number);
109 data->SetBlockId(block_number, block->id().ToInt());
113 int offset_to_counter_value =
static_cast<int>(block_number) *
kInt32Size;
114 if (on_heap_counters) {
115 offset_to_counter_value +=
118 Node* offset_to_counter =
122 offset_to_counter, graph->start(), graph->start());
123 Node* inc = graph->NewNode(machine.Int32Add(), load,
one);
127 Node* overflow = graph->NewNode(machine.Uint32LessThan(), inc, load);
128 Node* overflow_mask = graph->NewNode(machine.Int32Sub(), zero, overflow);
129 Node* saturated_inc =
130 graph->NewNode(machine.Word32Or(), inc, overflow_mask);
135 counters_array, offset_to_counter, saturated_inc,
136 graph->start(), graph->start());
138 static const int kArraySize = 10;
139 Node* to_insert[kArraySize] = {
140 counters_array,
zero,
one, offset_to_counter,
142 saturated_inc, store};
144 int insertion_start = block_number == 0 ? 0 : 3;
146 block->InsertNodes(insertion_point, &to_insert[insertion_start],
147 &to_insert[kArraySize]);
149 for (
int i = insertion_start;
i < kArraySize; ++
i) {
150 schedule->SetBlockForNode(block, to_insert[
i]);
155 block->successors()[0] !=
schedule->end() &&
156 block->successors()[1] !=
schedule->end()) {
157 data->AddBranch(block->successors()[0]->id().ToInt(),
158 block->successors()[1]->id().ToInt());
196 size_t block_number = 0;
197 size_t n_blocks =
schedule->RpoBlockCount();
199 ++it, ++block_number) {
201 if (block ==
schedule->end())
continue;
203 DCHECK_EQ(block->rpo_number(), block_number);
204 int block_id = block->id().ToInt();
208 for (
Node* node : *block) {
209 StoreBuiltinCallForNode(node, info->builtin(), block_id, profiler);
214 Node* cnt_node = block->control_input();
215 StoreBuiltinCallForNode(cnt_node, info->builtin(), block_id, profiler);
222 using namespace turboshaft;
228 callee_index = call_op->callee();
231 callee_index = tail_call_op->callee();
244 if (!IsCode(*heap_constant))
return false;
246 if (!code->is_builtin())
return false;
248 *called_builtin = code->builtin_id();