From 2aa4a82499d4becd2284cdb482213d541b8804dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 16:29:10 +0200 Subject: Adding upstream version 86.0.1. Signed-off-by: Daniel Baumann --- js/src/jsapi-tests/testJitMinimalFunc.h | 123 ++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 js/src/jsapi-tests/testJitMinimalFunc.h (limited to 'js/src/jsapi-tests/testJitMinimalFunc.h') 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(nullptr), options, &alloc, &graph, &info, + static_cast(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 -- cgit v1.2.3