blob: 804296f7ba56a495fcbaf4a367d3ea337fd3112e [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
Vladimir Marko71bf8092015-09-15 15:33:14 +010064 ArenaVector<HInstruction*>* GetLocalsFor(HBasicBlock* block) {
65 DCHECK_LT(block->GetBlockId(), locals_for_.size());
66 ArenaVector<HInstruction*>* locals = &locals_for_[block->GetBlockId()];
67 if (locals->empty() && GetGraph()->GetNumberOfVRegs() != 0u) {
David Brazdilffee3d32015-07-06 11:48:53 +010068 const size_t vregs = GetGraph()->GetNumberOfVRegs();
Vladimir Marko71bf8092015-09-15 15:33:14 +010069 locals->resize(vregs, nullptr);
David Brazdilffee3d32015-07-06 11:48:53 +010070
71 if (block->IsCatchBlock()) {
72 // We record incoming inputs of catch phis at throwing instructions and
73 // must therefore eagerly create the phis. Unused phis will be removed
74 // in the dead phi analysis.
Vladimir Marko71bf8092015-09-15 15:33:14 +010075 ArenaAllocator* arena = GetGraph()->GetArena();
David Brazdilffee3d32015-07-06 11:48:53 +010076 for (size_t i = 0; i < vregs; ++i) {
77 HPhi* phi = new (arena) HPhi(arena, i, 0, Primitive::kPrimVoid);
78 block->AddPhi(phi);
Vladimir Marko71bf8092015-09-15 15:33:14 +010079 (*locals)[i] = phi;
David Brazdilffee3d32015-07-06 11:48:53 +010080 }
81 }
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010082 }
Nicolas Geoffray8c0c91a2015-05-07 11:46:05 +010083 return locals;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010084 }
85
86 HInstruction* ValueOfLocal(HBasicBlock* block, size_t local);
87
88 void VisitBasicBlock(HBasicBlock* block);
89 void VisitLoadLocal(HLoadLocal* load);
90 void VisitStoreLocal(HStoreLocal* store);
91 void VisitInstruction(HInstruction* instruction);
Nicolas Geoffray421e9f92014-11-11 18:21:53 +000092 void VisitTemporary(HTemporary* instruction);
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +010093
Nicolas Geoffray102cbed2014-10-15 18:31:05 +010094 static HInstruction* GetFloatOrDoubleEquivalent(HInstruction* user,
95 HInstruction* instruction,
96 Primitive::Type type);
97
Nicolas Geoffrayd6138ef2015-02-18 14:48:53 +000098 static HInstruction* GetReferenceTypeEquivalent(HInstruction* instruction);
99
Andreas Gampe7c3952f2015-02-19 18:21:24 -0800100 static constexpr const char* kSsaBuilderPassName = "ssa_builder";
101
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +0100102 private:
Calin Juravlea4f88312015-04-16 12:57:19 +0100103 void FixNullConstantType();
104 void EquivalentPhisCleanup();
105
David Brazdil8d5b8b22015-03-24 10:51:52 +0000106 static HFloatConstant* GetFloatEquivalent(HIntConstant* constant);
107 static HDoubleConstant* GetDoubleEquivalent(HLongConstant* constant);
108 static HPhi* GetFloatDoubleOrReferenceEquivalentOfPhi(HPhi* phi, Primitive::Type type);
109
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +0100110 // Locals for the current block being visited.
Vladimir Marko71bf8092015-09-15 15:33:14 +0100111 ArenaVector<HInstruction*>* current_locals_;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +0100112
113 // Keep track of loop headers found. The last phase of the analysis iterates
114 // over these blocks to set the inputs of their phis.
Vladimir Marko71bf8092015-09-15 15:33:14 +0100115 ArenaVector<HBasicBlock*> loop_headers_;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +0100116
117 // HEnvironment for each block.
Vladimir Marko71bf8092015-09-15 15:33:14 +0100118 ArenaVector<ArenaVector<HInstruction*>> locals_for_;
Nicolas Geoffrayc32e7702014-04-24 12:43:16 +0100119
120 DISALLOW_COPY_AND_ASSIGN(SsaBuilder);
121};
122
123} // namespace art
124
125#endif // ART_COMPILER_OPTIMIZING_SSA_BUILDER_H_