Title: [221703] trunk/Source/_javascript_Core
Revision
221703
Author
[email protected]
Date
2017-09-06 14:04:25 -0700 (Wed, 06 Sep 2017)

Log Message

Air should have a Vector of prologue generators instead of a HashMap representing an optional prologue generator
https://bugs.webkit.org/show_bug.cgi?id=176346

Reviewed by Mark Lam.

* b3/B3Procedure.cpp:
(JSC::B3::Procedure::Procedure):
(JSC::B3::Procedure::setNumEntrypoints):
* b3/B3Procedure.h:
(JSC::B3::Procedure::setNumEntrypoints): Deleted.
* b3/air/AirCode.cpp:
(JSC::B3::Air::defaultPrologueGenerator):
(JSC::B3::Air::Code::Code):
(JSC::B3::Air::Code::setNumEntrypoints):
* b3/air/AirCode.h:
(JSC::B3::Air::Code::setPrologueForEntrypoint):
(JSC::B3::Air::Code::prologueGeneratorForEntrypoint):
(JSC::B3::Air::Code::setEntrypoints):
(JSC::B3::Air::Code::setEntrypointLabels):
* b3/air/AirGenerate.cpp:
(JSC::B3::Air::generate):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::lower):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (221702 => 221703)


--- trunk/Source/_javascript_Core/ChangeLog	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-09-06 21:04:25 UTC (rev 221703)
@@ -1,5 +1,31 @@
 2017-09-06  Saam Barati  <[email protected]>
 
+        Air should have a Vector of prologue generators instead of a HashMap representing an optional prologue generator
+        https://bugs.webkit.org/show_bug.cgi?id=176346
+
+        Reviewed by Mark Lam.
+
+        * b3/B3Procedure.cpp:
+        (JSC::B3::Procedure::Procedure):
+        (JSC::B3::Procedure::setNumEntrypoints):
+        * b3/B3Procedure.h:
+        (JSC::B3::Procedure::setNumEntrypoints): Deleted.
+        * b3/air/AirCode.cpp:
+        (JSC::B3::Air::defaultPrologueGenerator):
+        (JSC::B3::Air::Code::Code):
+        (JSC::B3::Air::Code::setNumEntrypoints):
+        * b3/air/AirCode.h:
+        (JSC::B3::Air::Code::setPrologueForEntrypoint):
+        (JSC::B3::Air::Code::prologueGeneratorForEntrypoint):
+        (JSC::B3::Air::Code::setEntrypoints):
+        (JSC::B3::Air::Code::setEntrypointLabels):
+        * b3/air/AirGenerate.cpp:
+        (JSC::B3::Air::generate):
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::lower):
+
+2017-09-06  Saam Barati  <[email protected]>
+
         ASSERTION FAILED: op() == CheckStructure in Source/_javascript_Core/dfg/DFGNode.h(443)
         https://bugs.webkit.org/show_bug.cgi?id=176470
 

Modified: trunk/Source/_javascript_Core/b3/B3Procedure.cpp (221702 => 221703)


--- trunk/Source/_javascript_Core/b3/B3Procedure.cpp	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/b3/B3Procedure.cpp	2017-09-06 21:04:25 UTC (rev 221703)
@@ -52,6 +52,7 @@
     , m_byproducts(std::make_unique<OpaqueByproducts>())
     , m_code(new Air::Code(*this))
 {
+    m_code->setNumEntrypoints(m_numEntrypoints);
 }
 
 Procedure::~Procedure()
@@ -420,6 +421,12 @@
     return code().mutableFPRs();
 }
 
+void Procedure::setNumEntrypoints(unsigned numEntrypoints)
+{
+    m_numEntrypoints = numEntrypoints;
+    m_code->setNumEntrypoints(numEntrypoints);
+}
+
 } } // namespace JSC::B3
 
 #endif // ENABLE(B3_JIT)

Modified: trunk/Source/_javascript_Core/b3/B3Procedure.h (221702 => 221703)


--- trunk/Source/_javascript_Core/b3/B3Procedure.h	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/b3/B3Procedure.h	2017-09-06 21:04:25 UTC (rev 221703)
@@ -186,8 +186,8 @@
     bool isFastConstant(const ValueKey&);
     
     unsigned numEntrypoints() const { return m_numEntrypoints; }
