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
20a3a3c5943522e7325d60cfcbdd17aff1e138f53dVladimir Marko#include "base/arena_object.h"
2175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#include "nodes.h"
22acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle#include "optimizing_compiler_stats.h"
2375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
2475be28332b278cff9039b54bfb228ac72f539cccRoland Levillainnamespace art {
2575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
2675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain/**
2775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain * Abstraction to implement an optimization pass.
2875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain */
29f9f6441c665b5ff9004d3ed55014f46d416fb1bbVladimir Markoclass HOptimization : public ArenaObject<kArenaAllocOptimization> {
3075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain public:
3175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  HOptimization(HGraph* graph,
32acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle                const char* pass_name,
33acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle                OptimizingCompilerStats* stats = nullptr)
3475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain      : graph_(graph),
35acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle        stats_(stats),
365e6916cea259897baaca019c5c7a5d05746306edNicolas Geoffray        pass_name_(pass_name) {}
3775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
3875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  virtual ~HOptimization() {}
3975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
4075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  // Return the name of the pass.
4175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  const char* GetPassName() const { return pass_name_; }
4275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
43854a02b1b488327f80c544ca1119b386b8715c26Aart Bik  // Perform the analysis itself.
4475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  virtual void Run() = 0;
4575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
4675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain protected:
472d7352ba5311b8f57427b91b7a891e61497373c1David Brazdil  void MaybeRecordStat(MethodCompilationStat compilation_stat, size_t count = 1) const;
48acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle
4975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  HGraph* const graph_;
50acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle  // Used to record stats about the optimization.
51acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle  OptimizingCompilerStats* const stats_;
5275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
5375be28332b278cff9039b54bfb228ac72f539cccRoland Levillain private:
5475be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  // Optimization pass name.
5575be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  const char* pass_name_;
5675be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
5775be28332b278cff9039b54bfb228ac72f539cccRoland Levillain  DISALLOW_COPY_AND_ASSIGN(HOptimization);
5875be28332b278cff9039b54bfb228ac72f539cccRoland Levillain};
5975be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
6075be28332b278cff9039b54bfb228ac72f539cccRoland Levillain}  // namespace art
6175be28332b278cff9039b54bfb228ac72f539cccRoland Levillain
6275be28332b278cff9039b54bfb228ac72f539cccRoland Levillain#endif  // ART_COMPILER_OPTIMIZING_OPTIMIZATION_H_
63