1 /*
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_PREPARE_FOR_REGISTER_ALLOCATION_H_
18 #define ART_COMPILER_OPTIMIZING_PREPARE_FOR_REGISTER_ALLOCATION_H_
19 
20 #include "nodes.h"
21 
22 namespace art {
23 
24 class CompilerOptions;
25 class OptimizingCompilerStats;
26 
27 /**
28  * A simplification pass over the graph before doing register allocation.
29  * For example it changes uses of null checks and bounds checks to the original
30  * objects, to avoid creating a live range for these checks.
31  */
32 class PrepareForRegisterAllocation : public HGraphDelegateVisitor {
33  public:
34   PrepareForRegisterAllocation(HGraph* graph,
35                                const CompilerOptions& compiler_options,
36                                OptimizingCompilerStats* stats = nullptr)
HGraphDelegateVisitor(graph,stats)37       : HGraphDelegateVisitor(graph, stats),
38         compiler_options_(compiler_options) {}
39 
40   void Run();
41 
42   static constexpr const char* kPrepareForRegisterAllocationPassName =
43       "prepare_for_register_allocation";
44 
45  private:
46   void VisitCheckCast(HCheckCast* check_cast) override;
47   void VisitInstanceOf(HInstanceOf* instance_of) override;
48   void VisitNullCheck(HNullCheck* check) override;
49   void VisitDivZeroCheck(HDivZeroCheck* check) override;
50   void VisitBoundsCheck(HBoundsCheck* check) override;
51   void VisitBoundType(HBoundType* bound_type) override;
52   void VisitArraySet(HArraySet* instruction) override;
53   void VisitClinitCheck(HClinitCheck* check) override;
54   void VisitCondition(HCondition* condition) override;
55   void VisitConstructorFence(HConstructorFence* constructor_fence) override;
56   void VisitInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke) override;
57   void VisitDeoptimize(HDeoptimize* deoptimize) override;
58   void VisitTypeConversion(HTypeConversion* instruction) override;
59 
60   bool CanMoveClinitCheck(HInstruction* input, HInstruction* user) const;
61   bool CanEmitConditionAt(HCondition* condition, HInstruction* user) const;
62 
63   const CompilerOptions& compiler_options_;
64 
65   DISALLOW_COPY_AND_ASSIGN(PrepareForRegisterAllocation);
66 };
67 
68 }  // namespace art
69 
70 #endif  // ART_COMPILER_OPTIMIZING_PREPARE_FOR_REGISTER_ALLOCATION_H_
71