-    void setNumEntrypoints(unsigned numEntrypoints) { m_numEntrypoints = numEntrypoints; }
-    
+    JS_EXPORT_PRIVATE void setNumEntrypoints(unsigned);
+
     // Only call this after code generation is complete. Note that the label for the 0th entrypoint
     // should point to exactly where the code generation cursor was before you started generating
     // code.

Modified: trunk/Source/_javascript_Core/b3/air/AirCode.cpp (221702 => 221703)


--- trunk/Source/_javascript_Core/b3/air/AirCode.cpp	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/b3/air/AirCode.cpp	2017-09-06 21:04:25 UTC (rev 221703)
@@ -30,6 +30,7 @@
 
 #include "AirCCallSpecial.h"
 #include "AirCFG.h"
+#include "AllowMacroScratchRegisterUsageIf.h"
 #include "B3BasicBlockUtils.h"
 #include "B3Procedure.h"
 #include "B3StackSlot.h"
@@ -37,10 +38,22 @@
 
 namespace JSC { namespace B3 { namespace Air {
 
+static void defaultPrologueGenerator(CCallHelpers& jit, Code& code)
+{
+    jit.emitFunctionPrologue();
+    if (code.frameSize()) {
+        AllowMacroScratchRegisterUsageIf allowScratch(jit, isARM64());
+        jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister);
+    }
+    
+    jit.emitSave(code.calleeSaveRegisterAtOffsetList());
+}
+
 Code::Code(Procedure& proc)
     : m_proc(proc)
     , m_cfg(new CFG(*this))
     , m_lastPhaseName("initial")
+    , m_defaultPrologueGenerator(createSharedTask<PrologueGeneratorFunction>(&defaultPrologueGenerator))
 {
     // Come up with initial orderings of registers. The user may replace this with something else.
     forEachBank(
@@ -294,6 +307,14 @@
     return result;
 }
 
+void Code::setNumEntrypoints(unsigned numEntrypoints)
+{
+    m_prologueGenerators.clear();
+    m_prologueGenerators.reserveCapacity(numEntrypoints);
+    for (unsigned i = 0; i < numEntrypoints; ++i)
+        m_prologueGenerators.uncheckedAppend(m_defaultPrologueGenerator.copyRef());
+}
+
 } } } // namespace JSC::B3::Air
 
 #endif // ENABLE(B3_JIT)

Modified: trunk/Source/_javascript_Core/b3/air/AirCode.h (221702 => 221703)


--- trunk/Source/_javascript_Core/b3/air/AirCode.h	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/b3/air/AirCode.h	2017-09-06 21:04:25 UTC (rev 221703)
@@ -171,21 +171,26 @@
     bool isEntrypoint(BasicBlock*) const;
     // Note: It is only valid to call this function after LowerEntrySwitch.
     std::optional<unsigned> entrypointIndex(BasicBlock*) const;
-    void setPrologueForEntrypoint(unsigned entrypointIndex, RefPtr<PrologueGenerator> generator)
+
+    // Note: We allow this to be called even before we set m_entrypoints just for convenience to users of this API.
+    // However, if you call this before setNumEntrypoints, setNumEntrypoints will overwrite this value.
+    void setPrologueForEntrypoint(unsigned entrypointIndex, Ref<PrologueGenerator>&& generator)
     {
-        // Note: We allow this to be called even before we set m_entrypoints just for convenience to users of this API.
-        m_entrypointIndexToGenerator.set(entrypointIndex, generator);
+        m_prologueGenerators[entrypointIndex] = WTFMove(generator);
     }
-    RefPtr<PrologueGenerator> prologueGeneratorForEntrypoint(unsigned entrypointIndex)
+    const Ref<PrologueGenerator>& prologueGeneratorForEntrypoint(unsigned entrypointIndex)
     {
-        return m_entrypointIndexToGenerator.get(entrypointIndex);
+        return m_prologueGenerators[entrypointIndex];
     }
 
+    void setNumEntrypoints(unsigned);
+
     // This is used by lowerEntrySwitch().
     template<typename Vector>
     void setEntrypoints(Vector&& vector)
     {
         m_entrypoints = std::forward<Vector>(vector);
+        RELEASE_ASSERT(m_entrypoints.size() == m_prologueGenerators.size());
     }
     
     CCallHelpers::Label entrypointLabel(unsigned index) const
