Reland "[compiler] Fix more truncation bugs in SimplifiedLowering"
This is a reland of 47077d9449
without
changes. The revert was false alarm.
Original change's description:
> [compiler] Fix more truncation bugs in SimplifiedLowering
>
> Bug: chromium:1200490
> Change-Id: I3555b6d99bdb4b4e7c302a43a82c17e8bff84ebe
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2840452
> Reviewed-by: Nico Hartmann <nicohartmann@chromium.org>
> Commit-Queue: Georg Neis <neis@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#74097}
Bug: chromium:1200490
Change-Id: I75cac59050bc393d157a1ee5bed776c8986a7bbe
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2843817
Reviewed-by: Georg Neis <neis@chromium.org>
Reviewed-by: Nico Hartmann <nicohartmann@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74105}
This commit is contained in:
parent
fd16e67e49
commit
e4a580c910
@ -1424,17 +1424,31 @@ class RepresentationSelector {
|
||||
return jsgraph_->simplified();
|
||||
}
|
||||
|
||||
void LowerToCheckedInt32Mul(Node* node, Truncation truncation,
|
||||
Type input0_type, Type input1_type) {
|
||||
// If one of the inputs is positive and/or truncation is being applied,
|
||||
// there is no need to return -0.
|
||||
CheckForMinusZeroMode mz_mode =
|
||||
truncation.IdentifiesZeroAndMinusZero() ||
|
||||
IsSomePositiveOrderedNumber(input0_type) ||
|
||||
IsSomePositiveOrderedNumber(input1_type)
|
||||
? CheckForMinusZeroMode::kDontCheckForMinusZero
|
||||
: CheckForMinusZeroMode::kCheckForMinusZero;
|
||||
ChangeOp(node, simplified()->CheckedInt32Mul(mz_mode));
|
||||
template <Phase T>
|
||||
void VisitForCheckedInt32Mul(Node* node, Truncation truncation,
|
||||
Type input0_type, Type input1_type,
|
||||
UseInfo input_use) {
|
||||
DCHECK_EQ(node->opcode(), IrOpcode::kSpeculativeNumberMultiply);
|
||||
// A -0 input is impossible or will cause a deopt.
|
||||
DCHECK(BothInputsAre(node, Type::Signed32()) ||
|
||||
!input_use.truncation().IdentifiesZeroAndMinusZero());
|
||||
|
||||
CheckForMinusZeroMode mz_mode;
|
||||
Type restriction;
|
||||
if (IsSomePositiveOrderedNumber(input0_type) ||
|
||||
IsSomePositiveOrderedNumber(input1_type)) {
|
||||
mz_mode = CheckForMinusZeroMode::kDontCheckForMinusZero;
|
||||
restriction = Type::Signed32();
|
||||
} else if (truncation.IdentifiesZeroAndMinusZero()) {
|
||||
mz_mode = CheckForMinusZeroMode::kDontCheckForMinusZero;
|
||||
restriction = Type::Signed32OrMinusZero();
|
||||
} else {
|
||||
mz_mode = CheckForMinusZeroMode::kCheckForMinusZero;
|
||||
restriction = Type::Signed32();
|
||||
}
|
||||
|
||||
VisitBinop<T>(node, input_use, MachineRepresentation::kWord32, restriction);
|
||||
if (lower<T>()) ChangeOp(node, simplified()->CheckedInt32Mul(mz_mode));
|
||||
}
|
||||
|
||||
void ChangeToInt32OverflowOp(Node* node) {
|
||||
@ -1622,12 +1636,22 @@ class RepresentationSelector {
|
||||
VisitBinop<T>(node, lhs_use, rhs_use, MachineRepresentation::kWord32);
|
||||
if (lower<T>()) DeferReplacement(node, lowering->Int32Mod(node));
|
||||
} else if (BothInputsAre(node, Type::Unsigned32OrMinusZeroOrNaN())) {
|
||||
Type const restriction =
|
||||
truncation.IdentifiesZeroAndMinusZero() &&
|
||||
TypeOf(node->InputAt(0)).Maybe(Type::MinusZero())
|
||||
? Type::Unsigned32OrMinusZero()
|
||||
: Type::Unsigned32();
|
||||
VisitBinop<T>(node, lhs_use, rhs_use, MachineRepresentation::kWord32,
|
||||
Type::Unsigned32());
|
||||
restriction);
|
||||
if (lower<T>()) ChangeToUint32OverflowOp(node);
|
||||
} else {
|
||||
Type const restriction =
|
||||
truncation.IdentifiesZeroAndMinusZero() &&
|
||||
TypeOf(node->InputAt(0)).Maybe(Type::MinusZero())
|
||||
? Type::Signed32OrMinusZero()
|
||||
: Type::Signed32();
|
||||
VisitBinop<T>(node, lhs_use, rhs_use, MachineRepresentation::kWord32,
|
||||
Type::Signed32());
|
||||
restriction);
|
||||
if (lower<T>()) ChangeToInt32OverflowOp(node);
|
||||
}
|
||||
return;
|
||||
@ -2261,22 +2285,16 @@ class RepresentationSelector {
|
||||
if (BothInputsAre(node, Type::Signed32())) {
|
||||
// If both inputs and feedback are int32, use the overflow op.
|
||||
if (hint == NumberOperationHint::kSignedSmall) {
|
||||
VisitBinop<T>(node, UseInfo::TruncatingWord32(),
|
||||
MachineRepresentation::kWord32, Type::Signed32());
|
||||
if (lower<T>()) {
|
||||
LowerToCheckedInt32Mul(node, truncation, input0_type,
|
||||
input1_type);
|
||||
}
|
||||
VisitForCheckedInt32Mul<T>(node, truncation, input0_type,
|
||||
input1_type,
|
||||
UseInfo::TruncatingWord32());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (hint == NumberOperationHint::kSignedSmall) {
|
||||
VisitBinop<T>(node, CheckedUseInfoAsWord32FromHint(hint),
|
||||
MachineRepresentation::kWord32, Type::Signed32());
|
||||
if (lower<T>()) {
|
||||
LowerToCheckedInt32Mul(node, truncation, input0_type, input1_type);
|
||||
}
|
||||
VisitForCheckedInt32Mul<T>(node, truncation, input0_type, input1_type,
|
||||
CheckedUseInfoAsWord32FromHint(hint));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4011,7 +4029,6 @@ template <>
|
||||
void RepresentationSelector::SetOutput<RETYPE>(
|
||||
Node* node, MachineRepresentation representation, Type restriction_type) {
|
||||
NodeInfo* const info = GetInfo(node);
|
||||
DCHECK(info->restriction_type().Is(restriction_type));
|
||||
DCHECK(restriction_type.Is(info->restriction_type()));
|
||||
info->set_output(representation);
|
||||
}
|
||||
@ -4021,7 +4038,6 @@ void RepresentationSelector::SetOutput<LOWER>(
|
||||
Node* node, MachineRepresentation representation, Type restriction_type) {
|
||||
NodeInfo* const info = GetInfo(node);
|
||||
DCHECK_EQ(info->representation(), representation);
|
||||
DCHECK(info->restriction_type().Is(restriction_type));
|
||||
DCHECK(restriction_type.Is(info->restriction_type()));
|
||||
USE(info);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user