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