Commit 5a9fa8f3 authored by Sigurd Schneider's avatar Sigurd Schneider Committed by Commit Bot

[turbofan] Restrict redundancy elimination from widening types

This CL prevents redundancy elimination from widening types, which
can cause problems if the input of a DeadValue (which has type None)
is replaced by an equivalent node that does not have type None. This
can happen because load elimination does not re-type nodes, for
example.

Bug: chromium:919340
Change-Id: I89e872412edbcdc610e70ae160cde56cd045006c
Reviewed-on: https://chromium-review.googlesource.com/c/1397709Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58617}
parent 95254434
...@@ -200,11 +200,22 @@ bool CheckSubsumes(Node const* a, Node const* b) { ...@@ -200,11 +200,22 @@ bool CheckSubsumes(Node const* a, Node const* b) {
return true; return true;
} }
bool TypeSubsumes(Node* node, Node* replacement) {
if (!NodeProperties::IsTyped(node) || !NodeProperties::IsTyped(replacement)) {
// If either node is untyped, we are running during an untyped optimization
// phase, and replacement is OK.
return true;
}
Type node_type = NodeProperties::GetType(node);
Type replacement_type = NodeProperties::GetType(replacement);
return replacement_type.Is(node_type);
}
} // namespace } // namespace
Node* RedundancyElimination::EffectPathChecks::LookupCheck(Node* node) const { Node* RedundancyElimination::EffectPathChecks::LookupCheck(Node* node) const {
for (Check const* check = head_; check != nullptr; check = check->next) { for (Check const* check = head_; check != nullptr; check = check->next) {
if (CheckSubsumes(check->node, node)) { if (CheckSubsumes(check->node, node) && TypeSubsumes(node, check->node)) {
DCHECK(!check->node->IsDead()); DCHECK(!check->node->IsDead());
return check->node; return check->node;
} }
......
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax --opt
var E = 'Σ';
var PI = 123;
function f() {
print(E = 2, /b/.test(E) || /b/.test(E = 2));
((E = 3) * PI);
}
f();
f();
%OptimizeFunctionOnNextCall(f);
f();
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