diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index 5e506e9c3cd5..84607aa31cd6 100644 --- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -3654,8 +3654,7 @@ AbortReasonOr 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(); diff --git a/js/src/jit/MIR.cpp b/js/src/jit/MIR.cpp index 8425258d0dbb..78b3f9398a06 100644 --- a/js/src/jit/MIR.cpp +++ b/js/src/jit/MIR.cpp @@ -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"); } diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index 1c5b5ee91095..98ff0dd5be94 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -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, diff --git a/js/src/jsapi-tests/testJitGVN.cpp b/js/src/jsapi-tests/testJitGVN.cpp index a9e96122f1be..4dd8d64fdee8 100644 --- a/js/src/jsapi-tests/testJitGVN.cpp +++ b/js/src/jsapi-tests/testJitGVN.cpp @@ -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));