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