diff options
Diffstat (limited to 'js/src/jsapi-tests/testJitMinimalFunc.h')
-rw-r--r-- | js/src/jsapi-tests/testJitMinimalFunc.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testJitMinimalFunc.h b/js/src/jsapi-tests/testJitMinimalFunc.h new file mode 100644 index 000000000..34bdd2d85 --- /dev/null +++ b/js/src/jsapi-tests/testJitMinimalFunc.h @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * 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<CompileCompartment*>(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++, nullptr); + 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.init()) + return false; + 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 |