diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /js/src/jsapi-tests/testJitMinimalFunc.h | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jsapi-tests/testJitMinimalFunc.h')
-rw-r--r-- | js/src/jsapi-tests/testJitMinimalFunc.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testJitMinimalFunc.h b/js/src/jsapi-tests/testJitMinimalFunc.h new file mode 100644 index 0000000000..3a7dbd3183 --- /dev/null +++ b/js/src/jsapi-tests/testJitMinimalFunc.h @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsapi_tests_jitTestGVN_h +#define jsapi_tests_jitTestGVN_h + +#include "jit/IonAnalysis.h" +#include "jit/MIRGenerator.h" +#include "jit/MIRGraph.h" +#include "jit/RangeAnalysis.h" +#include "jit/ValueNumbering.h" + +namespace js { +namespace jit { + +struct MinimalAlloc { + LifoAlloc lifo; + TempAllocator alloc; + + // We are not testing the fallible allocator in these test cases, thus make + // the lifo alloc chunk extremely large for our test cases. + MinimalAlloc() : lifo(128 * 1024), alloc(&lifo) { + if (!alloc.ensureBallast()) { + MOZ_CRASH("[OOM] Not enough RAM for the test."); + } + } +}; + +struct MinimalFunc : MinimalAlloc { + JitCompileOptions options; + CompileInfo info; + MIRGraph graph; + MIRGenerator mir; + uint32_t numParams; + + MinimalFunc() + : options(), + info(0), + graph(&alloc), + mir(static_cast<CompileRealm*>(nullptr), options, &alloc, &graph, &info, + static_cast<const OptimizationInfo*>(nullptr)), + numParams(0) {} + + MBasicBlock* createEntryBlock() { + MBasicBlock* block = + MBasicBlock::New(graph, info, nullptr, MBasicBlock::NORMAL); + graph.addBlock(block); + return block; + } + + MBasicBlock* createOsrEntryBlock() { + MBasicBlock* block = + MBasicBlock::New(graph, info, nullptr, MBasicBlock::NORMAL); + graph.addBlock(block); + graph.setOsrBlock(block); + return block; + } + + MBasicBlock* createBlock(MBasicBlock* pred) { + MBasicBlock* block = + MBasicBlock::New(graph, info, pred, MBasicBlock::NORMAL); + graph.addBlock(block); + return block; + } + + MParameter* createParameter() { + MParameter* p = MParameter::New(alloc, numParams++); + return p; + } + + bool runGVN() { + if (!SplitCriticalEdges(graph)) { + return false; + } + RenumberBlocks(graph); + if (!BuildDominatorTree(graph)) { + return false; + } + if (!BuildPhiReverseMapping(graph)) { + return false; + } + ValueNumberer gvn(&mir, graph); + if (!gvn.run(ValueNumberer::DontUpdateAliasAnalysis)) { + return false; + } + return true; + } + + bool runRangeAnalysis() { + if (!SplitCriticalEdges(graph)) { + return false; + } + RenumberBlocks(graph); + if (!BuildDominatorTree(graph)) { + return false; + } + if (!BuildPhiReverseMapping(graph)) { + return false; + } + RangeAnalysis rangeAnalysis(&mir, graph); + if (!rangeAnalysis.addBetaNodes()) { + return false; + } + if (!rangeAnalysis.analyze()) { + return false; + } + if (!rangeAnalysis.addRangeAssertions()) { + return false; + } + if (!rangeAnalysis.removeBetaNodes()) { + return false; + } + return true; + } +}; + +} // namespace jit +} // namespace js + +#endif |