diff options
Diffstat (limited to 'js/src/jit/FlowAliasAnalysis.h')
-rw-r--r-- | js/src/jit/FlowAliasAnalysis.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/js/src/jit/FlowAliasAnalysis.h b/js/src/jit/FlowAliasAnalysis.h new file mode 100644 index 000000000..d4c8c0f5f --- /dev/null +++ b/js/src/jit/FlowAliasAnalysis.h @@ -0,0 +1,71 @@ +/* -*- 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 jit_FlowAliasAnalysis_h +#define jit_FlowAliasAnalysis_h + +#include "jit/AliasAnalysisShared.h" +#include "jit/MIR.h" +#include "jit/MIRGraph.h" + +namespace js { +namespace jit { + +class LoopInfo; +class MIRGraph; +class GraphStoreInfo; + +typedef MDefinitionVector BlockStoreInfo; +typedef Vector<BlockStoreInfo*, 50, JitAllocPolicy> GraphStoreVector; + +class FlowAliasAnalysis : public AliasAnalysisShared +{ + // Info on the graph. + LoopInfo* loop_; + GraphStoreInfo* stores_; + + // Helper vectors. In order to not have to recreate them the whole time. + MDefinitionVector output_; + MDefinitionVector worklist_; + + public: + FlowAliasAnalysis(MIRGenerator* mir, MIRGraph& graph); + MOZ_MUST_USE bool analyze() override; + + protected: + /* Process instructions. */ + MOZ_MUST_USE bool processStore(BlockStoreInfo& stores, MDefinition* store); + MOZ_MUST_USE bool processLoad(BlockStoreInfo& stores, MDefinition* load); + MOZ_MUST_USE bool processDeferredLoads(LoopInfo* info); + + /* Improve dependency and helpers. */ + MOZ_MUST_USE bool improveDependency(MDefinition* load, MDefinitionVector& inputStores, + MDefinitionVector& outputStores); + MOZ_MUST_USE bool improveNonAliasedStores(MDefinition* load, MDefinitionVector& inputStores, + MDefinitionVector& outputStores, bool* improved, + bool onlyControlInstructions = false); + MOZ_MUST_USE bool improveStoresInFinishedLoops(MDefinition* load, MDefinitionVector& stores, + bool* improved); + + MOZ_MUST_USE bool improveLoopDependency(MDefinition* load, MDefinitionVector& inputStores, + MDefinitionVector& outputStores); + MOZ_MUST_USE bool deferImproveDependency(MDefinitionVector& stores); + + /* Save dependency info. */ + void saveLoadDependency(MDefinition* load, MDefinitionVector& dependencies); + MOZ_MUST_USE bool saveStoreDependency(MDefinition* store, BlockStoreInfo& prevStores); + + /* Helper functions. */ + MOZ_MUST_USE bool computeBlockStores(MBasicBlock* block); + MOZ_MUST_USE bool isLoopInvariant(MDefinition* load, MDefinition* store, bool* loopinvariant); + bool loopIsFinished(MBasicBlock* loopheader); + +}; + +} // namespace jit +} // namespace js + +#endif /* jit_FlowAliasAnalysis_h */ |