Changeset 232400 in webkit


Ignore:
Timestamp:
Jun 1, 2018 11:39:57 AM (6 years ago)
Author:
Yusuke Suzuki
Message:

[DFG] InById should be converted to MatchStructure
https://bugs.webkit.org/show_bug.cgi?id=185803

Reviewed by Keith Miller.

JSTests:

  • microbenchmarks/in-by-id-match.js: Added.

(test):

  • microbenchmarks/in-by-id-removed.js: Added.

(test):

  • stress/in-by-id-constant.js: Added.

(shouldBe):
(test1):

  • stress/in-by-id-match-invalid.js: Added.

(shouldBe):
(test1):

  • stress/in-by-id-match.js: Added.

(shouldBe):
(test1):

Source/JavaScriptCore:

MatchStructure is introduced for instanceof optimization. But this node
is also useful for InById node. This patch converts InById to MatchStructure
node with CheckStructures if possible by using InByIdStatus.

Added microbenchmarks show improvements.

baseline patched

in-by-id-removed 18.1196+-0.8108 16.1702+-0.9773 definitely 1.1206x faster
in-by-id-match 16.3912+-0.2608 15.2736+-0.8173 definitely 1.0732x faster

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Sources.txt:
  • bytecode/InByIdStatus.cpp: Added.

(JSC::InByIdStatus::appendVariant):
(JSC::InByIdStatus::computeFor):
(JSC::InByIdStatus::hasExitSite):
(JSC::InByIdStatus::computeForStubInfo):
(JSC::InByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
(JSC::InByIdStatus::filter):
(JSC::InByIdStatus::dump const):

  • bytecode/InByIdStatus.h: Added.

(JSC::InByIdStatus::InByIdStatus):
(JSC::InByIdStatus::state const):
(JSC::InByIdStatus::isSet const):
(JSC::InByIdStatus::operator bool const):
(JSC::InByIdStatus::isSimple const):
(JSC::InByIdStatus::numVariants const):
(JSC::InByIdStatus::variants const):
(JSC::InByIdStatus::at const):
(JSC::InByIdStatus::operator[] const):
(JSC::InByIdStatus::takesSlowPath const):

  • bytecode/InByIdVariant.cpp: Added.

(JSC::InByIdVariant::InByIdVariant):
(JSC::InByIdVariant::attemptToMerge):
(JSC::InByIdVariant::dump const):
(JSC::InByIdVariant::dumpInContext const):

  • bytecode/InByIdVariant.h: Added.

(JSC::InByIdVariant::isSet const):
(JSC::InByIdVariant::operator bool const):
(JSC::InByIdVariant::structureSet const):
(JSC::InByIdVariant::structureSet):
(JSC::InByIdVariant::conditionSet const):
(JSC::InByIdVariant::offset const):
(JSC::InByIdVariant::isHit const):

  • bytecode/PolyProtoAccessChain.h:
  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::parseBlock):

