author | Nicolas B. Pierron <nicolas.b.pierron@mozilla.com> |
Mon, 30 Sep 2013 10:25:13 -0700 | |
changeset 149363 | 22e91a399223a7131275b6c4890f5bc001d916ba |
parent 149362 | d4e4cc29a3e4f52d7da373bb5dd94b4da42e6731 |
child 149364 | 93e0f4316262035f978ba8ed32a924111b2a2382 |
push id | 25386 |
push user | emorley@mozilla.com |
push date | Tue, 01 Oct 2013 09:29:22 +0000 |
treeherder | mozilla-central@6856c45f3688 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 912264 |
milestone | 27.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -876,16 +876,24 @@ class OutOfLineInterruptCheckImplicit : bool accept(CodeGenerator *codegen) { return codegen->visitOutOfLineInterruptCheckImplicit(this); } }; bool CodeGenerator::visitOutOfLineInterruptCheckImplicit(OutOfLineInterruptCheckImplicit *ool) { +#ifdef CHECK_OSIPOINT_REGISTERS + // This is path is entered from the patched back-edge of the loop. This + // means that the JitAtivation flags used for checking the validity of the + // OSI points are not reseted by the path generated by generateBody, so we + // have to reset it here. + resetOsiPointRegs(ool->lir->safepoint()); +#endif + LInstructionIterator iter = ool->block->begin(); for (; iter != ool->block->end(); iter++) { if (iter->isLabel()) { // Nothing to do. } else if (iter->isMoveGroup()) { // Replay this move group that preceds the interrupt check at the // start of the loop header. Any incoming jumps here will be from // the backedge and will skip over the move group emitted inline. @@ -2761,27 +2769,18 @@ CodeGenerator::generateBody() blockCounts.ref().visitInstruction(*iter); if (iter->safepoint() && pushedArgumentSlots_.length()) { if (!markArgumentSlots(iter->safepoint())) return false; } #ifdef CHECK_OSIPOINT_REGISTERS - if (iter->safepoint() && shouldVerifyOsiPointRegs(iter->safepoint())) { - // Set checkRegs to 0. If we perform a VM call, the instruction - // will set it to 1. - GeneralRegisterSet allRegs(GeneralRegisterSet::All()); - Register scratch = allRegs.takeAny(); - masm.push(scratch); - masm.loadJitActivation(scratch); - Address checkRegs(scratch, JitActivation::offsetOfCheckRegs()); - masm.store32(Imm32(0), checkRegs); - masm.pop(scratch); - } + if (iter->safepoint()) + resetOsiPointRegs(iter->safepoint()); #endif if (!callTraceLIR(i, *iter)) return false; if (!iter->accept(this)) return false; }
--- a/js/src/jit/shared/CodeGenerator-shared.cpp +++ b/js/src/jit/shared/CodeGenerator-shared.cpp @@ -586,16 +586,33 @@ CodeGeneratorShared::shouldVerifyOsiPoin if (gen->info().executionMode() != SequentialExecution) return false; if (safepoint->liveRegs().empty(true) && safepoint->liveRegs().empty(false)) return false; // No registers to check. return true; } + +void +CodeGeneratorShared::resetOsiPointRegs(LSafepoint *safepoint) +{ + if (!shouldVerifyOsiPointRegs(safepoint)) + return; + + // Set checkRegs to 0. If we perform a VM call, the instruction + // will set it to 1. + GeneralRegisterSet allRegs(GeneralRegisterSet::All()); + Register scratch = allRegs.takeAny(); + masm.push(scratch); + masm.loadJitActivation(scratch); + Address checkRegs(scratch, JitActivation::offsetOfCheckRegs()); + masm.store32(Imm32(0), checkRegs); + masm.pop(scratch); +} #endif // Before doing any call to Cpp, you should ensure that volatile // registers are evicted by the register allocator. bool CodeGeneratorShared::callVM(const VMFunction &fun, LInstruction *ins, const Register *dynStack) { // Different execution modes have different sets of VM functions.
--- a/js/src/jit/shared/CodeGenerator-shared.h +++ b/js/src/jit/shared/CodeGenerator-shared.h @@ -195,16 +195,17 @@ class CodeGeneratorShared : public LInst // runtimeData offsets. size_t allocateCache(const IonCache &, size_t size) { size_t dataOffset = allocateData(size); masm.propagateOOM(cacheList_.append(dataOffset)); return dataOffset; } #ifdef CHECK_OSIPOINT_REGISTERS + void resetOsiPointRegs(LSafepoint *safepoint); bool shouldVerifyOsiPointRegs(LSafepoint *safepoint); void verifyOsiPointRegs(LSafepoint *safepoint); #endif public: // When appending to runtimeData_, the vector might realloc, leaving pointers // int the origianl vector stale and unusable. DataPtr acts like a pointer,