[turbofan] Remove eager frame state from comparisons.
This removes the frame state input representing the before-state from nodes having any comparison operator. Lowering that inserts number conversions of the inputs has to be disabled when deoptimization is enabled, because the frame state layout is no longer known. R=jarin@chromium.org BUG=v8:5021 Review-Url: https://codereview.chromium.org/2134173002 Cr-Commit-Position: refs/heads/master@{#37646}
This commit is contained in:
parent
ecfec3b039
commit
136e60a7ce
@ -52,7 +52,7 @@ class JSBinopReduction final {
|
||||
}
|
||||
DCHECK_NE(0, node_->op()->ControlOutputCount());
|
||||
DCHECK_EQ(1, node_->op()->EffectOutputCount());
|
||||
DCHECK_EQ(2, OperatorProperties::GetFrameStateInputCount(node_->op()));
|
||||
DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node_->op()));
|
||||
CompareOperationHints hints = CompareOperationHintsOf(node_->op());
|
||||
CompareOperationHints::Hint combined = hints.combined();
|
||||
if (combined == CompareOperationHints::kSignedSmall ||
|
||||
@ -644,10 +644,13 @@ Reduction JSTypedLowering::ReduceJSComparison(Node* node) {
|
||||
if (hint != CompareOperationHints::kAny) {
|
||||
less_than = simplified()->SpeculativeNumberLessThan(hint);
|
||||
less_than_or_equal = simplified()->SpeculativeNumberLessThanOrEqual(hint);
|
||||
} else {
|
||||
} else if (r.BothInputsAre(Type::PlainPrimitive()) ||
|
||||
!(flags() & kDeoptimizationEnabled)) {
|
||||
r.ConvertInputsToNumber();
|
||||
less_than = simplified()->NumberLessThan();
|
||||
less_than_or_equal = simplified()->NumberLessThanOrEqual();
|
||||
} else {
|
||||
return NoChange();
|
||||
}
|
||||
const Operator* comparison;
|
||||
switch (node->opcode()) {
|
||||
|
@ -45,6 +45,10 @@ int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
|
||||
// Compare operations
|
||||
case IrOpcode::kJSEqual:
|
||||
case IrOpcode::kJSNotEqual:
|
||||
case IrOpcode::kJSGreaterThan:
|
||||
case IrOpcode::kJSGreaterThanOrEqual:
|
||||
case IrOpcode::kJSLessThan:
|
||||
case IrOpcode::kJSLessThanOrEqual:
|
||||
case IrOpcode::kJSHasProperty:
|
||||
case IrOpcode::kJSInstanceOf:
|
||||
|
||||
@ -98,15 +102,6 @@ int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
|
||||
case IrOpcode::kJSShiftRightLogical:
|
||||
return 2;
|
||||
|
||||
// Compare operators that can deopt in the middle the operation (e.g.,
|
||||
// as a result of lazy deopt in ToNumber conversion) need a second frame
|
||||
// state so that we can resume before the operation.
|
||||
case IrOpcode::kJSGreaterThan:
|
||||
case IrOpcode::kJSGreaterThanOrEqual:
|
||||
case IrOpcode::kJSLessThan:
|
||||
case IrOpcode::kJSLessThanOrEqual:
|
||||
return 2;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
@ -997,7 +997,8 @@ TEST(OrderCompareEffects) {
|
||||
};
|
||||
|
||||
for (size_t j = 0; j < arraysize(ops); j += 2) {
|
||||
BinopEffectsTester B(ops[j], Type::Symbol(), Type::String());
|
||||
BinopEffectsTester B(ops[j], Type::Symbol(), Type::String(),
|
||||
JSTypedLowering::kNoFlags);
|
||||
CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode());
|
||||
|
||||
Node* i0 = B.CheckConvertedInput(IrOpcode::kStringToNumber, 0, false);
|
||||
@ -1012,7 +1013,8 @@ TEST(OrderCompareEffects) {
|
||||
}
|
||||
|
||||
for (size_t j = 0; j < arraysize(ops); j += 2) {
|
||||
BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol());
|
||||
BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol(),
|
||||
JSTypedLowering::kNoFlags);
|
||||
|
||||
Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true);
|
||||
Node* i1 = B.result->InputAt(1);
|
||||
@ -1025,7 +1027,8 @@ TEST(OrderCompareEffects) {
|
||||
}
|
||||
|
||||
for (size_t j = 0; j < arraysize(ops); j += 2) {
|
||||
BinopEffectsTester B(ops[j], Type::Symbol(), Type::Number());
|
||||
BinopEffectsTester B(ops[j], Type::Symbol(), Type::Number(),
|
||||
JSTypedLowering::kNoFlags);
|
||||
|
||||
Node* i0 = B.result->InputAt(0);
|
||||
Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true);
|
||||
|
Loading…
Reference in New Issue
Block a user