Location:
trunk
Files:
9 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r232386 r232400  
     12018-05-30  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [DFG] InById should be converted to MatchStructure
     4        https://bugs.webkit.org/show_bug.cgi?id=185803
     5
     6        Reviewed by Keith Miller.
     7
     8        * microbenchmarks/in-by-id-match.js: Added.
     9        (test):
     10        * microbenchmarks/in-by-id-removed.js: Added.
     11        (test):
     12        * stress/in-by-id-constant.js: Added.
     13        (shouldBe):
     14        (test1):
     15        * stress/in-by-id-match-invalid.js: Added.
     16        (shouldBe):
     17        (test1):
     18        * stress/in-by-id-match.js: Added.
     19        (shouldBe):
     20        (test1):
     21
    1222018-05-31  Caio Lima  <ticaiolima@gmail.com>
    223
  • trunk/Source/JavaScriptCore/ChangeLog

    r232399 r232400  
     12018-05-30  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [DFG] InById should be converted to MatchStructure
     4        https://bugs.webkit.org/show_bug.cgi?id=185803
     5
     6        Reviewed by Keith Miller.
     7
     8        MatchStructure is introduced for instanceof optimization. But this node
     9        is also useful for InById node. This patch converts InById to MatchStructure
     10        node with CheckStructures if possible by using InByIdStatus.
     11
     12        Added microbenchmarks show improvements.
     13
     14                                   baseline                  patched
     15
     16        in-by-id-removed       18.1196+-0.8108     ^     16.1702+-0.9773        ^ definitely 1.1206x faster
     17        in-by-id-match         16.3912+-0.2608     ^     15.2736+-0.8173        ^ definitely 1.0732x faster
     18
     19        * JavaScriptCore.xcodeproj/project.pbxproj:
     20        * Sources.txt:
     21        * bytecode/InByIdStatus.cpp: Added.
     22        (JSC::InByIdStatus::appendVariant):
     23        (JSC::InByIdStatus::computeFor):
     24        (JSC::InByIdStatus::hasExitSite):
     25        (JSC::InByIdStatus::computeForStubInfo):
     26        (JSC::InByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
     27        (JSC::InByIdStatus::filter):
     28        (JSC::InByIdStatus::dump const):
     29        * bytecode/InByIdStatus.h: Added.
     30        (JSC::InByIdStatus::InByIdStatus):
     31        (JSC::InByIdStatus::state const):
     32        (JSC::InByIdStatus::isSet const):
     33        (JSC::InByIdStatus::operator bool const):
     34        (JSC::InByIdStatus::isSimple const):
     35        (JSC::InByIdStatus::numVariants const):
     36        (JSC::InByIdStatus::variants const):
     37        (JSC::InByIdStatus::at const):
     38        (JSC::InByIdStatus::operator[] const):
     39        (JSC::InByIdStatus::takesSlowPath const):
     40        * bytecode/InByIdVariant.cpp: Added.
     41        (JSC::InByIdVariant::InByIdVariant):
     42        (JSC::InByIdVariant::attemptToMerge):
     43        (JSC::InByIdVariant::dump const):
     44        (JSC::InByIdVariant::dumpInContext const):
     45        * bytecode/InByIdVariant.h: Added.
     46        (JSC::InByIdVariant::isSet const):
     47        (JSC::InByIdVariant::operator bool const):
     48        (JSC::InByIdVariant::structureSet const):
     49        (JSC::InByIdVariant::structureSet):
     50        (JSC::InByIdVariant::conditionSet const):
     51        (JSC::InByIdVariant::offset const):
     52        (JSC::InByIdVariant::isHit const):
     53        * bytecode/PolyProtoAccessChain.h:
     54        * dfg/DFGByteCodeParser.cpp:
     55        (JSC::DFG::ByteCodeParser::parseBlock):
     56
    1572018-06-01  Keith Miller  <keith_miller@apple.com>
    258
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r232193 r232400  
    17031703                E328DAEB1D38D005001A2529 /* BytecodeRewriter.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D2642A1D38C042000BE174 /* BytecodeRewriter.h */; settings = {ATTRIBUTES = (Private, ); }; };
    17041704                E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1705                E3305FB320B0F78800CEB82B /* InByIdStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = E3305FAF20B0F78700CEB82B /* InByIdStatus.h */; };
     1706                E3305FB520B0F78800CEB82B /* InByIdVariant.h in Headers */ = {isa = PBXBuildFile; fileRef = E3305FB120B0F78800CEB82B /* InByIdVariant.h */; };
    17051707                E33637A61B63220200EE0840 /* ReflectObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E33637A41B63220200EE0840 /* ReflectObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
    17061708                E33B3E261B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = E33B3E251B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h */; };
     
    45694571                E3282BB91FE930A300EDAF71 /* YarrErrorCode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = YarrErrorCode.cpp; path = yarr/YarrErrorCode.cpp; sourceTree = "<group>"; };
    45704572                E3282BBA1FE930A400EDAF71 /* YarrErrorCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YarrErrorCode.h; path = yarr/YarrErrorCode.h; sourceTree = "<group>"; };
     4573                E3305FAF20B0F78700CEB82B /* InByIdStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InByIdStatus.h; sourceTree = "<group>"; };
     4574                E3305FB020B0F78700CEB82B /* InByIdVariant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InByIdVariant.cpp; sourceTree = "<group>"; };
     4575                E3305FB120B0F78800CEB82B /* InByIdVariant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InByIdVariant.h; sourceTree = "<group>"; };
     4576                E3305FB220B0F78800CEB82B /* InByIdStatus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InByIdStatus.cpp; sourceTree = "<group>"; };
    45714577                E33637A31B63220200EE0840 /* ReflectObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReflectObject.cpp; sourceTree = "<group>"; };
    45724578                E33637A41B63220200EE0840 /* ReflectObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReflectObject.h; sourceTree = "<group>"; };
     
    49134919                                0FEC85AD1BDB5CF10080FF74 /* testb3 */,
    49144920                                FE533CAC1F217DB40016A1FE /* testmasm */,
     4921                                79281BDC20B62B3E002E2A60 /* testmem */,
    49154922                                6511230514046A4C002B101D /* testRegExp */,
    49164923                                932F5BD90822A1C700736975 /* JavaScriptCore.framework */,
    4917                                 79281BDC20B62B3E002E2A60 /* testmem */,
    49184924                        );
    49194925                        name = Products;
     
    62876293                        isa = PBXGroup;
    62886294                        children = (
     6295                                79ABCC5820B7812600323D5F /* testmem2.1 */,
    62896296                                79ABCC5620B7812600323D5F /* testmem2.m */,
    6290                                 79ABCC5820B7812600323D5F /* testmem2.1 */,
    62916297                        );
    62926298                        path = testmem2;
     
    76767682                                0F0B83A814BCF55E00885B4F /* HandlerInfo.h */,
    76777683                                0FB399BD20AF6B380017E213 /* ICStatusUtils.h */,
     7684                                E3305FB220B0F78800CEB82B /* InByIdStatus.cpp */,
     7685                                E3305FAF20B0F78700CEB82B /* InByIdStatus.h */,
     7686                                E3305FB020B0F78700CEB82B /* InByIdVariant.cpp */,
     7687                                E3305FB120B0F78800CEB82B /* InByIdVariant.h */,
    76787688                                7905BB661D12050E0019FE57 /* InlineAccess.cpp */,
    76797689                                7905BB671D12050E0019FE57 /* InlineAccess.h */,
     
    83668376                                0FEC85261BDACDAC0080FF74 /* B3PatchpointSpecial.h in Headers */,
    83678377                                0FEC85281BDACDAC0080FF74 /* B3PatchpointValue.h in Headers */,
    8368                                 0FD2FD9520B52BE200F09441 /* IsoSubspaceInlines.h in Headers */,
    83698378                                799EF7C41C56ED96002B0534 /* B3PCToOriginMap.h in Headers */,
    83708379                                0FEC852A1BDACDAC0080FF74 /* B3PhaseScope.h in Headers */,
     
    84948503                                0F4F11E8209BCDAB00709654 /* CompilerTimingScope.h in Headers */,
    84958504                                0FDCE12A1FAFA85F006F3901 /* CompleteSubspace.h in Headers */,
     8505                                0FD2FD9420B52BDE00F09441 /* CompleteSubspaceInlines.h in Headers */,
    84968506                                BC18C3F40E16F5CD00B34460 /* Completion.h in Headers */,
    84978507                                0F6FC751196110A800E1D02D /* ComplexGetStatus.h in Headers */,
     
    89919001                                0FB467811FDDA6F7003FCB09 /* IsoCellSetInlines.h in Headers */,
    89929002                                0FDCE12D1FAFB4E5006F3901 /* IsoSubspace.h in Headers */,
     9003                                0FD2FD9520B52BE200F09441 /* IsoSubspaceInlines.h in Headers */,
    89939004                                0F5E0FE72086AD480097F0DE /* IsoSubspacePerVM.h in Headers */,
    89949005                                8B9F6D561D5912FA001C739F /* IterationKind.h in Headers */,
     
    90019012                                BC18C4150E16F5CD00B34460 /* JavaScriptCorePrefix.h in Headers */,
    90029013                                1429D9300ED22D7000B89619 /* JIT.h in Headers */,
    9003                                 0FD2FD9420B52BDE00F09441 /* CompleteSubspaceInlines.h in Headers */,
    90049014                                FE1220271BE7F58C0039E6F2 /* JITAddGenerator.h in Headers */,
    90059015                                0F75A0662013E4F10038E2CF /* JITAllocator.h in Headers */,
  • trunk/Source/JavaScriptCore/Sources.txt

    r232074 r232400  
    220220bytecode/GetByIdVariant.cpp
    221221bytecode/GetterSetterAccessCase.cpp
     222bytecode/InByIdStatus.cpp
     223bytecode/InByIdVariant.cpp
    222224bytecode/InlineAccess.cpp
    223225bytecode/InlineCallFrame.cpp
  • trunk/Source/JavaScriptCore/bytecode/PolyProtoAccessChain.h

    r222827 r232400  
    3030namespace JSC {
    3131
     32class JSCell;
    3233class JSGlobalObject;
    3334class JSObject;
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r232376 r232400  
    4949#include "GetByIdStatus.h"
    5050#include "Heap.h"
     51#include "InByIdStatus.h"
    5152#include "InstanceOfStatus.h"
    5253#include "JSCInlines.h"
     
    48064807                addToGraph(CheckCell, OpInfo(m_graph.freeze(commonPrototype)), prototype);
    48074808               
     4809                bool allOK = true;
    48084810                MatchStructureData* data = m_graph.m_matchStructureData.add();
    48094811                for (const InstanceOfVariant& variant : status.variants()) {
    4810                     check(variant.conditionSet());
     4812                    if (!check(variant.conditionSet())) {
     4813                        allOK = false;
     4814                        break;
     4815                    }
    48114816                    for (Structure* structure : variant.structureSet()) {
    48124817                        MatchStructureVariant matchVariant;
     
    48144819                        matchVariant.result = variant.isHit();
    48154820                       
    4816                         data->variants.append(matchVariant);
     4821                        data->variants.append(WTFMove(matchVariant));
    48174822                    }
    48184823                }
    48194824               
    4820                 Node* match = addToGraph(MatchStructure, OpInfo(data), value);
    4821                 set(VirtualRegister(bytecode.dst()), match);
    4822                 NEXT_OPCODE(op_instanceof);
     4825                if (allOK) {
     4826                    Node* match = addToGraph(MatchStructure, OpInfo(data), value);
     4827                    set(VirtualRegister(bytecode.dst()), match);
     4828                    NEXT_OPCODE(op_instanceof);
     4829                }
    48234830            }
    48244831           
     
    64246431            Node* base = get(VirtualRegister(currentInstruction[2].u.operand));
    64256432            unsigned identifierNumber = m_inlineStackTop->m_identifierRemap[currentInstruction[3].u.operand];
    6426             set(VirtualRegister(currentInstruction[1].u.operand),
    6427                 addToGraph(InById, OpInfo(identifierNumber), base));
     6433            UniquedStringImpl* uid = m_graph.identifiers()[identifierNumber];
     6434
     6435            InByIdStatus status = InByIdStatus::computeFor(
     6436                m_inlineStackTop->m_profiledBlock, m_dfgCodeBlock,
     6437                m_inlineStackTop->m_stubInfos, m_dfgStubInfos,
     6438                currentCodeOrigin(), uid);
     6439
     6440            if (status.isSimple()) {
     6441                bool allOK = true;
     6442                MatchStructureData* data = m_graph.m_matchStructureData.add();
     6443                for (const InByIdVariant& variant : status.variants()) {
     6444                    if (!check(variant.conditionSet())) {
     6445                        allOK = false;
     6446                        break;
     6447                    }
     6448                    for (Structure* structure : variant.structureSet()) {
     6449                        MatchStructureVariant matchVariant;
     6450                        matchVariant.structure = m_graph.registerStructure(structure);
     6451                        matchVariant.result = variant.isHit();
     6452
     6453                        data->variants.append(WTFMove(matchVariant));
     6454                    }
     6455                }
     6456
     6457                if (allOK) {
     6458                    Node* match = addToGraph(MatchStructure, OpInfo(data), base);
     6459                    set(VirtualRegister(currentInstruction[1].u.operand), match);
     6460                    NEXT_OPCODE(op_in_by_id);
     6461                }
     6462            }
     6463
     6464            set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(InById, OpInfo(identifierNumber), base));
    64286465            NEXT_OPCODE(op_in_by_id);
    6429             break;
    64306466        }
    64316467
Note: See TracChangeset for help on using the changeset viewer.