Home | History | Annotate | Line # | Download | only in gcc
tree-affine.cc revision 1.1
      1  1.1  mrg /* Operations with affine combinations of trees.
      2  1.1  mrg    Copyright (C) 2005-2022 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg GCC is free software; you can redistribute it and/or modify it
      7  1.1  mrg under the terms of the GNU General Public License as published by the
      8  1.1  mrg Free Software Foundation; either version 3, or (at your option) any
      9  1.1  mrg later version.
     10  1.1  mrg 
     11  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT
     12  1.1  mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  1.1  mrg for more details.
     15  1.1  mrg 
     16  1.1  mrg You should have received a copy of the GNU General Public License
     17  1.1  mrg along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg <http://www.gnu.org/licenses/>.  */
     19  1.1  mrg 
     20  1.1  mrg #include "config.h"
     21  1.1  mrg #include "system.h"
     22  1.1  mrg #include "coretypes.h"
     23  1.1  mrg #include "backend.h"
     24  1.1  mrg #include "rtl.h"
     25  1.1  mrg #include "tree.h"
     26  1.1  mrg #include "gimple.h"
     27  1.1  mrg #include "ssa.h"
     28  1.1  mrg #include "tree-pretty-print.h"
     29  1.1  mrg #include "fold-const.h"
     30  1.1  mrg #include "tree-affine.h"
     31  1.1  mrg #include "gimplify.h"
     32  1.1  mrg #include "dumpfile.h"
     33  1.1  mrg #include "cfgexpand.h"
     34  1.1  mrg #include "value-query.h"
     35  1.1  mrg 
     36  1.1  mrg /* Extends CST as appropriate for the affine combinations COMB.  */
     37  1.1  mrg 
     38  1.1  mrg static widest_int
     39  1.1  mrg wide_int_ext_for_comb (const widest_int &cst, tree type)
     40  1.1  mrg {
     41  1.1  mrg   return wi::sext (cst, TYPE_PRECISION (type));
     42  1.1  mrg }
     43  1.1  mrg 
     44  1.1  mrg /* Likewise for polynomial offsets.  */
     45  1.1  mrg 
     46  1.1  mrg static poly_widest_int
     47  1.1  mrg wide_int_ext_for_comb (const poly_widest_int &cst, tree type)
     48  1.1  mrg {
     49  1.1  mrg   return wi::sext (cst, TYPE_PRECISION (type));
     50  1.1  mrg }
     51  1.1  mrg 
     52  1.1  mrg /* Initializes affine combination COMB so that its value is zero in TYPE.  */
     53  1.1  mrg 
     54  1.1  mrg static void
     55  1.1  mrg aff_combination_zero (aff_tree *comb, tree type)
     56  1.1  mrg {
     57  1.1  mrg   int i;
     58  1.1  mrg   comb->type = type;
     59  1.1  mrg   comb->offset = 0;
     60  1.1  mrg   comb->n = 0;
     61  1.1  mrg   for (i = 0; i < MAX_AFF_ELTS; i++)
     62  1.1  mrg     comb->elts[i].coef = 0;
     63  1.1  mrg   comb->rest = NULL_TREE;
     64  1.1  mrg }
     65  1.1  mrg 
     66  1.1  mrg /* Sets COMB to CST.  */
     67  1.1  mrg 
     68  1.1  mrg void
     69  1.1  mrg aff_combination_const (aff_tree *comb, tree type, const poly_widest_int &cst)
     70  1.1  mrg {
     71  1.1  mrg   aff_combination_zero (comb, type);
     72  1.1  mrg   comb->offset = wide_int_ext_for_comb (cst, comb->type);;
     73  1.1  mrg }
     74  1.1  mrg 
     75  1.1  mrg /* Sets COMB to single element ELT.  */
     76  1.1  mrg 
     77  1.1  mrg void
     78  1.1  mrg aff_combination_elt (aff_tree *comb, tree type, tree elt)
     79  1.1  mrg {
     80  1.1  mrg   aff_combination_zero (comb, type);
     81  1.1  mrg 
     82  1.1  mrg   comb->n = 1;
     83  1.1  mrg   comb->elts[0].val = elt;
     84  1.1  mrg   comb->elts[0].coef = 1;
     85  1.1  mrg }
     86  1.1  mrg 
     87  1.1  mrg /* Scales COMB by SCALE.  */
     88  1.1  mrg 
     89  1.1  mrg void
     90  1.1  mrg aff_combination_scale (aff_tree *comb, const widest_int &scale_in)
     91  1.1  mrg {
     92  1.1  mrg   unsigned i, j;
     93  1.1  mrg 
     94  1.1  mrg   widest_int scale = wide_int_ext_for_comb (scale_in, comb->type);
     95  1.1  mrg   if (scale == 1)
     96  1.1  mrg     return;
     97  1.1  mrg 
     98  1.1  mrg   if (scale == 0)
     99  1.1  mrg     {
    100  1.1  mrg       aff_combination_zero (comb, comb->type);
    101  1.1  mrg       return;
    102  1.1  mrg     }
    103  1.1  mrg 
    104  1.1  mrg   comb->offset = wide_int_ext_for_comb (scale * comb->offset, comb->type);
    105  1.1  mrg   for (i = 0, j = 0; i < comb->n; i++)
    106  1.1  mrg     {
    107  1.1  mrg       widest_int new_coef
    108  1.1  mrg 	= wide_int_ext_for_comb (scale * comb->elts[i].coef, comb->type);
    109  1.1  mrg       /* A coefficient may become zero due to overflow.  Remove the zero
    110  1.1  mrg 	 elements.  */
    111  1.1  mrg       if (new_coef == 0)
    112  1.1  mrg 	continue;
    113  1.1  mrg       comb->elts[j].coef = new_coef;
    114  1.1  mrg       comb->elts[j].val = comb->elts[i].val;
    115  1.1  mrg       j++;
    116  1.1  mrg     }
    117  1.1  mrg   comb->n = j;
    118  1.1  mrg 
    119  1.1  mrg   if (comb->rest)
    120  1.1  mrg     {
    121  1.1  mrg       tree type = comb->type;
    122  1.1  mrg       if (POINTER_TYPE_P (type))
    123  1.1  mrg 	type = sizetype;
    124  1.1  mrg       if (comb->n < MAX_AFF_ELTS)
    125  1.1  mrg 	{
    126  1.1  mrg 	  comb->elts[comb->n].coef = scale;
    127  1.1  mrg 	  comb->elts[comb->n].val = comb->rest;
    128  1.1  mrg 	  comb->rest = NULL_TREE;
    129  1.1  mrg 	  comb->n++;
    130  1.1  mrg 	}
    131  1.1  mrg       else
    132  1.1  mrg 	comb->rest = fold_build2 (MULT_EXPR, type, comb->rest,
    133  1.1  mrg 				  wide_int_to_tree (type, scale));
    134  1.1  mrg     }
    135  1.1  mrg }
    136  1.1  mrg 
    137  1.1  mrg /* Adds ELT * SCALE to COMB.  */
    138  1.1  mrg 
    139  1.1  mrg void
    140  1.1  mrg aff_combination_add_elt (aff_tree *comb, tree elt, const widest_int &scale_in)
    141  1.1  mrg {
    142  1.1  mrg   unsigned i;
    143  1.1  mrg   tree type;
    144  1.1  mrg 
    145  1.1  mrg   widest_int scale = wide_int_ext_for_comb (scale_in, comb->type);
    146  1.1  mrg   if (scale == 0)
    147  1.1  mrg     return;
    148  1.1  mrg 
    149  1.1  mrg   for (i = 0; i < comb->n; i++)
    150  1.1  mrg     if (operand_equal_p (comb->elts[i].val, elt, 0))
    151  1.1  mrg       {
    152  1.1  mrg 	widest_int new_coef
    153  1.1  mrg 	  = wide_int_ext_for_comb (comb->elts[i].coef + scale, comb->type);
    154  1.1  mrg 	if (new_coef != 0)
    155  1.1  mrg 	  {
    156  1.1  mrg 	    comb->elts[i].coef = new_coef;
    157  1.1  mrg 	    return;
    158  1.1  mrg 	  }
    159  1.1  mrg 
    160  1.1  mrg 	comb->n--;
    161  1.1  mrg 	comb->elts[i] = comb->elts[comb->n];
    162  1.1  mrg 
    163  1.1  mrg 	if (comb->rest)
    164  1.1  mrg 	  {
    165  1.1  mrg 	    gcc_assert (comb->n == MAX_AFF_ELTS - 1);
    166  1.1  mrg 	    comb->elts[comb->n].coef = 1;
    167  1.1  mrg 	    comb->elts[comb->n].val = comb->rest;
    168  1.1  mrg 	    comb->rest = NULL_TREE;
    169  1.1  mrg 	    comb->n++;
    170  1.1  mrg 	  }
    171  1.1  mrg 	return;
    172  1.1  mrg       }
    173  1.1  mrg   if (comb->n < MAX_AFF_ELTS)
    174  1.1  mrg     {
    175  1.1  mrg       comb->elts[comb->n].coef = scale;
    176  1.1  mrg       comb->elts[comb->n].val = elt;
    177  1.1  mrg       comb->n++;
    178  1.1  mrg       return;
    179  1.1  mrg     }
    180  1.1  mrg 
    181  1.1  mrg   type = comb->type;
    182  1.1  mrg   if (POINTER_TYPE_P (type))
    183  1.1  mrg     type = sizetype;
    184  1.1  mrg 
    185  1.1  mrg   if (scale == 1)
    186  1.1  mrg     elt = fold_convert (type, elt);
    187  1.1  mrg   else
    188  1.1  mrg     elt = fold_build2 (MULT_EXPR, type,
    189  1.1  mrg 		       fold_convert (type, elt),
    190  1.1  mrg 		       wide_int_to_tree (type, scale));
    191  1.1  mrg 
    192  1.1  mrg   if (comb->rest)
    193  1.1  mrg     comb->rest = fold_build2 (PLUS_EXPR, type, comb->rest,
    194  1.1  mrg 			      elt);
    195  1.1  mrg   else
    196  1.1  mrg     comb->rest = elt;
    197  1.1  mrg }
    198  1.1  mrg 
    199  1.1  mrg /* Adds CST to C.  */
    200  1.1  mrg 
    201  1.1  mrg static void
    202  1.1  mrg aff_combination_add_cst (aff_tree *c, const poly_widest_int &cst)
    203  1.1  mrg {
    204  1.1  mrg   c->offset = wide_int_ext_for_comb (c->offset + cst, c->type);
    205  1.1  mrg }
    206  1.1  mrg 
    207  1.1  mrg /* Adds COMB2 to COMB1.  */
    208  1.1  mrg 
    209  1.1  mrg void
    210  1.1  mrg aff_combination_add (aff_tree *comb1, aff_tree *comb2)
    211  1.1  mrg {
    212  1.1  mrg   unsigned i;
    213  1.1  mrg 
    214  1.1  mrg   aff_combination_add_cst (comb1, comb2->offset);
    215  1.1  mrg   for (i = 0; i < comb2->n; i++)
    216  1.1  mrg     aff_combination_add_elt (comb1, comb2->elts[i].val, comb2->elts[i].coef);
    217  1.1  mrg   if (comb2->rest)
    218  1.1  mrg     aff_combination_add_elt (comb1, comb2->rest, 1);
    219  1.1  mrg }
    220  1.1  mrg 
    221  1.1  mrg /* Converts affine combination COMB to TYPE.  */
    222  1.1  mrg 
    223  1.1  mrg void
    224  1.1  mrg aff_combination_convert (aff_tree *comb, tree type)
    225  1.1  mrg {
    226  1.1  mrg   unsigned i, j;
    227  1.1  mrg   tree comb_type = comb->type;
    228  1.1  mrg 
    229  1.1  mrg   if  (TYPE_PRECISION (type) > TYPE_PRECISION (comb_type))
    230  1.1  mrg     {
    231  1.1  mrg       tree val = fold_convert (type, aff_combination_to_tree (comb));
    232  1.1  mrg       tree_to_aff_combination (val, type, comb);
    233  1.1  mrg       return;
    234  1.1  mrg     }
    235  1.1  mrg 
    236  1.1  mrg   comb->type = type;
    237  1.1  mrg   if (comb->rest && !POINTER_TYPE_P (type))
    238  1.1  mrg     comb->rest = fold_convert (type, comb->rest);
    239  1.1  mrg 
    240  1.1  mrg   if (TYPE_PRECISION (type) == TYPE_PRECISION (comb_type))
    241  1.1  mrg     return;
    242  1.1  mrg 
    243  1.1  mrg   comb->offset = wide_int_ext_for_comb (comb->offset, comb->type);
    244  1.1  mrg   for (i = j = 0; i < comb->n; i++)
    245  1.1  mrg     {
    246  1.1  mrg       if (comb->elts[i].coef == 0)
    247  1.1  mrg 	continue;
    248  1.1  mrg       comb->elts[j].coef = comb->elts[i].coef;
    249  1.1  mrg       comb->elts[j].val = fold_convert (type, comb->elts[i].val);
    250  1.1  mrg       j++;
    251  1.1  mrg     }
    252  1.1  mrg 
    253  1.1  mrg   comb->n = j;
    254  1.1  mrg   if (comb->n < MAX_AFF_ELTS && comb->rest)
    255  1.1  mrg     {
    256  1.1  mrg       comb->elts[comb->n].coef = 1;
    257  1.1  mrg       comb->elts[comb->n].val = comb->rest;
    258  1.1  mrg       comb->rest = NULL_TREE;
    259  1.1  mrg       comb->n++;
    260  1.1  mrg     }
    261  1.1  mrg }
    262  1.1  mrg 
    263  1.1  mrg /* Tries to handle OP0 CODE OP1 as affine combination of parts.  Returns
    264  1.1  mrg    true when that was successful and returns the combination in COMB.  */
    265  1.1  mrg 
    266  1.1  mrg static bool
    267  1.1  mrg expr_to_aff_combination (aff_tree *comb, tree_code code, tree type,
    268  1.1  mrg 			 tree op0, tree op1 = NULL_TREE)
    269  1.1  mrg {
    270  1.1  mrg   aff_tree tmp;
    271  1.1  mrg   poly_int64 bitpos, bitsize, bytepos;
    272  1.1  mrg 
    273  1.1  mrg   switch (code)
    274  1.1  mrg     {
    275  1.1  mrg     case POINTER_PLUS_EXPR:
    276  1.1  mrg       tree_to_aff_combination (op0, type, comb);
    277  1.1  mrg       tree_to_aff_combination (op1, sizetype, &tmp);
    278  1.1  mrg       aff_combination_add (comb, &tmp);
    279  1.1  mrg       return true;
    280  1.1  mrg 
    281  1.1  mrg     case PLUS_EXPR:
    282  1.1  mrg     case MINUS_EXPR:
    283  1.1  mrg       tree_to_aff_combination (op0, type, comb);
    284  1.1  mrg       tree_to_aff_combination (op1, type, &tmp);
    285  1.1  mrg       if (code == MINUS_EXPR)
    286  1.1  mrg 	aff_combination_scale (&tmp, -1);
    287  1.1  mrg       aff_combination_add (comb, &tmp);
    288  1.1  mrg       return true;
    289  1.1  mrg 
    290  1.1  mrg     case MULT_EXPR:
    291  1.1  mrg       if (TREE_CODE (op1) != INTEGER_CST)
    292  1.1  mrg 	break;
    293  1.1  mrg       tree_to_aff_combination (op0, type, comb);
    294  1.1  mrg       aff_combination_scale (comb, wi::to_widest (op1));
    295  1.1  mrg       return true;
    296  1.1  mrg 
    297  1.1  mrg     case NEGATE_EXPR:
    298  1.1  mrg       tree_to_aff_combination (op0, type, comb);
    299  1.1  mrg       aff_combination_scale (comb, -1);
    300  1.1  mrg       return true;
    301  1.1  mrg 
    302  1.1  mrg     case BIT_NOT_EXPR:
    303  1.1  mrg       /* ~x = -x - 1 */
    304  1.1  mrg       tree_to_aff_combination (op0, type, comb);
    305  1.1  mrg       aff_combination_scale (comb, -1);
    306  1.1  mrg       aff_combination_add_cst (comb, -1);
    307  1.1  mrg       return true;
    308  1.1  mrg 
    309  1.1  mrg     CASE_CONVERT:
    310  1.1  mrg       {
    311  1.1  mrg 	tree otype = type;
    312  1.1  mrg 	tree inner = op0;
    313  1.1  mrg 	tree itype = TREE_TYPE (inner);
    314  1.1  mrg 	enum tree_code icode = TREE_CODE (inner);
    315  1.1  mrg 
    316  1.1  mrg 	/* STRIP_NOPS  */
    317  1.1  mrg 	if (tree_nop_conversion_p (otype, itype))
    318  1.1  mrg 	  {
    319  1.1  mrg 	    tree_to_aff_combination (op0, type, comb);
    320  1.1  mrg 	    return true;
    321  1.1  mrg 	  }
    322  1.1  mrg 
    323  1.1  mrg 	/* In principle this is a valid folding, but it isn't necessarily
    324  1.1  mrg 	   an optimization, so do it here and not in fold_unary.  */
    325  1.1  mrg 	if ((icode == PLUS_EXPR || icode == MINUS_EXPR || icode == MULT_EXPR)
    326  1.1  mrg 	    && TREE_CODE (itype) == INTEGER_TYPE
    327  1.1  mrg 	    && TREE_CODE (otype) == INTEGER_TYPE
    328  1.1  mrg 	    && TYPE_PRECISION (otype) > TYPE_PRECISION (itype))
    329  1.1  mrg 	  {
    330  1.1  mrg 	    tree op0 = TREE_OPERAND (inner, 0), op1 = TREE_OPERAND (inner, 1);
    331  1.1  mrg 
    332  1.1  mrg 	    /* If inner type has undefined overflow behavior, fold conversion
    333  1.1  mrg 	       for below two cases:
    334  1.1  mrg 		 (T1)(X *+- CST) -> (T1)X *+- (T1)CST
    335  1.1  mrg 		 (T1)(X + X)     -> (T1)X + (T1)X.  */
    336  1.1  mrg 	    if (TYPE_OVERFLOW_UNDEFINED (itype)
    337  1.1  mrg 		&& (TREE_CODE (op1) == INTEGER_CST
    338  1.1  mrg 		    || (icode == PLUS_EXPR && operand_equal_p (op0, op1, 0))))
    339  1.1  mrg 	      {
    340  1.1  mrg 		op0 = fold_convert (otype, op0);
    341  1.1  mrg 		op1 = fold_convert (otype, op1);
    342  1.1  mrg 		return expr_to_aff_combination (comb, icode, otype, op0, op1);
    343  1.1  mrg 	      }
    344  1.1  mrg 	    wide_int minv, maxv;
    345  1.1  mrg 	    /* If inner type has wrapping overflow behavior, fold conversion
    346  1.1  mrg 	       for below case:
    347  1.1  mrg 		 (T1)(X *+- CST) -> (T1)X *+- (T1)CST
    348  1.1  mrg 	       if X *+- CST doesn't overflow by range information.  */
    349  1.1  mrg 	    value_range vr;
    350  1.1  mrg 	    if (TYPE_UNSIGNED (itype)
    351  1.1  mrg 		&& TYPE_OVERFLOW_WRAPS (itype)
    352  1.1  mrg 		&& TREE_CODE (op1) == INTEGER_CST
    353  1.1  mrg 		&& get_range_query (cfun)->range_of_expr (vr, op0)
    354  1.1  mrg 		&& vr.kind () == VR_RANGE)
    355  1.1  mrg 	      {
    356  1.1  mrg 		wide_int minv = vr.lower_bound ();
    357  1.1  mrg 		wide_int maxv = vr.upper_bound ();
    358  1.1  mrg 		wi::overflow_type overflow = wi::OVF_NONE;
    359  1.1  mrg 		signop sign = UNSIGNED;
    360  1.1  mrg 		if (icode == PLUS_EXPR)
    361  1.1  mrg 		  wi::add (maxv, wi::to_wide (op1), sign, &overflow);
    362  1.1  mrg 		else if (icode == MULT_EXPR)
    363  1.1  mrg 		  wi::mul (maxv, wi::to_wide (op1), sign, &overflow);
    364  1.1  mrg 		else
    365  1.1  mrg 		  wi::sub (minv, wi::to_wide (op1), sign, &overflow);
    366  1.1  mrg 
    367  1.1  mrg 		if (overflow == wi::OVF_NONE)
    368  1.1  mrg 		  {
    369  1.1  mrg 		    op0 = fold_convert (otype, op0);
    370  1.1  mrg 		    op1 = fold_convert (otype, op1);
    371  1.1  mrg 		    return expr_to_aff_combination (comb, icode, otype, op0,
    372  1.1  mrg 						    op1);
    373  1.1  mrg 		  }
    374  1.1  mrg 	      }
    375  1.1  mrg 	  }
    376  1.1  mrg       }
    377  1.1  mrg       break;
    378  1.1  mrg 
    379  1.1  mrg     default:;
    380  1.1  mrg     }
    381  1.1  mrg 
    382  1.1  mrg   return false;
    383  1.1  mrg }
    384  1.1  mrg 
    385  1.1  mrg /* Splits EXPR into an affine combination of parts.  */
    386  1.1  mrg 
    387  1.1  mrg void
    388  1.1  mrg tree_to_aff_combination (tree expr, tree type, aff_tree *comb)
    389  1.1  mrg {
    390  1.1  mrg   aff_tree tmp;
    391  1.1  mrg   enum tree_code code;
    392  1.1  mrg   tree core, toffset;
    393  1.1  mrg   poly_int64 bitpos, bitsize, bytepos;
    394  1.1  mrg   machine_mode mode;
    395  1.1  mrg   int unsignedp, reversep, volatilep;
    396  1.1  mrg 
    397  1.1  mrg   STRIP_NOPS (expr);
    398  1.1  mrg 
    399  1.1  mrg   code = TREE_CODE (expr);
    400  1.1  mrg   switch (code)
    401  1.1  mrg     {
    402  1.1  mrg     case POINTER_PLUS_EXPR:
    403  1.1  mrg     case PLUS_EXPR:
    404  1.1  mrg     case MINUS_EXPR:
    405  1.1  mrg     case MULT_EXPR:
    406  1.1  mrg       if (expr_to_aff_combination (comb, code, type, TREE_OPERAND (expr, 0),
    407  1.1  mrg 				   TREE_OPERAND (expr, 1)))
    408  1.1  mrg 	return;
    409  1.1  mrg       break;
    410  1.1  mrg 
    411  1.1  mrg     case NEGATE_EXPR:
    412  1.1  mrg     case BIT_NOT_EXPR:
    413  1.1  mrg       if (expr_to_aff_combination (comb, code, type, TREE_OPERAND (expr, 0)))
    414  1.1  mrg 	return;
    415  1.1  mrg       break;
    416  1.1  mrg 
    417  1.1  mrg     CASE_CONVERT:
    418  1.1  mrg       /* ???  TREE_TYPE (expr) should be equal to type here, but IVOPTS
    419  1.1  mrg 	 calls this with not showing an outer widening cast.  */
    420  1.1  mrg       if (expr_to_aff_combination (comb, code,
    421  1.1  mrg 				   TREE_TYPE (expr), TREE_OPERAND (expr, 0)))
    422  1.1  mrg 	{
    423  1.1  mrg 	  aff_combination_convert (comb, type);
    424  1.1  mrg 	  return;
    425  1.1  mrg 	}
    426  1.1  mrg       break;
    427  1.1  mrg 
    428  1.1  mrg     case ADDR_EXPR:
    429  1.1  mrg       /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR.  */
    430  1.1  mrg       if (TREE_CODE (TREE_OPERAND (expr, 0)) == MEM_REF)
    431  1.1  mrg 	{
    432  1.1  mrg 	  expr = TREE_OPERAND (expr, 0);
    433  1.1  mrg 	  tree_to_aff_combination (TREE_OPERAND (expr, 0), type, comb);
    434  1.1  mrg 	  tree_to_aff_combination (TREE_OPERAND (expr, 1), sizetype, &tmp);
    435  1.1  mrg 	  aff_combination_add (comb, &tmp);
    436  1.1  mrg 	  return;
    437  1.1  mrg 	}
    438  1.1  mrg       core = get_inner_reference (TREE_OPERAND (expr, 0), &bitsize, &bitpos,
    439  1.1  mrg 				  &toffset, &mode, &unsignedp, &reversep,
    440  1.1  mrg 				  &volatilep);
    441  1.1  mrg       if (!multiple_p (bitpos, BITS_PER_UNIT, &bytepos))
    442  1.1  mrg 	break;
    443  1.1  mrg       aff_combination_const (comb, type, bytepos);
    444  1.1  mrg       if (TREE_CODE (core) == MEM_REF)
    445  1.1  mrg 	{
    446  1.1  mrg 	  tree mem_offset = TREE_OPERAND (core, 1);
    447  1.1  mrg 	  aff_combination_add_cst (comb, wi::to_poly_widest (mem_offset));
    448  1.1  mrg 	  core = TREE_OPERAND (core, 0);
    449  1.1  mrg 	}
    450  1.1  mrg       else
    451  1.1  mrg 	core = build_fold_addr_expr (core);
    452  1.1  mrg 
    453  1.1  mrg       if (TREE_CODE (core) == ADDR_EXPR)
    454  1.1  mrg 	aff_combination_add_elt (comb, core, 1);
    455  1.1  mrg       else
    456  1.1  mrg 	{
    457  1.1  mrg 	  tree_to_aff_combination (core, type, &tmp);
    458  1.1  mrg 	  aff_combination_add (comb, &tmp);
    459  1.1  mrg 	}
    460  1.1  mrg       if (toffset)
    461  1.1  mrg 	{
    462  1.1  mrg 	  tree_to_aff_combination (toffset, type, &tmp);
    463  1.1  mrg 	  aff_combination_add (comb, &tmp);
    464  1.1  mrg 	}
    465  1.1  mrg       return;
    466  1.1  mrg 
    467  1.1  mrg     default:
    468  1.1  mrg       {
    469  1.1  mrg 	if (poly_int_tree_p (expr))
    470  1.1  mrg 	  {
    471  1.1  mrg 	    aff_combination_const (comb, type, wi::to_poly_widest (expr));
    472  1.1  mrg 	    return;
    473  1.1  mrg 	  }
    474  1.1  mrg 	break;
    475  1.1  mrg       }
    476  1.1  mrg     }
    477  1.1  mrg 
    478  1.1  mrg   aff_combination_elt (comb, type, expr);
    479  1.1  mrg }
    480  1.1  mrg 
    481  1.1  mrg /* Creates EXPR + ELT * SCALE in TYPE.  EXPR is taken from affine
    482  1.1  mrg    combination COMB.  */
    483  1.1  mrg 
    484  1.1  mrg static tree
    485  1.1  mrg add_elt_to_tree (tree expr, tree type, tree elt, const widest_int &scale_in)
    486  1.1  mrg {
    487  1.1  mrg   enum tree_code code;
    488  1.1  mrg 
    489  1.1  mrg   widest_int scale = wide_int_ext_for_comb (scale_in, type);
    490  1.1  mrg 
    491  1.1  mrg   elt = fold_convert (type, elt);
    492  1.1  mrg   if (scale == 1)
    493  1.1  mrg     {
    494  1.1  mrg       if (!expr)
    495  1.1  mrg 	return elt;
    496  1.1  mrg 
    497  1.1  mrg       return fold_build2 (PLUS_EXPR, type, expr, elt);
    498  1.1  mrg     }
    499  1.1  mrg 
    500  1.1  mrg   if (scale == -1)
    501  1.1  mrg     {
    502  1.1  mrg       if (!expr)
    503  1.1  mrg 	return fold_build1 (NEGATE_EXPR, type, elt);
    504  1.1  mrg 
    505  1.1  mrg       return fold_build2 (MINUS_EXPR, type, expr, elt);
    506  1.1  mrg     }
    507  1.1  mrg 
    508  1.1  mrg   if (!expr)
    509  1.1  mrg     return fold_build2 (MULT_EXPR, type, elt, wide_int_to_tree (type, scale));
    510  1.1  mrg 
    511  1.1  mrg   if (wi::neg_p (scale))
    512  1.1  mrg     {
    513  1.1  mrg       code = MINUS_EXPR;
    514  1.1  mrg       scale = -scale;
    515  1.1  mrg     }
    516  1.1  mrg   else
    517  1.1  mrg     code = PLUS_EXPR;
    518  1.1  mrg 
    519  1.1  mrg   elt = fold_build2 (MULT_EXPR, type, elt, wide_int_to_tree (type, scale));
    520  1.1  mrg   return fold_build2 (code, type, expr, elt);
    521  1.1  mrg }
    522  1.1  mrg 
    523  1.1  mrg /* Makes tree from the affine combination COMB.  */
    524  1.1  mrg 
    525  1.1  mrg tree
    526  1.1  mrg aff_combination_to_tree (aff_tree *comb)
    527  1.1  mrg {
    528  1.1  mrg   tree type = comb->type, base = NULL_TREE, expr = NULL_TREE;
    529  1.1  mrg   unsigned i;
    530  1.1  mrg   poly_widest_int off;
    531  1.1  mrg   int sgn;
    532  1.1  mrg 
    533  1.1  mrg   gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE);
    534  1.1  mrg 
    535  1.1  mrg   i = 0;
    536  1.1  mrg   if (POINTER_TYPE_P (type))
    537  1.1  mrg     {
    538  1.1  mrg       type = sizetype;
    539  1.1  mrg       if (comb->n > 0 && comb->elts[0].coef == 1
    540  1.1  mrg 	  && POINTER_TYPE_P (TREE_TYPE (comb->elts[0].val)))
    541  1.1  mrg 	{
    542  1.1  mrg 	  base = comb->elts[0].val;
    543  1.1  mrg 	  ++i;
    544  1.1  mrg 	}
    545  1.1  mrg     }
    546  1.1  mrg 
    547  1.1  mrg   for (; i < comb->n; i++)
    548  1.1  mrg     expr = add_elt_to_tree (expr, type, comb->elts[i].val, comb->elts[i].coef);
    549  1.1  mrg 
    550  1.1  mrg   if (comb->rest)
    551  1.1  mrg     expr = add_elt_to_tree (expr, type, comb->rest, 1);
    552  1.1  mrg 
    553  1.1  mrg   /* Ensure that we get x - 1, not x + (-1) or x + 0xff..f if x is
    554  1.1  mrg      unsigned.  */
    555  1.1  mrg   if (known_lt (comb->offset, 0))
    556  1.1  mrg     {
    557  1.1  mrg       off = -comb->offset;
    558  1.1  mrg       sgn = -1;
    559  1.1  mrg     }
    560  1.1  mrg   else
    561  1.1  mrg     {
    562  1.1  mrg       off = comb->offset;
    563  1.1  mrg       sgn = 1;
    564  1.1  mrg     }
    565  1.1  mrg   expr = add_elt_to_tree (expr, type, wide_int_to_tree (type, off), sgn);
    566  1.1  mrg 
    567  1.1  mrg   if (base)
    568  1.1  mrg     return fold_build_pointer_plus (base, expr);
    569  1.1  mrg   else
    570  1.1  mrg     return fold_convert (comb->type, expr);
    571  1.1  mrg }
    572  1.1  mrg 
    573  1.1  mrg /* Copies the tree elements of COMB to ensure that they are not shared.  */
    574  1.1  mrg 
    575  1.1  mrg void
    576  1.1  mrg unshare_aff_combination (aff_tree *comb)
    577  1.1  mrg {
    578  1.1  mrg   unsigned i;
    579  1.1  mrg 
    580  1.1  mrg   for (i = 0; i < comb->n; i++)
    581  1.1  mrg     comb->elts[i].val = unshare_expr (comb->elts[i].val);
    582  1.1  mrg   if (comb->rest)
    583  1.1  mrg     comb->rest = unshare_expr (comb->rest);
    584  1.1  mrg }
    585  1.1  mrg 
    586  1.1  mrg /* Remove M-th element from COMB.  */
    587  1.1  mrg 
    588  1.1  mrg void
    589  1.1  mrg aff_combination_remove_elt (aff_tree *comb, unsigned m)
    590  1.1  mrg {
    591  1.1  mrg   comb->n--;
    592  1.1  mrg   if (m <= comb->n)
    593  1.1  mrg     comb->elts[m] = comb->elts[comb->n];
    594  1.1  mrg   if (comb->rest)
    595  1.1  mrg     {
    596  1.1  mrg       comb->elts[comb->n].coef = 1;
    597  1.1  mrg       comb->elts[comb->n].val = comb->rest;
    598  1.1  mrg       comb->rest = NULL_TREE;
    599  1.1  mrg       comb->n++;
    600  1.1  mrg     }
    601  1.1  mrg }
    602  1.1  mrg 
    603  1.1  mrg /* Adds C * COEF * VAL to R.  VAL may be NULL, in that case only
    604  1.1  mrg    C * COEF is added to R.  */
    605  1.1  mrg 
    606  1.1  mrg 
    607  1.1  mrg static void
    608  1.1  mrg aff_combination_add_product (aff_tree *c, const widest_int &coef, tree val,
    609  1.1  mrg 			     aff_tree *r)
    610  1.1  mrg {
    611  1.1  mrg   unsigned i;
    612  1.1  mrg   tree aval, type;
    613  1.1  mrg 
    614  1.1  mrg   for (i = 0; i < c->n; i++)
    615  1.1  mrg     {
    616  1.1  mrg       aval = c->elts[i].val;
    617  1.1  mrg       if (val)
    618  1.1  mrg 	{
    619  1.1  mrg 	  type = TREE_TYPE (aval);
    620  1.1  mrg 	  aval = fold_build2 (MULT_EXPR, type, aval,
    621  1.1  mrg 			      fold_convert (type, val));
    622  1.1  mrg 	}
    623  1.1  mrg 
    624  1.1  mrg       aff_combination_add_elt (r, aval, coef * c->elts[i].coef);
    625  1.1  mrg     }
    626  1.1  mrg 
    627  1.1  mrg   if (c->rest)
    628  1.1  mrg     {
    629  1.1  mrg       aval = c->rest;
    630  1.1  mrg       if (val)
    631  1.1  mrg 	{
    632  1.1  mrg 	  type = TREE_TYPE (aval);
    633  1.1  mrg 	  aval = fold_build2 (MULT_EXPR, type, aval,
    634  1.1  mrg 			      fold_convert (type, val));
    635  1.1  mrg 	}
    636  1.1  mrg 
    637  1.1  mrg       aff_combination_add_elt (r, aval, coef);
    638  1.1  mrg     }
    639  1.1  mrg 
    640  1.1  mrg   if (val)
    641  1.1  mrg     {
    642  1.1  mrg       if (c->offset.is_constant ())
    643  1.1  mrg 	/* Access coeffs[0] directly, for efficiency.  */
    644  1.1  mrg 	aff_combination_add_elt (r, val, coef * c->offset.coeffs[0]);
    645  1.1  mrg       else
    646  1.1  mrg 	{
    647  1.1  mrg 	  /* c->offset is polynomial, so multiply VAL rather than COEF
    648  1.1  mrg 	     by it.  */
    649  1.1  mrg 	  tree offset = wide_int_to_tree (TREE_TYPE (val), c->offset);
    650  1.1  mrg 	  val = fold_build2 (MULT_EXPR, TREE_TYPE (val), val, offset);
    651  1.1  mrg 	  aff_combination_add_elt (r, val, coef);
    652  1.1  mrg 	}
    653  1.1  mrg     }
    654  1.1  mrg   else
    655  1.1  mrg     aff_combination_add_cst (r, coef * c->offset);
    656  1.1  mrg }
    657  1.1  mrg 
    658  1.1  mrg /* Multiplies C1 by C2, storing the result to R  */
    659  1.1  mrg 
    660  1.1  mrg void
    661  1.1  mrg aff_combination_mult (aff_tree *c1, aff_tree *c2, aff_tree *r)
    662  1.1  mrg {
    663  1.1  mrg   unsigned i;
    664  1.1  mrg   gcc_assert (TYPE_PRECISION (c1->type) == TYPE_PRECISION (c2->type));
    665  1.1  mrg 
    666  1.1  mrg   aff_combination_zero (r, c1->type);
    667  1.1  mrg 
    668  1.1  mrg   for (i = 0; i < c2->n; i++)
    669  1.1  mrg     aff_combination_add_product (c1, c2->elts[i].coef, c2->elts[i].val, r);
    670  1.1  mrg   if (c2->rest)
    671  1.1  mrg     aff_combination_add_product (c1, 1, c2->rest, r);
    672  1.1  mrg   if (c2->offset.is_constant ())
    673  1.1  mrg     /* Access coeffs[0] directly, for efficiency.  */
    674  1.1  mrg     aff_combination_add_product (c1, c2->offset.coeffs[0], NULL, r);
    675  1.1  mrg   else
    676  1.1  mrg     {
    677  1.1  mrg       /* c2->offset is polynomial, so do the multiplication in tree form.  */
    678  1.1  mrg       tree offset = wide_int_to_tree (c2->type, c2->offset);
    679  1.1  mrg       aff_combination_add_product (c1, 1, offset, r);
    680  1.1  mrg     }
    681  1.1  mrg }
    682  1.1  mrg 
    683  1.1  mrg /* Returns the element of COMB whose value is VAL, or NULL if no such
    684  1.1  mrg    element exists.  If IDX is not NULL, it is set to the index of VAL in
    685  1.1  mrg    COMB.  */
    686  1.1  mrg 
    687  1.1  mrg static class aff_comb_elt *
    688  1.1  mrg aff_combination_find_elt (aff_tree *comb, tree val, unsigned *idx)
    689  1.1  mrg {
    690  1.1  mrg   unsigned i;
    691  1.1  mrg 
    692  1.1  mrg   for (i = 0; i < comb->n; i++)
    693  1.1  mrg     if (operand_equal_p (comb->elts[i].val, val, 0))
    694  1.1  mrg       {
    695  1.1  mrg 	if (idx)
    696  1.1  mrg 	  *idx = i;
    697  1.1  mrg 
    698  1.1  mrg 	return &comb->elts[i];
    699  1.1  mrg       }
    700  1.1  mrg 
    701  1.1  mrg   return NULL;
    702  1.1  mrg }
    703  1.1  mrg 
    704  1.1  mrg /* Element of the cache that maps ssa name NAME to its expanded form
    705  1.1  mrg    as an affine expression EXPANSION.  */
    706  1.1  mrg 
    707  1.1  mrg class name_expansion
    708  1.1  mrg {
    709  1.1  mrg public:
    710  1.1  mrg   aff_tree expansion;
    711  1.1  mrg 
    712  1.1  mrg   /* True if the expansion for the name is just being generated.  */
    713  1.1  mrg   unsigned in_progress : 1;
    714  1.1  mrg };
    715  1.1  mrg 
    716  1.1  mrg /* Expands SSA names in COMB recursively.  CACHE is used to cache the
    717  1.1  mrg    results.  */
    718  1.1  mrg 
    719  1.1  mrg void
    720  1.1  mrg aff_combination_expand (aff_tree *comb ATTRIBUTE_UNUSED,
    721  1.1  mrg 			hash_map<tree, name_expansion *> **cache)
    722  1.1  mrg {
    723  1.1  mrg   unsigned i;
    724  1.1  mrg   aff_tree to_add, current, curre;
    725  1.1  mrg   tree e;
    726  1.1  mrg   gimple *def;
    727  1.1  mrg   widest_int scale;
    728  1.1  mrg   class name_expansion *exp;
    729  1.1  mrg 
    730  1.1  mrg   aff_combination_zero (&to_add, comb->type);
    731  1.1  mrg   for (i = 0; i < comb->n; i++)
    732  1.1  mrg     {
    733  1.1  mrg       tree type, name;
    734  1.1  mrg       enum tree_code code;
    735  1.1  mrg 
    736  1.1  mrg       e = comb->elts[i].val;
    737  1.1  mrg       type = TREE_TYPE (e);
    738  1.1  mrg       name = e;
    739  1.1  mrg       /* Look through some conversions.  */
    740  1.1  mrg       if (CONVERT_EXPR_P (e)
    741  1.1  mrg           && (TYPE_PRECISION (type)
    742  1.1  mrg 	      >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (e, 0)))))
    743  1.1  mrg 	name = TREE_OPERAND (e, 0);
    744  1.1  mrg       if (TREE_CODE (name) != SSA_NAME)
    745  1.1  mrg 	continue;
    746  1.1  mrg       def = SSA_NAME_DEF_STMT (name);
    747  1.1  mrg       if (!is_gimple_assign (def) || gimple_assign_lhs (def) != name)
    748  1.1  mrg 	continue;
    749  1.1  mrg 
    750  1.1  mrg       code = gimple_assign_rhs_code (def);
    751  1.1  mrg       if (code != SSA_NAME
    752  1.1  mrg 	  && !IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
    753  1.1  mrg 	  && (get_gimple_rhs_class (code) != GIMPLE_SINGLE_RHS
    754  1.1  mrg 	      || !is_gimple_min_invariant (gimple_assign_rhs1 (def))))
    755  1.1  mrg 	continue;
    756  1.1  mrg 
    757  1.1  mrg       /* We do not know whether the reference retains its value at the
    758  1.1  mrg 	 place where the expansion is used.  */
    759  1.1  mrg       if (TREE_CODE_CLASS (code) == tcc_reference)
    760  1.1  mrg 	continue;
    761  1.1  mrg 
    762  1.1  mrg       name_expansion **slot = NULL;
    763  1.1  mrg       if (*cache)
    764  1.1  mrg 	slot = (*cache)->get (name);
    765  1.1  mrg       exp = slot ? *slot : NULL;
    766  1.1  mrg       if (!exp)
    767  1.1  mrg 	{
    768  1.1  mrg 	  /* Only bother to handle cases tree_to_aff_combination will.  */
    769  1.1  mrg 	  switch (code)
    770  1.1  mrg 	    {
    771  1.1  mrg 	    case POINTER_PLUS_EXPR:
    772  1.1  mrg 	    case PLUS_EXPR:
    773  1.1  mrg 	    case MINUS_EXPR:
    774  1.1  mrg 	    case MULT_EXPR:
    775  1.1  mrg 	      if (!expr_to_aff_combination (&current, code, TREE_TYPE (name),
    776  1.1  mrg 					    gimple_assign_rhs1 (def),
    777  1.1  mrg 					    gimple_assign_rhs2 (def)))
    778  1.1  mrg 		continue;
    779  1.1  mrg 	      break;
    780  1.1  mrg 	    case NEGATE_EXPR:
    781  1.1  mrg 	    case BIT_NOT_EXPR:
    782  1.1  mrg 	      if (!expr_to_aff_combination (&current, code, TREE_TYPE (name),
    783  1.1  mrg 					    gimple_assign_rhs1 (def)))
    784  1.1  mrg 		continue;
    785  1.1  mrg 	      break;
    786  1.1  mrg 	    CASE_CONVERT:
    787  1.1  mrg 	      if (!expr_to_aff_combination (&current, code, TREE_TYPE (name),
    788  1.1  mrg 					    gimple_assign_rhs1 (def)))
    789  1.1  mrg 		/* This makes us always expand conversions which we did
    790  1.1  mrg 		   in the past and makes gcc.dg/tree-ssa/ivopts-lt-2.c
    791  1.1  mrg 		   PASS, eliminating one induction variable in IVOPTs.
    792  1.1  mrg 		   ???  But it is really excessive and we should try
    793  1.1  mrg 		   harder to do without it.  */
    794  1.1  mrg 		aff_combination_elt (&current, TREE_TYPE (name),
    795  1.1  mrg 				     fold_convert (TREE_TYPE (name),
    796  1.1  mrg 						   gimple_assign_rhs1 (def)));
    797  1.1  mrg 	      break;
    798  1.1  mrg 	    case ADDR_EXPR:
    799  1.1  mrg 	    case INTEGER_CST:
    800  1.1  mrg 	    case POLY_INT_CST:
    801  1.1  mrg 	      tree_to_aff_combination (gimple_assign_rhs1 (def),
    802  1.1  mrg 				       TREE_TYPE (name), &current);
    803  1.1  mrg 	      break;
    804  1.1  mrg 	    default:
    805  1.1  mrg 	      continue;
    806  1.1  mrg 	    }
    807  1.1  mrg 	  exp = XNEW (class name_expansion);
    808  1.1  mrg 	  exp->in_progress = 1;
    809  1.1  mrg 	  if (!*cache)
    810  1.1  mrg 	    *cache = new hash_map<tree, name_expansion *>;
    811  1.1  mrg 	  (*cache)->put (name, exp);
    812  1.1  mrg 	  aff_combination_expand (&current, cache);
    813  1.1  mrg 	  exp->expansion = current;
    814  1.1  mrg 	  exp->in_progress = 0;
    815  1.1  mrg 	}
    816  1.1  mrg       else
    817  1.1  mrg 	{
    818  1.1  mrg 	  /* Since we follow the definitions in the SSA form, we should not
    819  1.1  mrg 	     enter a cycle unless we pass through a phi node.  */
    820  1.1  mrg 	  gcc_assert (!exp->in_progress);
    821  1.1  mrg 	  current = exp->expansion;
    822  1.1  mrg 	}
    823  1.1  mrg       if (!useless_type_conversion_p (comb->type, current.type))
    824  1.1  mrg 	aff_combination_convert (&current, comb->type);
    825  1.1  mrg 
    826  1.1  mrg       /* Accumulate the new terms to TO_ADD, so that we do not modify
    827  1.1  mrg 	 COMB while traversing it; include the term -coef * E, to remove
    828  1.1  mrg          it from COMB.  */
    829  1.1  mrg       scale = comb->elts[i].coef;
    830  1.1  mrg       aff_combination_zero (&curre, comb->type);
    831  1.1  mrg       aff_combination_add_elt (&curre, e, -scale);
    832  1.1  mrg       aff_combination_scale (&current, scale);
    833  1.1  mrg       aff_combination_add (&to_add, &current);
    834  1.1  mrg       aff_combination_add (&to_add, &curre);
    835  1.1  mrg     }
    836  1.1  mrg   aff_combination_add (comb, &to_add);
    837  1.1  mrg }
    838  1.1  mrg 
    839  1.1  mrg /* Similar to tree_to_aff_combination, but follows SSA name definitions
    840  1.1  mrg    and expands them recursively.  CACHE is used to cache the expansions
    841  1.1  mrg    of the ssa names, to avoid exponential time complexity for cases
    842  1.1  mrg    like
    843  1.1  mrg 
    844  1.1  mrg    a1 = a0 + a0;
    845  1.1  mrg    a2 = a1 + a1;
    846  1.1  mrg    a3 = a2 + a2;
    847  1.1  mrg    ...  */
    848  1.1  mrg 
    849  1.1  mrg void
    850  1.1  mrg tree_to_aff_combination_expand (tree expr, tree type, aff_tree *comb,
    851  1.1  mrg 				hash_map<tree, name_expansion *> **cache)
    852  1.1  mrg {
    853  1.1  mrg   tree_to_aff_combination (expr, type, comb);
    854  1.1  mrg   aff_combination_expand (comb, cache);
    855  1.1  mrg }
    856  1.1  mrg 
    857  1.1  mrg /* Frees memory occupied by struct name_expansion in *VALUE.  Callback for
    858  1.1  mrg    hash_map::traverse.  */
    859  1.1  mrg 
    860  1.1  mrg bool
    861  1.1  mrg free_name_expansion (tree const &, name_expansion **value, void *)
    862  1.1  mrg {
    863  1.1  mrg   free (*value);
    864  1.1  mrg   return true;
    865  1.1  mrg }
    866  1.1  mrg 
    867  1.1  mrg /* Frees memory allocated for the CACHE used by
    868  1.1  mrg    tree_to_aff_combination_expand.  */
    869  1.1  mrg 
    870  1.1  mrg void
    871  1.1  mrg free_affine_expand_cache (hash_map<tree, name_expansion *> **cache)
    872  1.1  mrg {
    873  1.1  mrg   if (!*cache)
    874  1.1  mrg     return;
    875  1.1  mrg 
    876  1.1  mrg   (*cache)->traverse<void *, free_name_expansion> (NULL);
    877  1.1  mrg   delete (*cache);
    878  1.1  mrg   *cache = NULL;
    879  1.1  mrg }
    880  1.1  mrg 
    881  1.1  mrg /* If VAL != CST * DIV for any constant CST, returns false.
    882  1.1  mrg    Otherwise, if *MULT_SET is true, additionally compares CST and MULT,
    883  1.1  mrg    and if they are different, returns false.  Finally, if neither of these
    884  1.1  mrg    two cases occur, true is returned, and CST is stored to MULT and MULT_SET
    885  1.1  mrg    is set to true.  */
    886  1.1  mrg 
    887  1.1  mrg static bool
    888  1.1  mrg wide_int_constant_multiple_p (const poly_widest_int &val,
    889  1.1  mrg 			      const poly_widest_int &div,
    890  1.1  mrg 			      bool *mult_set, poly_widest_int *mult)
    891  1.1  mrg {
    892  1.1  mrg   poly_widest_int rem, cst;
    893  1.1  mrg 
    894  1.1  mrg   if (known_eq (val, 0))
    895  1.1  mrg     {
    896  1.1  mrg       if (*mult_set && maybe_ne (*mult, 0))
    897  1.1  mrg 	return false;
    898  1.1  mrg       *mult_set = true;
    899  1.1  mrg       *mult = 0;
    900  1.1  mrg       return true;
    901  1.1  mrg     }
    902  1.1  mrg 
    903  1.1  mrg   if (maybe_eq (div, 0))
    904  1.1  mrg     return false;
    905  1.1  mrg 
    906  1.1  mrg   if (!multiple_p (val, div, &cst))
    907  1.1  mrg     return false;
    908  1.1  mrg 
    909  1.1  mrg   if (*mult_set && maybe_ne (*mult, cst))
    910  1.1  mrg     return false;
    911  1.1  mrg 
    912  1.1  mrg   *mult_set = true;
    913  1.1  mrg   *mult = cst;
    914  1.1  mrg   return true;
    915  1.1  mrg }
    916  1.1  mrg 
    917  1.1  mrg /* Returns true if VAL = X * DIV for some constant X.  If this is the case,
    918  1.1  mrg    X is stored to MULT.  */
    919  1.1  mrg 
    920  1.1  mrg bool
    921  1.1  mrg aff_combination_constant_multiple_p (aff_tree *val, aff_tree *div,
    922  1.1  mrg 				     poly_widest_int *mult)
    923  1.1  mrg {
    924  1.1  mrg   bool mult_set = false;
    925  1.1  mrg   unsigned i;
    926  1.1  mrg 
    927  1.1  mrg   if (val->n == 0 && known_eq (val->offset, 0))
    928  1.1  mrg     {
    929  1.1  mrg       *mult = 0;
    930  1.1  mrg       return true;
    931  1.1  mrg     }
    932  1.1  mrg   if (val->n != div->n)
    933  1.1  mrg     return false;
    934  1.1  mrg 
    935  1.1  mrg   if (val->rest || div->rest)
    936  1.1  mrg     return false;
    937  1.1  mrg 
    938  1.1  mrg   if (!wide_int_constant_multiple_p (val->offset, div->offset,
    939  1.1  mrg 				     &mult_set, mult))
    940  1.1  mrg     return false;
    941  1.1  mrg 
    942  1.1  mrg   for (i = 0; i < div->n; i++)
    943  1.1  mrg     {
    944  1.1  mrg       class aff_comb_elt *elt
    945  1.1  mrg 	      = aff_combination_find_elt (val, div->elts[i].val, NULL);
    946  1.1  mrg       if (!elt)
    947  1.1  mrg 	return false;
    948  1.1  mrg       if (!wide_int_constant_multiple_p (elt->coef, div->elts[i].coef,
    949  1.1  mrg 					 &mult_set, mult))
    950  1.1  mrg 	return false;
    951  1.1  mrg     }
    952  1.1  mrg 
    953  1.1  mrg   gcc_assert (mult_set);
    954  1.1  mrg   return true;
    955  1.1  mrg }
    956  1.1  mrg 
    957  1.1  mrg /* Prints the affine VAL to the FILE. */
    958  1.1  mrg 
    959  1.1  mrg static void
    960  1.1  mrg print_aff (FILE *file, aff_tree *val)
    961  1.1  mrg {
    962  1.1  mrg   unsigned i;
    963  1.1  mrg   signop sgn = TYPE_SIGN (val->type);
    964  1.1  mrg   if (POINTER_TYPE_P (val->type))
    965  1.1  mrg     sgn = SIGNED;
    966  1.1  mrg   fprintf (file, "{\n  type = ");
    967  1.1  mrg   print_generic_expr (file, val->type, TDF_VOPS|TDF_MEMSYMS);
    968  1.1  mrg   fprintf (file, "\n  offset = ");
    969  1.1  mrg   print_dec (val->offset, file, sgn);
    970  1.1  mrg   if (val->n > 0)
    971  1.1  mrg     {
    972  1.1  mrg       fprintf (file, "\n  elements = {\n");
    973  1.1  mrg       for (i = 0; i < val->n; i++)
    974  1.1  mrg 	{
    975  1.1  mrg 	  fprintf (file, "    [%d] = ", i);
    976  1.1  mrg 	  print_generic_expr (file, val->elts[i].val, TDF_VOPS|TDF_MEMSYMS);
    977  1.1  mrg 
    978  1.1  mrg 	  fprintf (file, " * ");
    979  1.1  mrg 	  print_dec (val->elts[i].coef, file, sgn);
    980  1.1  mrg 	  if (i != val->n - 1)
    981  1.1  mrg 	    fprintf (file, ", \n");
    982  1.1  mrg 	}
    983  1.1  mrg       fprintf (file, "\n  }");
    984  1.1  mrg   }
    985  1.1  mrg   if (val->rest)
    986  1.1  mrg     {
    987  1.1  mrg       fprintf (file, "\n  rest = ");
    988  1.1  mrg       print_generic_expr (file, val->rest, TDF_VOPS|TDF_MEMSYMS);
    989  1.1  mrg     }
    990  1.1  mrg   fprintf (file, "\n}");
    991  1.1  mrg }
    992  1.1  mrg 
    993  1.1  mrg /* Prints the affine VAL to the standard error, used for debugging.  */
    994  1.1  mrg 
    995  1.1  mrg DEBUG_FUNCTION void
    996  1.1  mrg debug_aff (aff_tree *val)
    997  1.1  mrg {
    998  1.1  mrg   print_aff (stderr, val);
    999  1.1  mrg   fprintf (stderr, "\n");
   1000  1.1  mrg }
   1001  1.1  mrg 
   1002  1.1  mrg /* Computes address of the reference REF in ADDR.  The size of the accessed
   1003  1.1  mrg    location is stored to SIZE.  Returns the ultimate containing object to
   1004  1.1  mrg    which REF refers.  */
   1005  1.1  mrg 
   1006  1.1  mrg tree
   1007  1.1  mrg get_inner_reference_aff (tree ref, aff_tree *addr, poly_widest_int *size)
   1008  1.1  mrg {
   1009  1.1  mrg   poly_int64 bitsize, bitpos;
   1010  1.1  mrg   tree toff;
   1011  1.1  mrg   machine_mode mode;
   1012  1.1  mrg   int uns, rev, vol;
   1013  1.1  mrg   aff_tree tmp;
   1014  1.1  mrg   tree base = get_inner_reference (ref, &bitsize, &bitpos, &toff, &mode,
   1015  1.1  mrg 				   &uns, &rev, &vol);
   1016  1.1  mrg   tree base_addr = build_fold_addr_expr (base);
   1017  1.1  mrg 
   1018  1.1  mrg   /* ADDR = &BASE + TOFF + BITPOS / BITS_PER_UNIT.  */
   1019  1.1  mrg 
   1020  1.1  mrg   tree_to_aff_combination (base_addr, sizetype, addr);
   1021  1.1  mrg 
   1022  1.1  mrg   if (toff)
   1023  1.1  mrg     {
   1024  1.1  mrg       tree_to_aff_combination (toff, sizetype, &tmp);
   1025  1.1  mrg       aff_combination_add (addr, &tmp);
   1026  1.1  mrg     }
   1027  1.1  mrg 
   1028  1.1  mrg   aff_combination_const (&tmp, sizetype, bits_to_bytes_round_down (bitpos));
   1029  1.1  mrg   aff_combination_add (addr, &tmp);
   1030  1.1  mrg 
   1031  1.1  mrg   *size = bits_to_bytes_round_up (bitsize);
   1032  1.1  mrg 
   1033  1.1  mrg   return base;
   1034  1.1  mrg }
   1035  1.1  mrg 
   1036  1.1  mrg /* Returns true if a region of size SIZE1 at position 0 and a region of
   1037  1.1  mrg    size SIZE2 at position DIFF cannot overlap.  */
   1038  1.1  mrg 
   1039  1.1  mrg bool
   1040  1.1  mrg aff_comb_cannot_overlap_p (aff_tree *diff, const poly_widest_int &size1,
   1041  1.1  mrg 			   const poly_widest_int &size2)
   1042  1.1  mrg {
   1043  1.1  mrg   /* Unless the difference is a constant, we fail.  */
   1044  1.1  mrg   if (diff->n != 0)
   1045  1.1  mrg     return false;
   1046  1.1  mrg 
   1047  1.1  mrg   if (!ordered_p (diff->offset, 0))
   1048  1.1  mrg     return false;
   1049  1.1  mrg 
   1050  1.1  mrg   if (maybe_lt (diff->offset, 0))
   1051  1.1  mrg     {
   1052  1.1  mrg       /* The second object is before the first one, we succeed if the last
   1053  1.1  mrg 	 element of the second object is before the start of the first one.  */
   1054  1.1  mrg       return known_le (diff->offset + size2, 0);
   1055  1.1  mrg     }
   1056  1.1  mrg   else
   1057  1.1  mrg     {
   1058  1.1  mrg       /* We succeed if the second object starts after the first one ends.  */
   1059  1.1  mrg       return known_le (size1, diff->offset);
   1060  1.1  mrg     }
   1061  1.1  mrg }
   1062  1.1  mrg 
   1063