From 646e42d4108c36009629e4637cd15ddf534c2caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Wed, 13 May 2020 11:43:57 +0000 Subject: [PATCH] Bug 1636869: Disable LoadTypedArrayLengthResult when TI/Ion are enabled. r=evilpie Differential Revision: https://phabricator.services.mozilla.com/D74604 --- js/src/jit/BaselineInspector.cpp | 10 ++++++---- js/src/jit/CacheIR.cpp | 8 +++++--- js/src/jit/CacheIRCompiler.cpp | 3 ++- js/src/jit/CacheIROps.yaml | 1 + js/src/jit/WarpCacheIRTranspiler.cpp | 3 ++- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/js/src/jit/BaselineInspector.cpp b/js/src/jit/BaselineInspector.cpp index 5332b72b1192..5e7ccc07dd8a 100644 --- a/js/src/jit/BaselineInspector.cpp +++ b/js/src/jit/BaselineInspector.cpp @@ -975,7 +975,7 @@ static bool AddCacheIRGetPropFunction( // [..Id Guard..] // [..WindowProxy innerization..] // - // Call(Scripted|Native)GetterResult objId + // (Call(Scripted|Native)Getter|TypedArrayLength)Result objId // // Or a getter on the prototype: // @@ -985,7 +985,7 @@ static bool AddCacheIRGetPropFunction( // // LoadObject holderId // GuardShape holderId - // Call(Scripted|Native)GetterResult objId + // (Call(Scripted|Native)Getter|TypedArrayLength)Result objId // // If |innerized| is true, we replaced a WindowProxy with the Window // object and we're only interested in Baseline getter stubs that performed @@ -1044,7 +1044,8 @@ static bool AddCacheIRGetPropFunction( } if (reader.matchOp(CacheOp::CallScriptedGetterResult, objId) || - reader.matchOp(CacheOp::CallNativeGetterResult, objId)) { + reader.matchOp(CacheOp::CallNativeGetterResult, objId) || + reader.matchOp(CacheOp::LoadTypedArrayLengthResult, objId)) { // This is an own property getter, the first case. MOZ_ASSERT(receiver.getShape()); MOZ_ASSERT(!receiver.getGroup()); @@ -1081,7 +1082,8 @@ static bool AddCacheIRGetPropFunction( stub->stubInfo()->getStubField(stub, reader.stubOffset()); if (!reader.matchOp(CacheOp::CallScriptedGetterResult, objId) && - !reader.matchOp(CacheOp::CallNativeGetterResult, objId)) { + !reader.matchOp(CacheOp::CallNativeGetterResult, objId) && + !reader.matchOp(CacheOp::LoadTypedArrayLengthResult, objId)) { return false; } diff --git a/js/src/jit/CacheIR.cpp b/js/src/jit/CacheIR.cpp index 7f63391c1eed..28fcb3f6e5f0 100644 --- a/js/src/jit/CacheIR.cpp +++ b/js/src/jit/CacheIR.cpp @@ -1814,10 +1814,12 @@ AttachDecision GetPropIRGenerator::tryAttachTypedArrayLength(HandleObject obj, } maybeEmitIdGuard(id); - // Emit all the normal guards for calling this native, - // but specialize callNativeGetterResult. + // Emit all the normal guards for calling this native, but specialize + // callNativeGetterResult. Also store the getter itself to enable + // AddCacheIRGetPropFunction to read it from the IC stub, which is needed for + // Ion-inlining. EmitCallGetterResultGuards(writer, obj, holder, shape, objId, mode_); - writer.loadTypedArrayLengthResult(objId); + writer.loadTypedArrayLengthResult(objId, &fun); writer.returnFromIC(); trackAttached("TypedArrayLength"); diff --git a/js/src/jit/CacheIRCompiler.cpp b/js/src/jit/CacheIRCompiler.cpp index cc6954c0412f..06b8af4910b3 100644 --- a/js/src/jit/CacheIRCompiler.cpp +++ b/js/src/jit/CacheIRCompiler.cpp @@ -3078,7 +3078,8 @@ bool CacheIRCompiler::emitLoadArgumentsObjectLengthResult(ObjOperandId objId) { return true; } -bool CacheIRCompiler::emitLoadTypedArrayLengthResult(ObjOperandId objId) { +bool CacheIRCompiler::emitLoadTypedArrayLengthResult(ObjOperandId objId, + uint32_t getterOffset) { JitSpew(JitSpew_Codegen, "%s", __FUNCTION__); AutoOutputRegister output(*this); Register obj = allocator.useRegister(masm, objId); diff --git a/js/src/jit/CacheIROps.yaml b/js/src/jit/CacheIROps.yaml index 822432c49142..a512472fd3a8 100644 --- a/js/src/jit/CacheIROps.yaml +++ b/js/src/jit/CacheIROps.yaml @@ -912,6 +912,7 @@ transpile: true args: obj: ObjId + getter: ObjectField - name: LoadStringCharResult shared: true diff --git a/js/src/jit/WarpCacheIRTranspiler.cpp b/js/src/jit/WarpCacheIRTranspiler.cpp index ccfe1e20c01e..17cffcb775ef 100644 --- a/js/src/jit/WarpCacheIRTranspiler.cpp +++ b/js/src/jit/WarpCacheIRTranspiler.cpp @@ -481,7 +481,8 @@ bool WarpCacheIRTranspiler::emitLoadInt32ArrayLengthResult(ObjOperandId objId) { return true; } -bool WarpCacheIRTranspiler::emitLoadTypedArrayLengthResult(ObjOperandId objId) { +bool WarpCacheIRTranspiler::emitLoadTypedArrayLengthResult( + ObjOperandId objId, uint32_t getterOffset) { MDefinition* obj = getOperand(objId); auto* length = MTypedArrayLength::New(alloc(), obj);