gcc80: Handle TZ specific "%+" format in strftime.
[dragonfly.git] / contrib / gcc-8.0 / gcc / poly-int.h
1 /* Polynomial integer classes.
2    Copyright (C) 2014-2018 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 /* This file provides a representation of sizes and offsets whose exact
21    values depend on certain runtime properties.  The motivating example
22    is the Arm SVE ISA, in which the number of vector elements is only
23    known at runtime.  See doc/poly-int.texi for more details.
24
25    Tests for poly-int.h are located in testsuite/gcc.dg/plugin,
26    since they are too expensive (in terms of binary size) to be
27    included as selftests.  */
28
29 #ifndef HAVE_POLY_INT_H
30 #define HAVE_POLY_INT_H
31
32 template<unsigned int N, typename T> class poly_int_pod;
33 template<unsigned int N, typename T> class poly_int;
34
35 /* poly_coeff_traiits<T> describes the properties of a poly_int
36    coefficient type T:
37
38    - poly_coeff_traits<T1>::rank is less than poly_coeff_traits<T2>::rank
39      if T1 can promote to T2.  For C-like types the rank is:
40
41        (2 * number of bytes) + (unsigned ? 1 : 0)
42
43      wide_ints don't have a normal rank and so use a value of INT_MAX.
44      Any fixed-width integer should be promoted to wide_int if possible
45      and lead to an error otherwise.
46
47    - poly_coeff_traits<T>::int_type is the type to which an integer
48      literal should be cast before comparing it with T.
49
50    - poly_coeff_traits<T>::precision is the number of bits that T can hold.
51
52    - poly_coeff_traits<T>::signedness is:
53         0 if T is unsigned
54         1 if T is signed
55        -1 if T has no inherent sign (as for wide_int).
56
57    - poly_coeff_traits<T>::max_value, if defined, is the maximum value of T.
58
59    - poly_coeff_traits<T>::result is a type that can hold results of
60      operations on T.  This is different from T itself in cases where T
61      is the result of an accessor like wi::to_offset.  */
62 template<typename T, wi::precision_type = wi::int_traits<T>::precision_type>
63 struct poly_coeff_traits;
64
65 template<typename T>
66 struct poly_coeff_traits<T, wi::FLEXIBLE_PRECISION>
67 {
68   typedef T result;
69   typedef T int_type;
70   static const int signedness = (T (0) >= T (-1));
71   static const int precision = sizeof (T) * CHAR_BIT;
72   static const T max_value = (signedness
73                               ? ((T (1) << (precision - 2))
74                                  + ((T (1) << (precision - 2)) - 1))
75                               : T (-1));
76   static const int rank = sizeof (T) * 2 + !signedness;
77 };
78
79 template<typename T>
80 struct poly_coeff_traits<T, wi::VAR_PRECISION>
81 {
82   typedef T result;
83   typedef int int_type;
84   static const int signedness = -1;
85   static const int precision = WIDE_INT_MAX_PRECISION;
86   static const int rank = INT_MAX;
87 };
88
89 template<typename T>
90 struct poly_coeff_traits<T, wi::CONST_PRECISION>
91 {
92   typedef WI_UNARY_RESULT (T) result;
93   typedef int int_type;
94   /* These types are always signed.  */
95   static const int signedness = 1;
96   static const int precision = wi::int_traits<T>::precision;
97   static const int rank = precision * 2 / CHAR_BIT;
98 };
99
100 /* Information about a pair of coefficient types.  */
101 template<typename T1, typename T2>
102 struct poly_coeff_pair_traits
103 {
104   /* True if T1 can represent all the values of T2.
105
106      Either:
107
108      - T1 should be a type with the same signedness as T2 and no less
109        precision.  This allows things like int16_t -> int16_t and
110        uint32_t -> uint64_t.
111
112      - T1 should be signed, T2 should be unsigned, and T1 should be
113        wider than T2.  This allows things like uint16_t -> int32_t.
114
115      This rules out cases in which T1 has less precision than T2 or where
116      the conversion would reinterpret the top bit.  E.g. int16_t -> uint32_t
117      can be dangerous and should have an explicit cast if deliberate.  */
118   static const bool lossless_p = (poly_coeff_traits<T1>::signedness
119                                   == poly_coeff_traits<T2>::signedness
120                                   ? (poly_coeff_traits<T1>::precision
121                                      >= poly_coeff_traits<T2>::precision)
122                                   : (poly_coeff_traits<T1>::signedness == 1
123                                      && poly_coeff_traits<T2>::signedness == 0
124                                      && (poly_coeff_traits<T1>::precision
125                                          > poly_coeff_traits<T2>::precision)));
126
127   /* 0 if T1 op T2 should promote to HOST_WIDE_INT,
128      1 if T1 op T2 should promote to unsigned HOST_WIDE_INT,
129      2 if T1 op T2 should use wide-int rules.  */
130 #define RANK(X) poly_coeff_traits<X>::rank
131   static const int result_kind
132     = ((RANK (T1) <= RANK (HOST_WIDE_INT)
133         && RANK (T2) <= RANK (HOST_WIDE_INT))
134        ? 0
135        : (RANK (T1) <= RANK (unsigned HOST_WIDE_INT)
136           && RANK (T2) <= RANK (unsigned HOST_WIDE_INT))
137        ? 1 : 2);
138 #undef RANK
139 };
140
141 /* SFINAE class that makes T3 available as "type" if T2 can represent all the
142    values in T1.  */
143 template<typename T1, typename T2, typename T3,
144          bool lossless_p = poly_coeff_pair_traits<T1, T2>::lossless_p>
145 struct if_lossless;
146 template<typename T1, typename T2, typename T3>
147 struct if_lossless<T1, T2, T3, true>
148 {
149   typedef T3 type;
150 };
151
152 /* poly_int_traits<T> describes an integer type T that might be polynomial
153    or non-polynomial:
154
155    - poly_int_traits<T>::is_poly is true if T is a poly_int-based type
156      and false otherwise.
157
158    - poly_int_traits<T>::num_coeffs gives the number of coefficients in T
159      if T is a poly_int and 1 otherwise.
160
161    - poly_int_traits<T>::coeff_type gives the coefficent type of T if T
162      is a poly_int and T itself otherwise
163
164    - poly_int_traits<T>::int_type is a shorthand for
165      typename poly_coeff_traits<coeff_type>::int_type.  */
166 template<typename T>
167 struct poly_int_traits
168 {
169   static const bool is_poly = false;
170   static const unsigned int num_coeffs = 1;
171   typedef T coeff_type;
172   typedef typename poly_coeff_traits<T>::int_type int_type;
173 };
174 template<unsigned int N, typename C>
175 struct poly_int_traits<poly_int_pod<N, C> >
176 {
177   static const bool is_poly = true;
178   static const unsigned int num_coeffs = N;
179   typedef C coeff_type;
180   typedef typename poly_coeff_traits<C>::int_type int_type;
181 };
182 template<unsigned int N, typename C>
183 struct poly_int_traits<poly_int<N, C> > : poly_int_traits<poly_int_pod<N, C> >
184 {
185 };
186
187 /* SFINAE class that makes T2 available as "type" if T1 is a non-polynomial
188    type.  */
189 template<typename T1, typename T2 = T1,
190          bool is_poly = poly_int_traits<T1>::is_poly>
191 struct if_nonpoly {};
192 template<typename T1, typename T2>
193 struct if_nonpoly<T1, T2, false>
194 {
195   typedef T2 type;
196 };
197
198 /* SFINAE class that makes T3 available as "type" if both T1 and T2 are
199    non-polynomial types.  */
200 template<typename T1, typename T2, typename T3,
201          bool is_poly1 = poly_int_traits<T1>::is_poly,
202          bool is_poly2 = poly_int_traits<T2>::is_poly>
203 struct if_nonpoly2 {};
204 template<typename T1, typename T2, typename T3>
205 struct if_nonpoly2<T1, T2, T3, false, false>
206 {
207   typedef T3 type;
208 };
209
210 /* SFINAE class that makes T2 available as "type" if T1 is a polynomial
211    type.  */
212 template<typename T1, typename T2 = T1,
213          bool is_poly = poly_int_traits<T1>::is_poly>
214 struct if_poly {};
215 template<typename T1, typename T2>
216 struct if_poly<T1, T2, true>
217 {
218   typedef T2 type;
219 };
220
221 /* poly_result<T1, T2> describes the result of an operation on two
222    types T1 and T2, where at least one of the types is polynomial:
223
224    - poly_result<T1, T2>::type gives the result type for the operation.
225      The intention is to provide normal C-like rules for integer ranks,
226      except that everything smaller than HOST_WIDE_INT promotes to
227      HOST_WIDE_INT.
228
229    - poly_result<T1, T2>::cast is the type to which an operand of type
230      T1 should be cast before doing the operation, to ensure that
231      the operation is done at the right precision.  Casting to
232      poly_result<T1, T2>::type would also work, but casting to this
233      type is more efficient.  */
234 template<typename T1, typename T2 = T1,
235          int result_kind = poly_coeff_pair_traits<T1, T2>::result_kind>
236 struct poly_result;
237
238 /* Promote pair to HOST_WIDE_INT.  */
239 template<typename T1, typename T2>
240 struct poly_result<T1, T2, 0>
241 {
242   typedef HOST_WIDE_INT type;
243   /* T1 and T2 are primitive types, so cast values to T before operating
244      on them.  */
245   typedef type cast;
246 };
247
248 /* Promote pair to unsigned HOST_WIDE_INT.  */
249 template<typename T1, typename T2>
250 struct poly_result<T1, T2, 1>
251 {
252   typedef unsigned HOST_WIDE_INT type;
253   /* T1 and T2 are primitive types, so cast values to T before operating
254      on them.  */
255   typedef type cast;
256 };
257
258 /* Use normal wide-int rules.  */
259 template<typename T1, typename T2>
260 struct poly_result<T1, T2, 2>
261 {
262   typedef WI_BINARY_RESULT (T1, T2) type;
263   /* Don't cast values before operating on them; leave the wi:: routines
264      to handle promotion as necessary.  */
265   typedef const T1 &cast;
266 };
267
268 /* The coefficient type for the result of a binary operation on two
269    poly_ints, the first of which has coefficients of type C1 and the
270    second of which has coefficients of type C2.  */
271 #define POLY_POLY_COEFF(C1, C2) typename poly_result<C1, C2>::type
272
273 /* Enforce that T2 is non-polynomial and provide the cofficient type of
274    the result of a binary operation in which the first operand is a
275    poly_int with coefficients of type C1 and the second operand is
276    a constant of type T2.  */
277 #define POLY_CONST_COEFF(C1, T2) \
278   POLY_POLY_COEFF (C1, typename if_nonpoly<T2>::type)
279
280 /* Likewise in reverse.  */
281 #define CONST_POLY_COEFF(T1, C2) \
282   POLY_POLY_COEFF (typename if_nonpoly<T1>::type, C2)
283
284 /* The result type for a binary operation on poly_int<N, C1> and
285    poly_int<N, C2>.  */
286 #define POLY_POLY_RESULT(N, C1, C2) poly_int<N, POLY_POLY_COEFF (C1, C2)>
287
288 /* Enforce that T2 is non-polynomial and provide the result type
289    for a binary operation on poly_int<N, C1> and T2.  */
290 #define POLY_CONST_RESULT(N, C1, T2) poly_int<N, POLY_CONST_COEFF (C1, T2)>
291
292 /* Enforce that T1 is non-polynomial and provide the result type
293    for a binary operation on T1 and poly_int<N, C2>.  */
294 #define CONST_POLY_RESULT(N, T1, C2) poly_int<N, CONST_POLY_COEFF (T1, C2)>
295
296 /* Enforce that T1 and T2 are non-polynomial and provide the result type
297    for a binary operation on T1 and T2.  */
298 #define CONST_CONST_RESULT(N, T1, T2) \
299   POLY_POLY_COEFF (typename if_nonpoly<T1>::type, \
300                    typename if_nonpoly<T2>::type)
301
302 /* The type to which a coefficient of type C1 should be cast before
303    using it in a binary operation with a coefficient of type C2.  */
304 #define POLY_CAST(C1, C2) typename poly_result<C1, C2>::cast
305
306 /* Provide the coefficient type for the result of T1 op T2, where T1
307    and T2 can be polynomial or non-polynomial.  */
308 #define POLY_BINARY_COEFF(T1, T2) \
309   typename poly_result<typename poly_int_traits<T1>::coeff_type, \
310                        typename poly_int_traits<T2>::coeff_type>::type
311
312 /* The type to which an integer constant should be cast before
313    comparing it with T.  */
314 #define POLY_INT_TYPE(T) typename poly_int_traits<T>::int_type
315
316 /* RES is a poly_int result that has coefficients of type C and that
317    is being built up a coefficient at a time.  Set coefficient number I
318    to VALUE in the most efficient way possible.
319
320    For primitive C it is better to assign directly, since it avoids
321    any further calls and so is more efficient when the compiler is
322    built at -O0.  But for wide-int based C it is better to construct
323    the value in-place.  This means that calls out to a wide-int.cc
324    routine can take the address of RES rather than the address of
325    a temporary.
326
327    The dummy comparison against a null C * is just a way of checking
328    that C gives the right type.  */
329 #define POLY_SET_COEFF(C, RES, I, VALUE) \
330   ((void) (&(RES).coeffs[0] == (C *) 0), \
331    wi::int_traits<C>::precision_type == wi::FLEXIBLE_PRECISION \
332    ? (void) ((RES).coeffs[I] = VALUE) \
333    : (void) ((RES).coeffs[I].~C (), new (&(RES).coeffs[I]) C (VALUE)))
334
335 /* A base POD class for polynomial integers.  The polynomial has N
336    coefficients of type C.  */
337 template<unsigned int N, typename C>
338 class poly_int_pod
339 {
340 public:
341   template<typename Ca>
342   poly_int_pod &operator = (const poly_int_pod<N, Ca> &);
343   template<typename Ca>
344   typename if_nonpoly<Ca, poly_int_pod>::type &operator = (const Ca &);
345
346   template<typename Ca>
347   poly_int_pod &operator += (const poly_int_pod<N, Ca> &);
348   template<typename Ca>
349   typename if_nonpoly<Ca, poly_int_pod>::type &operator += (const Ca &);
350
351   template<typename Ca>
352   poly_int_pod &operator -= (const poly_int_pod<N, Ca> &);
353   template<typename Ca>
354   typename if_nonpoly<Ca, poly_int_pod>::type &operator -= (const Ca &);
355
356   template<typename Ca>
357   typename if_nonpoly<Ca, poly_int_pod>::type &operator *= (const Ca &);
358
359   poly_int_pod &operator <<= (unsigned int);
360
361   bool is_constant () const;
362
363   template<typename T>
364   typename if_lossless<T, C, bool>::type is_constant (T *) const;
365
366   C to_constant () const;
367
368   template<typename Ca>
369   static poly_int<N, C> from (const poly_int_pod<N, Ca> &, unsigned int,
370                               signop);
371   template<typename Ca>
372   static poly_int<N, C> from (const poly_int_pod<N, Ca> &, signop);
373
374   bool to_shwi (poly_int_pod<N, HOST_WIDE_INT> *) const;
375   bool to_uhwi (poly_int_pod<N, unsigned HOST_WIDE_INT> *) const;
376   poly_int<N, HOST_WIDE_INT> force_shwi () const;
377   poly_int<N, unsigned HOST_WIDE_INT> force_uhwi () const;
378
379 #if POLY_INT_CONVERSION
380   operator C () const;
381 #endif
382
383   C coeffs[N];
384 };
385
386 template<unsigned int N, typename C>
387 template<typename Ca>
388 inline poly_int_pod<N, C>&
389 poly_int_pod<N, C>::operator = (const poly_int_pod<N, Ca> &a)
390 {
391   for (unsigned int i = 0; i < N; i++)
392     POLY_SET_COEFF (C, *this, i, a.coeffs[i]);
393   return *this;
394 }
395
396 template<unsigned int N, typename C>
397 template<typename Ca>
398 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
399 poly_int_pod<N, C>::operator = (const Ca &a)
400 {
401   POLY_SET_COEFF (C, *this, 0, a);
402   if (N >= 2)
403     for (unsigned int i = 1; i < N; i++)
404       POLY_SET_COEFF (C, *this, i, wi::ints_for<C>::zero (this->coeffs[0]));
405   return *this;
406 }
407
408 template<unsigned int N, typename C>
409 template<typename Ca>
410 inline poly_int_pod<N, C>&
411 poly_int_pod<N, C>::operator += (const poly_int_pod<N, Ca> &a)
412 {
413   for (unsigned int i = 0; i < N; i++)
414     this->coeffs[i] += a.coeffs[i];
415   return *this;
416 }
417
418 template<unsigned int N, typename C>
419 template<typename Ca>
420 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
421 poly_int_pod<N, C>::operator += (const Ca &a)
422 {
423   this->coeffs[0] += a;
424   return *this;
425 }
426
427 template<unsigned int N, typename C>
428 template<typename Ca>
429 inline poly_int_pod<N, C>&
430 poly_int_pod<N, C>::operator -= (const poly_int_pod<N, Ca> &a)
431 {
432   for (unsigned int i = 0; i < N; i++)
433     this->coeffs[i] -= a.coeffs[i];
434   return *this;
435 }
436
437 template<unsigned int N, typename C>
438 template<typename Ca>
439 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
440 poly_int_pod<N, C>::operator -= (const Ca &a)
441 {
442   this->coeffs[0] -= a;
443   return *this;
444 }
445
446 template<unsigned int N, typename C>
447 template<typename Ca>
448 inline typename if_nonpoly<Ca, poly_int_pod<N, C> >::type &
449 poly_int_pod<N, C>::operator *= (const Ca &a)
450 {
451   for (unsigned int i = 0; i < N; i++)
452     this->coeffs[i] *= a;
453   return *this;
454 }
455
456 template<unsigned int N, typename C>
457 inline poly_int_pod<N, C>&
458 poly_int_pod<N, C>::operator <<= (unsigned int a)
459 {
460   for (unsigned int i = 0; i < N; i++)
461     this->coeffs[i] <<= a;
462   return *this;
463 }
464
465 /* Return true if the polynomial value is a compile-time constant.  */
466
467 template<unsigned int N, typename C>
468 inline bool
469 poly_int_pod<N, C>::is_constant () const
470 {
471   if (N >= 2)
472     for (unsigned int i = 1; i < N; i++)
473       if (this->coeffs[i] != 0)
474         return false;
475   return true;
476 }
477
478 /* Return true if the polynomial value is a compile-time constant,
479    storing its value in CONST_VALUE if so.  */
480
481 template<unsigned int N, typename C>
482 template<typename T>
483 inline typename if_lossless<T, C, bool>::type
484 poly_int_pod<N, C>::is_constant (T *const_value) const
485 {
486   if (is_constant ())
487     {
488       *const_value = this->coeffs[0];
489       return true;
490     }
491   return false;
492 }
493
494 /* Return the value of a polynomial that is already known to be a
495    compile-time constant.
496
497    NOTE: When using this function, please add a comment above the call
498    explaining why we know the value is constant in that context.  */
499
500 template<unsigned int N, typename C>
501 inline C
502 poly_int_pod<N, C>::to_constant () const
503 {
504   gcc_checking_assert (is_constant ());
505   return this->coeffs[0];
506 }
507
508 /* Convert X to a wide_int-based polynomial in which each coefficient
509    has BITSIZE bits.  If X's coefficients are smaller than BITSIZE,
510    extend them according to SGN.  */
511
512 template<unsigned int N, typename C>
513 template<typename Ca>
514 inline poly_int<N, C>
515 poly_int_pod<N, C>::from (const poly_int_pod<N, Ca> &a,
516                           unsigned int bitsize, signop sgn)
517 {
518   poly_int<N, C> r;
519   for (unsigned int i = 0; i < N; i++)
520     POLY_SET_COEFF (C, r, i, C::from (a.coeffs[i], bitsize, sgn));
521   return r;
522 }
523
524 /* Convert X to a fixed_wide_int-based polynomial, extending according
525    to SGN.  */
526
527 template<unsigned int N, typename C>
528 template<typename Ca>
529 inline poly_int<N, C>
530 poly_int_pod<N, C>::from (const poly_int_pod<N, Ca> &a, signop sgn)
531 {
532   poly_int<N, C> r;
533   for (unsigned int i = 0; i < N; i++)
534     POLY_SET_COEFF (C, r, i, C::from (a.coeffs[i], sgn));
535   return r;
536 }
537
538 /* Return true if the coefficients of this generic_wide_int-based
539    polynomial can be represented as signed HOST_WIDE_INTs without loss
540    of precision.  Store the HOST_WIDE_INT representation in *R if so.  */
541
542 template<unsigned int N, typename C>
543 inline bool
544 poly_int_pod<N, C>::to_shwi (poly_int_pod<N, HOST_WIDE_INT> *r) const
545 {
546   for (unsigned int i = 0; i < N; i++)
547     if (!wi::fits_shwi_p (this->coeffs[i]))
548       return false;
549   for (unsigned int i = 0; i < N; i++)
550     r->coeffs[i] = this->coeffs[i].to_shwi ();
551   return true;
552 }
553
554 /* Return true if the coefficients of this generic_wide_int-based
555    polynomial can be represented as unsigned HOST_WIDE_INTs without
556    loss of precision.  Store the unsigned HOST_WIDE_INT representation
557    in *R if so.  */
558
559 template<unsigned int N, typename C>
560 inline bool
561 poly_int_pod<N, C>::to_uhwi (poly_int_pod<N, unsigned HOST_WIDE_INT> *r) const
562 {
563   for (unsigned int i = 0; i < N; i++)
564     if (!wi::fits_uhwi_p (this->coeffs[i]))
565       return false;
566   for (unsigned int i = 0; i < N; i++)
567     r->coeffs[i] = this->coeffs[i].to_uhwi ();
568   return true;
569 }
570
571 /* Force a generic_wide_int-based constant to HOST_WIDE_INT precision,
572    truncating if necessary.  */
573
574 template<unsigned int N, typename C>
575 inline poly_int<N, HOST_WIDE_INT>
576 poly_int_pod<N, C>::force_shwi () const
577 {
578   poly_int_pod<N, HOST_WIDE_INT> r;
579   for (unsigned int i = 0; i < N; i++)
580     r.coeffs[i] = this->coeffs[i].to_shwi ();
581   return r;
582 }
583
584 /* Force a generic_wide_int-based constant to unsigned HOST_WIDE_INT precision,
585    truncating if necessary.  */
586
587 template<unsigned int N, typename C>
588 inline poly_int<N, unsigned HOST_WIDE_INT>
589 poly_int_pod<N, C>::force_uhwi () const
590 {
591   poly_int_pod<N, unsigned HOST_WIDE_INT> r;
592   for (unsigned int i = 0; i < N; i++)
593     r.coeffs[i] = this->coeffs[i].to_uhwi ();
594   return r;
595 }
596
597 #if POLY_INT_CONVERSION
598 /* Provide a conversion operator to constants.  */
599
600 template<unsigned int N, typename C>
601 inline
602 poly_int_pod<N, C>::operator C () const
603 {
604   gcc_checking_assert (this->is_constant ());
605   return this->coeffs[0];
606 }
607 #endif
608
609 /* The main class for polynomial integers.  The class provides
610    constructors that are necessarily missing from the POD base.  */
611 template<unsigned int N, typename C>
612 class poly_int : public poly_int_pod<N, C>
613 {
614 public:
615   poly_int () {}
616
617   template<typename Ca>
618   poly_int (const poly_int<N, Ca> &);
619   template<typename Ca>
620   poly_int (const poly_int_pod<N, Ca> &);
621   template<typename C0>
622   poly_int (const C0 &);
623   template<typename C0, typename C1>
624   poly_int (const C0 &, const C1 &);
625
626   template<typename Ca>
627   poly_int &operator = (const poly_int_pod<N, Ca> &);
628   template<typename Ca>
629   typename if_nonpoly<Ca, poly_int>::type &operator = (const Ca &);
630
631   template<typename Ca>
632   poly_int &operator += (const poly_int_pod<N, Ca> &);
633   template<typename Ca>
634   typename if_nonpoly<Ca, poly_int>::type &operator += (const Ca &);
635
636   template<typename Ca>
637   poly_int &operator -= (const poly_int_pod<N, Ca> &);
638   template<typename Ca>
639   typename if_nonpoly<Ca, poly_int>::type &operator -= (const Ca &);
640
641   template<typename Ca>
642   typename if_nonpoly<Ca, poly_int>::type &operator *= (const Ca &);
643
644   poly_int &operator <<= (unsigned int);
645 };
646
647 template<unsigned int N, typename C>
648 template<typename Ca>
649 inline
650 poly_int<N, C>::poly_int (const poly_int<N, Ca> &a)
651 {
652   for (unsigned int i = 0; i < N; i++)
653     POLY_SET_COEFF (C, *this, i, a.coeffs[i]);
654 }
655
656 template<unsigned int N, typename C>
657 template<typename Ca>
658 inline
659 poly_int<N, C>::poly_int (const poly_int_pod<N, Ca> &a)
660 {
661   for (unsigned int i = 0; i < N; i++)
662     POLY_SET_COEFF (C, *this, i, a.coeffs[i]);
663 }
664
665 template<unsigned int N, typename C>
666 template<typename C0>
667 inline
668 poly_int<N, C>::poly_int (const C0 &c0)
669 {
670   POLY_SET_COEFF (C, *this, 0, c0);
671   for (unsigned int i = 1; i < N; i++)
672     POLY_SET_COEFF (C, *this, i, wi::ints_for<C>::zero (this->coeffs[0]));
673 }
674
675 template<unsigned int N, typename C>
676 template<typename C0, typename C1>
677 inline
678 poly_int<N, C>::poly_int (const C0 &c0, const C1 &c1)
679 {
680   STATIC_ASSERT (N >= 2);
681   POLY_SET_COEFF (C, *this, 0, c0);
682   POLY_SET_COEFF (C, *this, 1, c1);
683   for (unsigned int i = 2; i < N; i++)
684     POLY_SET_COEFF (C, *this, i, wi::ints_for<C>::zero (this->coeffs[0]));
685 }
686
687 template<unsigned int N, typename C>
688 template<typename Ca>
689 inline poly_int<N, C>&
690 poly_int<N, C>::operator = (const poly_int_pod<N, Ca> &a)
691 {
692   for (unsigned int i = 0; i < N; i++)
693     this->coeffs[i] = a.coeffs[i];
694   return *this;
695 }
696
697 template<unsigned int N, typename C>
698 template<typename Ca>
699 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
700 poly_int<N, C>::operator = (const Ca &a)
701 {
702   this->coeffs[0] = a;
703   if (N >= 2)
704     for (unsigned int i = 1; i < N; i++)
705       this->coeffs[i] = wi::ints_for<C>::zero (this->coeffs[0]);
706   return *this;
707 }
708
709 template<unsigned int N, typename C>
710 template<typename Ca>
711 inline poly_int<N, C>&
712 poly_int<N, C>::operator += (const poly_int_pod<N, Ca> &a)
713 {
714   for (unsigned int i = 0; i < N; i++)
715     this->coeffs[i] += a.coeffs[i];
716   return *this;
717 }
718
719 template<unsigned int N, typename C>
720 template<typename Ca>
721 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
722 poly_int<N, C>::operator += (const Ca &a)
723 {
724   this->coeffs[0] += a;
725   return *this;
726 }
727
728 template<unsigned int N, typename C>
729 template<typename Ca>
730 inline poly_int<N, C>&
731 poly_int<N, C>::operator -= (const poly_int_pod<N, Ca> &a)
732 {
733   for (unsigned int i = 0; i < N; i++)
734     this->coeffs[i] -= a.coeffs[i];
735   return *this;
736 }
737
738 template<unsigned int N, typename C>
739 template<typename Ca>
740 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
741 poly_int<N, C>::operator -= (const Ca &a)
742 {
743   this->coeffs[0] -= a;
744   return *this;
745 }
746
747 template<unsigned int N, typename C>
748 template<typename Ca>
749 inline typename if_nonpoly<Ca, poly_int<N, C> >::type &
750 poly_int<N, C>::operator *= (const Ca &a)
751 {
752   for (unsigned int i = 0; i < N; i++)
753     this->coeffs[i] *= a;
754   return *this;
755 }
756
757 template<unsigned int N, typename C>
758 inline poly_int<N, C>&
759 poly_int<N, C>::operator <<= (unsigned int a)
760 {
761   for (unsigned int i = 0; i < N; i++)
762     this->coeffs[i] <<= a;
763   return *this;
764 }
765
766 /* Return true if every coefficient of A is in the inclusive range [B, C].  */
767
768 template<typename Ca, typename Cb, typename Cc>
769 inline typename if_nonpoly<Ca, bool>::type
770 coeffs_in_range_p (const Ca &a, const Cb &b, const Cc &c)
771 {
772   return a >= b && a <= c;
773 }
774
775 template<unsigned int N, typename Ca, typename Cb, typename Cc>
776 inline typename if_nonpoly<Ca, bool>::type
777 coeffs_in_range_p (const poly_int_pod<N, Ca> &a, const Cb &b, const Cc &c)
778 {
779   for (unsigned int i = 0; i < N; i++)
780     if (a.coeffs[i] < b || a.coeffs[i] > c)
781       return false;
782   return true;
783 }
784
785 namespace wi {
786 /* Poly version of wi::shwi, with the same interface.  */
787
788 template<unsigned int N>
789 inline poly_int<N, hwi_with_prec>
790 shwi (const poly_int_pod<N, HOST_WIDE_INT> &a, unsigned int precision)
791 {
792   poly_int<N, hwi_with_prec> r;
793   for (unsigned int i = 0; i < N; i++)
794     POLY_SET_COEFF (hwi_with_prec, r, i, wi::shwi (a.coeffs[i], precision));
795   return r;
796 }
797
798 /* Poly version of wi::uhwi, with the same interface.  */
799
800 template<unsigned int N>
801 inline poly_int<N, hwi_with_prec>
802 uhwi (const poly_int_pod<N, unsigned HOST_WIDE_INT> &a, unsigned int precision)
803 {
804   poly_int<N, hwi_with_prec> r;
805   for (unsigned int i = 0; i < N; i++)
806     POLY_SET_COEFF (hwi_with_prec, r, i, wi::uhwi (a.coeffs[i], precision));
807   return r;
808 }
809
810 /* Poly version of wi::sext, with the same interface.  */
811
812 template<unsigned int N, typename Ca>
813 inline POLY_POLY_RESULT (N, Ca, Ca)
814 sext (const poly_int_pod<N, Ca> &a, unsigned int precision)
815 {
816   typedef POLY_POLY_COEFF (Ca, Ca) C;
817   poly_int<N, C> r;
818   for (unsigned int i = 0; i < N; i++)
819     POLY_SET_COEFF (C, r, i, wi::sext (a.coeffs[i], precision));
820   return r;
821 }
822
823 /* Poly version of wi::zext, with the same interface.  */
824
825 template<unsigned int N, typename Ca>
826 inline POLY_POLY_RESULT (N, Ca, Ca)
827 zext (const poly_int_pod<N, Ca> &a, unsigned int precision)
828 {
829   typedef POLY_POLY_COEFF (Ca, Ca) C;
830   poly_int<N, C> r;
831   for (unsigned int i = 0; i < N; i++)
832     POLY_SET_COEFF (C, r, i, wi::zext (a.coeffs[i], precision));
833   return r;
834 }
835 }
836
837 template<unsigned int N, typename Ca, typename Cb>
838 inline POLY_POLY_RESULT (N, Ca, Cb)
839 operator + (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
840 {
841   typedef POLY_CAST (Ca, Cb) NCa;
842   typedef POLY_POLY_COEFF (Ca, Cb) C;
843   poly_int<N, C> r;
844   for (unsigned int i = 0; i < N; i++)
845     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) + b.coeffs[i]);
846   return r;
847 }
848
849 template<unsigned int N, typename Ca, typename Cb>
850 inline POLY_CONST_RESULT (N, Ca, Cb)
851 operator + (const poly_int_pod<N, Ca> &a, const Cb &b)
852 {
853   typedef POLY_CAST (Ca, Cb) NCa;
854   typedef POLY_CONST_COEFF (Ca, Cb) C;
855   poly_int<N, C> r;
856   POLY_SET_COEFF (C, r, 0, NCa (a.coeffs[0]) + b);
857   if (N >= 2)
858     for (unsigned int i = 1; i < N; i++)
859       POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]));
860   return r;
861 }
862
863 template<unsigned int N, typename Ca, typename Cb>
864 inline CONST_POLY_RESULT (N, Ca, Cb)
865 operator + (const Ca &a, const poly_int_pod<N, Cb> &b)
866 {
867   typedef POLY_CAST (Cb, Ca) NCb;
868   typedef CONST_POLY_COEFF (Ca, Cb) C;
869   poly_int<N, C> r;
870   POLY_SET_COEFF (C, r, 0, a + NCb (b.coeffs[0]));
871   if (N >= 2)
872     for (unsigned int i = 1; i < N; i++)
873       POLY_SET_COEFF (C, r, i, NCb (b.coeffs[i]));
874   return r;
875 }
876
877 namespace wi {
878 /* Poly versions of wi::add, with the same interface.  */
879
880 template<unsigned int N, typename Ca, typename Cb>
881 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
882 add (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
883 {
884   typedef WI_BINARY_RESULT (Ca, Cb) C;
885   poly_int<N, C> r;
886   for (unsigned int i = 0; i < N; i++)
887     POLY_SET_COEFF (C, r, i, wi::add (a.coeffs[i], b.coeffs[i]));
888   return r;
889 }
890
891 template<unsigned int N, typename Ca, typename Cb>
892 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
893 add (const poly_int_pod<N, Ca> &a, const Cb &b)
894 {
895   typedef WI_BINARY_RESULT (Ca, Cb) C;
896   poly_int<N, C> r;
897   POLY_SET_COEFF (C, r, 0, wi::add (a.coeffs[0], b));
898   for (unsigned int i = 1; i < N; i++)
899     POLY_SET_COEFF (C, r, i, wi::add (a.coeffs[i],
900                                       wi::ints_for<Cb>::zero (b)));
901   return r;
902 }
903
904 template<unsigned int N, typename Ca, typename Cb>
905 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
906 add (const Ca &a, const poly_int_pod<N, Cb> &b)
907 {
908   typedef WI_BINARY_RESULT (Ca, Cb) C;
909   poly_int<N, C> r;
910   POLY_SET_COEFF (C, r, 0, wi::add (a, b.coeffs[0]));
911   for (unsigned int i = 1; i < N; i++)
912     POLY_SET_COEFF (C, r, i, wi::add (wi::ints_for<Ca>::zero (a),
913                                       b.coeffs[i]));
914   return r;
915 }
916
917 template<unsigned int N, typename Ca, typename Cb>
918 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
919 add (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b,
920      signop sgn, bool *overflow)
921 {
922   typedef WI_BINARY_RESULT (Ca, Cb) C;
923   poly_int<N, C> r;
924   POLY_SET_COEFF (C, r, 0, wi::add (a.coeffs[0], b.coeffs[0], sgn, overflow));
925   for (unsigned int i = 1; i < N; i++)
926     {
927       bool suboverflow;
928       POLY_SET_COEFF (C, r, i, wi::add (a.coeffs[i], b.coeffs[i], sgn,
929                                         &suboverflow));
930       *overflow |= suboverflow;
931     }
932   return r;
933 }
934 }
935
936 template<unsigned int N, typename Ca, typename Cb>
937 inline POLY_POLY_RESULT (N, Ca, Cb)
938 operator - (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
939 {
940   typedef POLY_CAST (Ca, Cb) NCa;
941   typedef POLY_POLY_COEFF (Ca, Cb) C;
942   poly_int<N, C> r;
943   for (unsigned int i = 0; i < N; i++)
944     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) - b.coeffs[i]);
945   return r;
946 }
947
948 template<unsigned int N, typename Ca, typename Cb>
949 inline POLY_CONST_RESULT (N, Ca, Cb)
950 operator - (const poly_int_pod<N, Ca> &a, const Cb &b)
951 {
952   typedef POLY_CAST (Ca, Cb) NCa;
953   typedef POLY_CONST_COEFF (Ca, Cb) C;
954   poly_int<N, C> r;
955   POLY_SET_COEFF (C, r, 0, NCa (a.coeffs[0]) - b);
956   if (N >= 2)
957     for (unsigned int i = 1; i < N; i++)
958       POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]));
959   return r;
960 }
961
962 template<unsigned int N, typename Ca, typename Cb>
963 inline CONST_POLY_RESULT (N, Ca, Cb)
964 operator - (const Ca &a, const poly_int_pod<N, Cb> &b)
965 {
966   typedef POLY_CAST (Cb, Ca) NCb;
967   typedef CONST_POLY_COEFF (Ca, Cb) C;
968   poly_int<N, C> r;
969   POLY_SET_COEFF (C, r, 0, a - NCb (b.coeffs[0]));
970   if (N >= 2)
971     for (unsigned int i = 1; i < N; i++)
972       POLY_SET_COEFF (C, r, i, -NCb (b.coeffs[i]));
973   return r;
974 }
975
976 namespace wi {
977 /* Poly versions of wi::sub, with the same interface.  */
978
979 template<unsigned int N, typename Ca, typename Cb>
980 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
981 sub (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
982 {
983   typedef WI_BINARY_RESULT (Ca, Cb) C;
984   poly_int<N, C> r;
985   for (unsigned int i = 0; i < N; i++)
986     POLY_SET_COEFF (C, r, i, wi::sub (a.coeffs[i], b.coeffs[i]));
987   return r;
988 }
989
990 template<unsigned int N, typename Ca, typename Cb>
991 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
992 sub (const poly_int_pod<N, Ca> &a, const Cb &b)
993 {
994   typedef WI_BINARY_RESULT (Ca, Cb) C;
995   poly_int<N, C> r;
996   POLY_SET_COEFF (C, r, 0, wi::sub (a.coeffs[0], b));
997   for (unsigned int i = 1; i < N; i++)
998     POLY_SET_COEFF (C, r, i, wi::sub (a.coeffs[i],
999                                       wi::ints_for<Cb>::zero (b)));
1000   return r;
1001 }
1002
1003 template<unsigned int N, typename Ca, typename Cb>
1004 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1005 sub (const Ca &a, const poly_int_pod<N, Cb> &b)
1006 {
1007   typedef WI_BINARY_RESULT (Ca, Cb) C;
1008   poly_int<N, C> r;
1009   POLY_SET_COEFF (C, r, 0, wi::sub (a, b.coeffs[0]));
1010   for (unsigned int i = 1; i < N; i++)
1011     POLY_SET_COEFF (C, r, i, wi::sub (wi::ints_for<Ca>::zero (a),
1012                                       b.coeffs[i]));
1013   return r;
1014 }
1015
1016 template<unsigned int N, typename Ca, typename Cb>
1017 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1018 sub (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b,
1019      signop sgn, bool *overflow)
1020 {
1021   typedef WI_BINARY_RESULT (Ca, Cb) C;
1022   poly_int<N, C> r;
1023   POLY_SET_COEFF (C, r, 0, wi::sub (a.coeffs[0], b.coeffs[0], sgn, overflow));
1024   for (unsigned int i = 1; i < N; i++)
1025     {
1026       bool suboverflow;
1027       POLY_SET_COEFF (C, r, i, wi::sub (a.coeffs[i], b.coeffs[i], sgn,
1028                                         &suboverflow));
1029       *overflow |= suboverflow;
1030     }
1031   return r;
1032 }
1033 }
1034
1035 template<unsigned int N, typename Ca>
1036 inline POLY_POLY_RESULT (N, Ca, Ca)
1037 operator - (const poly_int_pod<N, Ca> &a)
1038 {
1039   typedef POLY_CAST (Ca, Ca) NCa;
1040   typedef POLY_POLY_COEFF (Ca, Ca) C;
1041   poly_int<N, C> r;
1042   for (unsigned int i = 0; i < N; i++)
1043     POLY_SET_COEFF (C, r, i, -NCa (a.coeffs[i]));
1044   return r;
1045 }
1046
1047 namespace wi {
1048 /* Poly version of wi::neg, with the same interface.  */
1049
1050 template<unsigned int N, typename Ca>
1051 inline poly_int<N, WI_UNARY_RESULT (Ca)>
1052 neg (const poly_int_pod<N, Ca> &a)
1053 {
1054   typedef WI_UNARY_RESULT (Ca) C;
1055   poly_int<N, C> r;
1056   for (unsigned int i = 0; i < N; i++)
1057     POLY_SET_COEFF (C, r, i, wi::neg (a.coeffs[i]));
1058   return r;
1059 }
1060
1061 template<unsigned int N, typename Ca>
1062 inline poly_int<N, WI_UNARY_RESULT (Ca)>
1063 neg (const poly_int_pod<N, Ca> &a, bool *overflow)
1064 {
1065   typedef WI_UNARY_RESULT (Ca) C;
1066   poly_int<N, C> r;
1067   POLY_SET_COEFF (C, r, 0, wi::neg (a.coeffs[0], overflow));
1068   for (unsigned int i = 1; i < N; i++)
1069     {
1070       bool suboverflow;
1071       POLY_SET_COEFF (C, r, i, wi::neg (a.coeffs[i], &suboverflow));
1072       *overflow |= suboverflow;
1073     }
1074   return r;
1075 }
1076 }
1077
1078 template<unsigned int N, typename Ca>
1079 inline POLY_POLY_RESULT (N, Ca, Ca)
1080 operator ~ (const poly_int_pod<N, Ca> &a)
1081 {
1082   if (N >= 2)
1083     return -1 - a;
1084   return ~a.coeffs[0];
1085 }
1086
1087 template<unsigned int N, typename Ca, typename Cb>
1088 inline POLY_CONST_RESULT (N, Ca, Cb)
1089 operator * (const poly_int_pod<N, Ca> &a, const Cb &b)
1090 {
1091   typedef POLY_CAST (Ca, Cb) NCa;
1092   typedef POLY_CONST_COEFF (Ca, Cb) C;
1093   poly_int<N, C> r;
1094   for (unsigned int i = 0; i < N; i++)
1095     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) * b);
1096   return r;
1097 }
1098
1099 template<unsigned int N, typename Ca, typename Cb>
1100 inline CONST_POLY_RESULT (N, Ca, Cb)
1101 operator * (const Ca &a, const poly_int_pod<N, Cb> &b)
1102 {
1103   typedef POLY_CAST (Ca, Cb) NCa;
1104   typedef CONST_POLY_COEFF (Ca, Cb) C;
1105   poly_int<N, C> r;
1106   for (unsigned int i = 0; i < N; i++)
1107     POLY_SET_COEFF (C, r, i, NCa (a) * b.coeffs[i]);
1108   return r;
1109 }
1110
1111 namespace wi {
1112 /* Poly versions of wi::mul, with the same interface.  */
1113
1114 template<unsigned int N, typename Ca, typename Cb>
1115 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1116 mul (const poly_int_pod<N, Ca> &a, const Cb &b)
1117 {
1118   typedef WI_BINARY_RESULT (Ca, Cb) C;
1119   poly_int<N, C> r;
1120   for (unsigned int i = 0; i < N; i++)
1121     POLY_SET_COEFF (C, r, i, wi::mul (a.coeffs[i], b));
1122   return r;
1123 }
1124
1125 template<unsigned int N, typename Ca, typename Cb>
1126 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1127 mul (const Ca &a, const poly_int_pod<N, Cb> &b)
1128 {
1129   typedef WI_BINARY_RESULT (Ca, Cb) C;
1130   poly_int<N, C> r;
1131   for (unsigned int i = 0; i < N; i++)
1132     POLY_SET_COEFF (C, r, i, wi::mul (a, b.coeffs[i]));
1133   return r;
1134 }
1135
1136 template<unsigned int N, typename Ca, typename Cb>
1137 inline poly_int<N, WI_BINARY_RESULT (Ca, Cb)>
1138 mul (const poly_int_pod<N, Ca> &a, const Cb &b,
1139      signop sgn, bool *overflow)
1140 {
1141   typedef WI_BINARY_RESULT (Ca, Cb) C;
1142   poly_int<N, C> r;
1143   POLY_SET_COEFF (C, r, 0, wi::mul (a.coeffs[0], b, sgn, overflow));
1144   for (unsigned int i = 1; i < N; i++)
1145     {
1146       bool suboverflow;
1147       POLY_SET_COEFF (C, r, i, wi::mul (a.coeffs[i], b, sgn, &suboverflow));
1148       *overflow |= suboverflow;
1149     }
1150   return r;
1151 }
1152 }
1153
1154 template<unsigned int N, typename Ca, typename Cb>
1155 inline POLY_POLY_RESULT (N, Ca, Ca)
1156 operator << (const poly_int_pod<N, Ca> &a, const Cb &b)
1157 {
1158   typedef POLY_CAST (Ca, Ca) NCa;
1159   typedef POLY_POLY_COEFF (Ca, Ca) C;
1160   poly_int<N, C> r;
1161   for (unsigned int i = 0; i < N; i++)
1162     POLY_SET_COEFF (C, r, i, NCa (a.coeffs[i]) << b);
1163   return r;
1164 }
1165
1166 namespace wi {
1167 /* Poly version of wi::lshift, with the same interface.  */
1168
1169 template<unsigned int N, typename Ca, typename Cb>
1170 inline poly_int<N, WI_BINARY_RESULT (Ca, Ca)>
1171 lshift (const poly_int_pod<N, Ca> &a, const Cb &b)
1172 {
1173   typedef WI_BINARY_RESULT (Ca, Ca) C;
1174   poly_int<N, C> r;
1175   for (unsigned int i = 0; i < N; i++)
1176     POLY_SET_COEFF (C, r, i, wi::lshift (a.coeffs[i], b));
1177   return r;
1178 }
1179 }
1180
1181 /* Return true if a0 + a1 * x might equal b0 + b1 * x for some nonnegative
1182    integer x.  */
1183
1184 template<typename Ca, typename Cb>
1185 inline bool
1186 maybe_eq_2 (const Ca &a0, const Ca &a1, const Cb &b0, const Cb &b1)
1187 {
1188   if (a1 != b1)
1189      /*      a0 + a1 * x == b0 + b1 * x
1190        ==> (a1 - b1) * x == b0 - a0
1191        ==>             x == (b0 - a0) / (a1 - b1)
1192
1193        We need to test whether that's a valid value of x.
1194        (b0 - a0) and (a1 - b1) must not have opposite signs
1195        and the result must be integral.  */
1196     return (a1 < b1
1197             ? b0 <= a0 && (a0 - b0) % (b1 - a1) == 0
1198             : b0 >= a0 && (b0 - a0) % (a1 - b1) == 0);
1199   return a0 == b0;
1200 }
1201
1202 /* Return true if a0 + a1 * x might equal b for some nonnegative
1203    integer x.  */
1204
1205 template<typename Ca, typename Cb>
1206 inline bool
1207 maybe_eq_2 (const Ca &a0, const Ca &a1, const Cb &b)
1208 {
1209   if (a1 != 0)
1210      /*      a0 + a1 * x == b
1211        ==>             x == (b - a0) / a1
1212
1213        We need to test whether that's a valid value of x.
1214        (b - a0) and a1 must not have opposite signs and the
1215        result must be integral.  */
1216     return (a1 < 0
1217             ? b <= a0 && (a0 - b) % a1 == 0
1218             : b >= a0 && (b - a0) % a1 == 0);
1219   return a0 == b;
1220 }
1221
1222 /* Return true if A might equal B for some indeterminate values.  */
1223
1224 template<unsigned int N, typename Ca, typename Cb>
1225 inline bool
1226 maybe_eq (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1227 {
1228   STATIC_ASSERT (N <= 2);
1229   if (N == 2)
1230     return maybe_eq_2 (a.coeffs[0], a.coeffs[1], b.coeffs[0], b.coeffs[1]);
1231   return a.coeffs[0] == b.coeffs[0];
1232 }
1233
1234 template<unsigned int N, typename Ca, typename Cb>
1235 inline typename if_nonpoly<Cb, bool>::type
1236 maybe_eq (const poly_int_pod<N, Ca> &a, const Cb &b)
1237 {
1238   STATIC_ASSERT (N <= 2);
1239   if (N == 2)
1240     return maybe_eq_2 (a.coeffs[0], a.coeffs[1], b);
1241   return a.coeffs[0] == b;
1242 }
1243
1244 template<unsigned int N, typename Ca, typename Cb>
1245 inline typename if_nonpoly<Ca, bool>::type
1246 maybe_eq (const Ca &a, const poly_int_pod<N, Cb> &b)
1247 {
1248   STATIC_ASSERT (N <= 2);
1249   if (N == 2)
1250     return maybe_eq_2 (b.coeffs[0], b.coeffs[1], a);
1251   return a == b.coeffs[0];
1252 }
1253
1254 template<typename Ca, typename Cb>
1255 inline typename if_nonpoly2<Ca, Cb, bool>::type
1256 maybe_eq (const Ca &a, const Cb &b)
1257 {
1258   return a == b;
1259 }
1260
1261 /* Return true if A might not equal B for some indeterminate values.  */
1262
1263 template<unsigned int N, typename Ca, typename Cb>
1264 inline bool
1265 maybe_ne (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1266 {
1267   if (N >= 2)
1268     for (unsigned int i = 1; i < N; i++)
1269       if (a.coeffs[i] != b.coeffs[i])
1270         return true;
1271   return a.coeffs[0] != b.coeffs[0];
1272 }
1273
1274 template<unsigned int N, typename Ca, typename Cb>
1275 inline typename if_nonpoly<Cb, bool>::type
1276 maybe_ne (const poly_int_pod<N, Ca> &a, const Cb &b)
1277 {
1278   if (N >= 2)
1279     for (unsigned int i = 1; i < N; i++)
1280       if (a.coeffs[i] != 0)
1281         return true;
1282   return a.coeffs[0] != b;
1283 }
1284
1285 template<unsigned int N, typename Ca, typename Cb>
1286 inline typename if_nonpoly<Ca, bool>::type
1287 maybe_ne (const Ca &a, const poly_int_pod<N, Cb> &b)
1288 {
1289   if (N >= 2)
1290     for (unsigned int i = 1; i < N; i++)
1291       if (b.coeffs[i] != 0)
1292         return true;
1293   return a != b.coeffs[0];
1294 }
1295
1296 template<typename Ca, typename Cb>
1297 inline typename if_nonpoly2<Ca, Cb, bool>::type
1298 maybe_ne (const Ca &a, const Cb &b)
1299 {
1300   return a != b;
1301 }
1302
1303 /* Return true if A is known to be equal to B.  */
1304 #define known_eq(A, B) (!maybe_ne (A, B))
1305
1306 /* Return true if A is known to be unequal to B.  */
1307 #define known_ne(A, B) (!maybe_eq (A, B))
1308
1309 /* Return true if A might be less than or equal to B for some
1310    indeterminate values.  */
1311
1312 template<unsigned int N, typename Ca, typename Cb>
1313 inline bool
1314 maybe_le (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1315 {
1316   if (N >= 2)
1317     for (unsigned int i = 1; i < N; i++)
1318       if (a.coeffs[i] < b.coeffs[i])
1319         return true;
1320   return a.coeffs[0] <= b.coeffs[0];
1321 }
1322
1323 template<unsigned int N, typename Ca, typename Cb>
1324 inline typename if_nonpoly<Cb, bool>::type
1325 maybe_le (const poly_int_pod<N, Ca> &a, const Cb &b)
1326 {
1327   if (N >= 2)
1328     for (unsigned int i = 1; i < N; i++)
1329       if (a.coeffs[i] < 0)
1330         return true;
1331   return a.coeffs[0] <= b;
1332 }
1333
1334 template<unsigned int N, typename Ca, typename Cb>
1335 inline typename if_nonpoly<Ca, bool>::type
1336 maybe_le (const Ca &a, const poly_int_pod<N, Cb> &b)
1337 {
1338   if (N >= 2)
1339     for (unsigned int i = 1; i < N; i++)
1340       if (b.coeffs[i] > 0)
1341         return true;
1342   return a <= b.coeffs[0];
1343 }
1344
1345 template<typename Ca, typename Cb>
1346 inline typename if_nonpoly2<Ca, Cb, bool>::type
1347 maybe_le (const Ca &a, const Cb &b)
1348 {
1349   return a <= b;
1350 }
1351
1352 /* Return true if A might be less than B for some indeterminate values.  */
1353
1354 template<unsigned int N, typename Ca, typename Cb>
1355 inline bool
1356 maybe_lt (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1357 {
1358   if (N >= 2)
1359     for (unsigned int i = 1; i < N; i++)
1360       if (a.coeffs[i] < b.coeffs[i])
1361         return true;
1362   return a.coeffs[0] < b.coeffs[0];
1363 }
1364
1365 template<unsigned int N, typename Ca, typename Cb>
1366 inline typename if_nonpoly<Cb, bool>::type
1367 maybe_lt (const poly_int_pod<N, Ca> &a, const Cb &b)
1368 {
1369   if (N >= 2)
1370     for (unsigned int i = 1; i < N; i++)
1371       if (a.coeffs[i] < 0)
1372         return true;
1373   return a.coeffs[0] < b;
1374 }
1375
1376 template<unsigned int N, typename Ca, typename Cb>
1377 inline typename if_nonpoly<Ca, bool>::type
1378 maybe_lt (const Ca &a, const poly_int_pod<N, Cb> &b)
1379 {
1380   if (N >= 2)
1381     for (unsigned int i = 1; i < N; i++)
1382       if (b.coeffs[i] > 0)
1383         return true;
1384   return a < b.coeffs[0];
1385 }
1386
1387 template<typename Ca, typename Cb>
1388 inline typename if_nonpoly2<Ca, Cb, bool>::type
1389 maybe_lt (const Ca &a, const Cb &b)
1390 {
1391   return a < b;
1392 }
1393
1394 /* Return true if A may be greater than or equal to B.  */
1395 #define maybe_ge(A, B) maybe_le (B, A)
1396
1397 /* Return true if A may be greater than B.  */
1398 #define maybe_gt(A, B) maybe_lt (B, A)
1399
1400 /* Return true if A is known to be less than or equal to B.  */
1401 #define known_le(A, B) (!maybe_gt (A, B))
1402
1403 /* Return true if A is known to be less than B.  */
1404 #define known_lt(A, B) (!maybe_ge (A, B))
1405
1406 /* Return true if A is known to be greater than B.  */
1407 #define known_gt(A, B) (!maybe_le (A, B))
1408
1409 /* Return true if A is known to be greater than or equal to B.  */
1410 #define known_ge(A, B) (!maybe_lt (A, B))
1411
1412 /* Return true if A and B are ordered by the partial ordering known_le.  */
1413
1414 template<typename T1, typename T2>
1415 inline bool
1416 ordered_p (const T1 &a, const T2 &b)
1417 {
1418   return ((poly_int_traits<T1>::num_coeffs == 1
1419            && poly_int_traits<T2>::num_coeffs == 1)
1420           || known_le (a, b)
1421           || known_le (b, a));
1422 }
1423
1424 /* Assert that A and B are known to be ordered and return the minimum
1425    of the two.
1426
1427    NOTE: When using this function, please add a comment above the call
1428    explaining why we know the values are ordered in that context.  */
1429
1430 template<unsigned int N, typename Ca, typename Cb>
1431 inline POLY_POLY_RESULT (N, Ca, Cb)
1432 ordered_min (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1433 {
1434   if (known_le (a, b))
1435     return a;
1436   else
1437     {
1438       if (N > 1)
1439         gcc_checking_assert (known_le (b, a));
1440       return b;
1441     }
1442 }
1443
1444 template<unsigned int N, typename Ca, typename Cb>
1445 inline CONST_POLY_RESULT (N, Ca, Cb)
1446 ordered_min (const Ca &a, const poly_int_pod<N, Cb> &b)
1447 {
1448   if (known_le (a, b))
1449     return a;
1450   else
1451     {
1452       if (N > 1)
1453         gcc_checking_assert (known_le (b, a));
1454       return b;
1455     }
1456 }
1457
1458 template<unsigned int N, typename Ca, typename Cb>
1459 inline POLY_CONST_RESULT (N, Ca, Cb)
1460 ordered_min (const poly_int_pod<N, Ca> &a, const Cb &b)
1461 {
1462   if (known_le (a, b))
1463     return a;
1464   else
1465     {
1466       if (N > 1)
1467         gcc_checking_assert (known_le (b, a));
1468       return b;
1469     }
1470 }
1471
1472 /* Assert that A and B are known to be ordered and return the maximum
1473    of the two.
1474
1475    NOTE: When using this function, please add a comment above the call
1476    explaining why we know the values are ordered in that context.  */
1477
1478 template<unsigned int N, typename Ca, typename Cb>
1479 inline POLY_POLY_RESULT (N, Ca, Cb)
1480 ordered_max (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1481 {
1482   if (known_le (a, b))
1483     return b;
1484   else
1485     {
1486       if (N > 1)
1487         gcc_checking_assert (known_le (b, a));
1488       return a;
1489     }
1490 }
1491
1492 template<unsigned int N, typename Ca, typename Cb>
1493 inline CONST_POLY_RESULT (N, Ca, Cb)
1494 ordered_max (const Ca &a, const poly_int_pod<N, Cb> &b)
1495 {
1496   if (known_le (a, b))
1497     return b;
1498   else
1499     {
1500       if (N > 1)
1501         gcc_checking_assert (known_le (b, a));
1502       return a;
1503     }
1504 }
1505
1506 template<unsigned int N, typename Ca, typename Cb>
1507 inline POLY_CONST_RESULT (N, Ca, Cb)
1508 ordered_max (const poly_int_pod<N, Ca> &a, const Cb &b)
1509 {
1510   if (known_le (a, b))
1511     return b;
1512   else
1513     {
1514       if (N > 1)
1515         gcc_checking_assert (known_le (b, a));
1516       return a;
1517     }
1518 }
1519
1520 /* Return a constant lower bound on the value of A, which is known
1521    to be nonnegative.  */
1522
1523 template<unsigned int N, typename Ca>
1524 inline Ca
1525 constant_lower_bound (const poly_int_pod<N, Ca> &a)
1526 {
1527   gcc_checking_assert (known_ge (a, POLY_INT_TYPE (Ca) (0)));
1528   return a.coeffs[0];
1529 }
1530
1531 /* Return a value that is known to be no greater than A and B.  This
1532    will be the greatest lower bound for some indeterminate values but
1533    not necessarily for all.  */
1534
1535 template<unsigned int N, typename Ca, typename Cb>
1536 inline POLY_CONST_RESULT (N, Ca, Cb)
1537 lower_bound (const poly_int_pod<N, Ca> &a, const Cb &b)
1538 {
1539   typedef POLY_CAST (Ca, Cb) NCa;
1540   typedef POLY_CAST (Cb, Ca) NCb;
1541   typedef POLY_INT_TYPE (Cb) ICb;
1542   typedef POLY_CONST_COEFF (Ca, Cb) C;
1543
1544   poly_int<N, C> r;
1545   POLY_SET_COEFF (C, r, 0, MIN (NCa (a.coeffs[0]), NCb (b)));
1546   if (N >= 2)
1547     for (unsigned int i = 1; i < N; i++)
1548       POLY_SET_COEFF (C, r, i, MIN (NCa (a.coeffs[i]), ICb (0)));
1549   return r;
1550 }
1551
1552 template<unsigned int N, typename Ca, typename Cb>
1553 inline CONST_POLY_RESULT (N, Ca, Cb)
1554 lower_bound (const Ca &a, const poly_int_pod<N, Cb> &b)
1555 {
1556   return lower_bound (b, a);
1557 }
1558
1559 template<unsigned int N, typename Ca, typename Cb>
1560 inline POLY_POLY_RESULT (N, Ca, Cb)
1561 lower_bound (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1562 {
1563   typedef POLY_CAST (Ca, Cb) NCa;
1564   typedef POLY_CAST (Cb, Ca) NCb;
1565   typedef POLY_POLY_COEFF (Ca, Cb) C;
1566
1567   poly_int<N, C> r;
1568   for (unsigned int i = 0; i < N; i++)
1569     POLY_SET_COEFF (C, r, i, MIN (NCa (a.coeffs[i]), NCb (b.coeffs[i])));
1570   return r;
1571 }
1572
1573 template<typename Ca, typename Cb>
1574 inline CONST_CONST_RESULT (N, Ca, Cb)
1575 lower_bound (const Ca &a, const Cb &b)
1576 {
1577   return a < b ? a : b;
1578 }
1579
1580 /* Return a value that is known to be no less than A and B.  This will
1581    be the least upper bound for some indeterminate values but not
1582    necessarily for all.  */
1583
1584 template<unsigned int N, typename Ca, typename Cb>
1585 inline POLY_CONST_RESULT (N, Ca, Cb)
1586 upper_bound (const poly_int_pod<N, Ca> &a, const Cb &b)
1587 {
1588   typedef POLY_CAST (Ca, Cb) NCa;
1589   typedef POLY_CAST (Cb, Ca) NCb;
1590   typedef POLY_INT_TYPE (Cb) ICb;
1591   typedef POLY_CONST_COEFF (Ca, Cb) C;
1592
1593   poly_int<N, C> r;
1594   POLY_SET_COEFF (C, r, 0, MAX (NCa (a.coeffs[0]), NCb (b)));
1595   if (N >= 2)
1596     for (unsigned int i = 1; i < N; i++)
1597       POLY_SET_COEFF (C, r, i, MAX (NCa (a.coeffs[i]), ICb (0)));
1598   return r;
1599 }
1600
1601 template<unsigned int N, typename Ca, typename Cb>
1602 inline CONST_POLY_RESULT (N, Ca, Cb)
1603 upper_bound (const Ca &a, const poly_int_pod<N, Cb> &b)
1604 {
1605   return upper_bound (b, a);
1606 }
1607
1608 template<unsigned int N, typename Ca, typename Cb>
1609 inline POLY_POLY_RESULT (N, Ca, Cb)
1610 upper_bound (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
1611 {
1612   typedef POLY_CAST (Ca, Cb) NCa;
1613   typedef POLY_CAST (Cb, Ca) NCb;
1614   typedef POLY_POLY_COEFF (Ca, Cb) C;
1615
1616   poly_int<N, C> r;
1617   for (unsigned int i = 0; i < N; i++)
1618     POLY_SET_COEFF (C, r, i, MAX (NCa (a.coeffs[i]), NCb (b.coeffs[i])));
1619   return r;
1620 }
1621
1622 /* Return the greatest common divisor of all nonzero coefficients, or zero
1623    if all coefficients are zero.  */
1624
1625 template<unsigned int N, typename Ca>
1626 inline POLY_BINARY_COEFF (Ca, Ca)
1627 coeff_gcd (const poly_int_pod<N, Ca> &a)
1628 {
1629   /* Find the first nonzero coefficient, stopping at 0 whatever happens.  */
1630   unsigned int i;
1631   for (i = N - 1; i > 0; --i)
1632     if (a.coeffs[i] != 0)
1633       break;
1634   typedef POLY_BINARY_COEFF (Ca, Ca) C;
1635   C r = a.coeffs[i];
1636   for (unsigned int j = 0; j < i; ++j)
1637     if (a.coeffs[j] != 0)
1638       r = gcd (r, C (a.coeffs[j]));
1639   return r;
1640 }
1641
1642 /* Return a value that is a multiple of both A and B.  This will be the
1643    least common multiple for some indeterminate values but necessarily
1644    for all.  */
1645
1646 template<unsigned int N, typename Ca, typename Cb>
1647 POLY_CONST_RESULT (N, Ca, Cb)
1648 common_multiple (const poly_int_pod<N, Ca> &a, Cb b)
1649 {
1650   POLY_BINARY_COEFF (Ca, Ca) xgcd = coeff_gcd (a);
1651   return a * (least_common_multiple (xgcd, b) / xgcd);
1652 }
1653
1654 template<unsigned int N, typename Ca, typename Cb>
1655 inline CONST_POLY_RESULT (N, Ca, Cb)
1656 common_multiple (const Ca &a, const poly_int_pod<N, Cb> &b)
1657 {
1658   return common_multiple (b, a);
1659 }
1660
1661 /* Return a value that is a multiple of both A and B, asserting that
1662    such a value exists.  The result will be the least common multiple
1663    for some indeterminate values but necessarily for all.
1664
1665    NOTE: When using this function, please add a comment above the call
1666    explaining why we know the values have a common multiple (which might
1667    for example be because we know A / B is rational).  */
1668
1669 template<unsigned int N, typename Ca, typename Cb>
1670 POLY_POLY_RESULT (N, Ca, Cb)
1671 force_common_multiple (const poly_int_pod<N, Ca> &a,
1672                        const poly_int_pod<N, Cb> &b)
1673 {
1674   if (b.is_constant ())
1675     return common_multiple (a, b.coeffs[0]);
1676   if (a.is_constant ())
1677     return common_multiple (a.coeffs[0], b);
1678
1679   typedef POLY_CAST (Ca, Cb) NCa;
1680   typedef POLY_CAST (Cb, Ca) NCb;
1681   typedef POLY_BINARY_COEFF (Ca, Cb) C;
1682   typedef POLY_INT_TYPE (Ca) ICa;
1683
1684   for (unsigned int i = 1; i < N; ++i)
1685     if (a.coeffs[i] != ICa (0))
1686       {
1687         C lcm = least_common_multiple (NCa (a.coeffs[i]), NCb (b.coeffs[i]));
1688         C amul = lcm / a.coeffs[i];
1689         C bmul = lcm / b.coeffs[i];
1690         for (unsigned int j = 0; j < N; ++j)
1691           gcc_checking_assert (a.coeffs[j] * amul == b.coeffs[j] * bmul);
1692         return a * amul;
1693       }
1694   gcc_unreachable ();
1695 }
1696
1697 /* Compare A and B for sorting purposes, returning -1 if A should come
1698    before B, 0 if A and B are identical, and 1 if A should come after B.
1699    This is a lexicographical compare of the coefficients in reverse order.
1700
1701    A consequence of this is that all constant sizes come before all
1702    non-constant ones, regardless of magnitude (since a size is never
1703    negative).  This is what most callers want.  For example, when laying
1704    data out on the stack, it's better to keep all the constant-sized
1705    data together so that it can be accessed as a constant offset from a
1706    single base.  */
1707
1708 template<unsigned int N, typename Ca, typename Cb>
1709 inline int
1710 compare_sizes_for_sort (const poly_int_pod<N, Ca> &a,
1711                         const poly_int_pod<N, Cb> &b)
1712 {
1713   for (unsigned int i = N; i-- > 0; )
1714     if (a.coeffs[i] != b.coeffs[i])
1715       return a.coeffs[i] < b.coeffs[i] ? -1 : 1;
1716   return 0;
1717 }
1718
1719 /* Return true if we can calculate VALUE & (ALIGN - 1) at compile time.  */
1720
1721 template<unsigned int N, typename Ca, typename Cb>
1722 inline bool
1723 can_align_p (const poly_int_pod<N, Ca> &value, Cb align)
1724 {
1725   for (unsigned int i = 1; i < N; i++)
1726     if ((value.coeffs[i] & (align - 1)) != 0)
1727       return false;
1728   return true;
1729 }
1730
1731 /* Return true if we can align VALUE up to the smallest multiple of
1732    ALIGN that is >= VALUE.  Store the aligned value in *ALIGNED if so.  */
1733
1734 template<unsigned int N, typename Ca, typename Cb>
1735 inline bool
1736 can_align_up (const poly_int_pod<N, Ca> &value, Cb align,
1737               poly_int_pod<N, Ca> *aligned)
1738 {
1739   if (!can_align_p (value, align))
1740     return false;
1741   *aligned = value + (-value.coeffs[0] & (align - 1));
1742   return true;
1743 }
1744
1745 /* Return true if we can align VALUE down to the largest multiple of
1746    ALIGN that is <= VALUE.  Store the aligned value in *ALIGNED if so.  */
1747
1748 template<unsigned int N, typename Ca, typename Cb>
1749 inline bool
1750 can_align_down (const poly_int_pod<N, Ca> &value, Cb align,
1751                 poly_int_pod<N, Ca> *aligned)
1752 {
1753   if (!can_align_p (value, align))
1754     return false;
1755   *aligned = value - (value.coeffs[0] & (align - 1));
1756   return true;
1757 }
1758
1759 /* Return true if we can align A and B up to the smallest multiples of
1760    ALIGN that are >= A and B respectively, and if doing so gives the
1761    same value.  */
1762
1763 template<unsigned int N, typename Ca, typename Cb, typename Cc>
1764 inline bool
1765 known_equal_after_align_up (const poly_int_pod<N, Ca> &a,
1766                             const poly_int_pod<N, Cb> &b,
1767                             Cc align)
1768 {
1769   poly_int<N, Ca> aligned_a;
1770   poly_int<N, Cb> aligned_b;
1771   return (can_align_up (a, align, &aligned_a)
1772           && can_align_up (b, align, &aligned_b)
1773           && known_eq (aligned_a, aligned_b));
1774 }
1775
1776 /* Return true if we can align A and B down to the largest multiples of
1777    ALIGN that are <= A and B respectively, and if doing so gives the
1778    same value.  */
1779
1780 template<unsigned int N, typename Ca, typename Cb, typename Cc>
1781 inline bool
1782 known_equal_after_align_down (const poly_int_pod<N, Ca> &a,
1783                               const poly_int_pod<N, Cb> &b,
1784                               Cc align)
1785 {
1786   poly_int<N, Ca> aligned_a;
1787   poly_int<N, Cb> aligned_b;
1788   return (can_align_down (a, align, &aligned_a)
1789           && can_align_down (b, align, &aligned_b)
1790           && known_eq (aligned_a, aligned_b));
1791 }
1792
1793 /* Assert that we can align VALUE to ALIGN at compile time and return
1794    the smallest multiple of ALIGN that is >= VALUE.
1795
1796    NOTE: When using this function, please add a comment above the call
1797    explaining why we know the non-constant coefficients must already
1798    be a multiple of ALIGN.  */
1799
1800 template<unsigned int N, typename Ca, typename Cb>
1801 inline poly_int<N, Ca>
1802 force_align_up (const poly_int_pod<N, Ca> &value, Cb align)
1803 {
1804   gcc_checking_assert (can_align_p (value, align));
1805   return value + (-value.coeffs[0] & (align - 1));
1806 }
1807
1808 /* Assert that we can align VALUE to ALIGN at compile time and return
1809    the largest multiple of ALIGN that is <= VALUE.
1810
1811    NOTE: When using this function, please add a comment above the call
1812    explaining why we know the non-constant coefficients must already
1813    be a multiple of ALIGN.  */
1814
1815 template<unsigned int N, typename Ca, typename Cb>
1816 inline poly_int<N, Ca>
1817 force_align_down (const poly_int_pod<N, Ca> &value, Cb align)
1818 {
1819   gcc_checking_assert (can_align_p (value, align));
1820   return value - (value.coeffs[0] & (align - 1));
1821 }
1822
1823 /* Return a value <= VALUE that is a multiple of ALIGN.  It will be the
1824    greatest such value for some indeterminate values but not necessarily
1825    for all.  */
1826
1827 template<unsigned int N, typename Ca, typename Cb>
1828 inline poly_int<N, Ca>
1829 aligned_lower_bound (const poly_int_pod<N, Ca> &value, Cb align)
1830 {
1831   poly_int<N, Ca> r;
1832   for (unsigned int i = 0; i < N; i++)
1833     /* This form copes correctly with more type combinations than
1834        value.coeffs[i] & -align would.  */
1835     POLY_SET_COEFF (Ca, r, i, (value.coeffs[i]
1836                                - (value.coeffs[i] & (align - 1))));
1837   return r;
1838 }
1839
1840 /* Return a value >= VALUE that is a multiple of ALIGN.  It will be the
1841    least such value for some indeterminate values but not necessarily
1842    for all.  */
1843
1844 template<unsigned int N, typename Ca, typename Cb>
1845 inline poly_int<N, Ca>
1846 aligned_upper_bound (const poly_int_pod<N, Ca> &value, Cb align)
1847 {
1848   poly_int<N, Ca> r;
1849   for (unsigned int i = 0; i < N; i++)
1850     POLY_SET_COEFF (Ca, r, i, (value.coeffs[i]
1851                                + (-value.coeffs[i] & (align - 1))));
1852   return r;
1853 }
1854
1855 /* Assert that we can align VALUE to ALIGN at compile time.  Align VALUE
1856    down to the largest multiple of ALIGN that is <= VALUE, then divide by
1857    ALIGN.
1858
1859    NOTE: When using this function, please add a comment above the call
1860    explaining why we know the non-constant coefficients must already
1861    be a multiple of ALIGN.  */
1862
1863 template<unsigned int N, typename Ca, typename Cb>
1864 inline poly_int<N, Ca>
1865 force_align_down_and_div (const poly_int_pod<N, Ca> &value, Cb align)
1866 {
1867   gcc_checking_assert (can_align_p (value, align));
1868
1869   poly_int<N, Ca> r;
1870   POLY_SET_COEFF (Ca, r, 0, ((value.coeffs[0]
1871                               - (value.coeffs[0] & (align - 1)))
1872                              / align));
1873   if (N >= 2)
1874     for (unsigned int i = 1; i < N; i++)
1875       POLY_SET_COEFF (Ca, r, i, value.coeffs[i] / align);
1876   return r;
1877 }
1878
1879 /* Assert that we can align VALUE to ALIGN at compile time.  Align VALUE
1880    up to the smallest multiple of ALIGN that is >= VALUE, then divide by
1881    ALIGN.
1882
1883    NOTE: When using this function, please add a comment above the call
1884    explaining why we know the non-constant coefficients must already
1885    be a multiple of ALIGN.  */
1886
1887 template<unsigned int N, typename Ca, typename Cb>
1888 inline poly_int<N, Ca>
1889 force_align_up_and_div (const poly_int_pod<N, Ca> &value, Cb align)
1890 {
1891   gcc_checking_assert (can_align_p (value, align));
1892
1893   poly_int<N, Ca> r;
1894   POLY_SET_COEFF (Ca, r, 0, ((value.coeffs[0]
1895                               + (-value.coeffs[0] & (align - 1)))
1896                              / align));
1897   if (N >= 2)
1898     for (unsigned int i = 1; i < N; i++)
1899       POLY_SET_COEFF (Ca, r, i, value.coeffs[i] / align);
1900   return r;
1901 }
1902
1903 /* Return true if we know at compile time the difference between VALUE
1904    and the equal or preceding multiple of ALIGN.  Store the value in
1905    *MISALIGN if so.  */
1906
1907 template<unsigned int N, typename Ca, typename Cb, typename Cm>
1908 inline bool
1909 known_misalignment (const poly_int_pod<N, Ca> &value, Cb align, Cm *misalign)
1910 {
1911   gcc_checking_assert (align != 0);
1912   if (!can_align_p (value, align))
1913     return false;
1914   *misalign = value.coeffs[0] & (align - 1);
1915   return true;
1916 }
1917
1918 /* Return X & (Y - 1), asserting that this value is known.  Please add
1919    an a comment above callers to this function to explain why the condition
1920    is known to hold.  */
1921
1922 template<unsigned int N, typename Ca, typename Cb>
1923 inline POLY_BINARY_COEFF (Ca, Ca)
1924 force_get_misalignment (const poly_int_pod<N, Ca> &a, Cb align)
1925 {
1926   gcc_checking_assert (can_align_p (a, align));
1927   return a.coeffs[0] & (align - 1);
1928 }
1929
1930 /* Return the maximum alignment that A is known to have.  Return 0
1931    if A is known to be zero.  */
1932
1933 template<unsigned int N, typename Ca>
1934 inline POLY_BINARY_COEFF (Ca, Ca)
1935 known_alignment (const poly_int_pod<N, Ca> &a)
1936 {
1937   typedef POLY_BINARY_COEFF (Ca, Ca) C;
1938   C r = a.coeffs[0];
1939   for (unsigned int i = 1; i < N; ++i)
1940     r |= a.coeffs[i];
1941   return r & -r;
1942 }
1943
1944 /* Return true if we can compute A | B at compile time, storing the
1945    result in RES if so.  */
1946
1947 template<unsigned int N, typename Ca, typename Cb, typename Cr>
1948 inline typename if_nonpoly<Cb, bool>::type
1949 can_ior_p (const poly_int_pod<N, Ca> &a, Cb b, Cr *result)
1950 {
1951   /* Coefficients 1 and above must be a multiple of something greater
1952      than B.  */
1953   typedef POLY_INT_TYPE (Ca) int_type;
1954   if (N >= 2)
1955     for (unsigned int i = 1; i < N; i++)
1956       if ((-(a.coeffs[i] & -a.coeffs[i]) & b) != int_type (0))
1957         return false;
1958   *result = a;
1959   result->coeffs[0] |= b;
1960   return true;
1961 }
1962
1963 /* Return true if A is a constant multiple of B, storing the
1964    multiple in *MULTIPLE if so.  */
1965
1966 template<unsigned int N, typename Ca, typename Cb, typename Cm>
1967 inline typename if_nonpoly<Cb, bool>::type
1968 constant_multiple_p (const poly_int_pod<N, Ca> &a, Cb b, Cm *multiple)
1969 {
1970   typedef POLY_CAST (Ca, Cb) NCa;
1971   typedef POLY_CAST (Cb, Ca) NCb;
1972
1973   /* Do the modulus before the constant check, to catch divide by
1974      zero errors.  */
1975   if (NCa (a.coeffs[0]) % NCb (b) != 0 || !a.is_constant ())
1976     return false;
1977   *multiple = NCa (a.coeffs[0]) / NCb (b);
1978   return true;
1979 }
1980
1981 template<unsigned int N, typename Ca, typename Cb, typename Cm>
1982 inline typename if_nonpoly<Ca, bool>::type
1983 constant_multiple_p (Ca a, const poly_int_pod<N, Cb> &b, Cm *multiple)
1984 {
1985   typedef POLY_CAST (Ca, Cb) NCa;
1986   typedef POLY_CAST (Cb, Ca) NCb;
1987   typedef POLY_INT_TYPE (Ca) int_type;
1988
1989   /* Do the modulus before the constant check, to catch divide by
1990      zero errors.  */
1991   if (NCa (a) % NCb (b.coeffs[0]) != 0
1992       || (a != int_type (0) && !b.is_constant ()))
1993     return false;
1994   *multiple = NCa (a) / NCb (b.coeffs[0]);
1995   return true;
1996 }
1997
1998 template<unsigned int N, typename Ca, typename Cb, typename Cm>
1999 inline bool
2000 constant_multiple_p (const poly_int_pod<N, Ca> &a,
2001                      const poly_int_pod<N, Cb> &b, Cm *multiple)
2002 {
2003   typedef POLY_CAST (Ca, Cb) NCa;
2004   typedef POLY_CAST (Cb, Ca) NCb;
2005   typedef POLY_INT_TYPE (Ca) ICa;
2006   typedef POLY_INT_TYPE (Cb) ICb;
2007   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2008
2009   if (NCa (a.coeffs[0]) % NCb (b.coeffs[0]) != 0)
2010     return false;
2011
2012   C r = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2013   for (unsigned int i = 1; i < N; ++i)
2014     if (b.coeffs[i] == ICb (0)
2015         ? a.coeffs[i] != ICa (0)
2016         : (NCa (a.coeffs[i]) % NCb (b.coeffs[i]) != 0
2017            || NCa (a.coeffs[i]) / NCb (b.coeffs[i]) != r))
2018       return false;
2019
2020   *multiple = r;
2021   return true;
2022 }
2023
2024 /* Return true if A is a multiple of B.  */
2025
2026 template<typename Ca, typename Cb>
2027 inline typename if_nonpoly2<Ca, Cb, bool>::type
2028 multiple_p (Ca a, Cb b)
2029 {
2030   return a % b == 0;
2031 }
2032
2033 /* Return true if A is a (polynomial) multiple of B.  */
2034
2035 template<unsigned int N, typename Ca, typename Cb>
2036 inline typename if_nonpoly<Cb, bool>::type
2037 multiple_p (const poly_int_pod<N, Ca> &a, Cb b)
2038 {
2039   for (unsigned int i = 0; i < N; ++i)
2040     if (a.coeffs[i] % b != 0)
2041       return false;
2042   return true;
2043 }
2044
2045 /* Return true if A is a (constant) multiple of B.  */
2046
2047 template<unsigned int N, typename Ca, typename Cb>
2048 inline typename if_nonpoly<Ca, bool>::type
2049 multiple_p (Ca a, const poly_int_pod<N, Cb> &b)
2050 {
2051   typedef POLY_INT_TYPE (Ca) int_type;
2052
2053   /* Do the modulus before the constant check, to catch divide by
2054      potential zeros.  */
2055   return a % b.coeffs[0] == 0 && (a == int_type (0) || b.is_constant ());
2056 }
2057
2058 /* Return true if A is a (polynomial) multiple of B.  This handles cases
2059    where either B is constant or the multiple is constant.  */
2060
2061 template<unsigned int N, typename Ca, typename Cb>
2062 inline bool
2063 multiple_p (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
2064 {
2065   if (b.is_constant ())
2066     return multiple_p (a, b.coeffs[0]);
2067   POLY_BINARY_COEFF (Ca, Ca) tmp;
2068   return constant_multiple_p (a, b, &tmp);
2069 }
2070
2071 /* Return true if A is a (constant) multiple of B, storing the
2072    multiple in *MULTIPLE if so.  */
2073
2074 template<typename Ca, typename Cb, typename Cm>
2075 inline typename if_nonpoly2<Ca, Cb, bool>::type
2076 multiple_p (Ca a, Cb b, Cm *multiple)
2077 {
2078   if (a % b != 0)
2079     return false;
2080   *multiple = a / b;
2081   return true;
2082 }
2083
2084 /* Return true if A is a (polynomial) multiple of B, storing the
2085    multiple in *MULTIPLE if so.  */
2086
2087 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2088 inline typename if_nonpoly<Cb, bool>::type
2089 multiple_p (const poly_int_pod<N, Ca> &a, Cb b, poly_int_pod<N, Cm> *multiple)
2090 {
2091   if (!multiple_p (a, b))
2092     return false;
2093   for (unsigned int i = 0; i < N; ++i)
2094     multiple->coeffs[i] = a.coeffs[i] / b;
2095   return true;
2096 }
2097
2098 /* Return true if B is a constant and A is a (constant) multiple of B,
2099    storing the multiple in *MULTIPLE if so.  */
2100
2101 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2102 inline typename if_nonpoly<Ca, bool>::type
2103 multiple_p (Ca a, const poly_int_pod<N, Cb> &b, Cm *multiple)
2104 {
2105   typedef POLY_CAST (Ca, Cb) NCa;
2106
2107   /* Do the modulus before the constant check, to catch divide by
2108      potential zeros.  */
2109   if (a % b.coeffs[0] != 0 || (NCa (a) != 0 && !b.is_constant ()))
2110     return false;
2111   *multiple = a / b.coeffs[0];
2112   return true;
2113 }
2114
2115 /* Return true if A is a (polynomial) multiple of B, storing the
2116    multiple in *MULTIPLE if so.  This handles cases where either
2117    B is constant or the multiple is constant.  */
2118
2119 template<unsigned int N, typename Ca, typename Cb, typename Cm>
2120 inline bool
2121 multiple_p (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b,
2122             poly_int_pod<N, Cm> *multiple)
2123 {
2124   if (b.is_constant ())
2125     return multiple_p (a, b.coeffs[0], multiple);
2126   return constant_multiple_p (a, b, multiple);
2127 }
2128
2129 /* Return A / B, given that A is known to be a multiple of B.  */
2130
2131 template<unsigned int N, typename Ca, typename Cb>
2132 inline POLY_CONST_RESULT (N, Ca, Cb)
2133 exact_div (const poly_int_pod<N, Ca> &a, Cb b)
2134 {
2135   typedef POLY_CONST_COEFF (Ca, Cb) C;
2136   poly_int<N, C> r;
2137   for (unsigned int i = 0; i < N; i++)
2138     {
2139       gcc_checking_assert (a.coeffs[i] % b == 0);
2140       POLY_SET_COEFF (C, r, i, a.coeffs[i] / b);
2141     }
2142   return r;
2143 }
2144
2145 /* Return A / B, given that A is known to be a multiple of B.  */
2146
2147 template<unsigned int N, typename Ca, typename Cb>
2148 inline POLY_POLY_RESULT (N, Ca, Cb)
2149 exact_div (const poly_int_pod<N, Ca> &a, const poly_int_pod<N, Cb> &b)
2150 {
2151   if (b.is_constant ())
2152     return exact_div (a, b.coeffs[0]);
2153
2154   typedef POLY_CAST (Ca, Cb) NCa;
2155   typedef POLY_CAST (Cb, Ca) NCb;
2156   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2157   typedef POLY_INT_TYPE (Cb) int_type;
2158
2159   gcc_checking_assert (a.coeffs[0] % b.coeffs[0] == 0);
2160   C r = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2161   for (unsigned int i = 1; i < N; ++i)
2162     gcc_checking_assert (b.coeffs[i] == int_type (0)
2163                          ? a.coeffs[i] == int_type (0)
2164                          : (a.coeffs[i] % b.coeffs[i] == 0
2165                             && NCa (a.coeffs[i]) / NCb (b.coeffs[i]) == r));
2166
2167   return r;
2168 }
2169
2170 /* Return true if there is some constant Q and polynomial r such that:
2171
2172      (1) a = b * Q + r
2173      (2) |b * Q| <= |a|
2174      (3) |r| < |b|
2175
2176    Store the value Q in *QUOTIENT if so.  */
2177
2178 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2179 inline typename if_nonpoly2<Cb, Cq, bool>::type
2180 can_div_trunc_p (const poly_int_pod<N, Ca> &a, Cb b, Cq *quotient)
2181 {
2182   typedef POLY_CAST (Ca, Cb) NCa;
2183   typedef POLY_CAST (Cb, Ca) NCb;
2184
2185   /* Do the division before the constant check, to catch divide by
2186      zero errors.  */
2187   Cq q = NCa (a.coeffs[0]) / NCb (b);
2188   if (!a.is_constant ())
2189     return false;
2190   *quotient = q;
2191   return true;
2192 }
2193
2194 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2195 inline typename if_nonpoly<Cq, bool>::type
2196 can_div_trunc_p (const poly_int_pod<N, Ca> &a,
2197                  const poly_int_pod<N, Cb> &b,
2198                  Cq *quotient)
2199 {
2200   /* We can calculate Q from the case in which the indeterminates
2201      are zero.  */
2202   typedef POLY_CAST (Ca, Cb) NCa;
2203   typedef POLY_CAST (Cb, Ca) NCb;
2204   typedef POLY_INT_TYPE (Ca) ICa;
2205   typedef POLY_INT_TYPE (Cb) ICb;
2206   typedef POLY_BINARY_COEFF (Ca, Cb) C;
2207   C q = NCa (a.coeffs[0]) / NCb (b.coeffs[0]);
2208
2209   /* Check the other coefficients and record whether the division is exact.
2210      The only difficult case is when it isn't.  If we require a and b to
2211      ordered wrt zero, there can be no two coefficients of the same value
2212      that have opposite signs.  This means that:
2213
2214          |a| = |a0| + |a1 * x1| + |a2 * x2| + ...
2215          |b| = |b0| + |b1 * x1| + |b2 * x2| + ...
2216
2217       The Q we've just calculated guarantees:
2218
2219          |b0 * Q| <= |a0|
2220          |a0 - b0 * Q| < |b0|
2221
2222       and so:
2223
2224          (2) |b * Q| <= |a|
2225
2226       is satisfied if:
2227
2228          |bi * xi * Q| <= |ai * xi|
2229
2230       for each i in [1, N].  This is trivially true when xi is zero.
2231       When it isn't we need:
2232
2233          (2') |bi * Q| <= |ai|
2234
2235       r is calculated as:
2236
2237          r = r0 + r1 * x1 + r2 * x2 + ...
2238          where ri = ai - bi * Q
2239
2240       Restricting to ordered a and b also guarantees that no two ris
2241       have opposite signs, so we have:
2242
2243          |r| = |r0| + |r1 * x1| + |r2 * x2| + ...
2244
2245       We know from the calculation of Q that |r0| < |b0|, so:
2246
2247          (3) |r| < |b|
2248
2249       is satisfied if:
2250
2251          (3') |ai - bi * Q| <= |bi|
2252
2253       for each i in [1, N].  */
2254   bool rem_p = NCa (a.coeffs[0]) % NCb (b.coeffs[0]) != 0;
2255   for (unsigned int i = 1; i < N; ++i)
2256     {
2257       if (b.coeffs[i] == ICb (0))
2258         {
2259           /* For bi == 0 we simply need: (3') |ai| == 0.  */
2260           if (a.coeffs[i] != ICa (0))
2261             return false;
2262         }
2263       else
2264         {
2265           if (q == 0)
2266             {
2267               /* For Q == 0 we simply need: (3') |ai| <= |bi|.  */
2268               if (a.coeffs[i] != ICa (0))
2269                 {
2270                   /* Use negative absolute to avoid overflow, i.e.
2271                      -|ai| >= -|bi|.  */
2272                   C neg_abs_a = (a.coeffs[i] < 0 ? a.coeffs[i] : -a.coeffs[i]);
2273                   C neg_abs_b = (b.coeffs[i] < 0 ? b.coeffs[i] : -b.coeffs[i]);
2274                   if (neg_abs_a < neg_abs_b)
2275                     return false;
2276                   rem_p = true;
2277                 }
2278             }
2279           else
2280             {
2281               /* Otherwise just check for the case in which ai / bi == Q.  */
2282               if (NCa (a.coeffs[i]) / NCb (b.coeffs[i]) != q)
2283                 return false;
2284               if (NCa (a.coeffs[i]) % NCb (b.coeffs[i]) != 0)
2285                 rem_p = true;
2286             }
2287         }
2288     }
2289
2290   /* If the division isn't exact, require both values to be ordered wrt 0,
2291      so that we can guarantee conditions (2) and (3) for all indeterminate
2292      values.  */
2293   if (rem_p && (!ordered_p (a, ICa (0)) || !ordered_p (b, ICb (0))))
2294     return false;
2295
2296   *quotient = q;
2297   return true;
2298 }
2299
2300 /* Likewise, but also store r in *REMAINDER.  */
2301
2302 template<unsigned int N, typename Ca, typename Cb, typename Cq, typename Cr>
2303 inline typename if_nonpoly<Cq, bool>::type
2304 can_div_trunc_p (const poly_int_pod<N, Ca> &a,
2305                  const poly_int_pod<N, Cb> &b,
2306                  Cq *quotient, Cr *remainder)
2307 {
2308   if (!can_div_trunc_p (a, b, quotient))
2309     return false;
2310   *remainder = a - *quotient * b;
2311   return true;
2312 }
2313
2314 /* Return true if there is some polynomial q and constant R such that:
2315
2316      (1) a = B * q + R
2317      (2) |B * q| <= |a|
2318      (3) |R| < |B|
2319
2320    Store the value q in *QUOTIENT if so.  */
2321
2322 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2323 inline typename if_nonpoly<Cb, bool>::type
2324 can_div_trunc_p (const poly_int_pod<N, Ca> &a, Cb b,
2325                  poly_int_pod<N, Cq> *quotient)
2326 {
2327   /* The remainder must be constant.  */
2328   for (unsigned int i = 1; i < N; ++i)
2329     if (a.coeffs[i] % b != 0)
2330       return false;
2331   for (unsigned int i = 0; i < N; ++i)
2332     quotient->coeffs[i] = a.coeffs[i] / b;
2333   return true;
2334 }
2335
2336 /* Likewise, but also store R in *REMAINDER.  */
2337
2338 template<unsigned int N, typename Ca, typename Cb, typename Cq, typename Cr>
2339 inline typename if_nonpoly<Cb, bool>::type
2340 can_div_trunc_p (const poly_int_pod<N, Ca> &a, Cb b,
2341                  poly_int_pod<N, Cq> *quotient, Cr *remainder)
2342 {
2343   if (!can_div_trunc_p (a, b, quotient))
2344     return false;
2345   *remainder = a.coeffs[0] % b;
2346   return true;
2347 }
2348
2349 /* Return true if there is some constant Q and polynomial r such that:
2350
2351      (1) a = b * Q + r
2352      (2) |a| <= |b * Q|
2353      (3) |r| < |b|
2354
2355    Store the value Q in *QUOTIENT if so.  */
2356
2357 template<unsigned int N, typename Ca, typename Cb, typename Cq>
2358 inline typename if_nonpoly<Cq, bool>::type
2359 can_div_away_from_zero_p (const poly_int_pod<N, Ca> &a,
2360                           const poly_int_pod<N, Cb> &b,
2361                           Cq *quotient)
2362 {
2363   if (!can_div_trunc_p (a, b, quotient))
2364     return false;
2365   if (maybe_ne (*quotient * b, a))
2366     *quotient += (*quotient < 0 ? -1 : 1);
2367   return true;
2368 }
2369
2370 /* Use print_dec to print VALUE to FILE, where SGN is the sign
2371    of the values.  */
2372
2373 template<unsigned int N, typename C>
2374 void
2375 print_dec (const poly_int_pod<N, C> &value, FILE *file, signop sgn)
2376 {
2377   if (value.is_constant ())
2378     print_dec (value.coeffs[0], file, sgn);
2379   else
2380     {
2381       fprintf (file, "[");
2382       for (unsigned int i = 0; i < N; ++i)
2383         {
2384           print_dec (value.coeffs[i], file, sgn);
2385           fputc (i == N - 1 ? ']' : ',', file);
2386         }
2387     }
2388 }
2389
2390 /* Likewise without the signop argument, for coefficients that have an
2391    inherent signedness.  */
2392
2393 template<unsigned int N, typename C>
2394 void
2395 print_dec (const poly_int_pod<N, C> &value, FILE *file)
2396 {
2397   STATIC_ASSERT (poly_coeff_traits<C>::signedness >= 0);
2398   print_dec (value, file,
2399              poly_coeff_traits<C>::signedness ? SIGNED : UNSIGNED);
2400 }
2401
2402 /* Helper for calculating the distance between two points P1 and P2,
2403    in cases where known_le (P1, P2).  T1 and T2 are the types of the
2404    two positions, in either order.  The coefficients of P2 - P1 have
2405    type unsigned HOST_WIDE_INT if the coefficients of both T1 and T2
2406    have C++ primitive type, otherwise P2 - P1 has its usual
2407    wide-int-based type.
2408
2409    The actual subtraction should look something like this:
2410
2411      typedef poly_span_traits<T1, T2> span_traits;
2412      span_traits::cast (P2) - span_traits::cast (P1)
2413
2414    Applying the cast before the subtraction avoids undefined overflow
2415    for signed T1 and T2.
2416
2417    The implementation of the cast tries to avoid unnecessary arithmetic
2418    or copying.  */
2419 template<typename T1, typename T2,
2420          typename Res = POLY_BINARY_COEFF (POLY_BINARY_COEFF (T1, T2),
2421                                            unsigned HOST_WIDE_INT)>
2422 struct poly_span_traits
2423 {
2424   template<typename T>
2425   static const T &cast (const T &x) { return x; }
2426 };
2427
2428 template<typename T1, typename T2>
2429 struct poly_span_traits<T1, T2, unsigned HOST_WIDE_INT>
2430 {
2431   template<typename T>
2432   static typename if_nonpoly<T, unsigned HOST_WIDE_INT>::type
2433   cast (const T &x) { return x; }
2434
2435   template<unsigned int N, typename T>
2436   static poly_int<N, unsigned HOST_WIDE_INT>
2437   cast (const poly_int_pod<N, T> &x) { return x; }
2438 };
2439
2440 /* Return true if SIZE represents a known size, assuming that all-ones
2441    indicates an unknown size.  */
2442
2443 template<typename T>
2444 inline bool
2445 known_size_p (const T &a)
2446 {
2447   return maybe_ne (a, POLY_INT_TYPE (T) (-1));
2448 }
2449
2450 /* Return true if range [POS, POS + SIZE) might include VAL.
2451    SIZE can be the special value -1, in which case the range is
2452    open-ended.  */
2453
2454 template<typename T1, typename T2, typename T3>
2455 inline bool
2456 maybe_in_range_p (const T1 &val, const T2 &pos, const T3 &size)
2457 {
2458   typedef poly_span_traits<T1, T2> start_span;
2459   typedef poly_span_traits<T3, T3> size_span;
2460   if (known_lt (val, pos))
2461     return false;
2462   if (!known_size_p (size))
2463     return true;
2464   if ((poly_int_traits<T1>::num_coeffs > 1
2465        || poly_int_traits<T2>::num_coeffs > 1)
2466       && maybe_lt (val, pos))
2467     /* In this case we don't know whether VAL >= POS is true at compile
2468        time, so we can't prove that VAL >= POS + SIZE.  */
2469     return true;
2470   return maybe_lt (start_span::cast (val) - start_span::cast (pos),
2471                    size_span::cast (size));
2472 }
2473
2474 /* Return true if range [POS, POS + SIZE) is known to include VAL.
2475    SIZE can be the special value -1, in which case the range is
2476    open-ended.  */
2477
2478 template<typename T1, typename T2, typename T3>
2479 inline bool
2480 known_in_range_p (const T1 &val, const T2 &pos, const T3 &size)
2481 {
2482   typedef poly_span_traits<T1, T2> start_span;
2483   typedef poly_span_traits<T3, T3> size_span;
2484   return (known_size_p (size)
2485           && known_ge (val, pos)
2486           && known_lt (start_span::cast (val) - start_span::cast (pos),
2487                        size_span::cast (size)));
2488 }
2489
2490 /* Return true if the two ranges [POS1, POS1 + SIZE1) and [POS2, POS2 + SIZE2)
2491    might overlap.  SIZE1 and/or SIZE2 can be the special value -1, in which
2492    case the range is open-ended.  */
2493
2494 template<typename T1, typename T2, typename T3, typename T4>
2495 inline bool
2496 ranges_maybe_overlap_p (const T1 &pos1, const T2 &size1,
2497                         const T3 &pos2, const T4 &size2)
2498 {
2499   if (maybe_in_range_p (pos2, pos1, size1))
2500     return maybe_ne (size2, POLY_INT_TYPE (T4) (0));
2501   if (maybe_in_range_p (pos1, pos2, size2))
2502     return maybe_ne (size1, POLY_INT_TYPE (T2) (0));
2503   return false;
2504 }
2505
2506 /* Return true if the two ranges [POS1, POS1 + SIZE1) and [POS2, POS2 + SIZE2)
2507    are known to overlap.  SIZE1 and/or SIZE2 can be the special value -1,
2508    in which case the range is open-ended.  */
2509
2510 template<typename T1, typename T2, typename T3, typename T4>
2511 inline bool
2512 ranges_known_overlap_p (const T1 &pos1, const T2 &size1,
2513                         const T3 &pos2, const T4 &size2)
2514 {
2515   typedef poly_span_traits<T1, T3> start_span;
2516   typedef poly_span_traits<T2, T2> size1_span;
2517   typedef poly_span_traits<T4, T4> size2_span;
2518   /* known_gt (POS1 + SIZE1, POS2)                         [infinite precision]
2519      --> known_gt (SIZE1, POS2 - POS1)                     [infinite precision]
2520      --> known_gt (SIZE1, POS2 - lower_bound (POS1, POS2)) [infinite precision]
2521                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ always nonnegative
2522      --> known_gt (SIZE1, span1::cast (POS2 - lower_bound (POS1, POS2))).
2523
2524      Using the saturating subtraction enforces that SIZE1 must be
2525      nonzero, since known_gt (0, x) is false for all nonnegative x.
2526      If POS2.coeff[I] < POS1.coeff[I] for some I > 0, increasing
2527      indeterminate number I makes the unsaturated condition easier to
2528      satisfy, so using a saturated coefficient of zero tests the case in
2529      which the indeterminate is zero (the minimum value).  */
2530   return (known_size_p (size1)
2531           && known_size_p (size2)
2532           && known_lt (start_span::cast (pos2)
2533                        - start_span::cast (lower_bound (pos1, pos2)),
2534                        size1_span::cast (size1))
2535           && known_lt (start_span::cast (pos1)
2536                        - start_span::cast (lower_bound (pos1, pos2)),
2537                        size2_span::cast (size2)));
2538 }
2539
2540 /* Return true if range [POS1, POS1 + SIZE1) is known to be a subrange of
2541    [POS2, POS2 + SIZE2).  SIZE1 and/or SIZE2 can be the special value -1,
2542    in which case the range is open-ended.  */
2543
2544 template<typename T1, typename T2, typename T3, typename T4>
2545 inline bool
2546 known_subrange_p (const T1 &pos1, const T2 &size1,
2547                   const T3 &pos2, const T4 &size2)
2548 {
2549   typedef typename poly_int_traits<T2>::coeff_type C2;
2550   typedef poly_span_traits<T1, T3> start_span;
2551   typedef poly_span_traits<T2, T4> size_span;
2552   return (known_gt (size1, POLY_INT_TYPE (T2) (0))
2553           && (poly_coeff_traits<C2>::signedness > 0
2554               || known_size_p (size1))
2555           && known_size_p (size2)
2556           && known_ge (pos1, pos2)
2557           && known_le (size1, size2)
2558           && known_le (start_span::cast (pos1) - start_span::cast (pos2),
2559                        size_span::cast (size2) - size_span::cast (size1)));
2560 }
2561
2562 /* Return true if the endpoint of the range [POS, POS + SIZE) can be
2563    stored in a T, or if SIZE is the special value -1, which makes the
2564    range open-ended.  */
2565
2566 template<typename T>
2567 inline typename if_nonpoly<T, bool>::type
2568 endpoint_representable_p (const T &pos, const T &size)
2569 {
2570   return (!known_size_p (size)
2571           || pos <= poly_coeff_traits<T>::max_value - size);
2572 }
2573
2574 template<unsigned int N, typename C>
2575 inline bool
2576 endpoint_representable_p (const poly_int_pod<N, C> &pos,
2577                           const poly_int_pod<N, C> &size)
2578 {
2579   if (known_size_p (size))
2580     for (unsigned int i = 0; i < N; ++i)
2581       if (pos.coeffs[i] > poly_coeff_traits<C>::max_value - size.coeffs[i])
2582         return false;
2583   return true;
2584 }
2585
2586 template<unsigned int N, typename C>
2587 void
2588 gt_ggc_mx (poly_int_pod<N, C> *)
2589 {
2590 }
2591
2592 template<unsigned int N, typename C>
2593 void
2594 gt_pch_nx (poly_int_pod<N, C> *)
2595 {
2596 }
2597
2598 template<unsigned int N, typename C>
2599 void
2600 gt_pch_nx (poly_int_pod<N, C> *, void (*) (void *, void *), void *)
2601 {
2602 }
2603
2604 #undef POLY_SET_COEFF
2605 #undef POLY_INT_TYPE
2606 #undef POLY_BINARY_COEFF
2607 #undef CONST_CONST_RESULT
2608 #undef POLY_CONST_RESULT
2609 #undef CONST_POLY_RESULT
2610 #undef POLY_POLY_RESULT
2611 #undef POLY_CONST_COEFF
2612 #undef CONST_POLY_COEFF
2613 #undef POLY_POLY_COEFF
2614
2615 #endif