1 /*
2  * Copyright (C) 2016 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 /*
18  * This optimization recognizes the common diamond selection pattern and
19  * replaces it with an instance of the HSelect instruction.
20  *
21  * Recognized patterns:
22  *
23  *          If [ Condition ]
24  *            /          \
25  *      false branch  true branch
26  *            \          /
27  *     Phi [FalseValue, TrueValue]
28  *
29  * and
30  *
31  *             If [ Condition ]
32  *               /          \
33  *     false branch        true branch
34  *     return FalseValue   return TrueValue
35  *
36  * The pattern will be simplified if `true_branch` and `false_branch` each
37  * contain at most one instruction without any side effects.
38  *
39  * Blocks are merged into one and Select replaces the If and the Phi.
40  *
41  * For the first pattern it simplifies to:
42  *
43  *              true branch
44  *              false branch
45  *              Select [FalseValue, TrueValue, Condition]
46  *
47  * For the second pattern it simplifies to:
48  *
49  *              true branch
50  *              false branch
51  *              return Select [FalseValue, TrueValue, Condition]
52  *
53  * Note: In order to recognize no side-effect blocks, this optimization must be
54  * run after the instruction simplifier has removed redundant suspend checks.
55  */
56 
57 #ifndef ART_COMPILER_OPTIMIZING_SELECT_GENERATOR_H_
58 #define ART_COMPILER_OPTIMIZING_SELECT_GENERATOR_H_
59 
60 #include "optimization.h"
61 
62 namespace art {
63 
64 class HSelectGenerator : public HOptimization {
65  public:
66   HSelectGenerator(HGraph* graph,
67                    VariableSizedHandleScope* handles,
68                    OptimizingCompilerStats* stats,
69                    const char* name = kSelectGeneratorPassName);
70 
71   void Run() OVERRIDE;
72 
73   static constexpr const char* kSelectGeneratorPassName = "select_generator";
74 
75  private:
76   VariableSizedHandleScope* handle_scope_;
77   DISALLOW_COPY_AND_ASSIGN(HSelectGenerator);
78 };
79 
80 }  // namespace art
81 
82 #endif  // ART_COMPILER_OPTIMIZING_SELECT_GENERATOR_H_
83