Skip to content

Commit a58cca8

Browse files
verwaestV8 LUCI CQ
authored andcommitted
[maglev] Properly handle merged feedback in property load
- deal with no merge state being allocated - heap number map feedback can end up being wrong, so pre-check before adding the smi case. Otherwise we'll try to go to a block that's never generated Bug: 342451738 Change-Id: Ie6736798656136456dba00f7a36903b4786cab1e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5646187 Reviewed-by: Leszek Swirski <[email protected]> Commit-Queue: Toon Verwaest <[email protected]> Auto-Submit: Toon Verwaest <[email protected]> Commit-Queue: Leszek Swirski <[email protected]> Cr-Commit-Position: refs/heads/main@{#94586}
1 parent 70d2fe6 commit a58cca8

File tree

2 files changed

+45
-9
lines changed

2 files changed

+45
-9
lines changed

src/maglev/maglev-graph-builder.cc

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -702,14 +702,14 @@ void MaglevGraphBuilder::MaglevSubGraphBuilder::EndLoop(LoopLabel* loop_label) {
702702

703703
ReduceResult MaglevGraphBuilder::MaglevSubGraphBuilder::TrimPredecessorsAndBind(
704704
Label* label) {
705-
DCHECK_LE(label->merge_state_->predecessors_so_far(),
706-
label->predecessor_count_);
705+
int predecessors_so_far = label->merge_state_ == nullptr
706+
? 0
707+
: label->merge_state_->predecessors_so_far();
708+
DCHECK_LE(predecessors_so_far, label->predecessor_count_);
707709
builder_->current_block_ = nullptr;
708-
ReducePredecessorCount(label, label->predecessor_count_ -
709-
label->merge_state_->predecessors_so_far());
710-
if (label->merge_state_->predecessors_so_far() == 0) {
711-
return ReduceResult::DoneWithAbort();
712-
}
710+
ReducePredecessorCount(label,
711+
label->predecessor_count_ - predecessors_so_far);
712+
if (predecessors_so_far == 0) return ReduceResult::DoneWithAbort();
713713
Bind(label);
714714
return ReduceResult::Done();
715715
}
@@ -4630,8 +4630,15 @@ ReduceResult MaglevGraphBuilder::TryBuildNamedAccess(
46304630
return ReduceResult::Fail();
46314631
}
46324632
if (map.IsHeapNumberMap()) {
4633-
DCHECK_EQ(number_map_index, -1);
4634-
number_map_index = i;
4633+
GetOrCreateInfoFor(lookup_start_object);
4634+
base::SmallVector<compiler::MapRef, 1> known_maps = {map};
4635+
KnownMapsMerger merger(broker(), base::VectorOf(known_maps));
4636+
merger.IntersectWithKnownNodeAspects(lookup_start_object,
4637+
known_node_aspects());
4638+
if (!merger.intersect_set().is_empty()) {
4639+
DCHECK_EQ(number_map_index, -1);
4640+
number_map_index = i;
4641+
}
46354642
}
46364643
}
46374644
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2024 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+
// Flags: --jit-fuzzing --efficiency-mode
6+
7+
function f1( a3) {
8+
try { a3(); } catch (e) {}
9+
class C6 {
10+
}
11+
const v7 = new C6();
12+
function f9(a10, a11) {
13+
a11.propertyIsEnumerable();
14+
const t6 = a11.constructor;
15+
const v14 = new t6();
16+
v14.constructor;
17+
}
18+
f9(7, v7);
19+
for (let v17 = 0; v17 < 25; v17++) {
20+
const o18 = {
21+
"deleteProperty": f9,
22+
};
23+
const t17 = o18.deleteProperty;
24+
t17(3653, o18);
25+
o18.deleteProperty(v17, 2);
26+
}
27+
}
28+
f1(f1, f1);
29+
f1();

0 commit comments

Comments
 (0)