1/* Operations with affine combinations of trees. 2 Copyright (C) 2005-2015 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it 7under the terms of the GNU General Public License as published by the 8Free Software Foundation; either version 3, or (at your option) any 9later version. 10 11GCC is distributed in the hope that it will be useful, but WITHOUT 12ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING3. If not see 18<http://www.gnu.org/licenses/>. */ 19 20/* Affine combination of trees. We keep track of at most MAX_AFF_ELTS elements 21 to make things simpler; this is sufficient in most cases. */ 22 23#ifndef GCC_TREE_AFFINE_H 24#define GCC_TREE_AFFINE_H 25 26#include "hash-map.h" 27#include "wide-int.h" 28 29#define MAX_AFF_ELTS 8 30 31/* Element of an affine combination. */ 32 33struct aff_comb_elt 34{ 35 /* The value of the element. */ 36 tree val; 37 38 /* Its coefficient in the combination. */ 39 widest_int coef; 40}; 41 42struct aff_tree 43{ 44 /* Type of the result of the combination. */ 45 tree type; 46 47 /* Constant offset. */ 48 widest_int offset; 49 50 /* Number of elements of the combination. */ 51 unsigned n; 52 53 /* Elements and their coefficients. Type of elements may be different from 54 TYPE, but their sizes must be the same (STRIP_NOPS is applied to the 55 elements). 56 57 The coefficients are always sign extended from the precision of TYPE 58 (regardless of signedness of TYPE). */ 59 struct aff_comb_elt elts[MAX_AFF_ELTS]; 60 61 /* Remainder of the expression. Usually NULL, used only if there are more 62 than MAX_AFF_ELTS elements. Type of REST will be either sizetype for 63 TYPE of POINTER_TYPEs or TYPE. */ 64 tree rest; 65}; 66 67struct name_expansion; 68 69widest_int wide_int_ext_for_comb (const widest_int &, aff_tree *); 70void aff_combination_const (aff_tree *, tree, const widest_int &); 71void aff_combination_elt (aff_tree *, tree, tree); 72void aff_combination_scale (aff_tree *, const widest_int &); 73void aff_combination_mult (aff_tree *, aff_tree *, aff_tree *); 74void aff_combination_add (aff_tree *, aff_tree *); 75void aff_combination_add_elt (aff_tree *, tree, const widest_int &); 76void aff_combination_remove_elt (aff_tree *, unsigned); 77void aff_combination_convert (aff_tree *, tree); 78void tree_to_aff_combination (tree, tree, aff_tree *); 79tree aff_combination_to_tree (aff_tree *); 80void unshare_aff_combination (aff_tree *); 81bool aff_combination_constant_multiple_p (aff_tree *, aff_tree *, widest_int *); 82void aff_combination_expand (aff_tree *, hash_map<tree, name_expansion *> **); 83void tree_to_aff_combination_expand (tree, tree, aff_tree *, 84 hash_map<tree, name_expansion *> **); 85tree get_inner_reference_aff (tree, aff_tree *, widest_int *); 86void free_affine_expand_cache (hash_map<tree, name_expansion *> **); 87bool aff_comb_cannot_overlap_p (aff_tree *, const widest_int &, 88 const widest_int &); 89 90/* Debugging functions. */ 91void debug_aff (aff_tree *); 92 93/* Return true if AFF is actually ZERO. */ 94static inline bool 95aff_combination_zero_p (aff_tree *aff) 96{ 97 if (!aff) 98 return true; 99 100 if (aff->n == 0 && aff->offset == 0) 101 return true; 102 103 return false; 104} 105 106#endif /* GCC_TREE_AFFINE_H */ 107