@@ -198,6 +203,7 @@
     void setEntrypointLabels(Vector&& vector)
     {
         m_entrypointLabels = std::forward<Vector>(vector);
+        RELEASE_ASSERT(m_entrypointLabels.size() == m_prologueGenerators.size());
     }
     
     void setStackIsAllocated(bool value)
@@ -368,11 +374,12 @@
     StackSlot* m_calleeSaveStackSlot { nullptr };
     Vector<FrequentedBlock> m_entrypoints; // This is empty until after lowerEntrySwitch().
     Vector<CCallHelpers::Label> m_entrypointLabels; // This is empty until code generation.
-    HashMap<unsigned, RefPtr<PrologueGenerator>, WTF::IntHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> m_entrypointIndexToGenerator;
+    Vector<Ref<PrologueGenerator>, 1> m_prologueGenerators;
     RefPtr<WasmBoundsCheckGenerator> m_wasmBoundsCheckGenerator;
     const char* m_lastPhaseName;
     std::unique_ptr<Disassembler> m_disassembler;
     unsigned m_optLevel { defaultOptLevel() };
+    Ref<PrologueGenerator> m_defaultPrologueGenerator;
 };
 
 } } } // namespace JSC::B3::Air

Modified: trunk/Source/_javascript_Core/b3/air/AirGenerate.cpp (221702 => 221703)


--- trunk/Source/_javascript_Core/b3/air/AirGenerate.cpp	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/b3/air/AirGenerate.cpp	2017-09-06 21:04:25 UTC (rev 221703)
@@ -46,7 +46,6 @@
 #include "AirReportUsedRegisters.h"
 #include "AirSimplifyCFG.h"
 #include "AirValidate.h"
-#include "AllowMacroScratchRegisterUsageIf.h"
 #include "B3Common.h"
 #include "B3Procedure.h"
 #include "B3TimingScope.h"
@@ -214,17 +213,7 @@
             if (disassembler)
                 disassembler->startEntrypoint(jit); 
 
-            if (RefPtr<PrologueGenerator> prologueGenerator = code.prologueGeneratorForEntrypoint(*entrypointIndex))
-                prologueGenerator->run(jit, code);
-            else {
-                jit.emitFunctionPrologue();
-                if (code.frameSize()) {
-                    AllowMacroScratchRegisterUsageIf allowScratch(jit, isARM64());
-                    jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister);
-                }
-                
-                jit.emitSave(code.calleeSaveRegisterAtOffsetList());
-            }
+            code.prologueGeneratorForEntrypoint(*entrypointIndex)->run(jit, code);
 
             if (disassembler)
                 disassembler->endEntrypoint(jit); 

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (221702 => 221703)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2017-09-06 20:54:36 UTC (rev 221702)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2017-09-06 21:04:25 UTC (rev 221703)
@@ -157,7 +157,7 @@
             m_proc.setNumEntrypoints(m_graph.m_numberOfEntrypoints);
             CodeBlock* codeBlock = m_graph.m_codeBlock;
 
-            RefPtr<B3::Air::PrologueGenerator> catchPrologueGenerator = createSharedTask<B3::Air::PrologueGeneratorFunction>(
+            Ref<B3::Air::PrologueGenerator> catchPrologueGenerator = createSharedTask<B3::Air::PrologueGeneratorFunction>(
                 [codeBlock] (CCallHelpers& jit, B3::Air::Code& code) {
                     AllowMacroScratchRegisterUsage allowScratch(jit);
                     jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), GPRInfo::callFrameRegister, CCallHelpers::stackPointerRegister);
@@ -167,7 +167,7 @@
 
             for (unsigned catchEntrypointIndex : m_graph.m_entrypointIndexToCatchBytecodeOffset.keys()) {
                 RELEASE_ASSERT(catchEntrypointIndex != 0);
-                m_proc.code().setPrologueForEntrypoint(catchEntrypointIndex, catchPrologueGenerator);
+                m_proc.code().setPrologueForEntrypoint(catchEntrypointIndex, catchPrologueGenerator.copyRef());
             }
 
             if (m_graph.m_maxLocalsForCatchOSREntry) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to