Bug 1507785 - Use logical, not physical, frame size at block exit. r=bbouvier
authorLars T Hansen <lhansen@mozilla.com>
Mon, 19 Nov 2018 09:45:32 +0100
changeset 507187 45b378c260d9308b6b067e42da3412961d431128
parent 507162 3214fd9390a0cf9e74599014d8c325ea1b7850fc
child 507188 f03c9e85b401ed8c488f5e98f90e50451c1cb1cb
push id1905
push userffxbld-merge
push dateMon, 21 Jan 2019 12:33:13 +0000
treeherdermozilla-release@c2fca1944d8c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbbouvier
bugs1507785
milestone65.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
Bug 1507785 - Use logical, not physical, frame size at block exit. r=bbouvier Background: When we branch out of a block we must adjust the physical stack pointer along the edge so that it will be equal to the physical stack pointer as it is when we fall out of the block at the bottom. But along the edge we do not do anything to adjust the logical stack pointer, because the logical stack pointer is determined by the non-branching path through the code. But when we fall out of a block we must adjust both the physical and the logical stack pointers: the logical stack pointer may need to pop a few items to get to where it was on entry to the block (the stack can be higher because of pushes followed by an UNREACHABLE), and if the code is not dead we may also have to deallocate some stack memory by changing the physical stack pointer. Previously, we used values for the physical stack pointers as guards on the block-exit code, but this is WRONG since it prevents us from doing something when the physical stack pointer does not change, as the case is on ARM64 when we do need to pop something logically but the stack stays within the currently allocated chunk - we would end up doing nothing when we should adjust the logical stack pointer. Instead, we should use the logical stack pointers for the guard, and then popChunkyBytes will take care of translating the difference in logical pointers for us so that a chunk is popped if that is required by the amount of deallocation. To catch these errors earlier we add an assertion on the logical stack frame size that is tested for every instruction we compile. The test case is reduced from the fuzzing test that found the bug.
js/src/jit-test/tests/wasm/regress/baseline-stack-height.js
js/src/jit-test/tests/wasm/regress/baseline-stack-height.wasm
js/src/wasm/WasmBaselineCompile.cpp
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/baseline-stack-height.js
@@ -0,0 +1,1 @@
+new WebAssembly.Module(os.file.readFile(scriptdir + "/baseline-stack-height.wasm", 'binary'));
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cc25a1dac8033e72ef5ea8f7a207f6f1636beaed
GIT binary patch
literal 67032
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
EA1oYNI{*Lx
--- a/js/src/wasm/WasmBaselineCompile.cpp
+++ b/js/src/wasm/WasmBaselineCompile.cpp
@@ -1159,17 +1159,16 @@ class BaseStackFrame
     // risk; if it is too small we spend too much time adjusting the stack
     // pointer.
     //
     // Good values for ChunkSize are the subject of future empirical analysis;
     // eight words is just an educated guess.
 
     static constexpr uint32_t ChunkSize = 8 * sizeof(void*);
     static constexpr uint32_t InitialChunk = ChunkSize;
-    static constexpr uint32_t ChunkCutoff = ChunkSize + InitialChunk;
 #endif
 
     MacroAssembler& masm;
 
     // Size of local area in bytes (stable after beginFunction).
     uint32_t localSize_;
 
     // Low byte offset of local area for true locals (not parameters).
@@ -1478,16 +1477,22 @@ class BaseStackFrame
         return maxFramePushed_ <= 512 * 1024;
     }
 
     // The current height of the stack area, not necessarily zero-based.
     StackHeight stackHeight() const {
         return StackHeight(currentFramePushed());
     }
 
+    // The current height of the dynamic part of the stack area (ie, the backing
+    // store for the evaluation stack), zero-based.
+    uint32_t dynamicHeight() const {
+        return currentFramePushed() - localSize_;
+    }
+
     // Set the frame height.
     void setStackHeight(StackHeight amount) {
 #ifdef RABALDR_CHUNKY_STACK
         currentFramePushed_ = amount.height;
         masm.setFramePushed(framePushedForHeight(amount));
         CHUNKY_INVARIANT();
 #else
         masm.setFramePushed(amount.height);
@@ -1574,16 +1579,18 @@ class BaseStackFrame
             masm.freeStack(bytes);
 #endif
         }
     }
 
     // Before branching to an outer control label, pop the execution stack to
     // the level expected by that region, but do not update masm.framePushed()
     // as that will happen as compilation leaves the block.
