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) {