Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorRay Wang <ray@isrc.iscas.ac.cn>2021-11-19 16:14:47 +0300
committerMichaël Zasso <targos@protonmail.com>2021-11-21 18:06:06 +0300
commit25bc27d1ce58d54d92dcb1179c369474389de8a0 (patch)
treec19bcb357ebbeabf8572940361e6b3cd10a617e7 /deps
parenta9b03eabf215a368df25c05af3f4e40a64aeb994 (diff)
deps: V8: cherry-pick 7ae0b77628f6
Original commit message: [interpreter] Stop jump-table optimizing switch stms when spread overflows Bug: v8:12389 Change-Id: I53c728ab0c8ba38c7dd96c7e1089f771ba44b9f0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3289227 Reviewed-by: Leszek Swirski <leszeks@chromium.org> Commit-Queue: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/main@{#77995} Refs: https://github.com/v8/v8/commit/7ae0b77628f6b7ef5b38658bec82fd57115dfaf3 PR-URL: https://github.com/nodejs/node/pull/40882 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'deps')
-rw-r--r--deps/v8/src/interpreter/bytecode-generator.cc33
1 files changed, 22 insertions, 11 deletions
diff --git a/deps/v8/src/interpreter/bytecode-generator.cc b/deps/v8/src/interpreter/bytecode-generator.cc
index f82a71202c0..ff5d342f3d1 100644
--- a/deps/v8/src/interpreter/bytecode-generator.cc
+++ b/deps/v8/src/interpreter/bytecode-generator.cc
@@ -1889,17 +1889,28 @@ bool IsSwitchOptimizable(SwitchStatement* stmt, SwitchInfo* info) {
}
// GCC also jump-table optimizes switch statements with 6 cases or more.
- if (!(static_cast<int>(info->covered_cases.size()) >=
- FLAG_switch_table_min_cases &&
- IsSpreadAcceptable(info->MaxCase() - info->MinCase(),
- cases->length()))) {
- // Invariant- covered_cases has all cases and only cases that will go in the
- // jump table.
- info->covered_cases.clear();
- return false;
- } else {
- return true;
- }
+ if (static_cast<int>(info->covered_cases.size()) >=
+ FLAG_switch_table_min_cases) {
+ // Due to case spread will be used as the size of jump-table,
+ // we need to check if it doesn't overflow by casting its
+ // min and max bounds to int64_t, and calculate if the difference is less
+ // than or equal to INT_MAX.
+ int64_t min = static_cast<int64_t>(info->MinCase());
+ int64_t max = static_cast<int64_t>(info->MaxCase());
+ int64_t spread = max - min + 1;
+
+ DCHECK_GT(spread, 0);
+
+ // Check if casted spread is acceptable and doesn't overflow.
+ if (spread <= INT_MAX &&
+ IsSpreadAcceptable(static_cast<int>(spread), cases->length())) {
+ return true;
+ }
+ }
+ // Invariant- covered_cases has all cases and only cases that will go in the
+ // jump table.
+ info->covered_cases.clear();
+ return false;
}
} // namespace