+    //
+    // Note these operate directly on the stack pointer register.
 
     void popStackBeforeBranch(StackHeight destStackHeight) {
         uint32_t framePushedHere = masm.framePushed();
         uint32_t framePushedThere = framePushedForHeight(destStackHeight);
         if (framePushedHere > framePushedThere) {
             masm.addToStackPtr(Imm32(framePushedHere - framePushedThere));
         }
     }
@@ -1592,32 +1599,36 @@ class BaseStackFrame
         uint32_t framePushedHere = masm.framePushed();
         uint32_t framePushedThere = framePushedForHeight(destStackHeight);
         return framePushedHere > framePushedThere;
     }
 
     // Before exiting a nested control region, pop the execution stack
     // to the level expected by the nesting region, and free the
     // stack.
+    //
+    // Note this operates on the stack height, which is not the same as the
+    // stack pointer on chunky-stack systems; the stack pointer may or may not
+    // change on such systems.
 
     void popStackOnBlockExit(StackHeight destStackHeight, bool deadCode) {
-        uint32_t framePushedHere = masm.framePushed();
-        uint32_t framePushedThere = framePushedForHeight(destStackHeight);
-        if (framePushedHere > framePushedThere) {
+        uint32_t stackHeightHere = currentFramePushed();
+        uint32_t stackHeightThere = destStackHeight.height;
+        if (stackHeightHere > stackHeightThere) {
 #ifdef RABALDR_CHUNKY_STACK
             if (deadCode) {
                 setStackHeight(destStackHeight);
             } else {
-                popChunkyBytes(framePushedHere - framePushedThere);
+                popChunkyBytes(stackHeightHere - stackHeightThere);
             }
 #else
             if (deadCode) {
-                masm.setFramePushed(framePushedThere);
+                masm.setFramePushed(stackHeightThere);
             } else {
-                masm.freeStack(framePushedHere - framePushedThere);
+                masm.freeStack(stackHeightHere - stackHeightThere);
             }
 #endif
         }
     }
 
     void loadStackI32(int32_t offset, RegI32 dest) {
         masm.load32(Address(sp_, stackOffset(offset)), dest);
     }
@@ -3405,16 +3416,32 @@ class BaseCompiler final : public BaseCo
               case Stk::RegisterRef:
                 check.addKnownRef(item.refReg());
                 break;
               default:
                 break;
             }
         }
     }
+
+    void assertStackInvariants() const {
+        size_t size = 0;
+        for (const Stk& v : stk_) {
+            switch (v.kind()) {
+              case Stk::MemRef: size += BaseStackFrame::StackSizeOfPtr;    break;
+              case Stk::MemI32: size += BaseStackFrame::StackSizeOfPtr;    break;
+              case Stk::MemI64: size += BaseStackFrame::StackSizeOfInt64;  break;
+              case Stk::MemF64: size += BaseStackFrame::StackSizeOfDouble; break;
+              case Stk::MemF32: size += BaseStackFrame::StackSizeOfFloat;  break;
+              default:          MOZ_ASSERT(!v.isMem());                    break;
+            }
+        }
+        MOZ_ASSERT(size == fr.dynamicHeight());
+    }
+
 #endif
 
     ////////////////////////////////////////////////////////////
     //
     // Control stack
 
     void initControl(Control& item)
     {
@@ -10252,16 +10279,17 @@ BaseCompiler::emitBody()
     uint32_t overhead = 0;
 
     for (;;) {
 
         Nothing unused_a, unused_b;
 
 #ifdef DEBUG
         performRegisterLeakCheck();
+        assertStackInvariants();
 #endif
 
 #define emitBinary(doEmit, type) \
         iter_.readBinary(type, &unused_a, &unused_b) && (deadCode_ || (doEmit(), true))
 
 #define emitUnary(doEmit, type) \
         iter_.readUnary(type, &unused_a) && (deadCode_ || (doEmit(), true))