[turbofan] fix deopt-loop for specuative Boolean to Number conversion
Bug: chromium:965513 Change-Id: I18ff91c98ad6106c5d4df260e6ead6a9e2425dbb Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1622119 Commit-Queue: Tobias Tebbi <tebbi@chromium.org> Auto-Submit: Tobias Tebbi <tebbi@chromium.org> Reviewed-by: Jaroslav Sevcik <jarin@chromium.org> Cr-Commit-Position: refs/heads/master@{#61730}
This commit is contained in:
parent
9188d54941
commit
52636535fa
@ -843,7 +843,10 @@ Node* RepresentationChanger::GetFloat64RepresentationFor(
|
|||||||
}
|
}
|
||||||
} else if (output_rep == MachineRepresentation::kBit) {
|
} else if (output_rep == MachineRepresentation::kBit) {
|
||||||
CHECK(output_type.Is(Type::Boolean()));
|
CHECK(output_type.Is(Type::Boolean()));
|
||||||
if (use_info.truncation().IsUsedAsFloat64()) {
|
// TODO(tebbi): TypeCheckKind::kNumberOrOddball should imply Float64
|
||||||
|
// truncation, since this exactly means that we treat Oddballs as Numbers.
|
||||||
|
if (use_info.truncation().IsUsedAsFloat64() ||
|
||||||
|
use_info.type_check() == TypeCheckKind::kNumberOrOddball) {
|
||||||
op = machine()->ChangeUint32ToFloat64();
|
op = machine()->ChangeUint32ToFloat64();
|
||||||
} else {
|
} else {
|
||||||
CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
|
CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
|
||||||
@ -975,6 +978,7 @@ Node* RepresentationChanger::GetWord32RepresentationFor(
|
|||||||
CHECK(Truncation::Any(kIdentifyZeros)
|
CHECK(Truncation::Any(kIdentifyZeros)
|
||||||
.IsLessGeneralThan(use_info.truncation()));
|
.IsLessGeneralThan(use_info.truncation()));
|
||||||
CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
|
CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
|
||||||
|
CHECK_NE(use_info.type_check(), TypeCheckKind::kNumberOrOddball);
|
||||||
Node* unreachable =
|
Node* unreachable =
|
||||||
InsertUnconditionalDeopt(use_node, DeoptimizeReason::kNotASmi);
|
InsertUnconditionalDeopt(use_node, DeoptimizeReason::kNotASmi);
|
||||||
return jsgraph()->graph()->NewNode(
|
return jsgraph()->graph()->NewNode(
|
||||||
@ -1261,6 +1265,7 @@ Node* RepresentationChanger::GetWord64RepresentationFor(
|
|||||||
} else if (output_rep == MachineRepresentation::kBit) {
|
} else if (output_rep == MachineRepresentation::kBit) {
|
||||||
CHECK(output_type.Is(Type::Boolean()));
|
CHECK(output_type.Is(Type::Boolean()));
|
||||||
CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
|
CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
|
||||||
|
CHECK_NE(use_info.type_check(), TypeCheckKind::kNumberOrOddball);
|
||||||
Node* unreachable =
|
Node* unreachable =
|
||||||
InsertUnconditionalDeopt(use_node, DeoptimizeReason::kNotASmi);
|
InsertUnconditionalDeopt(use_node, DeoptimizeReason::kNotASmi);
|
||||||
return jsgraph()->graph()->NewNode(
|
return jsgraph()->graph()->NewNode(
|
||||||
|
@ -240,6 +240,8 @@ class UseInfo {
|
|||||||
}
|
}
|
||||||
static UseInfo CheckedNumberOrOddballAsFloat64(
|
static UseInfo CheckedNumberOrOddballAsFloat64(
|
||||||
IdentifyZeros identify_zeros, const VectorSlotPair& feedback) {
|
IdentifyZeros identify_zeros, const VectorSlotPair& feedback) {
|
||||||
|
// TODO(tebbi): We should use Float64 truncation here, since this exactly
|
||||||
|
// means that we treat Oddballs as Numbers.
|
||||||
return UseInfo(MachineRepresentation::kFloat64,
|
return UseInfo(MachineRepresentation::kFloat64,
|
||||||
Truncation::Any(identify_zeros),
|
Truncation::Any(identify_zeros),
|
||||||
TypeCheckKind::kNumberOrOddball, feedback);
|
TypeCheckKind::kNumberOrOddball, feedback);
|
||||||
|
15
test/mjsunit/compiler/regress-crbug-965513.js
Normal file
15
test/mjsunit/compiler/regress-crbug-965513.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 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
|
||||||
|
|
||||||
|
%EnsureFeedbackVectorForFunction(foo);
|
||||||
|
function foo(x) {
|
||||||
|
return x * (x == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foo(0.5);
|
||||||
|
foo(1.5);
|
||||||
|
%OptimizeFunctionOnNextCall(foo);
|
||||||
|
foo(1.5);
|
||||||
|
assertOptimized(foo);
|
Loading…
Reference in New Issue
Block a user