blob: dcce5e4c2cec7db889b800fe19431a85b8815a89 [file] [log] [blame]
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +01001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_COMPILER_OPTIMIZING_SSA_BUILDER_H_
18#define ART_COMPILER_OPTIMIZING_SSA_BUILDER_H_
19
Vladimir Marko71bf8092015-09-15 15:33:14 +010020#include "base/arena_containers.h"
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010021#include "nodes.h"
Nicolas Geoffray31596742014-11-24 15:28:45 +000022#include "optimization.h"
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010023
24namespace art {
25
26static constexpr int kDefaultNumberOfLoops = 2;
27
Nicolas Geoffraye0fe7ae2015-03-09 10:02:49 +000028/**
29 * Transforms a graph into SSA form. The liveness guarantees of
30 * this transformation are listed below. A DEX register
31 * being killed means its value at a given position in the code
32 * will not be available to its environment uses. A merge in the
33 * following text is materialized as a `HPhi`.
34 *
35 * (a) Dex registers that do not require merging (that is, they do not
36 * have different values at a join block) are available to all their
Nicolas Geoffray915b9d02015-03-11 15:11:19 +000037 * environment uses. Note that it does not imply the instruction will
38 * have a physical location after register allocation. See the
39 * SsaLivenessAnalysis phase.
Nicolas Geoffraye0fe7ae2015-03-09 10:02:49 +000040 *
41 * (b) Dex registers that require merging, and the merging gives
42 * incompatible types, will be killed for environment uses of that merge.
43 *
44 * (c) When the `debuggable` flag is passed to the compiler, Dex registers
45 * that require merging and have a proper type after the merge, are
46 * available to all their environment uses. If the `debuggable` flag
47 * is not set, values of Dex registers only used by environments
48 * are killed.
49 */
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010050class SsaBuilder : public HGraphVisitor {
51 public:
52 explicit SsaBuilder(HGraph* graph)
53 : HGraphVisitor(graph),
54 current_locals_(nullptr),
Vladimir Marko71bf8092015-09-15 15:33:14 +010055 loop_headers_(graph->GetArena()->Adapter(kArenaAllocSsaBuilder)),
56 locals_for_(graph->GetBlocks().size(),
57 ArenaVector<HInstruction*>(graph->GetArena()->Adapter(kArenaAllocSsaBuilder)),
58 graph->GetArena()->Adapter(kArenaAllocSsaBuilder)) {
59 loop_headers_.reserve(kDefaultNumberOfLoops);
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010060 }
61
62 void BuildSsa();
63
David Brazdileead0712015-09-18 14:58:57 +010064 // Returns locals vector for `block`. If it is a catch block, the vector will be
65 // prepopulated with catch phis for vregs which are defined in `current_locals_`.
66 ArenaVector<HInstruction*>* GetLocalsFor(HBasicBlock* block);
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010067 HInstruction* ValueOfLocal(HBasicBlock* block, size_t local);
68
69 void VisitBasicBlock(HBasicBlock* block);
70 void VisitLoadLocal(HLoadLocal* load);
71 void VisitStoreLocal(HStoreLocal* store);
72 void VisitInstruction(HInstruction* instruction);
Nicolas Geoffray421e9f92014-11-11 18:21:53 +000073 void VisitTemporary(HTemporary* instruction);
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010074
Nicolas Geoffray102cbed2014-10-15 18:31:05 +010075 static HInstruction* GetFloatOrDoubleEquivalent(HInstruction* user,
76 HInstruction* instruction,
77 Primitive::Type type);
78
Nicolas Geoffrayd6138ef2015-02-18 14:48:53 +000079 static HInstruction* GetReferenceTypeEquivalent(HInstruction* instruction);
80
Andreas Gampe7c3952f2015-02-19 18:21:24 -080081 static constexpr const char* kSsaBuilderPassName = "ssa_builder";
82
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010083 private:
David Brazdil809d70f2015-11-19 10:29:39 +000084 void SetLoopHeaderPhiInputs();
Calin Juravlea4f88312015-04-16 12:57:19 +010085 void FixNullConstantType();
86 void EquivalentPhisCleanup();
87
David Brazdil8d5b8b22015-03-24 10:51:52 +000088 static HFloatConstant* GetFloatEquivalent(HIntConstant* constant);
89 static HDoubleConstant* GetDoubleEquivalent(HLongConstant* constant);
90 static HPhi* GetFloatDoubleOrReferenceEquivalentOfPhi(HPhi* phi, Primitive::Type type);
91
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010092 // Locals for the current block being visited.
Vladimir Marko71bf8092015-09-15 15:33:14 +010093 ArenaVector<HInstruction*>* current_locals_;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010094
95 // Keep track of loop headers found. The last phase of the analysis iterates
96 // over these blocks to set the inputs of their phis.
Vladimir Marko71bf8092015-09-15 15:33:14 +010097 ArenaVector<HBasicBlock*> loop_headers_;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010098
99 // HEnvironment for each block.
Vladimir Marko71bf8092015-09-15 15:33:14 +0100100 ArenaVector<ArenaVector<HInstruction*>> locals_for_;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +0100101
102 DISALLOW_COPY_AND_ASSIGN(SsaBuilder);
103};
104
105} // namespace art
106
107#endif // ART_COMPILER_OPTIMIZING_SSA_BUILDER_H_