1 /* 2 * Copyright (C) 2015 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 // This optimization recognizes two common patterns: 18 // (a) Boolean selection: Casting a boolean to an integer or negating it is 19 // carried out with an If statement selecting from zero/one integer 20 // constants. Because Boolean values are represented as zero/one, the 21 // pattern can be replaced with the condition instruction itself or its 22 // negation, depending on the layout. 23 // (b) Negated condition: Instruction simplifier may replace an If's condition 24 // with a boolean value. If this value is the result of a Boolean negation, 25 // the true/false branches can be swapped and negation removed. 26 27 // Example: Negating a boolean value 28 // B1: 29 // z1 ParameterValue 30 // i2 IntConstant 0 31 // i3 IntConstant 1 32 // v4 Goto B2 33 // B2: 34 // z5 NotEquals [ z1 i2 ] 35 // v6 If [ z5 ] then B3 else B4 36 // B3: 37 // v7 Goto B5 38 // B4: 39 // v8 Goto B5 40 // B5: 41 // i9 Phi [ i3 i2 ] 42 // v10 Return [ i9 ] 43 // turns into 44 // B1: 45 // z1 ParameterValue 46 // i2 IntConstant 0 47 // v4 Goto B2 48 // B2: 49 // z11 Equals [ z1 i2 ] 50 // v10 Return [ z11 ] 51 // B3, B4, B5: removed 52 53 // Note: in order to recognize empty blocks, this optimization must be run 54 // after the instruction simplifier has removed redundant suspend checks. 55 56 #ifndef ART_COMPILER_OPTIMIZING_BOOLEAN_SIMPLIFIER_H_ 57 #define ART_COMPILER_OPTIMIZING_BOOLEAN_SIMPLIFIER_H_ 58 59 #include "optimization.h" 60 61 namespace art { 62 63 class HBooleanSimplifier : public HOptimization { 64 public: HBooleanSimplifier(HGraph * graph)65 explicit HBooleanSimplifier(HGraph* graph) 66 : HOptimization(graph, true, kBooleanSimplifierPassName) {} 67 68 void Run() OVERRIDE; 69 70 static constexpr const char* kBooleanSimplifierPassName = "boolean_simplifier"; 71 72 private: 73 void TryRemovingNegatedCondition(HBasicBlock* block); 74 void TryRemovingBooleanSelection(HBasicBlock* block); 75 76 DISALLOW_COPY_AND_ASSIGN(HBooleanSimplifier); 77 }; 78 79 } // namespace art 80 81 #endif // ART_COMPILER_OPTIMIZING_BOOLEAN_SIMPLIFIER_H_ 82