Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 : * vim: set ts=8 sts=4 et sw=4 tw=99:
3 : * This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef jit_FlowAliasAnalysis_h
8 : #define jit_FlowAliasAnalysis_h
9 :
10 : #include "jit/AliasAnalysisShared.h"
11 : #include "jit/MIR.h"
12 : #include "jit/MIRGraph.h"
13 :
14 : namespace js {
15 : namespace jit {
16 :
17 : class LoopInfo;
18 : class MIRGraph;
19 : class GraphStoreInfo;
20 :
21 : typedef MDefinitionVector BlockStoreInfo;
22 : typedef Vector<BlockStoreInfo*, 50, JitAllocPolicy> GraphStoreVector;
23 :
24 0 : class FlowAliasAnalysis : public AliasAnalysisShared
25 : {
26 : // Info on the graph.
27 : LoopInfo* loop_;
28 : GraphStoreInfo* stores_;
29 :
30 : // Helper vectors. In order to not have to recreate them the whole time.
31 : MDefinitionVector output_;
32 : MDefinitionVector worklist_;
33 :
34 : public:
35 : FlowAliasAnalysis(MIRGenerator* mir, MIRGraph& graph);
36 : MOZ_MUST_USE bool analyze() override;
37 :
38 : protected:
39 : /* Process instructions. */
40 : MOZ_MUST_USE bool processStore(BlockStoreInfo& stores, MDefinition* store);
41 : MOZ_MUST_USE bool processLoad(BlockStoreInfo& stores, MDefinition* load);
42 : MOZ_MUST_USE bool processDeferredLoads(LoopInfo* info);
43 :
44 : /* Improve dependency and helpers. */
45 : MOZ_MUST_USE bool improveDependency(MDefinition* load, MDefinitionVector& inputStores,
46 : MDefinitionVector& outputStores);
47 : MOZ_MUST_USE bool improveNonAliasedStores(MDefinition* load, MDefinitionVector& inputStores,
48 : MDefinitionVector& outputStores, bool* improved,
49 : bool onlyControlInstructions = false);
50 : MOZ_MUST_USE bool improveStoresInFinishedLoops(MDefinition* load, MDefinitionVector& stores,
51 : bool* improved);
52 :
53 : MOZ_MUST_USE bool improveLoopDependency(MDefinition* load, MDefinitionVector& inputStores,
54 : MDefinitionVector& outputStores);
55 : MOZ_MUST_USE bool deferImproveDependency(MDefinitionVector& stores);
56 :
57 : /* Save dependency info. */
58 : void saveLoadDependency(MDefinition* load, MDefinitionVector& dependencies);
59 : MOZ_MUST_USE bool saveStoreDependency(MDefinition* store, BlockStoreInfo& prevStores);
60 :
61 : /* Helper functions. */
62 : MOZ_MUST_USE bool computeBlockStores(MBasicBlock* block);
63 : MOZ_MUST_USE bool isLoopInvariant(MDefinition* load, MDefinition* store, bool* loopinvariant);
64 : bool loopIsFinished(MBasicBlock* loopheader);
65 :
66 : };
67 :
68 : } // namespace jit
69 : } // namespace js
70 :
71 : #endif /* jit_FlowAliasAnalysis_h */
|