optimization.h revision 75be28332b278cff9039b54bfb228ac72f539ccc
175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain/* 275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * Copyright (C) 2014 The Android Open Source Project 375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * 475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * Licensed under the Apache License, Version 2.0 (the "License"); 575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * you may not use this file except in compliance with the License. 675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * You may obtain a copy of the License at 775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * 875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * http://www.apache.org/licenses/LICENSE-2.0 975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * 1075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * Unless required by applicable law or agreed to in writing, software 1175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * distributed under the License is distributed on an "AS IS" BASIS, 1275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * See the License for the specific language governing permissions and 1475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * limitations under the License. 1575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain */ 1675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 1775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#ifndef ART_COMPILER_OPTIMIZING_OPTIMIZATION_H_ 1875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#define ART_COMPILER_OPTIMIZING_OPTIMIZATION_H_ 1975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 2075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#include "graph_visualizer.h" 2175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#include "nodes.h" 2275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 2375be28332b278cff9039b54bfb228ac72f539cccRoland Levillainnamespace art { 2475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 2575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain/** 2675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * Abstraction to implement an optimization pass. 2775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain */ 2875be28332b278cff9039b54bfb228ac72f539cccRoland Levillainclass HOptimization : public ValueObject { 2975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain public: 3075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain HOptimization(HGraph* graph, 3175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain bool is_in_ssa_form, 3275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain const char* pass_name, 3375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain const HGraphVisualizer& visualizer) 3475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain : graph_(graph), 3575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain is_in_ssa_form_(is_in_ssa_form), 3675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain pass_name_(pass_name), 3775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain visualizer_(visualizer) {} 3875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 3975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain virtual ~HOptimization() {} 4075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 4175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // Execute the optimization pass. 4275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain void Execute(); 4375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 4475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // Return the name of the pass. 4575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain const char* GetPassName() const { return pass_name_; } 4675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 4775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // Peform the analysis itself. 4875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain virtual void Run() = 0; 4975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 5075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain private: 5175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // Verify the graph; abort if it is not valid. 5275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain void Check(); 5375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 5475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain protected: 5575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain HGraph* const graph_; 5675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 5775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain private: 5875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // Does the analyzed graph use the SSA form? 5975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain const bool is_in_ssa_form_; 6075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // Optimization pass name. 6175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain const char* pass_name_; 6275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // A graph visualiser invoked after the execution of the optimization 6375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain // pass if enabled. 6475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain const HGraphVisualizer& visualizer_; 6575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 6675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain DISALLOW_COPY_AND_ASSIGN(HOptimization); 6775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain}; 6875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 6975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain} // namespace art 7075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain 7175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#endif // ART_COMPILER_OPTIMIZING_OPTIMIZATION_H_ 72