Commit 0c8e3cea authored by mstarzinger's avatar mstarzinger Committed by Commit bot

[turbofan] Remove eager frame state from bitwise ops.

This removes the frame state input representing the before-state from
nodes having any int32 bitwise 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=epertoso@chromium.org
BUG=v8:5021,v8:4746

Review-Url: https://codereview.chromium.org/2194383004
Cr-Commit-Position: refs/heads/master@{#38280}
parent 60f9e60b
......@@ -582,7 +582,6 @@ Reduction JSTypedLowering::ReduceJSModulus(Node* node) {
Reduction JSTypedLowering::ReduceInt32Binop(Node* node,
const Operator* int_op) {
if (flags() & kDisableIntegerBinaryOpReduction) return NoChange();
JSBinopReduction r(this, node);
BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback();
if (feedback != BinaryOperationHints::kAny) {
......@@ -597,9 +596,15 @@ Reduction JSTypedLowering::ReduceInt32Binop(Node* node,
}
return r.ChangeToSpeculativeOperator(speculative_op, Type::Signed32());
}
r.ConvertInputsToNumber();
r.ConvertInputsToUI32(kSigned, kSigned);
return r.ChangeToPureOperator(int_op, Type::Signed32());
// If deoptimization is enabled we rely on type feedback.
if (r.BothInputsAre(Type::PlainPrimitive()) ||
!(flags() & kDeoptimizationEnabled)) {
r.ConvertInputsToNumber();
r.ConvertInputsToUI32(kSigned, kSigned);
return r.ChangeToPureOperator(int_op, Type::Signed32());
}
return NoChange();
}
Reduction JSTypedLowering::ReduceUI32Shift(Node* node,
......
......@@ -34,7 +34,6 @@ class JSTypedLowering final : public AdvancedReducer {
enum Flag {
kNoFlags = 0u,
kDeoptimizationEnabled = 1u << 0,
kDisableIntegerBinaryOpReduction = 1u << 1,
};
typedef base::Flags<Flag> Flags;
......
......@@ -42,6 +42,11 @@ int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
case IrOpcode::kJSDivide:
case IrOpcode::kJSModulus:
// Bitwise operations
case IrOpcode::kJSBitwiseOr:
case IrOpcode::kJSBitwiseXor:
case IrOpcode::kJSBitwiseAnd:
// Shift operations
case IrOpcode::kJSShiftLeft:
case IrOpcode::kJSShiftRight:
......@@ -96,14 +101,6 @@ int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
case IrOpcode::kJSStackCheck:
return 1;
// Binary 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::kJSBitwiseAnd:
case IrOpcode::kJSBitwiseOr:
case IrOpcode::kJSBitwiseXor:
return 2;
default:
return 0;
}
......
......@@ -909,9 +909,6 @@ struct TypedLoweringPhase {
if (data->info()->is_deoptimization_enabled()) {
typed_lowering_flags |= JSTypedLowering::kDeoptimizationEnabled;
}
if (data->info()->is_optimizing_from_bytecode()) {
typed_lowering_flags |= JSTypedLowering::kDisableIntegerBinaryOpReduction;
}
JSTypedLowering typed_lowering(&graph_reducer, data->info()->dependencies(),
typed_lowering_flags, data->jsgraph(),
temp_zone);
......
......@@ -1044,7 +1044,8 @@ TEST(Int32BinopEffects) {
JSBitwiseTypedLoweringTester R;
for (int j = 0; j < R.kNumberOps; j += 2) {
bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1];
BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right));
BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right),
JSTypedLowering::kNoFlags);
CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode());
B.R.CheckBinop(B.result->opcode(), B.result);
......@@ -1057,7 +1058,8 @@ TEST(Int32BinopEffects) {
for (int j = 0; j < R.kNumberOps; j += 2) {
bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1];
BinopEffectsTester B(R.ops[j], Type::Number(), Type::Number());
BinopEffectsTester B(R.ops[j], Type::Number(), Type::Number(),
JSTypedLowering::kNoFlags);
CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode());
B.R.CheckBinop(B.result->opcode(), B.result);
......@@ -1070,7 +1072,8 @@ TEST(Int32BinopEffects) {
for (int j = 0; j < R.kNumberOps; j += 2) {
bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1];
BinopEffectsTester B(R.ops[j], Type::Number(), Type::Primitive());
BinopEffectsTester B(R.ops[j], Type::Number(), Type::Primitive(),
JSTypedLowering::kNoFlags);
B.R.CheckBinop(B.result->opcode(), B.result);
......@@ -1087,7 +1090,8 @@ TEST(Int32BinopEffects) {
for (int j = 0; j < R.kNumberOps; j += 2) {
bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1];
BinopEffectsTester B(R.ops[j], Type::Primitive(), Type::Number());
BinopEffectsTester B(R.ops[j], Type::Primitive(), Type::Number(),
JSTypedLowering::kNoFlags);
B.R.CheckBinop(B.result->opcode(), B.result);
......@@ -1104,7 +1108,8 @@ TEST(Int32BinopEffects) {
for (int j = 0; j < R.kNumberOps; j += 2) {
bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1];
BinopEffectsTester B(R.ops[j], Type::Primitive(), Type::Primitive());
BinopEffectsTester B(R.ops[j], Type::Primitive(), Type::Primitive(),
JSTypedLowering::kNoFlags);
B.R.CheckBinop(B.result->opcode(), B.result);
......
......@@ -1019,9 +1019,9 @@ TEST_F(JSTypedLoweringTest, JSBitwiseAndWithTypeFeedback) {
Node* rhs = Parameter(Type::Number(), 3);
Node* effect = graph()->start();
Node* control = graph()->start();
Reduction r = Reduce(graph()->NewNode(
javascript()->BitwiseAnd(hints), lhs, rhs, UndefinedConstant(),
EmptyFrameState(), EmptyFrameState(), effect, control));
Reduction r = Reduce(graph()->NewNode(javascript()->BitwiseAnd(hints), lhs,
rhs, UndefinedConstant(),
EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed());
EXPECT_THAT(r.replacement(), IsSpeculativeNumberBitwiseAnd(
feedback, lhs, rhs, effect, control));
......@@ -1041,9 +1041,9 @@ TEST_F(JSTypedLoweringTest, JSBitwiseOrWithTypeFeedback) {
Node* rhs = Parameter(Type::Number(), 3);
Node* effect = graph()->start();
Node* control = graph()->start();
Reduction r = Reduce(graph()->NewNode(
javascript()->BitwiseOr(hints), lhs, rhs, UndefinedConstant(),
EmptyFrameState(), EmptyFrameState(), effect, control));
Reduction r = Reduce(graph()->NewNode(javascript()->BitwiseOr(hints), lhs,
rhs, UndefinedConstant(),
EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed());
EXPECT_THAT(r.replacement(), IsSpeculativeNumberBitwiseOr(
feedback, lhs, rhs, effect, control));
......@@ -1063,9 +1063,9 @@ TEST_F(JSTypedLoweringTest, JSBitwiseXorWithTypeFeedback) {
Node* rhs = Parameter(Type::Number(), 3);
Node* effect = graph()->start();
Node* control = graph()->start();
Reduction r = Reduce(graph()->NewNode(
javascript()->BitwiseXor(hints), lhs, rhs, UndefinedConstant(),
EmptyFrameState(), EmptyFrameState(), effect, control));
Reduction r = Reduce(graph()->NewNode(javascript()->BitwiseXor(hints), lhs,
rhs, UndefinedConstant(),
EmptyFrameState(), effect, control));
ASSERT_TRUE(r.Changed());
EXPECT_THAT(r.replacement(), IsSpeculativeNumberBitwiseXor(
feedback, lhs, rhs, effect, control));
......
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