Bug 1627618 - Part 5: Directly set specialisation when calling MBinaryArithInstruction::New. r=jandem

Instead of manually adjusting the specialisation in `IonBuilder::binaryArithEmitSpecialized()`,
directly pass it to `MBinaryArithInstruction::New()`.

The constructor changes in the previous parts made it possible to pass `MIRType`
to the `MAdd` and `MSub` constructors.

Differential Revision: https://phabricator.services.mozilla.com/D69783

--HG--
extra : moz-landing-system : lando
This commit is contained in:
André Bargull 2020-04-07 08:37:20 +00:00
parent dfc520a2f2
commit dcc49bdb1f
4 changed files with 17 additions and 11 deletions

View File

@ -3654,8 +3654,7 @@ AbortReasonOr<MBinaryArithInstruction*> IonBuilder::binaryArithEmitSpecialized(
MDefinition::Opcode op, MIRType specialization, MDefinition* left,
MDefinition* right) {
MBinaryArithInstruction* ins =
MBinaryArithInstruction::New(alloc(), op, left, right);
ins->setSpecialization(specialization);
MBinaryArithInstruction::New(alloc(), op, left, right, specialization);
if (op == MDefinition::Opcode::Add || op == MDefinition::Opcode::Mul) {
ins->setCommutative();

View File

@ -2787,18 +2787,20 @@ void MBinaryArithInstruction::printOpcode(GenericPrinter& out) const {
MBinaryArithInstruction* MBinaryArithInstruction::New(TempAllocator& alloc,
Opcode op,
MDefinition* left,
MDefinition* right) {
MDefinition* right,
MIRType specialization) {
MOZ_ASSERT(IsNumberType(specialization));
switch (op) {
case Opcode::Add:
return MAdd::New(alloc, left, right);
return MAdd::New(alloc, left, right, specialization);
case Opcode::Sub:
return MSub::New(alloc, left, right);
return MSub::New(alloc, left, right, specialization);
case Opcode::Mul:
return MMul::New(alloc, left, right);
return MMul::New(alloc, left, right, specialization);
case Opcode::Div:
return MDiv::New(alloc, left, right);
return MDiv::New(alloc, left, right, specialization);
case Opcode::Mod:
return MMod::New(alloc, left, right);
return MMod::New(alloc, left, right, specialization);
default:
MOZ_CRASH("unexpected binary opcode");
}

View File

@ -4788,7 +4788,8 @@ class MBinaryArithInstruction : public MBinaryInstruction,
}
static MBinaryArithInstruction* New(TempAllocator& alloc, Opcode op,
MDefinition* left, MDefinition* right);
MDefinition* left, MDefinition* right,
MIRType specialization);
bool constantDoubleResult(TempAllocator& alloc);
@ -5709,6 +5710,10 @@ class MMod : public MBinaryArithInstruction {
MDefinition* right) {
return new (alloc) MMod(left, right, MIRType::Value);
}
static MMod* New(TempAllocator& alloc, MDefinition* left, MDefinition* right,
MIRType type) {
return new (alloc) MMod(left, right, type);
}
static MMod* New(
TempAllocator& alloc, MDefinition* left, MDefinition* right, MIRType type,
bool unsignd, bool trapOnError = false,

View File

@ -267,9 +267,9 @@ BEGIN_TEST(testJitGVN_PinnedPhis) {
innerBackedge->end(MGoto::New(func.alloc, innerHeader));
MInstruction* z4 = MAdd::New(func.alloc, phi0, phi1);
MInstruction* z4 = MAdd::New(func.alloc, phi0, phi1, MIRType::Int32);
MConstant* z5 = MConstant::New(func.alloc, Int32Value(4));
MInstruction* z6 = MAdd::New(func.alloc, phi2, phi3);
MInstruction* z6 = MAdd::New(func.alloc, phi2, phi3, MIRType::Int32);
MConstant* z7 = MConstant::New(func.alloc, Int32Value(6));
MOZ_RELEASE_ASSERT(phi0->addInputSlow(z4));
MOZ_RELEASE_ASSERT(phi1->addInputSlow(z5));