blob: e0bb76eb226dfe9d662d02149bd93a73c6bc131e [file] [log] [blame]
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +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_PREPARE_FOR_REGISTER_ALLOCATION_H_
18#define ART_COMPILER_OPTIMIZING_PREPARE_FOR_REGISTER_ALLOCATION_H_
19
20#include "nodes.h"
21
Vladimir Marko0a516052019-10-14 13:00:44 +000022namespace art {
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010023
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +010024class CompilerOptions;
Igor Murashkin6ef45672017-08-08 13:59:55 -070025class OptimizingCompilerStats;
26
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010027/**
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 */
Nicolas Geoffray360231a2014-10-08 21:07:48 +010032class PrepareForRegisterAllocation : public HGraphDelegateVisitor {
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010033 public:
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +010034 PrepareForRegisterAllocation(HGraph* graph,
35 const CompilerOptions& compiler_options,
36 OptimizingCompilerStats* stats = nullptr)
37 : HGraphDelegateVisitor(graph, stats),
38 compiler_options_(compiler_options) {}
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010039
40 void Run();
41
Mingyao Yang700347e2016-03-02 14:59:32 -080042 static constexpr const char* kPrepareForRegisterAllocationPassName =
43 "prepare_for_register_allocation";
44
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010045 private:
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010046 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;
Nicolas Geoffrayacc56ac2018-10-09 08:45:24 +010058 void VisitTypeConversion(HTypeConversion* instruction) override;
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010059
David Brazdilb3e773e2016-01-26 11:28:37 +000060 bool CanMoveClinitCheck(HInstruction* input, HInstruction* user) const;
61 bool CanEmitConditionAt(HCondition* condition, HInstruction* user) const;
Vladimir Markofbb184a2015-11-13 14:47:00 +000062
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +010063 const CompilerOptions& compiler_options_;
64
Nicolas Geoffray26a25ef2014-09-30 13:54:09 +010065 DISALLOW_COPY_AND_ASSIGN(PrepareForRegisterAllocation);
66};
67
68} // namespace art
69
70#endif // ART_COMPILER_OPTIMIZING_PREPARE_FOR_REGISTER_ALLOCATION_H_