1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* -*- c++ -*- */ 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2010 Intel Corporation 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#pragma once 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef LOOP_ANALYSIS_H 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOOP_ANALYSIS_H 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ir.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/hash_table.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Analyze and classify all variables used in all loops in the instruction list 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern class loop_state * 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.organalyze_loop_variables(exec_list *instructions); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fill in loop control fields 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Based on analysis of loop variables, this function tries to remove sequences 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the loop of the form 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (if (expression bool ...) (break)) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and fill in the \c ir_loop::from, \c ir_loop::to, and \c ir_loop::counter 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fields of the \c ir_loop. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In this process, some conditional break-statements may be eliminated 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * altogether. For example, if it is provable that one loop exit condition will 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * always be satisfied before another, the unnecessary exit condition will be 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * removed. 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern bool 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_loop_controls(exec_list *instructions, loop_state *ls); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern bool 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunroll_loops(exec_list *instructions, loop_state *ls, unsigned max_iterations); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Tracking for all variables used in a loop 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass loop_variable_state : public exec_node { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class loop_variable *get(const ir_variable *); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class loop_variable *insert(ir_variable *); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class loop_terminator *insert(ir_if *); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Loop whose variable state is being tracked by this structure 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_loop *loop; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Variables that have not yet been classified 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list variables; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Variables whose values are constant within the body of the loop 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This list contains \c loop_variable objects. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list constants; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Induction variables for this loop 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This list contains \c loop_variable objects. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list induction_variables; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Simple if-statements that lead to the termination of the loop 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This list contains \c loop_terminator objects. 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa is_loop_terminator 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_list terminators; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Hash table containing all variables accessed in this loop 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table *var_hash; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Maximum number of loop iterations. 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If this value is negative, then the loop may be infinite. This actually 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * means that analysis was unable to determine an upper bound on the number 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of loop iterations. 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int max_iterations; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Number of ir_loop_jump instructions that operate on this loop 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_loop_jumps; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether this loop contains any function calls. 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool contains_calls; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loop_variable_state() 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->max_iterations = -1; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->num_loop_jumps = 0; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->contains_calls = false; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->var_hash = hash_table_ctor(0, hash_table_pointer_hash, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table_pointer_compare); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~loop_variable_state() 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table_dtor(this->var_hash); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void* operator new(size_t size, void *ctx) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *lvs = ralloc_size(ctx, size); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(lvs != NULL); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ralloc_set_destructor(lvs, (void (*)(void*)) destructor); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lvs; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static void 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org destructor(loop_variable_state *lvs) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lvs->~loop_variable_state(); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass loop_variable : public exec_node { 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** The variable in question. */ 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_variable *var; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Is the variable read in the loop before it is written? */ 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool read_before_write; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Are all variables in the RHS of the assignment loop constants? */ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool rhs_clean; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Is there an assignment to the variable that is conditional? */ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool conditional_assignment; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Reference to the first assignment to the variable in the loop body. */ 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_assignment *first_assignment; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Number of assignments to the variable in the loop body. */ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_assignments; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Increment values for loop induction variables 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Loop induction variables have a single increment of the form 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c b * \c biv + \c c, where \c b and \c c are loop constants and \c i 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is a basic loop induction variable. 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If \c iv_scale is \c NULL, 1 is used. If \c biv is the same as \c var, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * then \c var is a basic loop induction variable. 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*@{*/ 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_rvalue *iv_scale; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_variable *biv; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_rvalue *increment; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*@}*/ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline bool is_loop_constant() const 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool is_const = (this->num_assignments == 0) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ((this->num_assignments == 1) 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !this->conditional_assignment 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !this->read_before_write 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && this->rhs_clean); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the RHS of *the* assignment is clean, then there must be exactly 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * one assignment of the variable. 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((this->rhs_clean && (this->num_assignments == 1)) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || !this->rhs_clean); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Variables that are marked read-only *MUST* be loop constant. 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!this->var->read_only || (this->var->read_only && is_const)); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return is_const; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass loop_terminator : public exec_node { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ir_if *ir; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass loop_state { 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~loop_state(); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the loop variable state data for a particular loop 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loop_variable_state *get(const ir_loop *); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loop_variable_state *insert(ir_loop *ir); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool loop_found; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loop_state(); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Hash table containing all loops that have been analyzed. 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table *ht; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *mem_ctx; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org friend class loop_analysis; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* LOOP_ANALYSIS_H */ 256