From c80394dd3c9e651574359afc2db61293aa1ad2a5 Mon Sep 17 00:00:00 2001 From: Matthias Liedtke Date: Thu, 10 Nov 2022 15:17:30 +0100 Subject: [PATCH] [turbofan] Scheduler: Do not split nodes into loops This is required for wasm loop peeling to not split immutable loads into every loop iteration. Bug: v8:7748 Change-Id: I05432812235475150a1ce8be1a6a6b5eaed08de7 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4013552 Commit-Queue: Matthias Liedtke Reviewed-by: Tobias Tebbi Cr-Commit-Position: refs/heads/main@{#84190} --- src/compiler/scheduler.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc index 4da855cf6e..d221f7ce84 100644 --- a/src/compiler/scheduler.cc +++ b/src/compiler/scheduler.cc @@ -1615,6 +1615,7 @@ class ScheduleLateNodeVisitor { if (!node->op()->HasProperty(Operator::kPure)) return block; // TODO(titzer): fix the special case of splitting of projections. if (node->opcode() == IrOpcode::kProjection) return block; + // Wasm-gc uses LoadImmutable for things that we want deduplicated. // The {block} is common dominator of all uses of {node}, so we cannot // split anything unless the {block} has at least two successors. @@ -1647,10 +1648,12 @@ class ScheduleLateNodeVisitor { marking_queue_.pop_front(); if (IsMarked(top_block)) continue; bool marked = true; - for (BasicBlock* successor : top_block->successors()) { - if (!IsMarked(successor)) { - marked = false; - break; + if (top_block->loop_depth() == block->loop_depth()) { + for (BasicBlock* successor : top_block->successors()) { + if (!IsMarked(successor)) { + marked = false; + break; + } } } if (marked) MarkBlock(top_block);