#pragma once
#if ENABLE(WEBASSEMBLY)
#include "CompilationResult.h"
#include "ExecutionCounter.h"
#include "Options.h"
#include <wtf/Atomics.h>
#include <wtf/SegmentedVector.h>
#include <wtf/StdLibExtras.h>
namespace JSC { namespace Wasm {
class OSREntryData;
class TierUpCount : public UpperTierExecutionCounter {
WTF_MAKE_NONCOPYABLE(TierUpCount);
public:
enum class TriggerReason : uint8_t {
DontTrigger,
CompilationDone,
StartCompilation,
};
enum class CompilationStatus : uint8_t {
NotCompiled,
StartCompilation,
Compiled,
};
TierUpCount();
~TierUpCount();
static int32_t loopIncrement() { return Options::omgTierUpCounterIncrementForLoop(); }
static int32_t functionEntryIncrement() { return Options::omgTierUpCounterIncrementForEntry(); }
SegmentedVector<TriggerReason, 16>& osrEntryTriggers() { return m_osrEntryTriggers; }
Vector<uint32_t>& outerLoops() { return m_outerLoops; }
Lock& getLock() { return m_lock; }
OSREntryData& addOSREntryData(uint32_t functionIndex, uint32_t loopIndex);
void optimizeAfterWarmUp(uint32_t functionIndex)
{
dataLogLnIf(Options::verboseOSR(), functionIndex, ": OMG-optimizing after warm-up.");
setNewThreshold(Options::thresholdForOMGOptimizeAfterWarmUp(), nullptr);
}
bool checkIfOptimizationThresholdReached()
{
return checkIfThresholdCrossedAndSet(nullptr);
}
void dontOptimizeAnytimeSoon(uint32_t functionIndex)
{
dataLogLnIf(Options::verboseOSR(), functionIndex, ": Not OMG-optimizing anytime soon.");
deferIndefinitely();
}
void optimizeNextInvocation(uint32_t functionIndex)
{
dataLogLnIf(Options::verboseOSR(), functionIndex, ": OMG-optimizing next invocation.");
setNewThreshold(0, nullptr);
}
void optimizeSoon(uint32_t functionIndex)
{
dataLogLnIf(Options::verboseOSR(), functionIndex, ": OMG-optimizing soon.");
setNewThreshold(Options::thresholdForOMGOptimizeSoon(), nullptr);
}
void setOptimizationThresholdBasedOnCompilationResult(uint32_t functionIndex, CompilationResult result)
{
switch (result) {
case CompilationSuccessful:
optimizeNextInvocation(functionIndex);
return;
case CompilationFailed:
dontOptimizeAnytimeSoon(functionIndex);
return;
case CompilationDeferred:
optimizeAfterWarmUp(functionIndex);
return;
case CompilationInvalidated:
optimizeAfterWarmUp(functionIndex);
return;
}
RELEASE_ASSERT_NOT_REACHED();
}
Lock m_lock;
CompilationStatus m_compilationStatusForOMG { CompilationStatus::NotCompiled };
CompilationStatus m_compilationStatusForOMGForOSREntry { CompilationStatus::NotCompiled };
SegmentedVector<TriggerReason, 16> m_osrEntryTriggers;
Vector<uint32_t> m_outerLoops;
Vector<std::unique_ptr<OSREntryData>> m_osrEntryData;
};
} }
#endif // ENABLE(WEBASSEMBLY)