Commit 29f1c138 authored by Yuri Iozzelli's avatar Yuri Iozzelli Committed by V8 LUCI CQ

Update WebAssembly Branch Hinting proposal

The main change is the section name, which is now 'metadata.code.branch_hint'.
The binary format has also a couple of minor changes.
Semantics remain unchanged.

Change-Id: I056c9f672ae494979e8ea55266fa766139b71d38
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3487788Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#79292}
parent a3361bee
...@@ -2234,6 +2234,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> { ...@@ -2234,6 +2234,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
DCHECK_LE(this->pc_, this->end_); DCHECK_LE(this->pc_, this->end_);
DCHECK_EQ(this->num_locals(), 0); DCHECK_EQ(this->num_locals(), 0);
locals_offset_ = this->pc_offset();
this->InitializeLocalsFromSig(); this->InitializeLocalsFromSig();
uint32_t params_count = static_cast<uint32_t>(this->num_locals()); uint32_t params_count = static_cast<uint32_t>(this->num_locals());
uint32_t locals_length; uint32_t locals_length;
...@@ -2340,7 +2341,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> { ...@@ -2340,7 +2341,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
} }
uint32_t pc_relative_offset() const { uint32_t pc_relative_offset() const {
return this->pc_offset() - first_instruction_offset; return this->pc_offset() - locals_offset_;
} }
void DecodeFunctionBody() { void DecodeFunctionBody() {
...@@ -2374,7 +2375,6 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> { ...@@ -2374,7 +2375,6 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
CALL_INTERFACE_IF_OK_AND_REACHABLE(StartFunctionBody, c); CALL_INTERFACE_IF_OK_AND_REACHABLE(StartFunctionBody, c);
} }
first_instruction_offset = this->pc_offset();
// Decode the function body. // Decode the function body.
while (this->pc_ < this->end_) { while (this->pc_ < this->end_) {
// Most operations only grow the stack by at least one element (unary and // Most operations only grow the stack by at least one element (unary and
...@@ -2407,7 +2407,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> { ...@@ -2407,7 +2407,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
} }
private: private:
uint32_t first_instruction_offset = 0; uint32_t locals_offset_ = 0;
Interface interface_; Interface interface_;
// The value stack, stored as individual pointers for maximum performance. // The value stack, stored as individual pointers for maximum performance.
......
...@@ -36,7 +36,7 @@ namespace { ...@@ -36,7 +36,7 @@ namespace {
constexpr char kNameString[] = "name"; constexpr char kNameString[] = "name";
constexpr char kSourceMappingURLString[] = "sourceMappingURL"; constexpr char kSourceMappingURLString[] = "sourceMappingURL";
constexpr char kCompilationHintsString[] = "compilationHints"; constexpr char kCompilationHintsString[] = "compilationHints";
constexpr char kBranchHintsString[] = "branchHints"; constexpr char kBranchHintsString[] = "metadata.code.branch_hint";
constexpr char kDebugInfoString[] = ".debug_info"; constexpr char kDebugInfoString[] = ".debug_info";
constexpr char kExternalDebugInfoString[] = "external_debug_info"; constexpr char kExternalDebugInfoString[] = "external_debug_info";
...@@ -1345,11 +1345,6 @@ class ModuleDecoderImpl : public Decoder { ...@@ -1345,11 +1345,6 @@ class ModuleDecoderImpl : public Decoder {
break; break;
} }
last_func_idx = func_idx; last_func_idx = func_idx;
uint8_t reserved = inner.consume_u8("reserved byte");
if (reserved != 0x0) {
inner.errorf("Invalid reserved byte: %#x", reserved);
break;
}
uint32_t num_hints = inner.consume_u32v("number of hints"); uint32_t num_hints = inner.consume_u32v("number of hints");
BranchHintMap func_branch_hints; BranchHintMap func_branch_hints;
TRACE("DecodeBranchHints[%d] module+%d\n", func_idx, TRACE("DecodeBranchHints[%d] module+%d\n", func_idx,
...@@ -1357,13 +1352,18 @@ class ModuleDecoderImpl : public Decoder { ...@@ -1357,13 +1352,18 @@ class ModuleDecoderImpl : public Decoder {
// Keep track of the previous branch offset to validate the ordering // Keep track of the previous branch offset to validate the ordering
int64_t last_br_off = -1; int64_t last_br_off = -1;
for (uint32_t j = 0; j < num_hints; ++j) { for (uint32_t j = 0; j < num_hints; ++j) {
uint32_t br_dir = inner.consume_u32v("branch direction");
uint32_t br_off = inner.consume_u32v("branch instruction offset"); uint32_t br_off = inner.consume_u32v("branch instruction offset");
if (int64_t(br_off) <= last_br_off) { if (int64_t(br_off) <= last_br_off) {
inner.errorf("Invalid branch offset: %d", br_off); inner.errorf("Invalid branch offset: %d", br_off);
break; break;
} }
last_br_off = br_off; last_br_off = br_off;
uint32_t data_size = inner.consume_u32v("data size");
if (data_size != 1) {
inner.errorf("Invalid data size: %#x. Expected 1.", data_size);
break;
}
uint32_t br_dir = inner.consume_u8("branch direction");
TRACE("DecodeBranchHints[%d][%d] module+%d\n", func_idx, br_off, TRACE("DecodeBranchHints[%d][%d] module+%d\n", func_idx, br_off,
static_cast<int>(inner.pc() - inner.start())); static_cast<int>(inner.pc() - inner.start()));
WasmBranchHint hint; WasmBranchHint hint;
......
...@@ -76,9 +76,11 @@ namespace module_decoder_unittest { ...@@ -76,9 +76,11 @@ namespace module_decoder_unittest {
'H', 'i', 'n', 't', 's'), \ 'H', 'i', 'n', 't', 's'), \
ADD_COUNT(__VA_ARGS__)) ADD_COUNT(__VA_ARGS__))
#define SECTION_BRANCH_HINTS(...) \ #define SECTION_BRANCH_HINTS(...) \
SECTION(Unknown, \ SECTION(Unknown, \
ADD_COUNT('b', 'r', 'a', 'n', 'c', 'h', 'H', 'i', 'n', 't', 's'), \ ADD_COUNT('m', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'c', 'o', \
'd', 'e', '.', 'b', 'r', 'a', 'n', 'c', 'h', '_', 'h', \
'i', 'n', 't'), \
__VA_ARGS__) __VA_ARGS__)
#define FAIL_IF_NO_EXPERIMENTAL_EH(data) \ #define FAIL_IF_NO_EXPERIMENTAL_EH(data) \
...@@ -2228,10 +2230,10 @@ TEST_F(WasmModuleVerifyTest, BranchHinting) { ...@@ -2228,10 +2230,10 @@ TEST_F(WasmModuleVerifyTest, BranchHinting) {
WASM_FEATURE_SCOPE(branch_hinting); WASM_FEATURE_SCOPE(branch_hinting);
static const byte data[] = { static const byte data[] = {
TYPE_SECTION(1, SIG_ENTRY_v_v), FUNCTION_SECTION(2, 0, 0), TYPE_SECTION(1, SIG_ENTRY_v_v), FUNCTION_SECTION(2, 0, 0),
SECTION_BRANCH_HINTS(ENTRY_COUNT(2), 0 /*func_index*/, 0 /*reserved*/, SECTION_BRANCH_HINTS(ENTRY_COUNT(2), 0 /*func_index*/, ENTRY_COUNT(1),
ENTRY_COUNT(1), 1 /*likely*/, 2 /* if offset*/, 3 /* if offset*/, 1 /*reserved*/, 1 /*likely*/,
1 /*func_index*/, 0 /*reserved*/, ENTRY_COUNT(1), 1 /*func_index*/, ENTRY_COUNT(1),
0 /*unlikely*/, 4 /* br_if offset*/), 5 /* br_if offset*/, 1 /*reserved*/, 0 /*unlikely*/),
SECTION(Code, ENTRY_COUNT(2), SECTION(Code, ENTRY_COUNT(2),
ADD_COUNT(0, /*no locals*/ ADD_COUNT(0, /*no locals*/
WASM_IF(WASM_I32V_1(1), WASM_NOP), WASM_END), WASM_IF(WASM_I32V_1(1), WASM_NOP), WASM_END),
...@@ -2243,9 +2245,9 @@ TEST_F(WasmModuleVerifyTest, BranchHinting) { ...@@ -2243,9 +2245,9 @@ TEST_F(WasmModuleVerifyTest, BranchHinting) {
EXPECT_EQ(2u, result.value()->branch_hints.size()); EXPECT_EQ(2u, result.value()->branch_hints.size());
EXPECT_EQ(WasmBranchHint::kLikely, EXPECT_EQ(WasmBranchHint::kLikely,
result.value()->branch_hints[0].GetHintFor(2)); result.value()->branch_hints[0].GetHintFor(3));
EXPECT_EQ(WasmBranchHint::kUnlikely, EXPECT_EQ(WasmBranchHint::kUnlikely,
result.value()->branch_hints[1].GetHintFor(4)); result.value()->branch_hints[1].GetHintFor(5));
} }
class WasmSignatureDecodeTest : public TestWithZone { class WasmSignatureDecodeTest : public TestWithZone {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment