fold-const.c revision 1.6
1/* Fold a constant sub-tree into a single node for C-compiler
2   Copyright (C) 1987-2015 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.  */
19
20/*@@ This file should be rewritten to use an arbitrary precision
21  @@ representation for "struct tree_int_cst" and "struct tree_real_cst".
22  @@ Perhaps the routines could also be used for bc/dc, and made a lib.
23  @@ The routines that translate from the ap rep should
24  @@ warn if precision et. al. is lost.
25  @@ This would also make life easier when this technology is used
26  @@ for cross-compilers.  */
27
28/* The entry points in this file are fold, size_int_wide and size_binop.
29
30   fold takes a tree as argument and returns a simplified tree.
31
32   size_binop takes a tree code for an arithmetic operation
33   and two operands that are trees, and produces a tree for the
34   result, assuming the type comes from `sizetype'.
35
36   size_int takes an integer value, and creates a tree constant
37   with type from `sizetype'.
38
39   Note: Since the folders get called on non-gimple code as well as
40   gimple code, we need to handle GIMPLE tuples as well as their
41   corresponding tree equivalents.  */
42
43#include "config.h"
44#include "system.h"
45#include "coretypes.h"
46#include "tm.h"
47#include "flags.h"
48#include "hash-set.h"
49#include "machmode.h"
50#include "vec.h"
51#include "double-int.h"
52#include "input.h"
53#include "alias.h"
54#include "symtab.h"
55#include "wide-int.h"
56#include "inchash.h"
57#include "tree.h"
58#include "fold-const.h"
59#include "stor-layout.h"
60#include "calls.h"
61#include "tree-iterator.h"
62#include "realmpfr.h"
63#include "rtl.h"
64#include "hashtab.h"
65#include "hard-reg-set.h"
66#include "function.h"
67#include "statistics.h"
68#include "real.h"
69#include "fixed-value.h"
70#include "insn-config.h"
71#include "expmed.h"
72#include "dojump.h"
73#include "explow.h"
74#include "emit-rtl.h"
75#include "varasm.h"
76#include "stmt.h"
77#include "expr.h"
78#include "tm_p.h"
79#include "target.h"
80#include "diagnostic-core.h"
81#include "intl.h"
82#include "langhooks.h"
83#include "md5.h"
84#include "predict.h"
85#include "basic-block.h"
86#include "tree-ssa-alias.h"
87#include "internal-fn.h"
88#include "tree-eh.h"
89#include "gimple-expr.h"
90#include "is-a.h"
91#include "gimple.h"
92#include "gimplify.h"
93#include "tree-dfa.h"
94#include "hash-table.h"  /* Required for ENABLE_FOLD_CHECKING.  */
95#include "builtins.h"
96#include "hash-map.h"
97#include "plugin-api.h"
98#include "ipa-ref.h"
99#include "cgraph.h"
100#include "generic-match.h"
101#include "optabs.h"
102
103/* Nonzero if we are folding constants inside an initializer; zero
104   otherwise.  */
105int folding_initializer = 0;
106
107/* The following constants represent a bit based encoding of GCC's
108   comparison operators.  This encoding simplifies transformations
109   on relational comparison operators, such as AND and OR.  */
110enum comparison_code {
111  COMPCODE_FALSE = 0,
112  COMPCODE_LT = 1,
113  COMPCODE_EQ = 2,
114  COMPCODE_LE = 3,
115  COMPCODE_GT = 4,
116  COMPCODE_LTGT = 5,
117  COMPCODE_GE = 6,
118  COMPCODE_ORD = 7,
119  COMPCODE_UNORD = 8,
120  COMPCODE_UNLT = 9,
121  COMPCODE_UNEQ = 10,
122  COMPCODE_UNLE = 11,
123  COMPCODE_UNGT = 12,
124  COMPCODE_NE = 13,
125  COMPCODE_UNGE = 14,
126  COMPCODE_TRUE = 15
127};
128
129static bool negate_mathfn_p (enum built_in_function);
130static bool negate_expr_p (tree);
131static tree negate_expr (tree);
132static tree split_tree (location_t, tree, tree, enum tree_code,
133			tree *, tree *, tree *, int);
134static tree associate_trees (location_t, tree, tree, enum tree_code, tree);
135static enum comparison_code comparison_to_compcode (enum tree_code);
136static enum tree_code compcode_to_comparison (enum comparison_code);
137static int operand_equal_for_comparison_p (tree, tree, tree);
138static int twoval_comparison_p (tree, tree *, tree *, int *);
139static tree eval_subst (location_t, tree, tree, tree, tree, tree);
140static tree distribute_bit_expr (location_t, enum tree_code, tree, tree, tree);
141static tree make_bit_field_ref (location_t, tree, tree,
142				HOST_WIDE_INT, HOST_WIDE_INT, int);
143static tree optimize_bit_field_compare (location_t, enum tree_code,
144					tree, tree, tree);
145static tree decode_field_reference (location_t, tree, HOST_WIDE_INT *,
146				    HOST_WIDE_INT *,
147				    machine_mode *, int *, int *,
148				    tree *, tree *);
149static int simple_operand_p (const_tree);
150static bool simple_operand_p_2 (tree);
151static tree range_binop (enum tree_code, tree, tree, int, tree, int);
152static tree range_predecessor (tree);
153static tree range_successor (tree);
154static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
155static tree fold_cond_expr_with_comparison (location_t, tree, tree, tree, tree);
156static tree unextend (tree, int, int, tree);
157static tree optimize_minmax_comparison (location_t, enum tree_code,
158					tree, tree, tree);
159static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
160static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
161static tree fold_binary_op_with_conditional_arg (location_t,
162						 enum tree_code, tree,
163						 tree, tree,
164						 tree, tree, int);
165static tree fold_mathfn_compare (location_t,
166				 enum built_in_function, enum tree_code,
167				 tree, tree, tree);
168static tree fold_inf_compare (location_t, enum tree_code, tree, tree, tree);
169static tree fold_div_compare (location_t, enum tree_code, tree, tree, tree);
170static bool reorder_operands_p (const_tree, const_tree);
171static tree fold_negate_const (tree, tree);
172static tree fold_not_const (const_tree, tree);
173static tree fold_relational_const (enum tree_code, tree, tree, tree);
174static tree fold_convert_const (enum tree_code, tree, tree);
175static tree fold_view_convert_expr (tree, tree);
176static bool vec_cst_ctor_to_array (tree, tree *);
177
178
179/* Return EXPR_LOCATION of T if it is not UNKNOWN_LOCATION.
180   Otherwise, return LOC.  */
181
182static location_t
183expr_location_or (tree t, location_t loc)
184{
185  location_t tloc = EXPR_LOCATION (t);
186  return tloc == UNKNOWN_LOCATION ? loc : tloc;
187}
188
189/* Similar to protected_set_expr_location, but never modify x in place,
190   if location can and needs to be set, unshare it.  */
191
192static inline tree
193protected_set_expr_location_unshare (tree x, location_t loc)
194{
195  if (CAN_HAVE_LOCATION_P (x)
196      && EXPR_LOCATION (x) != loc
197      && !(TREE_CODE (x) == SAVE_EXPR
198	   || TREE_CODE (x) == TARGET_EXPR
199	   || TREE_CODE (x) == BIND_EXPR))
200    {
201      x = copy_node (x);
202      SET_EXPR_LOCATION (x, loc);
203    }
204  return x;
205}
206
207/* If ARG2 divides ARG1 with zero remainder, carries out the exact
208   division and returns the quotient.  Otherwise returns
209   NULL_TREE.  */
210
211tree
212div_if_zero_remainder (const_tree arg1, const_tree arg2)
213{
214  widest_int quo;
215
216  if (wi::multiple_of_p (wi::to_widest (arg1), wi::to_widest (arg2),
217			 SIGNED, &quo))
218    return wide_int_to_tree (TREE_TYPE (arg1), quo);
219
220  return NULL_TREE;
221}
222
223/* This is nonzero if we should defer warnings about undefined
224   overflow.  This facility exists because these warnings are a
225   special case.  The code to estimate loop iterations does not want
226   to issue any warnings, since it works with expressions which do not
227   occur in user code.  Various bits of cleanup code call fold(), but
228   only use the result if it has certain characteristics (e.g., is a
229   constant); that code only wants to issue a warning if the result is
230   used.  */
231
232static int fold_deferring_overflow_warnings;
233
234/* If a warning about undefined overflow is deferred, this is the
235   warning.  Note that this may cause us to turn two warnings into
236   one, but that is fine since it is sufficient to only give one
237   warning per expression.  */
238
239static const char* fold_deferred_overflow_warning;
240
241/* If a warning about undefined overflow is deferred, this is the
242   level at which the warning should be emitted.  */
243
244static enum warn_strict_overflow_code fold_deferred_overflow_code;
245
246/* Start deferring overflow warnings.  We could use a stack here to
247   permit nested calls, but at present it is not necessary.  */
248
249void
250fold_defer_overflow_warnings (void)
251{
252  ++fold_deferring_overflow_warnings;
253}
254
255/* Stop deferring overflow warnings.  If there is a pending warning,
256   and ISSUE is true, then issue the warning if appropriate.  STMT is
257   the statement with which the warning should be associated (used for
258   location information); STMT may be NULL.  CODE is the level of the
259   warning--a warn_strict_overflow_code value.  This function will use
260   the smaller of CODE and the deferred code when deciding whether to
261   issue the warning.  CODE may be zero to mean to always use the
262   deferred code.  */
263
264void
265fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code)
266{
267  const char *warnmsg;
268  location_t locus;
269
270  gcc_assert (fold_deferring_overflow_warnings > 0);
271  --fold_deferring_overflow_warnings;
272  if (fold_deferring_overflow_warnings > 0)
273    {
274      if (fold_deferred_overflow_warning != NULL
275	  && code != 0
276	  && code < (int) fold_deferred_overflow_code)
277	fold_deferred_overflow_code = (enum warn_strict_overflow_code) code;
278      return;
279    }
280
281  warnmsg = fold_deferred_overflow_warning;
282  fold_deferred_overflow_warning = NULL;
283
284  if (!issue || warnmsg == NULL)
285    return;
286
287  if (gimple_no_warning_p (stmt))
288    return;
289
290  /* Use the smallest code level when deciding to issue the
291     warning.  */
292  if (code == 0 || code > (int) fold_deferred_overflow_code)
293    code = fold_deferred_overflow_code;
294
295  if (!issue_strict_overflow_warning (code))
296    return;
297
298  if (stmt == NULL)
299    locus = input_location;
300  else
301    locus = gimple_location (stmt);
302  warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg);
303}
304
305/* Stop deferring overflow warnings, ignoring any deferred
306   warnings.  */
307
308void
309fold_undefer_and_ignore_overflow_warnings (void)
310{
311  fold_undefer_overflow_warnings (false, NULL, 0);
312}
313
314/* Whether we are deferring overflow warnings.  */
315
316bool
317fold_deferring_overflow_warnings_p (void)
318{
319  return fold_deferring_overflow_warnings > 0;
320}
321
322/* This is called when we fold something based on the fact that signed
323   overflow is undefined.  */
324
325static void
326fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
327{
328  if (fold_deferring_overflow_warnings > 0)
329    {
330      if (fold_deferred_overflow_warning == NULL
331	  || wc < fold_deferred_overflow_code)
332	{
333	  fold_deferred_overflow_warning = gmsgid;
334	  fold_deferred_overflow_code = wc;
335	}
336    }
337  else if (issue_strict_overflow_warning (wc))
338    warning (OPT_Wstrict_overflow, gmsgid);
339}
340
341/* Return true if the built-in mathematical function specified by CODE
342   is odd, i.e. -f(x) == f(-x).  */
343
344static bool
345negate_mathfn_p (enum built_in_function code)
346{
347  switch (code)
348    {
349    CASE_FLT_FN (BUILT_IN_ASIN):
350    CASE_FLT_FN (BUILT_IN_ASINH):
351    CASE_FLT_FN (BUILT_IN_ATAN):
352    CASE_FLT_FN (BUILT_IN_ATANH):
353    CASE_FLT_FN (BUILT_IN_CASIN):
354    CASE_FLT_FN (BUILT_IN_CASINH):
355    CASE_FLT_FN (BUILT_IN_CATAN):
356    CASE_FLT_FN (BUILT_IN_CATANH):
357    CASE_FLT_FN (BUILT_IN_CBRT):
358    CASE_FLT_FN (BUILT_IN_CPROJ):
359    CASE_FLT_FN (BUILT_IN_CSIN):
360    CASE_FLT_FN (BUILT_IN_CSINH):
361    CASE_FLT_FN (BUILT_IN_CTAN):
362    CASE_FLT_FN (BUILT_IN_CTANH):
363    CASE_FLT_FN (BUILT_IN_ERF):
364    CASE_FLT_FN (BUILT_IN_LLROUND):
365    CASE_FLT_FN (BUILT_IN_LROUND):
366    CASE_FLT_FN (BUILT_IN_ROUND):
367    CASE_FLT_FN (BUILT_IN_SIN):
368    CASE_FLT_FN (BUILT_IN_SINH):
369    CASE_FLT_FN (BUILT_IN_TAN):
370    CASE_FLT_FN (BUILT_IN_TANH):
371    CASE_FLT_FN (BUILT_IN_TRUNC):
372      return true;
373
374    CASE_FLT_FN (BUILT_IN_LLRINT):
375    CASE_FLT_FN (BUILT_IN_LRINT):
376    CASE_FLT_FN (BUILT_IN_NEARBYINT):
377    CASE_FLT_FN (BUILT_IN_RINT):
378      return !flag_rounding_math;
379
380    default:
381      break;
382    }
383  return false;
384}
385
386/* Check whether we may negate an integer constant T without causing
387   overflow.  */
388
389bool
390may_negate_without_overflow_p (const_tree t)
391{
392  tree type;
393
394  gcc_assert (TREE_CODE (t) == INTEGER_CST);
395
396  type = TREE_TYPE (t);
397  if (TYPE_UNSIGNED (type))
398    return false;
399
400  return !wi::only_sign_bit_p (t);
401}
402
403/* Determine whether an expression T can be cheaply negated using
404   the function negate_expr without introducing undefined overflow.  */
405
406static bool
407negate_expr_p (tree t)
408{
409  tree type;
410
411  if (t == 0)
412    return false;
413
414  type = TREE_TYPE (t);
415
416  STRIP_SIGN_NOPS (t);
417  switch (TREE_CODE (t))
418    {
419    case INTEGER_CST:
420      if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type))
421	return true;
422
423      /* Check that -CST will not overflow type.  */
424      return may_negate_without_overflow_p (t);
425    case BIT_NOT_EXPR:
426      return (INTEGRAL_TYPE_P (type)
427	      && TYPE_OVERFLOW_WRAPS (type));
428
429    case FIXED_CST:
430      return true;
431
432    case NEGATE_EXPR:
433      return !TYPE_OVERFLOW_SANITIZED (type);
434
435    case REAL_CST:
436      /* We want to canonicalize to positive real constants.  Pretend
437         that only negative ones can be easily negated.  */
438      return REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
439
440    case COMPLEX_CST:
441      return negate_expr_p (TREE_REALPART (t))
442	     && negate_expr_p (TREE_IMAGPART (t));
443
444    case VECTOR_CST:
445      {
446	if (FLOAT_TYPE_P (TREE_TYPE (type)) || TYPE_OVERFLOW_WRAPS (type))
447	  return true;
448
449	int count = TYPE_VECTOR_SUBPARTS (type), i;
450
451	for (i = 0; i < count; i++)
452	  if (!negate_expr_p (VECTOR_CST_ELT (t, i)))
453	    return false;
454
455	return true;
456      }
457
458    case COMPLEX_EXPR:
459      return negate_expr_p (TREE_OPERAND (t, 0))
460	     && negate_expr_p (TREE_OPERAND (t, 1));
461
462    case CONJ_EXPR:
463      return negate_expr_p (TREE_OPERAND (t, 0));
464
465    case PLUS_EXPR:
466      if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
467	  || HONOR_SIGNED_ZEROS (element_mode (type))
468	  || (INTEGRAL_TYPE_P (type)
469	      && ! TYPE_OVERFLOW_WRAPS (type)))
470	return false;
471      /* -(A + B) -> (-B) - A.  */
472      if (negate_expr_p (TREE_OPERAND (t, 1))
473	  && reorder_operands_p (TREE_OPERAND (t, 0),
474				 TREE_OPERAND (t, 1)))
475	return true;
476      /* -(A + B) -> (-A) - B.  */
477      return negate_expr_p (TREE_OPERAND (t, 0));
478
479    case MINUS_EXPR:
480      /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
481      return !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
482	     && !HONOR_SIGNED_ZEROS (element_mode (type))
483	     && (! INTEGRAL_TYPE_P (type)
484		 || TYPE_OVERFLOW_WRAPS (type))
485	     && reorder_operands_p (TREE_OPERAND (t, 0),
486				    TREE_OPERAND (t, 1));
487
488    case MULT_EXPR:
489      if (TYPE_UNSIGNED (type))
490	break;
491      /* INT_MIN/n * n doesn't overflow while negating one operand it does
492         if n is a power of two.  */
493      if (INTEGRAL_TYPE_P (TREE_TYPE (t))
494	  && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
495	  && ! ((TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
496		 && ! integer_pow2p (TREE_OPERAND (t, 0)))
497		|| (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
498		    && ! integer_pow2p (TREE_OPERAND (t, 1)))))
499	break;
500
501      /* Fall through.  */
502
503    case RDIV_EXPR:
504      if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (TREE_TYPE (t))))
505	return negate_expr_p (TREE_OPERAND (t, 1))
506	       || negate_expr_p (TREE_OPERAND (t, 0));
507      break;
508
509    case TRUNC_DIV_EXPR:
510    case ROUND_DIV_EXPR:
511    case EXACT_DIV_EXPR:
512      /* In general we can't negate A / B, because if A is INT_MIN and
513	 B is 1, we may turn this into INT_MIN / -1 which is undefined
514	 and actually traps on some architectures.  But if overflow is
515	 undefined, we can negate, because - (INT_MIN / 1) is an
516	 overflow.  */
517      if (INTEGRAL_TYPE_P (TREE_TYPE (t)))
518	{
519	  if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
520	    break;
521	  /* If overflow is undefined then we have to be careful because
522	     we ask whether it's ok to associate the negate with the
523	     division which is not ok for example for
524	     -((a - b) / c) where (-(a - b)) / c may invoke undefined
525	     overflow because of negating INT_MIN.  So do not use
526	     negate_expr_p here but open-code the two important cases.  */
527	  if (TREE_CODE (TREE_OPERAND (t, 0)) == NEGATE_EXPR
528	      || (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
529		  && may_negate_without_overflow_p (TREE_OPERAND (t, 0))))
530	    return true;
531	}
532      else if (negate_expr_p (TREE_OPERAND (t, 0)))
533	return true;
534      return negate_expr_p (TREE_OPERAND (t, 1));
535
536    case NOP_EXPR:
537      /* Negate -((double)float) as (double)(-float).  */
538      if (TREE_CODE (type) == REAL_TYPE)
539	{
540	  tree tem = strip_float_extensions (t);
541	  if (tem != t)
542	    return negate_expr_p (tem);
543	}
544      break;
545
546    case CALL_EXPR:
547      /* Negate -f(x) as f(-x).  */
548      if (negate_mathfn_p (builtin_mathfn_code (t)))
549	return negate_expr_p (CALL_EXPR_ARG (t, 0));
550      break;
551
552    case RSHIFT_EXPR:
553      /* Optimize -((int)x >> 31) into (unsigned)x >> 31 for int.  */
554      if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
555	{
556	  tree op1 = TREE_OPERAND (t, 1);
557	  if (wi::eq_p (op1, TYPE_PRECISION (type) - 1))
558	    return true;
559	}
560      break;
561
562    default:
563      break;
564    }
565  return false;
566}
567
568/* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
569   simplification is possible.
570   If negate_expr_p would return true for T, NULL_TREE will never be
571   returned.  */
572
573static tree
574fold_negate_expr (location_t loc, tree t)
575{
576  tree type = TREE_TYPE (t);
577  tree tem;
578
579  switch (TREE_CODE (t))
580    {
581    /* Convert - (~A) to A + 1.  */
582    case BIT_NOT_EXPR:
583      if (INTEGRAL_TYPE_P (type))
584        return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0),
585                            build_one_cst (type));
586      break;
587
588    case INTEGER_CST:
589      tem = fold_negate_const (t, type);
590      if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
591	  || (ANY_INTEGRAL_TYPE_P (type)
592	      && !TYPE_OVERFLOW_TRAPS (type)
593	      && TYPE_OVERFLOW_WRAPS (type))
594	  || (flag_sanitize & SANITIZE_SI_OVERFLOW) == 0)
595	return tem;
596      break;
597
598    case REAL_CST:
599      tem = fold_negate_const (t, type);
600      return tem;
601
602    case FIXED_CST:
603      tem = fold_negate_const (t, type);
604      return tem;
605
606    case COMPLEX_CST:
607      {
608	tree rpart = fold_negate_expr (loc, TREE_REALPART (t));
609	tree ipart = fold_negate_expr (loc, TREE_IMAGPART (t));
610	if (rpart && ipart)
611	  return build_complex (type, rpart, ipart);
612      }
613      break;
614
615    case VECTOR_CST:
616      {
617	int count = TYPE_VECTOR_SUBPARTS (type), i;
618	tree *elts = XALLOCAVEC (tree, count);
619
620	for (i = 0; i < count; i++)
621	  {
622	    elts[i] = fold_negate_expr (loc, VECTOR_CST_ELT (t, i));
623	    if (elts[i] == NULL_TREE)
624	      return NULL_TREE;
625	  }
626
627	return build_vector (type, elts);
628      }
629
630    case COMPLEX_EXPR:
631      if (negate_expr_p (t))
632	return fold_build2_loc (loc, COMPLEX_EXPR, type,
633			    fold_negate_expr (loc, TREE_OPERAND (t, 0)),
634			    fold_negate_expr (loc, TREE_OPERAND (t, 1)));
635      break;
636
637    case CONJ_EXPR:
638      if (negate_expr_p (t))
639	return fold_build1_loc (loc, CONJ_EXPR, type,
640			    fold_negate_expr (loc, TREE_OPERAND (t, 0)));
641      break;
642
643    case NEGATE_EXPR:
644      if (!TYPE_OVERFLOW_SANITIZED (type))
645	return TREE_OPERAND (t, 0);
646      break;
647
648    case PLUS_EXPR:
649      if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
650	  && !HONOR_SIGNED_ZEROS (element_mode (type)))
651	{
652	  /* -(A + B) -> (-B) - A.  */
653	  if (negate_expr_p (TREE_OPERAND (t, 1))
654	      && reorder_operands_p (TREE_OPERAND (t, 0),
655				     TREE_OPERAND (t, 1)))
656	    {
657	      tem = negate_expr (TREE_OPERAND (t, 1));
658	      return fold_build2_loc (loc, MINUS_EXPR, type,
659				  tem, TREE_OPERAND (t, 0));
660	    }
661
662	  /* -(A + B) -> (-A) - B.  */
663	  if (negate_expr_p (TREE_OPERAND (t, 0)))
664	    {
665	      tem = negate_expr (TREE_OPERAND (t, 0));
666	      return fold_build2_loc (loc, MINUS_EXPR, type,
667				  tem, TREE_OPERAND (t, 1));
668	    }
669	}
670      break;
671
672    case MINUS_EXPR:
673      /* - (A - B) -> B - A  */
674      if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
675	  && !HONOR_SIGNED_ZEROS (element_mode (type))
676	  && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
677	return fold_build2_loc (loc, MINUS_EXPR, type,
678			    TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
679      break;
680
681    case MULT_EXPR:
682      if (TYPE_UNSIGNED (type))
683        break;
684
685      /* Fall through.  */
686
687    case RDIV_EXPR:
688      if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type)))
689	{
690	  tem = TREE_OPERAND (t, 1);
691	  if (negate_expr_p (tem))
692	    return fold_build2_loc (loc, TREE_CODE (t), type,
693				TREE_OPERAND (t, 0), negate_expr (tem));
694	  tem = TREE_OPERAND (t, 0);
695	  if (negate_expr_p (tem))
696	    return fold_build2_loc (loc, TREE_CODE (t), type,
697				negate_expr (tem), TREE_OPERAND (t, 1));
698	}
699      break;
700
701    case TRUNC_DIV_EXPR:
702    case ROUND_DIV_EXPR:
703    case EXACT_DIV_EXPR:
704      /* In general we can't negate A / B, because if A is INT_MIN and
705	 B is 1, we may turn this into INT_MIN / -1 which is undefined
706	 and actually traps on some architectures.  But if overflow is
707	 undefined, we can negate, because - (INT_MIN / 1) is an
708	 overflow.  */
709      if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
710        {
711	  const char * const warnmsg = G_("assuming signed overflow does not "
712					  "occur when negating a division");
713          tem = TREE_OPERAND (t, 1);
714          if (negate_expr_p (tem))
715	    {
716	      if (INTEGRAL_TYPE_P (type)
717		  && (TREE_CODE (tem) != INTEGER_CST
718		      || integer_onep (tem)))
719		fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
720	      return fold_build2_loc (loc, TREE_CODE (t), type,
721				  TREE_OPERAND (t, 0), negate_expr (tem));
722	    }
723	  /* If overflow is undefined then we have to be careful because
724	     we ask whether it's ok to associate the negate with the
725	     division which is not ok for example for
726	     -((a - b) / c) where (-(a - b)) / c may invoke undefined
727	     overflow because of negating INT_MIN.  So do not use
728	     negate_expr_p here but open-code the two important cases.  */
729          tem = TREE_OPERAND (t, 0);
730	  if ((INTEGRAL_TYPE_P (type)
731	       && (TREE_CODE (tem) == NEGATE_EXPR
732		   || (TREE_CODE (tem) == INTEGER_CST
733		       && may_negate_without_overflow_p (tem))))
734	      || !INTEGRAL_TYPE_P (type))
735	    return fold_build2_loc (loc, TREE_CODE (t), type,
736				    negate_expr (tem), TREE_OPERAND (t, 1));
737        }
738      break;
739
740    case NOP_EXPR:
741      /* Convert -((double)float) into (double)(-float).  */
742      if (TREE_CODE (type) == REAL_TYPE)
743	{
744	  tem = strip_float_extensions (t);
745	  if (tem != t && negate_expr_p (tem))
746	    return fold_convert_loc (loc, type, negate_expr (tem));
747	}
748      break;
749
750    case CALL_EXPR:
751      /* Negate -f(x) as f(-x).  */
752      if (negate_mathfn_p (builtin_mathfn_code (t))
753	  && negate_expr_p (CALL_EXPR_ARG (t, 0)))
754	{
755	  tree fndecl, arg;
756
757	  fndecl = get_callee_fndecl (t);
758	  arg = negate_expr (CALL_EXPR_ARG (t, 0));
759	  return build_call_expr_loc (loc, fndecl, 1, arg);
760	}
761      break;
762
763    case RSHIFT_EXPR:
764      /* Optimize -((int)x >> 31) into (unsigned)x >> 31 for int.  */
765      if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
766	{
767	  tree op1 = TREE_OPERAND (t, 1);
768	  if (wi::eq_p (op1, TYPE_PRECISION (type) - 1))
769	    {
770	      tree ntype = TYPE_UNSIGNED (type)
771			   ? signed_type_for (type)
772			   : unsigned_type_for (type);
773	      tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0));
774	      temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1);
775	      return fold_convert_loc (loc, type, temp);
776	    }
777	}
778      break;
779
780    default:
781      break;
782    }
783
784  return NULL_TREE;
785}
786
787/* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
788   negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
789   return NULL_TREE. */
790
791static tree
792negate_expr (tree t)
793{
794  tree type, tem;
795  location_t loc;
796
797  if (t == NULL_TREE)
798    return NULL_TREE;
799
800  loc = EXPR_LOCATION (t);
801  type = TREE_TYPE (t);
802  STRIP_SIGN_NOPS (t);
803
804  tem = fold_negate_expr (loc, t);
805  if (!tem)
806    tem = build1_loc (loc, NEGATE_EXPR, TREE_TYPE (t), t);
807  return fold_convert_loc (loc, type, tem);
808}
809
810/* Split a tree IN into a constant, literal and variable parts that could be
811   combined with CODE to make IN.  "constant" means an expression with
812   TREE_CONSTANT but that isn't an actual constant.  CODE must be a
813   commutative arithmetic operation.  Store the constant part into *CONP,
814   the literal in *LITP and return the variable part.  If a part isn't
815   present, set it to null.  If the tree does not decompose in this way,
816   return the entire tree as the variable part and the other parts as null.
817
818   If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
819   case, we negate an operand that was subtracted.  Except if it is a
820   literal for which we use *MINUS_LITP instead.
821
822   If NEGATE_P is true, we are negating all of IN, again except a literal
823   for which we use *MINUS_LITP instead.  If a variable part is of pointer
824   type, it is negated after converting to TYPE.  This prevents us from
825   generating illegal MINUS pointer expression.  LOC is the location of
826   the converted variable part.
827
828   If IN is itself a literal or constant, return it as appropriate.
829
830   Note that we do not guarantee that any of the three values will be the
831   same type as IN, but they will have the same signedness and mode.  */
832
833static tree
834split_tree (location_t loc, tree in, tree type, enum tree_code code,
835	    tree *conp, tree *litp, tree *minus_litp, int negate_p)
836{
837  tree var = 0;
838
839  *conp = 0;
840  *litp = 0;
841  *minus_litp = 0;
842
843  /* Strip any conversions that don't change the machine mode or signedness.  */
844  STRIP_SIGN_NOPS (in);
845
846  if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
847      || TREE_CODE (in) == FIXED_CST)
848    *litp = in;
849  else if (TREE_CODE (in) == code
850	   || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
851	       && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
852	       /* We can associate addition and subtraction together (even
853		  though the C standard doesn't say so) for integers because
854		  the value is not affected.  For reals, the value might be
855		  affected, so we can't.  */
856	       && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
857		   || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
858    {
859      tree op0 = TREE_OPERAND (in, 0);
860      tree op1 = TREE_OPERAND (in, 1);
861      int neg1_p = TREE_CODE (in) == MINUS_EXPR;
862      int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
863
864      /* First see if either of the operands is a literal, then a constant.  */
865      if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
866	  || TREE_CODE (op0) == FIXED_CST)
867	*litp = op0, op0 = 0;
868      else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
869	       || TREE_CODE (op1) == FIXED_CST)
870	*litp = op1, neg_litp_p = neg1_p, op1 = 0;
871
872      if (op0 != 0 && TREE_CONSTANT (op0))
873	*conp = op0, op0 = 0;
874      else if (op1 != 0 && TREE_CONSTANT (op1))
875	*conp = op1, neg_conp_p = neg1_p, op1 = 0;
876
877      /* If we haven't dealt with either operand, this is not a case we can
878	 decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
879      if (op0 != 0 && op1 != 0)
880	var = in;
881      else if (op0 != 0)
882	var = op0;
883      else
884	var = op1, neg_var_p = neg1_p;
885
886      /* Now do any needed negations.  */
887      if (neg_litp_p)
888	*minus_litp = *litp, *litp = 0;
889      if (neg_conp_p)
890	*conp = negate_expr (*conp);
891      if (neg_var_p && var)
892	{
893	  /* Convert to TYPE before negating.  */
894	  var = fold_convert_loc (loc, type, var);
895	  var = negate_expr (var);
896	}
897    }
898  else if (TREE_CODE (in) == BIT_NOT_EXPR
899	   && code == PLUS_EXPR)
900    {
901      /* -X - 1 is folded to ~X, undo that here.  */
902      *minus_litp = build_one_cst (TREE_TYPE (in));
903      var = negate_expr (TREE_OPERAND (in, 0));
904    }
905  else if (TREE_CONSTANT (in))
906    *conp = in;
907  else
908    var = in;
909
910  if (negate_p)
911    {
912      if (*litp)
913	*minus_litp = *litp, *litp = 0;
914      else if (*minus_litp)
915	*litp = *minus_litp, *minus_litp = 0;
916      *conp = negate_expr (*conp);
917      if (var)
918	{
919	  /* Convert to TYPE before negating.  */
920	  var = fold_convert_loc (loc, type, var);
921	  var = negate_expr (var);
922	}
923    }
924
925  return var;
926}
927
928/* Re-associate trees split by the above function.  T1 and T2 are
929   either expressions to associate or null.  Return the new
930   expression, if any.  LOC is the location of the new expression.  If
931   we build an operation, do it in TYPE and with CODE.  */
932
933static tree
934associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type)
935{
936  if (t1 == 0)
937    return t2;
938  else if (t2 == 0)
939    return t1;
940
941  /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
942     try to fold this since we will have infinite recursion.  But do
943     deal with any NEGATE_EXPRs.  */
944  if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
945      || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
946    {
947      if (code == PLUS_EXPR)
948	{
949	  if (TREE_CODE (t1) == NEGATE_EXPR)
950	    return build2_loc (loc, MINUS_EXPR, type,
951			       fold_convert_loc (loc, type, t2),
952			       fold_convert_loc (loc, type,
953						 TREE_OPERAND (t1, 0)));
954	  else if (TREE_CODE (t2) == NEGATE_EXPR)
955	    return build2_loc (loc, MINUS_EXPR, type,
956			       fold_convert_loc (loc, type, t1),
957			       fold_convert_loc (loc, type,
958						 TREE_OPERAND (t2, 0)));
959	  else if (integer_zerop (t2))
960	    return fold_convert_loc (loc, type, t1);
961	}
962      else if (code == MINUS_EXPR)
963	{
964	  if (integer_zerop (t2))
965	    return fold_convert_loc (loc, type, t1);
966	}
967
968      return build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
969			 fold_convert_loc (loc, type, t2));
970    }
971
972  return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
973			  fold_convert_loc (loc, type, t2));
974}
975
976/* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
977   for use in int_const_binop, size_binop and size_diffop.  */
978
979static bool
980int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
981{
982  if (!INTEGRAL_TYPE_P (type1) && !POINTER_TYPE_P (type1))
983    return false;
984  if (!INTEGRAL_TYPE_P (type2) && !POINTER_TYPE_P (type2))
985    return false;
986
987  switch (code)
988    {
989    case LSHIFT_EXPR:
990    case RSHIFT_EXPR:
991    case LROTATE_EXPR:
992    case RROTATE_EXPR:
993      return true;
994
995    default:
996      break;
997    }
998
999  return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
1000	 && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1001	 && TYPE_MODE (type1) == TYPE_MODE (type2);
1002}
1003
1004
1005/* Combine two integer constants ARG1 and ARG2 under operation CODE
1006   to produce a new constant.  Return NULL_TREE if we don't know how
1007   to evaluate CODE at compile-time.  */
1008
1009static tree
1010int_const_binop_1 (enum tree_code code, const_tree arg1, const_tree parg2,
1011		   int overflowable)
1012{
1013  wide_int res;
1014  tree t;
1015  tree type = TREE_TYPE (arg1);
1016  signop sign = TYPE_SIGN (type);
1017  bool overflow = false;
1018
1019  wide_int arg2 = wide_int::from (parg2, TYPE_PRECISION (type),
1020				  TYPE_SIGN (TREE_TYPE (parg2)));
1021
1022  switch (code)
1023    {
1024    case BIT_IOR_EXPR:
1025      res = wi::bit_or (arg1, arg2);
1026      break;
1027
1028    case BIT_XOR_EXPR:
1029      res = wi::bit_xor (arg1, arg2);
1030      break;
1031
1032    case BIT_AND_EXPR:
1033      res = wi::bit_and (arg1, arg2);
1034      break;
1035
1036    case RSHIFT_EXPR:
1037    case LSHIFT_EXPR:
1038      if (wi::neg_p (arg2))
1039	{
1040	  arg2 = -arg2;
1041	  if (code == RSHIFT_EXPR)
1042	    code = LSHIFT_EXPR;
1043	  else
1044	    code = RSHIFT_EXPR;
1045	}
1046
1047      if (code == RSHIFT_EXPR)
1048	/* It's unclear from the C standard whether shifts can overflow.
1049	   The following code ignores overflow; perhaps a C standard
1050	   interpretation ruling is needed.  */
1051	res = wi::rshift (arg1, arg2, sign);
1052      else
1053	res = wi::lshift (arg1, arg2);
1054      break;
1055
1056    case RROTATE_EXPR:
1057    case LROTATE_EXPR:
1058      if (wi::neg_p (arg2))
1059	{
1060	  arg2 = -arg2;
1061	  if (code == RROTATE_EXPR)
1062	    code = LROTATE_EXPR;
1063	  else
1064	    code = RROTATE_EXPR;
1065	}
1066
1067      if (code == RROTATE_EXPR)
1068	res = wi::rrotate (arg1, arg2);
1069      else
1070	res = wi::lrotate (arg1, arg2);
1071      break;
1072
1073    case PLUS_EXPR:
1074      res = wi::add (arg1, arg2, sign, &overflow);
1075      break;
1076
1077    case MINUS_EXPR:
1078      res = wi::sub (arg1, arg2, sign, &overflow);
1079      break;
1080
1081    case MULT_EXPR:
1082      res = wi::mul (arg1, arg2, sign, &overflow);
1083      break;
1084
1085    case MULT_HIGHPART_EXPR:
1086      res = wi::mul_high (arg1, arg2, sign);
1087      break;
1088
1089    case TRUNC_DIV_EXPR:
1090    case EXACT_DIV_EXPR:
1091      if (arg2 == 0)
1092	return NULL_TREE;
1093      res = wi::div_trunc (arg1, arg2, sign, &overflow);
1094      break;
1095
1096    case FLOOR_DIV_EXPR:
1097      if (arg2 == 0)
1098	return NULL_TREE;
1099      res = wi::div_floor (arg1, arg2, sign, &overflow);
1100      break;
1101
1102    case CEIL_DIV_EXPR:
1103      if (arg2 == 0)
1104	return NULL_TREE;
1105      res = wi::div_ceil (arg1, arg2, sign, &overflow);
1106      break;
1107
1108    case ROUND_DIV_EXPR:
1109      if (arg2 == 0)
1110	return NULL_TREE;
1111      res = wi::div_round (arg1, arg2, sign, &overflow);
1112      break;
1113
1114    case TRUNC_MOD_EXPR:
1115      if (arg2 == 0)
1116	return NULL_TREE;
1117      res = wi::mod_trunc (arg1, arg2, sign, &overflow);
1118      break;
1119
1120    case FLOOR_MOD_EXPR:
1121      if (arg2 == 0)
1122	return NULL_TREE;
1123      res = wi::mod_floor (arg1, arg2, sign, &overflow);
1124      break;
1125
1126    case CEIL_MOD_EXPR:
1127      if (arg2 == 0)
1128	return NULL_TREE;
1129      res = wi::mod_ceil (arg1, arg2, sign, &overflow);
1130      break;
1131
1132    case ROUND_MOD_EXPR:
1133      if (arg2 == 0)
1134	return NULL_TREE;
1135      res = wi::mod_round (arg1, arg2, sign, &overflow);
1136      break;
1137
1138    case MIN_EXPR:
1139      res = wi::min (arg1, arg2, sign);
1140      break;
1141
1142    case MAX_EXPR:
1143      res = wi::max (arg1, arg2, sign);
1144      break;
1145
1146    default:
1147      return NULL_TREE;
1148    }
1149
1150  t = force_fit_type (type, res, overflowable,
1151		      (((sign == SIGNED || overflowable == -1)
1152			&& overflow)
1153		       | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (parg2)));
1154
1155  return t;
1156}
1157
1158tree
1159int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2)
1160{
1161  return int_const_binop_1 (code, arg1, arg2, 1);
1162}
1163
1164/* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1165   constant.  We assume ARG1 and ARG2 have the same data type, or at least
1166   are the same kind of constant and the same machine mode.  Return zero if
1167   combining the constants is not allowed in the current operating mode.  */
1168
1169static tree
1170const_binop (enum tree_code code, tree arg1, tree arg2)
1171{
1172  /* Sanity check for the recursive cases.  */
1173  if (!arg1 || !arg2)
1174    return NULL_TREE;
1175
1176  STRIP_NOPS (arg1);
1177  STRIP_NOPS (arg2);
1178
1179  if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg2) == INTEGER_CST)
1180    {
1181      if (code == POINTER_PLUS_EXPR)
1182	return int_const_binop (PLUS_EXPR,
1183				arg1, fold_convert (TREE_TYPE (arg1), arg2));
1184
1185      return int_const_binop (code, arg1, arg2);
1186    }
1187
1188  if (TREE_CODE (arg1) == REAL_CST && TREE_CODE (arg2) == REAL_CST)
1189    {
1190      machine_mode mode;
1191      REAL_VALUE_TYPE d1;
1192      REAL_VALUE_TYPE d2;
1193      REAL_VALUE_TYPE value;
1194      REAL_VALUE_TYPE result;
1195      bool inexact;
1196      tree t, type;
1197
1198      /* The following codes are handled by real_arithmetic.  */
1199      switch (code)
1200	{
1201	case PLUS_EXPR:
1202	case MINUS_EXPR:
1203	case MULT_EXPR:
1204	case RDIV_EXPR:
1205	case MIN_EXPR:
1206	case MAX_EXPR:
1207	  break;
1208
1209	default:
1210	  return NULL_TREE;
1211	}
1212
1213      d1 = TREE_REAL_CST (arg1);
1214      d2 = TREE_REAL_CST (arg2);
1215
1216      type = TREE_TYPE (arg1);
1217      mode = TYPE_MODE (type);
1218
1219      /* Don't perform operation if we honor signaling NaNs and
1220	 either operand is a NaN.  */
1221      if (HONOR_SNANS (mode)
1222	  && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1223	return NULL_TREE;
1224
1225      /* Don't perform operation if it would raise a division
1226	 by zero exception.  */
1227      if (code == RDIV_EXPR
1228	  && REAL_VALUES_EQUAL (d2, dconst0)
1229	  && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1230	return NULL_TREE;
1231
1232      /* If either operand is a NaN, just return it.  Otherwise, set up
1233	 for floating-point trap; we return an overflow.  */
1234      if (REAL_VALUE_ISNAN (d1))
1235	return arg1;
1236      else if (REAL_VALUE_ISNAN (d2))
1237	return arg2;
1238
1239      inexact = real_arithmetic (&value, code, &d1, &d2);
1240      real_convert (&result, mode, &value);
1241
1242      /* Don't constant fold this floating point operation if
1243	 the result has overflowed and flag_trapping_math.  */
1244      if (flag_trapping_math
1245	  && MODE_HAS_INFINITIES (mode)
1246	  && REAL_VALUE_ISINF (result)
1247	  && !REAL_VALUE_ISINF (d1)
1248	  && !REAL_VALUE_ISINF (d2))
1249	return NULL_TREE;
1250
1251      /* Don't constant fold this floating point operation if the
1252	 result may dependent upon the run-time rounding mode and
1253	 flag_rounding_math is set, or if GCC's software emulation
1254	 is unable to accurately represent the result.  */
1255      if ((flag_rounding_math
1256	   || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
1257	  && (inexact || !real_identical (&result, &value)))
1258	return NULL_TREE;
1259
1260      t = build_real (type, result);
1261
1262      TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1263      return t;
1264    }
1265
1266  if (TREE_CODE (arg1) == FIXED_CST)
1267    {
1268      FIXED_VALUE_TYPE f1;
1269      FIXED_VALUE_TYPE f2;
1270      FIXED_VALUE_TYPE result;
1271      tree t, type;
1272      int sat_p;
1273      bool overflow_p;
1274
1275      /* The following codes are handled by fixed_arithmetic.  */
1276      switch (code)
1277        {
1278	case PLUS_EXPR:
1279	case MINUS_EXPR:
1280	case MULT_EXPR:
1281	case TRUNC_DIV_EXPR:
1282	  if (TREE_CODE (arg2) != FIXED_CST)
1283	    return NULL_TREE;
1284	  f2 = TREE_FIXED_CST (arg2);
1285	  break;
1286
1287	case LSHIFT_EXPR:
1288	case RSHIFT_EXPR:
1289	  {
1290	    if (TREE_CODE (arg2) != INTEGER_CST)
1291	      return NULL_TREE;
1292	    wide_int w2 = arg2;
1293	    f2.data.high = w2.elt (1);
1294	    f2.data.low = w2.elt (0);
1295	    f2.mode = SImode;
1296	  }
1297	  break;
1298
1299        default:
1300	  return NULL_TREE;
1301        }
1302
1303      f1 = TREE_FIXED_CST (arg1);
1304      type = TREE_TYPE (arg1);
1305      sat_p = TYPE_SATURATING (type);
1306      overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1307      t = build_fixed (type, result);
1308      /* Propagate overflow flags.  */
1309      if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1310	TREE_OVERFLOW (t) = 1;
1311      return t;
1312    }
1313
1314  if (TREE_CODE (arg1) == COMPLEX_CST && TREE_CODE (arg2) == COMPLEX_CST)
1315    {
1316      tree type = TREE_TYPE (arg1);
1317      tree r1 = TREE_REALPART (arg1);
1318      tree i1 = TREE_IMAGPART (arg1);
1319      tree r2 = TREE_REALPART (arg2);
1320      tree i2 = TREE_IMAGPART (arg2);
1321      tree real, imag;
1322
1323      switch (code)
1324	{
1325	case PLUS_EXPR:
1326	case MINUS_EXPR:
1327	  real = const_binop (code, r1, r2);
1328	  imag = const_binop (code, i1, i2);
1329	  break;
1330
1331	case MULT_EXPR:
1332	  if (COMPLEX_FLOAT_TYPE_P (type))
1333	    return do_mpc_arg2 (arg1, arg2, type,
1334				/* do_nonfinite= */ folding_initializer,
1335				mpc_mul);
1336
1337	  real = const_binop (MINUS_EXPR,
1338			      const_binop (MULT_EXPR, r1, r2),
1339			      const_binop (MULT_EXPR, i1, i2));
1340	  imag = const_binop (PLUS_EXPR,
1341			      const_binop (MULT_EXPR, r1, i2),
1342			      const_binop (MULT_EXPR, i1, r2));
1343	  break;
1344
1345	case RDIV_EXPR:
1346	  if (COMPLEX_FLOAT_TYPE_P (type))
1347	    return do_mpc_arg2 (arg1, arg2, type,
1348                                /* do_nonfinite= */ folding_initializer,
1349				mpc_div);
1350	  /* Fallthru ... */
1351	case TRUNC_DIV_EXPR:
1352	case CEIL_DIV_EXPR:
1353	case FLOOR_DIV_EXPR:
1354	case ROUND_DIV_EXPR:
1355	  if (flag_complex_method == 0)
1356	  {
1357	    /* Keep this algorithm in sync with
1358	       tree-complex.c:expand_complex_div_straight().
1359
1360	       Expand complex division to scalars, straightforward algorithm.
1361	       a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t)
1362	       t = br*br + bi*bi
1363	    */
1364	    tree magsquared
1365	      = const_binop (PLUS_EXPR,
1366			     const_binop (MULT_EXPR, r2, r2),
1367			     const_binop (MULT_EXPR, i2, i2));
1368	    tree t1
1369	      = const_binop (PLUS_EXPR,
1370			     const_binop (MULT_EXPR, r1, r2),
1371			     const_binop (MULT_EXPR, i1, i2));
1372	    tree t2
1373	      = const_binop (MINUS_EXPR,
1374			     const_binop (MULT_EXPR, i1, r2),
1375			     const_binop (MULT_EXPR, r1, i2));
1376
1377	    real = const_binop (code, t1, magsquared);
1378	    imag = const_binop (code, t2, magsquared);
1379	  }
1380	  else
1381	  {
1382	    /* Keep this algorithm in sync with
1383               tree-complex.c:expand_complex_div_wide().
1384
1385	       Expand complex division to scalars, modified algorithm to minimize
1386	       overflow with wide input ranges.  */
1387	    tree compare = fold_build2 (LT_EXPR, boolean_type_node,
1388					fold_abs_const (r2, TREE_TYPE (type)),
1389					fold_abs_const (i2, TREE_TYPE (type)));
1390
1391	    if (integer_nonzerop (compare))
1392	      {
1393		/* In the TRUE branch, we compute
1394		   ratio = br/bi;
1395		   div = (br * ratio) + bi;
1396		   tr = (ar * ratio) + ai;
1397		   ti = (ai * ratio) - ar;
1398		   tr = tr / div;
1399		   ti = ti / div;  */
1400		tree ratio = const_binop (code, r2, i2);
1401		tree div = const_binop (PLUS_EXPR, i2,
1402					const_binop (MULT_EXPR, r2, ratio));
1403		real = const_binop (MULT_EXPR, r1, ratio);
1404		real = const_binop (PLUS_EXPR, real, i1);
1405		real = const_binop (code, real, div);
1406
1407		imag = const_binop (MULT_EXPR, i1, ratio);
1408		imag = const_binop (MINUS_EXPR, imag, r1);
1409		imag = const_binop (code, imag, div);
1410	      }
1411	    else
1412	      {
1413		/* In the FALSE branch, we compute
1414		   ratio = d/c;
1415		   divisor = (d * ratio) + c;
1416		   tr = (b * ratio) + a;
1417		   ti = b - (a * ratio);
1418		   tr = tr / div;
1419		   ti = ti / div;  */
1420		tree ratio = const_binop (code, i2, r2);
1421		tree div = const_binop (PLUS_EXPR, r2,
1422                                        const_binop (MULT_EXPR, i2, ratio));
1423
1424		real = const_binop (MULT_EXPR, i1, ratio);
1425		real = const_binop (PLUS_EXPR, real, r1);
1426		real = const_binop (code, real, div);
1427
1428		imag = const_binop (MULT_EXPR, r1, ratio);
1429		imag = const_binop (MINUS_EXPR, i1, imag);
1430		imag = const_binop (code, imag, div);
1431	      }
1432	  }
1433	  break;
1434
1435	default:
1436	  return NULL_TREE;
1437	}
1438
1439      if (real && imag)
1440	return build_complex (type, real, imag);
1441    }
1442
1443  if (TREE_CODE (arg1) == VECTOR_CST
1444      && TREE_CODE (arg2) == VECTOR_CST)
1445    {
1446      tree type = TREE_TYPE (arg1);
1447      int count = TYPE_VECTOR_SUBPARTS (type), i;
1448      tree *elts = XALLOCAVEC (tree, count);
1449
1450      for (i = 0; i < count; i++)
1451	{
1452	  tree elem1 = VECTOR_CST_ELT (arg1, i);
1453	  tree elem2 = VECTOR_CST_ELT (arg2, i);
1454
1455	  elts[i] = const_binop (code, elem1, elem2);
1456
1457	  /* It is possible that const_binop cannot handle the given
1458	     code and return NULL_TREE */
1459	  if (elts[i] == NULL_TREE)
1460	    return NULL_TREE;
1461	}
1462
1463      return build_vector (type, elts);
1464    }
1465
1466  /* Shifts allow a scalar offset for a vector.  */
1467  if (TREE_CODE (arg1) == VECTOR_CST
1468      && TREE_CODE (arg2) == INTEGER_CST)
1469    {
1470      tree type = TREE_TYPE (arg1);
1471      int count = TYPE_VECTOR_SUBPARTS (type), i;
1472      tree *elts = XALLOCAVEC (tree, count);
1473
1474      for (i = 0; i < count; i++)
1475	{
1476	  tree elem1 = VECTOR_CST_ELT (arg1, i);
1477
1478	  elts[i] = const_binop (code, elem1, arg2);
1479
1480	  /* It is possible that const_binop cannot handle the given
1481	     code and return NULL_TREE.  */
1482	  if (elts[i] == NULL_TREE)
1483	    return NULL_TREE;
1484	}
1485
1486      return build_vector (type, elts);
1487    }
1488  return NULL_TREE;
1489}
1490
1491/* Overload that adds a TYPE parameter to be able to dispatch
1492   to fold_relational_const.  */
1493
1494tree
1495const_binop (enum tree_code code, tree type, tree arg1, tree arg2)
1496{
1497  if (TREE_CODE_CLASS (code) == tcc_comparison)
1498    return fold_relational_const (code, type, arg1, arg2);
1499
1500  /* ???  Until we make the const_binop worker take the type of the
1501     result as argument put those cases that need it here.  */
1502  switch (code)
1503    {
1504    case COMPLEX_EXPR:
1505      if ((TREE_CODE (arg1) == REAL_CST
1506	   && TREE_CODE (arg2) == REAL_CST)
1507	  || (TREE_CODE (arg1) == INTEGER_CST
1508	      && TREE_CODE (arg2) == INTEGER_CST))
1509	return build_complex (type, arg1, arg2);
1510      return NULL_TREE;
1511
1512    case VEC_PACK_TRUNC_EXPR:
1513    case VEC_PACK_FIX_TRUNC_EXPR:
1514      {
1515	unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
1516	tree *elts;
1517
1518	gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts / 2
1519		    && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg2)) == nelts / 2);
1520	if (TREE_CODE (arg1) != VECTOR_CST
1521	    || TREE_CODE (arg2) != VECTOR_CST)
1522	  return NULL_TREE;
1523
1524	elts = XALLOCAVEC (tree, nelts);
1525	if (!vec_cst_ctor_to_array (arg1, elts)
1526	    || !vec_cst_ctor_to_array (arg2, elts + nelts / 2))
1527	  return NULL_TREE;
1528
1529	for (i = 0; i < nelts; i++)
1530	  {
1531	    elts[i] = fold_convert_const (code == VEC_PACK_TRUNC_EXPR
1532					  ? NOP_EXPR : FIX_TRUNC_EXPR,
1533					  TREE_TYPE (type), elts[i]);
1534	    if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
1535	      return NULL_TREE;
1536	  }
1537
1538	return build_vector (type, elts);
1539      }
1540
1541    case VEC_WIDEN_MULT_LO_EXPR:
1542    case VEC_WIDEN_MULT_HI_EXPR:
1543    case VEC_WIDEN_MULT_EVEN_EXPR:
1544    case VEC_WIDEN_MULT_ODD_EXPR:
1545      {
1546	unsigned int nelts = TYPE_VECTOR_SUBPARTS (type);
1547	unsigned int out, ofs, scale;
1548	tree *elts;
1549
1550	gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts * 2
1551		    && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg2)) == nelts * 2);
1552	if (TREE_CODE (arg1) != VECTOR_CST || TREE_CODE (arg2) != VECTOR_CST)
1553	  return NULL_TREE;
1554
1555	elts = XALLOCAVEC (tree, nelts * 4);
1556	if (!vec_cst_ctor_to_array (arg1, elts)
1557	    || !vec_cst_ctor_to_array (arg2, elts + nelts * 2))
1558	  return NULL_TREE;
1559
1560	if (code == VEC_WIDEN_MULT_LO_EXPR)
1561	  scale = 0, ofs = BYTES_BIG_ENDIAN ? nelts : 0;
1562	else if (code == VEC_WIDEN_MULT_HI_EXPR)
1563	  scale = 0, ofs = BYTES_BIG_ENDIAN ? 0 : nelts;
1564	else if (code == VEC_WIDEN_MULT_EVEN_EXPR)
1565	  scale = 1, ofs = 0;
1566	else /* if (code == VEC_WIDEN_MULT_ODD_EXPR) */
1567	  scale = 1, ofs = 1;
1568
1569	for (out = 0; out < nelts; out++)
1570	  {
1571	    unsigned int in1 = (out << scale) + ofs;
1572	    unsigned int in2 = in1 + nelts * 2;
1573	    tree t1, t2;
1574
1575	    t1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in1]);
1576	    t2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in2]);
1577
1578	    if (t1 == NULL_TREE || t2 == NULL_TREE)
1579	      return NULL_TREE;
1580	    elts[out] = const_binop (MULT_EXPR, t1, t2);
1581	    if (elts[out] == NULL_TREE || !CONSTANT_CLASS_P (elts[out]))
1582	      return NULL_TREE;
1583	  }
1584
1585	return build_vector (type, elts);
1586      }
1587
1588    default:;
1589    }
1590
1591  if (TREE_CODE_CLASS (code) != tcc_binary)
1592    return NULL_TREE;
1593
1594  /* Make sure type and arg0 have the same saturating flag.  */
1595  gcc_checking_assert (TYPE_SATURATING (type)
1596		       == TYPE_SATURATING (TREE_TYPE (arg1)));
1597
1598  return const_binop (code, arg1, arg2);
1599}
1600
1601/* Compute CODE ARG1 with resulting type TYPE with ARG1 being constant.
1602   Return zero if computing the constants is not possible.  */
1603
1604tree
1605const_unop (enum tree_code code, tree type, tree arg0)
1606{
1607  switch (code)
1608    {
1609    CASE_CONVERT:
1610    case FLOAT_EXPR:
1611    case FIX_TRUNC_EXPR:
1612    case FIXED_CONVERT_EXPR:
1613      return fold_convert_const (code, type, arg0);
1614
1615    case ADDR_SPACE_CONVERT_EXPR:
1616      if (integer_zerop (arg0))
1617	return fold_convert_const (code, type, arg0);
1618      break;
1619
1620    case VIEW_CONVERT_EXPR:
1621      return fold_view_convert_expr (type, arg0);
1622
1623    case NEGATE_EXPR:
1624      {
1625	/* Can't call fold_negate_const directly here as that doesn't
1626	   handle all cases and we might not be able to negate some
1627	   constants.  */
1628	tree tem = fold_negate_expr (UNKNOWN_LOCATION, arg0);
1629	if (tem && CONSTANT_CLASS_P (tem))
1630	  return tem;
1631	break;
1632      }
1633
1634    case ABS_EXPR:
1635      if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
1636	return fold_abs_const (arg0, type);
1637      break;
1638
1639    case CONJ_EXPR:
1640      if (TREE_CODE (arg0) == COMPLEX_CST)
1641	{
1642	  tree ipart = fold_negate_const (TREE_IMAGPART (arg0),
1643					  TREE_TYPE (type));
1644	  return build_complex (type, TREE_REALPART (arg0), ipart);
1645	}
1646      break;
1647
1648    case BIT_NOT_EXPR:
1649      if (TREE_CODE (arg0) == INTEGER_CST)
1650	return fold_not_const (arg0, type);
1651      /* Perform BIT_NOT_EXPR on each element individually.  */
1652      else if (TREE_CODE (arg0) == VECTOR_CST)
1653	{
1654	  tree *elements;
1655	  tree elem;
1656	  unsigned count = VECTOR_CST_NELTS (arg0), i;
1657
1658	  elements = XALLOCAVEC (tree, count);
1659	  for (i = 0; i < count; i++)
1660	    {
1661	      elem = VECTOR_CST_ELT (arg0, i);
1662	      elem = const_unop (BIT_NOT_EXPR, TREE_TYPE (type), elem);
1663	      if (elem == NULL_TREE)
1664		break;
1665	      elements[i] = elem;
1666	    }
1667	  if (i == count)
1668	    return build_vector (type, elements);
1669	}
1670      break;
1671
1672    case TRUTH_NOT_EXPR:
1673      if (TREE_CODE (arg0) == INTEGER_CST)
1674	return constant_boolean_node (integer_zerop (arg0), type);
1675      break;
1676
1677    case REALPART_EXPR:
1678      if (TREE_CODE (arg0) == COMPLEX_CST)
1679	return fold_convert (type, TREE_REALPART (arg0));
1680      break;
1681
1682    case IMAGPART_EXPR:
1683      if (TREE_CODE (arg0) == COMPLEX_CST)
1684	return fold_convert (type, TREE_IMAGPART (arg0));
1685      break;
1686
1687    case VEC_UNPACK_LO_EXPR:
1688    case VEC_UNPACK_HI_EXPR:
1689    case VEC_UNPACK_FLOAT_LO_EXPR:
1690    case VEC_UNPACK_FLOAT_HI_EXPR:
1691      {
1692	unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
1693	tree *elts;
1694	enum tree_code subcode;
1695
1696	gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts * 2);
1697	if (TREE_CODE (arg0) != VECTOR_CST)
1698	  return NULL_TREE;
1699
1700	elts = XALLOCAVEC (tree, nelts * 2);
1701	if (!vec_cst_ctor_to_array (arg0, elts))
1702	  return NULL_TREE;
1703
1704	if ((!BYTES_BIG_ENDIAN) ^ (code == VEC_UNPACK_LO_EXPR
1705				   || code == VEC_UNPACK_FLOAT_LO_EXPR))
1706	  elts += nelts;
1707
1708	if (code == VEC_UNPACK_LO_EXPR || code == VEC_UNPACK_HI_EXPR)
1709	  subcode = NOP_EXPR;
1710	else
1711	  subcode = FLOAT_EXPR;
1712
1713	for (i = 0; i < nelts; i++)
1714	  {
1715	    elts[i] = fold_convert_const (subcode, TREE_TYPE (type), elts[i]);
1716	    if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
1717	      return NULL_TREE;
1718	  }
1719
1720	return build_vector (type, elts);
1721      }
1722
1723    case REDUC_MIN_EXPR:
1724    case REDUC_MAX_EXPR:
1725    case REDUC_PLUS_EXPR:
1726      {
1727	unsigned int nelts, i;
1728	tree *elts;
1729	enum tree_code subcode;
1730
1731	if (TREE_CODE (arg0) != VECTOR_CST)
1732	  return NULL_TREE;
1733        nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0));
1734
1735	elts = XALLOCAVEC (tree, nelts);
1736	if (!vec_cst_ctor_to_array (arg0, elts))
1737	  return NULL_TREE;
1738
1739	switch (code)
1740	  {
1741	  case REDUC_MIN_EXPR: subcode = MIN_EXPR; break;
1742	  case REDUC_MAX_EXPR: subcode = MAX_EXPR; break;
1743	  case REDUC_PLUS_EXPR: subcode = PLUS_EXPR; break;
1744	  default: gcc_unreachable ();
1745	  }
1746
1747	for (i = 1; i < nelts; i++)
1748	  {
1749	    elts[0] = const_binop (subcode, elts[0], elts[i]);
1750	    if (elts[0] == NULL_TREE || !CONSTANT_CLASS_P (elts[0]))
1751	      return NULL_TREE;
1752	  }
1753
1754	return elts[0];
1755      }
1756
1757    default:
1758      break;
1759    }
1760
1761  return NULL_TREE;
1762}
1763
1764/* Create a sizetype INT_CST node with NUMBER sign extended.  KIND
1765   indicates which particular sizetype to create.  */
1766
1767tree
1768size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1769{
1770  return build_int_cst (sizetype_tab[(int) kind], number);
1771}
1772
1773/* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
1774   is a tree code.  The type of the result is taken from the operands.
1775   Both must be equivalent integer types, ala int_binop_types_match_p.
1776   If the operands are constant, so is the result.  */
1777
1778tree
1779size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1)
1780{
1781  tree type = TREE_TYPE (arg0);
1782
1783  if (arg0 == error_mark_node || arg1 == error_mark_node)
1784    return error_mark_node;
1785
1786  gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
1787                                       TREE_TYPE (arg1)));
1788
1789  /* Handle the special case of two integer constants faster.  */
1790  if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1791    {
1792      /* And some specific cases even faster than that.  */
1793      if (code == PLUS_EXPR)
1794	{
1795	  if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
1796	    return arg1;
1797	  if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1798	    return arg0;
1799	}
1800      else if (code == MINUS_EXPR)
1801	{
1802	  if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1803	    return arg0;
1804	}
1805      else if (code == MULT_EXPR)
1806	{
1807	  if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
1808	    return arg1;
1809	}
1810
1811      /* Handle general case of two integer constants.  For sizetype
1812         constant calculations we always want to know about overflow,
1813	 even in the unsigned case.  */
1814      return int_const_binop_1 (code, arg0, arg1, -1);
1815    }
1816
1817  return fold_build2_loc (loc, code, type, arg0, arg1);
1818}
1819
1820/* Given two values, either both of sizetype or both of bitsizetype,
1821   compute the difference between the two values.  Return the value
1822   in signed type corresponding to the type of the operands.  */
1823
1824tree
1825size_diffop_loc (location_t loc, tree arg0, tree arg1)
1826{
1827  tree type = TREE_TYPE (arg0);
1828  tree ctype;
1829
1830  gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
1831				       TREE_TYPE (arg1)));
1832
1833  /* If the type is already signed, just do the simple thing.  */
1834  if (!TYPE_UNSIGNED (type))
1835    return size_binop_loc (loc, MINUS_EXPR, arg0, arg1);
1836
1837  if (type == sizetype)
1838    ctype = ssizetype;
1839  else if (type == bitsizetype)
1840    ctype = sbitsizetype;
1841  else
1842    ctype = signed_type_for (type);
1843
1844  /* If either operand is not a constant, do the conversions to the signed
1845     type and subtract.  The hardware will do the right thing with any
1846     overflow in the subtraction.  */
1847  if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
1848    return size_binop_loc (loc, MINUS_EXPR,
1849			   fold_convert_loc (loc, ctype, arg0),
1850			   fold_convert_loc (loc, ctype, arg1));
1851
1852  /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1853     Otherwise, subtract the other way, convert to CTYPE (we know that can't
1854     overflow) and negate (which can't either).  Special-case a result
1855     of zero while we're here.  */
1856  if (tree_int_cst_equal (arg0, arg1))
1857    return build_int_cst (ctype, 0);
1858  else if (tree_int_cst_lt (arg1, arg0))
1859    return fold_convert_loc (loc, ctype,
1860			     size_binop_loc (loc, MINUS_EXPR, arg0, arg1));
1861  else
1862    return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0),
1863			   fold_convert_loc (loc, ctype,
1864					     size_binop_loc (loc,
1865							     MINUS_EXPR,
1866							     arg1, arg0)));
1867}
1868
1869/* A subroutine of fold_convert_const handling conversions of an
1870   INTEGER_CST to another integer type.  */
1871
1872static tree
1873fold_convert_const_int_from_int (tree type, const_tree arg1)
1874{
1875  /* Given an integer constant, make new constant with new type,
1876     appropriately sign-extended or truncated.  Use widest_int
1877     so that any extension is done according ARG1's type.  */
1878  return force_fit_type (type, wi::to_widest (arg1),
1879			 !POINTER_TYPE_P (TREE_TYPE (arg1)),
1880			 TREE_OVERFLOW (arg1));
1881}
1882
1883/* A subroutine of fold_convert_const handling conversions a REAL_CST
1884   to an integer type.  */
1885
1886static tree
1887fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
1888{
1889  bool overflow = false;
1890  tree t;
1891
1892  /* The following code implements the floating point to integer
1893     conversion rules required by the Java Language Specification,
1894     that IEEE NaNs are mapped to zero and values that overflow
1895     the target precision saturate, i.e. values greater than
1896     INT_MAX are mapped to INT_MAX, and values less than INT_MIN
1897     are mapped to INT_MIN.  These semantics are allowed by the
1898     C and C++ standards that simply state that the behavior of
1899     FP-to-integer conversion is unspecified upon overflow.  */
1900
1901  wide_int val;
1902  REAL_VALUE_TYPE r;
1903  REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
1904
1905  switch (code)
1906    {
1907    case FIX_TRUNC_EXPR:
1908      real_trunc (&r, VOIDmode, &x);
1909      break;
1910
1911    default:
1912      gcc_unreachable ();
1913    }
1914
1915  /* If R is NaN, return zero and show we have an overflow.  */
1916  if (REAL_VALUE_ISNAN (r))
1917    {
1918      overflow = true;
1919      val = wi::zero (TYPE_PRECISION (type));
1920    }
1921
1922  /* See if R is less than the lower bound or greater than the
1923     upper bound.  */
1924
1925  if (! overflow)
1926    {
1927      tree lt = TYPE_MIN_VALUE (type);
1928      REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
1929      if (REAL_VALUES_LESS (r, l))
1930	{
1931	  overflow = true;
1932	  val = lt;
1933	}
1934    }
1935
1936  if (! overflow)
1937    {
1938      tree ut = TYPE_MAX_VALUE (type);
1939      if (ut)
1940	{
1941	  REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
1942	  if (REAL_VALUES_LESS (u, r))
1943	    {
1944	      overflow = true;
1945	      val = ut;
1946	    }
1947	}
1948    }
1949
1950  if (! overflow)
1951    val = real_to_integer (&r, &overflow, TYPE_PRECISION (type));
1952
1953  t = force_fit_type (type, val, -1, overflow | TREE_OVERFLOW (arg1));
1954  return t;
1955}
1956
1957/* A subroutine of fold_convert_const handling conversions of a
1958   FIXED_CST to an integer type.  */
1959
1960static tree
1961fold_convert_const_int_from_fixed (tree type, const_tree arg1)
1962{
1963  tree t;
1964  double_int temp, temp_trunc;
1965  unsigned int mode;
1966
1967  /* Right shift FIXED_CST to temp by fbit.  */
1968  temp = TREE_FIXED_CST (arg1).data;
1969  mode = TREE_FIXED_CST (arg1).mode;
1970  if (GET_MODE_FBIT (mode) < HOST_BITS_PER_DOUBLE_INT)
1971    {
1972      temp = temp.rshift (GET_MODE_FBIT (mode),
1973			  HOST_BITS_PER_DOUBLE_INT,
1974			  SIGNED_FIXED_POINT_MODE_P (mode));
1975
1976      /* Left shift temp to temp_trunc by fbit.  */
1977      temp_trunc = temp.lshift (GET_MODE_FBIT (mode),
1978				HOST_BITS_PER_DOUBLE_INT,
1979				SIGNED_FIXED_POINT_MODE_P (mode));
1980    }
1981  else
1982    {
1983      temp = double_int_zero;
1984      temp_trunc = double_int_zero;
1985    }
1986
1987  /* If FIXED_CST is negative, we need to round the value toward 0.
1988     By checking if the fractional bits are not zero to add 1 to temp.  */
1989  if (SIGNED_FIXED_POINT_MODE_P (mode)
1990      && temp_trunc.is_negative ()
1991      && TREE_FIXED_CST (arg1).data != temp_trunc)
1992    temp += double_int_one;
1993
1994  /* Given a fixed-point constant, make new constant with new type,
1995     appropriately sign-extended or truncated.  */
1996  t = force_fit_type (type, temp, -1,
1997		      (temp.is_negative ()
1998		       && (TYPE_UNSIGNED (type)
1999			   < TYPE_UNSIGNED (TREE_TYPE (arg1))))
2000		      | TREE_OVERFLOW (arg1));
2001
2002  return t;
2003}
2004
2005/* A subroutine of fold_convert_const handling conversions a REAL_CST
2006   to another floating point type.  */
2007
2008static tree
2009fold_convert_const_real_from_real (tree type, const_tree arg1)
2010{
2011  REAL_VALUE_TYPE value;
2012  tree t;
2013
2014  real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
2015  t = build_real (type, value);
2016
2017  /* If converting an infinity or NAN to a representation that doesn't
2018     have one, set the overflow bit so that we can produce some kind of
2019     error message at the appropriate point if necessary.  It's not the
2020     most user-friendly message, but it's better than nothing.  */
2021  if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))
2022      && !MODE_HAS_INFINITIES (TYPE_MODE (type)))
2023    TREE_OVERFLOW (t) = 1;
2024  else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
2025	   && !MODE_HAS_NANS (TYPE_MODE (type)))
2026    TREE_OVERFLOW (t) = 1;
2027  /* Regular overflow, conversion produced an infinity in a mode that
2028     can't represent them.  */
2029  else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))
2030	   && REAL_VALUE_ISINF (value)
2031	   && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1)))
2032    TREE_OVERFLOW (t) = 1;
2033  else
2034    TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2035  return t;
2036}
2037
2038/* A subroutine of fold_convert_const handling conversions a FIXED_CST
2039   to a floating point type.  */
2040
2041static tree
2042fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2043{
2044  REAL_VALUE_TYPE value;
2045  tree t;
2046
2047  real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2048  t = build_real (type, value);
2049
2050  TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2051  return t;
2052}
2053
2054/* A subroutine of fold_convert_const handling conversions a FIXED_CST
2055   to another fixed-point type.  */
2056
2057static tree
2058fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2059{
2060  FIXED_VALUE_TYPE value;
2061  tree t;
2062  bool overflow_p;
2063
2064  overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2065			      TYPE_SATURATING (type));
2066  t = build_fixed (type, value);
2067
2068  /* Propagate overflow flags.  */
2069  if (overflow_p | TREE_OVERFLOW (arg1))
2070    TREE_OVERFLOW (t) = 1;
2071  return t;
2072}
2073
2074/* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2075   to a fixed-point type.  */
2076
2077static tree
2078fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2079{
2080  FIXED_VALUE_TYPE value;
2081  tree t;
2082  bool overflow_p;
2083  double_int di;
2084
2085  gcc_assert (TREE_INT_CST_NUNITS (arg1) <= 2);
2086
2087  di.low = TREE_INT_CST_ELT (arg1, 0);
2088  if (TREE_INT_CST_NUNITS (arg1) == 1)
2089    di.high = (HOST_WIDE_INT) di.low < 0 ? (HOST_WIDE_INT) -1 : 0;
2090  else
2091    di.high = TREE_INT_CST_ELT (arg1, 1);
2092
2093  overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type), di,
2094				       TYPE_UNSIGNED (TREE_TYPE (arg1)),
2095				       TYPE_SATURATING (type));
2096  t = build_fixed (type, value);
2097
2098  /* Propagate overflow flags.  */
2099  if (overflow_p | TREE_OVERFLOW (arg1))
2100    TREE_OVERFLOW (t) = 1;
2101  return t;
2102}
2103
2104/* A subroutine of fold_convert_const handling conversions a REAL_CST
2105   to a fixed-point type.  */
2106
2107static tree
2108fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2109{
2110  FIXED_VALUE_TYPE value;
2111  tree t;
2112  bool overflow_p;
2113
2114  overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2115					&TREE_REAL_CST (arg1),
2116					TYPE_SATURATING (type));
2117  t = build_fixed (type, value);
2118
2119  /* Propagate overflow flags.  */
2120  if (overflow_p | TREE_OVERFLOW (arg1))
2121    TREE_OVERFLOW (t) = 1;
2122  return t;
2123}
2124
2125/* Attempt to fold type conversion operation CODE of expression ARG1 to
2126   type TYPE.  If no simplification can be done return NULL_TREE.  */
2127
2128static tree
2129fold_convert_const (enum tree_code code, tree type, tree arg1)
2130{
2131  if (TREE_TYPE (arg1) == type)
2132    return arg1;
2133
2134  if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
2135      || TREE_CODE (type) == OFFSET_TYPE)
2136    {
2137      if (TREE_CODE (arg1) == INTEGER_CST)
2138	return fold_convert_const_int_from_int (type, arg1);
2139      else if (TREE_CODE (arg1) == REAL_CST)
2140	return fold_convert_const_int_from_real (code, type, arg1);
2141      else if (TREE_CODE (arg1) == FIXED_CST)
2142	return fold_convert_const_int_from_fixed (type, arg1);
2143    }
2144  else if (TREE_CODE (type) == REAL_TYPE)
2145    {
2146      if (TREE_CODE (arg1) == INTEGER_CST)
2147	return build_real_from_int_cst (type, arg1);
2148      else if (TREE_CODE (arg1) == REAL_CST)
2149	return fold_convert_const_real_from_real (type, arg1);
2150      else if (TREE_CODE (arg1) == FIXED_CST)
2151	return fold_convert_const_real_from_fixed (type, arg1);
2152    }
2153  else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2154    {
2155      if (TREE_CODE (arg1) == FIXED_CST)
2156	return fold_convert_const_fixed_from_fixed (type, arg1);
2157      else if (TREE_CODE (arg1) == INTEGER_CST)
2158	return fold_convert_const_fixed_from_int (type, arg1);
2159      else if (TREE_CODE (arg1) == REAL_CST)
2160	return fold_convert_const_fixed_from_real (type, arg1);
2161    }
2162  return NULL_TREE;
2163}
2164
2165/* Construct a vector of zero elements of vector type TYPE.  */
2166
2167static tree
2168build_zero_vector (tree type)
2169{
2170  tree t;
2171
2172  t = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2173  return build_vector_from_val (type, t);
2174}
2175
2176/* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2177
2178bool
2179fold_convertible_p (const_tree type, const_tree arg)
2180{
2181  tree orig = TREE_TYPE (arg);
2182
2183  if (type == orig)
2184    return true;
2185
2186  if (TREE_CODE (arg) == ERROR_MARK
2187      || TREE_CODE (type) == ERROR_MARK
2188      || TREE_CODE (orig) == ERROR_MARK)
2189    return false;
2190
2191  if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2192    return true;
2193
2194  switch (TREE_CODE (type))
2195    {
2196    case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2197    case POINTER_TYPE: case REFERENCE_TYPE:
2198    case OFFSET_TYPE:
2199      if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2200	  || TREE_CODE (orig) == OFFSET_TYPE)
2201        return true;
2202      return (TREE_CODE (orig) == VECTOR_TYPE
2203	      && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2204
2205    case REAL_TYPE:
2206    case FIXED_POINT_TYPE:
2207    case VECTOR_TYPE:
2208    case VOID_TYPE:
2209      return TREE_CODE (type) == TREE_CODE (orig);
2210
2211    default:
2212      return false;
2213    }
2214}
2215
2216/* Convert expression ARG to type TYPE.  Used by the middle-end for
2217   simple conversions in preference to calling the front-end's convert.  */
2218
2219tree
2220fold_convert_loc (location_t loc, tree type, tree arg)
2221{
2222  tree orig = TREE_TYPE (arg);
2223  tree tem;
2224
2225  if (type == orig)
2226    return arg;
2227
2228  if (TREE_CODE (arg) == ERROR_MARK
2229      || TREE_CODE (type) == ERROR_MARK
2230      || TREE_CODE (orig) == ERROR_MARK)
2231    return error_mark_node;
2232
2233  switch (TREE_CODE (type))
2234    {
2235    case POINTER_TYPE:
2236    case REFERENCE_TYPE:
2237      /* Handle conversions between pointers to different address spaces.  */
2238      if (POINTER_TYPE_P (orig)
2239	  && (TYPE_ADDR_SPACE (TREE_TYPE (type))
2240	      != TYPE_ADDR_SPACE (TREE_TYPE (orig))))
2241	return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg);
2242      /* fall through */
2243
2244    case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2245    case OFFSET_TYPE:
2246      if (TREE_CODE (arg) == INTEGER_CST)
2247	{
2248	  tem = fold_convert_const (NOP_EXPR, type, arg);
2249	  if (tem != NULL_TREE)
2250	    return tem;
2251	}
2252      if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2253	  || TREE_CODE (orig) == OFFSET_TYPE)
2254	return fold_build1_loc (loc, NOP_EXPR, type, arg);
2255      if (TREE_CODE (orig) == COMPLEX_TYPE)
2256	return fold_convert_loc (loc, type,
2257			     fold_build1_loc (loc, REALPART_EXPR,
2258					  TREE_TYPE (orig), arg));
2259      gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2260		  && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2261      return fold_build1_loc (loc, NOP_EXPR, type, arg);
2262
2263    case REAL_TYPE:
2264      if (TREE_CODE (arg) == INTEGER_CST)
2265	{
2266	  tem = fold_convert_const (FLOAT_EXPR, type, arg);
2267	  if (tem != NULL_TREE)
2268	    return tem;
2269	}
2270      else if (TREE_CODE (arg) == REAL_CST)
2271	{
2272	  tem = fold_convert_const (NOP_EXPR, type, arg);
2273	  if (tem != NULL_TREE)
2274	    return tem;
2275	}
2276      else if (TREE_CODE (arg) == FIXED_CST)
2277	{
2278	  tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2279	  if (tem != NULL_TREE)
2280	    return tem;
2281	}
2282
2283      switch (TREE_CODE (orig))
2284	{
2285	case INTEGER_TYPE:
2286	case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2287	case POINTER_TYPE: case REFERENCE_TYPE:
2288	  return fold_build1_loc (loc, FLOAT_EXPR, type, arg);
2289
2290	case REAL_TYPE:
2291	  return fold_build1_loc (loc, NOP_EXPR, type, arg);
2292
2293	case FIXED_POINT_TYPE:
2294	  return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2295
2296	case COMPLEX_TYPE:
2297	  tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2298	  return fold_convert_loc (loc, type, tem);
2299
2300	default:
2301	  gcc_unreachable ();
2302	}
2303
2304    case FIXED_POINT_TYPE:
2305      if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2306	  || TREE_CODE (arg) == REAL_CST)
2307	{
2308	  tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2309	  if (tem != NULL_TREE)
2310	    goto fold_convert_exit;
2311	}
2312
2313      switch (TREE_CODE (orig))
2314	{
2315	case FIXED_POINT_TYPE:
2316	case INTEGER_TYPE:
2317	case ENUMERAL_TYPE:
2318	case BOOLEAN_TYPE:
2319	case REAL_TYPE:
2320	  return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2321
2322	case COMPLEX_TYPE:
2323	  tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2324	  return fold_convert_loc (loc, type, tem);
2325
2326	default:
2327	  gcc_unreachable ();
2328	}
2329
2330    case COMPLEX_TYPE:
2331      switch (TREE_CODE (orig))
2332	{
2333	case INTEGER_TYPE:
2334	case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2335	case POINTER_TYPE: case REFERENCE_TYPE:
2336	case REAL_TYPE:
2337	case FIXED_POINT_TYPE:
2338	  return fold_build2_loc (loc, COMPLEX_EXPR, type,
2339			      fold_convert_loc (loc, TREE_TYPE (type), arg),
2340			      fold_convert_loc (loc, TREE_TYPE (type),
2341					    integer_zero_node));
2342	case COMPLEX_TYPE:
2343	  {
2344	    tree rpart, ipart;
2345
2346	    if (TREE_CODE (arg) == COMPLEX_EXPR)
2347	      {
2348		rpart = fold_convert_loc (loc, TREE_TYPE (type),
2349				      TREE_OPERAND (arg, 0));
2350		ipart = fold_convert_loc (loc, TREE_TYPE (type),
2351				      TREE_OPERAND (arg, 1));
2352		return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2353	      }
2354
2355	    arg = save_expr (arg);
2356	    rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2357	    ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig), arg);
2358	    rpart = fold_convert_loc (loc, TREE_TYPE (type), rpart);
2359	    ipart = fold_convert_loc (loc, TREE_TYPE (type), ipart);
2360	    return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2361	  }
2362
2363	default:
2364	  gcc_unreachable ();
2365	}
2366
2367    case VECTOR_TYPE:
2368      if (integer_zerop (arg))
2369	return build_zero_vector (type);
2370      gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2371      gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2372		  || TREE_CODE (orig) == VECTOR_TYPE);
2373      return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg);
2374
2375    case VOID_TYPE:
2376      tem = fold_ignored_result (arg);
2377      return fold_build1_loc (loc, NOP_EXPR, type, tem);
2378
2379    default:
2380      if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2381	return fold_build1_loc (loc, NOP_EXPR, type, arg);
2382      gcc_unreachable ();
2383    }
2384 fold_convert_exit:
2385  protected_set_expr_location_unshare (tem, loc);
2386  return tem;
2387}
2388
2389/* Return false if expr can be assumed not to be an lvalue, true
2390   otherwise.  */
2391
2392static bool
2393maybe_lvalue_p (const_tree x)
2394{
2395  /* We only need to wrap lvalue tree codes.  */
2396  switch (TREE_CODE (x))
2397  {
2398  case VAR_DECL:
2399  case PARM_DECL:
2400  case RESULT_DECL:
2401  case LABEL_DECL:
2402  case FUNCTION_DECL:
2403  case SSA_NAME:
2404
2405  case COMPONENT_REF:
2406  case MEM_REF:
2407  case INDIRECT_REF:
2408  case ARRAY_REF:
2409  case ARRAY_RANGE_REF:
2410  case BIT_FIELD_REF:
2411  case OBJ_TYPE_REF:
2412
2413  case REALPART_EXPR:
2414  case IMAGPART_EXPR:
2415  case PREINCREMENT_EXPR:
2416  case PREDECREMENT_EXPR:
2417  case SAVE_EXPR:
2418  case TRY_CATCH_EXPR:
2419  case WITH_CLEANUP_EXPR:
2420  case COMPOUND_EXPR:
2421  case MODIFY_EXPR:
2422  case TARGET_EXPR:
2423  case COND_EXPR:
2424  case BIND_EXPR:
2425    break;
2426
2427  default:
2428    /* Assume the worst for front-end tree codes.  */
2429    if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2430      break;
2431    return false;
2432  }
2433
2434  return true;
2435}
2436
2437/* Return an expr equal to X but certainly not valid as an lvalue.  */
2438
2439tree
2440non_lvalue_loc (location_t loc, tree x)
2441{
2442  /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2443     us.  */
2444  if (in_gimple_form)
2445    return x;
2446
2447  if (! maybe_lvalue_p (x))
2448    return x;
2449  return build1_loc (loc, NON_LVALUE_EXPR, TREE_TYPE (x), x);
2450}
2451
2452/* When pedantic, return an expr equal to X but certainly not valid as a
2453   pedantic lvalue.  Otherwise, return X.  */
2454
2455static tree
2456pedantic_non_lvalue_loc (location_t loc, tree x)
2457{
2458  return protected_set_expr_location_unshare (x, loc);
2459}
2460
2461/* Given a tree comparison code, return the code that is the logical inverse.
2462   It is generally not safe to do this for floating-point comparisons, except
2463   for EQ_EXPR, NE_EXPR, ORDERED_EXPR and UNORDERED_EXPR, so we return
2464   ERROR_MARK in this case.  */
2465
2466enum tree_code
2467invert_tree_comparison (enum tree_code code, bool honor_nans)
2468{
2469  if (honor_nans && flag_trapping_math && code != EQ_EXPR && code != NE_EXPR
2470      && code != ORDERED_EXPR && code != UNORDERED_EXPR)
2471    return ERROR_MARK;
2472
2473  switch (code)
2474    {
2475    case EQ_EXPR:
2476      return NE_EXPR;
2477    case NE_EXPR:
2478      return EQ_EXPR;
2479    case GT_EXPR:
2480      return honor_nans ? UNLE_EXPR : LE_EXPR;
2481    case GE_EXPR:
2482      return honor_nans ? UNLT_EXPR : LT_EXPR;
2483    case LT_EXPR:
2484      return honor_nans ? UNGE_EXPR : GE_EXPR;
2485    case LE_EXPR:
2486      return honor_nans ? UNGT_EXPR : GT_EXPR;
2487    case LTGT_EXPR:
2488      return UNEQ_EXPR;
2489    case UNEQ_EXPR:
2490      return LTGT_EXPR;
2491    case UNGT_EXPR:
2492      return LE_EXPR;
2493    case UNGE_EXPR:
2494      return LT_EXPR;
2495    case UNLT_EXPR:
2496      return GE_EXPR;
2497    case UNLE_EXPR:
2498      return GT_EXPR;
2499    case ORDERED_EXPR:
2500      return UNORDERED_EXPR;
2501    case UNORDERED_EXPR:
2502      return ORDERED_EXPR;
2503    default:
2504      gcc_unreachable ();
2505    }
2506}
2507
2508/* Similar, but return the comparison that results if the operands are
2509   swapped.  This is safe for floating-point.  */
2510
2511enum tree_code
2512swap_tree_comparison (enum tree_code code)
2513{
2514  switch (code)
2515    {
2516    case EQ_EXPR:
2517    case NE_EXPR:
2518    case ORDERED_EXPR:
2519    case UNORDERED_EXPR:
2520    case LTGT_EXPR:
2521    case UNEQ_EXPR:
2522      return code;
2523    case GT_EXPR:
2524      return LT_EXPR;
2525    case GE_EXPR:
2526      return LE_EXPR;
2527    case LT_EXPR:
2528      return GT_EXPR;
2529    case LE_EXPR:
2530      return GE_EXPR;
2531    case UNGT_EXPR:
2532      return UNLT_EXPR;
2533    case UNGE_EXPR:
2534      return UNLE_EXPR;
2535    case UNLT_EXPR:
2536      return UNGT_EXPR;
2537    case UNLE_EXPR:
2538      return UNGE_EXPR;
2539    default:
2540      gcc_unreachable ();
2541    }
2542}
2543
2544
2545/* Convert a comparison tree code from an enum tree_code representation
2546   into a compcode bit-based encoding.  This function is the inverse of
2547   compcode_to_comparison.  */
2548
2549static enum comparison_code
2550comparison_to_compcode (enum tree_code code)
2551{
2552  switch (code)
2553    {
2554    case LT_EXPR:
2555      return COMPCODE_LT;
2556    case EQ_EXPR:
2557      return COMPCODE_EQ;
2558    case LE_EXPR:
2559      return COMPCODE_LE;
2560    case GT_EXPR:
2561      return COMPCODE_GT;
2562    case NE_EXPR:
2563      return COMPCODE_NE;
2564    case GE_EXPR:
2565      return COMPCODE_GE;
2566    case ORDERED_EXPR:
2567      return COMPCODE_ORD;
2568    case UNORDERED_EXPR:
2569      return COMPCODE_UNORD;
2570    case UNLT_EXPR:
2571      return COMPCODE_UNLT;
2572    case UNEQ_EXPR:
2573      return COMPCODE_UNEQ;
2574    case UNLE_EXPR:
2575      return COMPCODE_UNLE;
2576    case UNGT_EXPR:
2577      return COMPCODE_UNGT;
2578    case LTGT_EXPR:
2579      return COMPCODE_LTGT;
2580    case UNGE_EXPR:
2581      return COMPCODE_UNGE;
2582    default:
2583      gcc_unreachable ();
2584    }
2585}
2586
2587/* Convert a compcode bit-based encoding of a comparison operator back
2588   to GCC's enum tree_code representation.  This function is the
2589   inverse of comparison_to_compcode.  */
2590
2591static enum tree_code
2592compcode_to_comparison (enum comparison_code code)
2593{
2594  switch (code)
2595    {
2596    case COMPCODE_LT:
2597      return LT_EXPR;
2598    case COMPCODE_EQ:
2599      return EQ_EXPR;
2600    case COMPCODE_LE:
2601      return LE_EXPR;
2602    case COMPCODE_GT:
2603      return GT_EXPR;
2604    case COMPCODE_NE:
2605      return NE_EXPR;
2606    case COMPCODE_GE:
2607      return GE_EXPR;
2608    case COMPCODE_ORD:
2609      return ORDERED_EXPR;
2610    case COMPCODE_UNORD:
2611      return UNORDERED_EXPR;
2612    case COMPCODE_UNLT:
2613      return UNLT_EXPR;
2614    case COMPCODE_UNEQ:
2615      return UNEQ_EXPR;
2616    case COMPCODE_UNLE:
2617      return UNLE_EXPR;
2618    case COMPCODE_UNGT:
2619      return UNGT_EXPR;
2620    case COMPCODE_LTGT:
2621      return LTGT_EXPR;
2622    case COMPCODE_UNGE:
2623      return UNGE_EXPR;
2624    default:
2625      gcc_unreachable ();
2626    }
2627}
2628
2629/* Return a tree for the comparison which is the combination of
2630   doing the AND or OR (depending on CODE) of the two operations LCODE
2631   and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2632   the possibility of trapping if the mode has NaNs, and return NULL_TREE
2633   if this makes the transformation invalid.  */
2634
2635tree
2636combine_comparisons (location_t loc,
2637		     enum tree_code code, enum tree_code lcode,
2638		     enum tree_code rcode, tree truth_type,
2639		     tree ll_arg, tree lr_arg)
2640{
2641  bool honor_nans = HONOR_NANS (ll_arg);
2642  enum comparison_code lcompcode = comparison_to_compcode (lcode);
2643  enum comparison_code rcompcode = comparison_to_compcode (rcode);
2644  int compcode;
2645
2646  switch (code)
2647    {
2648    case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2649      compcode = lcompcode & rcompcode;
2650      break;
2651
2652    case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2653      compcode = lcompcode | rcompcode;
2654      break;
2655
2656    default:
2657      return NULL_TREE;
2658    }
2659
2660  if (!honor_nans)
2661    {
2662      /* Eliminate unordered comparisons, as well as LTGT and ORD
2663	 which are not used unless the mode has NaNs.  */
2664      compcode &= ~COMPCODE_UNORD;
2665      if (compcode == COMPCODE_LTGT)
2666	compcode = COMPCODE_NE;
2667      else if (compcode == COMPCODE_ORD)
2668	compcode = COMPCODE_TRUE;
2669    }
2670   else if (flag_trapping_math)
2671     {
2672	/* Check that the original operation and the optimized ones will trap
2673	   under the same condition.  */
2674	bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2675		     && (lcompcode != COMPCODE_EQ)
2676		     && (lcompcode != COMPCODE_ORD);
2677	bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2678		     && (rcompcode != COMPCODE_EQ)
2679		     && (rcompcode != COMPCODE_ORD);
2680	bool trap = (compcode & COMPCODE_UNORD) == 0
2681		    && (compcode != COMPCODE_EQ)
2682		    && (compcode != COMPCODE_ORD);
2683
2684        /* In a short-circuited boolean expression the LHS might be
2685	   such that the RHS, if evaluated, will never trap.  For
2686	   example, in ORD (x, y) && (x < y), we evaluate the RHS only
2687	   if neither x nor y is NaN.  (This is a mixed blessing: for
2688	   example, the expression above will never trap, hence
2689	   optimizing it to x < y would be invalid).  */
2690        if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2691            || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2692          rtrap = false;
2693
2694        /* If the comparison was short-circuited, and only the RHS
2695	   trapped, we may now generate a spurious trap.  */
2696	if (rtrap && !ltrap
2697	    && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2698	  return NULL_TREE;
2699
2700	/* If we changed the conditions that cause a trap, we lose.  */
2701	if ((ltrap || rtrap) != trap)
2702	  return NULL_TREE;
2703      }
2704
2705  if (compcode == COMPCODE_TRUE)
2706    return constant_boolean_node (true, truth_type);
2707  else if (compcode == COMPCODE_FALSE)
2708    return constant_boolean_node (false, truth_type);
2709  else
2710    {
2711      enum tree_code tcode;
2712
2713      tcode = compcode_to_comparison ((enum comparison_code) compcode);
2714      return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg);
2715    }
2716}
2717
2718/* Return nonzero if two operands (typically of the same tree node)
2719   are necessarily equal.  If either argument has side-effects this
2720   function returns zero.  FLAGS modifies behavior as follows:
2721
2722   If OEP_ONLY_CONST is set, only return nonzero for constants.
2723   This function tests whether the operands are indistinguishable;
2724   it does not test whether they are equal using C's == operation.
2725   The distinction is important for IEEE floating point, because
2726   (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
2727   (2) two NaNs may be indistinguishable, but NaN!=NaN.
2728
2729   If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
2730   even though it may hold multiple values during a function.
2731   This is because a GCC tree node guarantees that nothing else is
2732   executed between the evaluation of its "operands" (which may often
2733   be evaluated in arbitrary order).  Hence if the operands themselves
2734   don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
2735   same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
2736   unset means assuming isochronic (or instantaneous) tree equivalence.
2737   Unless comparing arbitrary expression trees, such as from different
2738   statements, this flag can usually be left unset.
2739
2740   If OEP_PURE_SAME is set, then pure functions with identical arguments
2741   are considered the same.  It is used when the caller has other ways
2742   to ensure that global memory is unchanged in between.  */
2743
2744int
2745operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
2746{
2747  /* If either is ERROR_MARK, they aren't equal.  */
2748  if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK
2749      || TREE_TYPE (arg0) == error_mark_node
2750      || TREE_TYPE (arg1) == error_mark_node)
2751    return 0;
2752
2753  /* Similar, if either does not have a type (like a released SSA name),
2754     they aren't equal.  */
2755  if (!TREE_TYPE (arg0) || !TREE_TYPE (arg1))
2756    return 0;
2757
2758  /* Check equality of integer constants before bailing out due to
2759     precision differences.  */
2760  if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2761    return tree_int_cst_equal (arg0, arg1);
2762
2763  /* If both types don't have the same signedness, then we can't consider
2764     them equal.  We must check this before the STRIP_NOPS calls
2765     because they may change the signedness of the arguments.  As pointers
2766     strictly don't have a signedness, require either two pointers or
2767     two non-pointers as well.  */
2768  if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
2769      || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
2770    return 0;
2771
2772  /* We cannot consider pointers to different address space equal.  */
2773  if (POINTER_TYPE_P (TREE_TYPE (arg0)) && POINTER_TYPE_P (TREE_TYPE (arg1))
2774      && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))
2775	  != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1)))))
2776    return 0;
2777
2778  /* If both types don't have the same precision, then it is not safe
2779     to strip NOPs.  */
2780  if (element_precision (TREE_TYPE (arg0))
2781      != element_precision (TREE_TYPE (arg1)))
2782    return 0;
2783
2784  STRIP_NOPS (arg0);
2785  STRIP_NOPS (arg1);
2786
2787  /* In case both args are comparisons but with different comparison
2788     code, try to swap the comparison operands of one arg to produce
2789     a match and compare that variant.  */
2790  if (TREE_CODE (arg0) != TREE_CODE (arg1)
2791      && COMPARISON_CLASS_P (arg0)
2792      && COMPARISON_CLASS_P (arg1))
2793    {
2794      enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
2795
2796      if (TREE_CODE (arg0) == swap_code)
2797	return operand_equal_p (TREE_OPERAND (arg0, 0),
2798			        TREE_OPERAND (arg1, 1), flags)
2799	       && operand_equal_p (TREE_OPERAND (arg0, 1),
2800				   TREE_OPERAND (arg1, 0), flags);
2801    }
2802
2803  if (TREE_CODE (arg0) != TREE_CODE (arg1)
2804      /* NOP_EXPR and CONVERT_EXPR are considered equal.  */
2805      && !(CONVERT_EXPR_P (arg0) && CONVERT_EXPR_P (arg1)))
2806    return 0;
2807
2808  /* This is needed for conversions and for COMPONENT_REF.
2809     Might as well play it safe and always test this.  */
2810  if (TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2811      || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
2812      || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2813    return 0;
2814
2815  /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2816     We don't care about side effects in that case because the SAVE_EXPR
2817     takes care of that for us. In all other cases, two expressions are
2818     equal if they have no side effects.  If we have two identical
2819     expressions with side effects that should be treated the same due
2820     to the only side effects being identical SAVE_EXPR's, that will
2821     be detected in the recursive calls below.
2822     If we are taking an invariant address of two identical objects
2823     they are necessarily equal as well.  */
2824  if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
2825      && (TREE_CODE (arg0) == SAVE_EXPR
2826	  || (flags & OEP_CONSTANT_ADDRESS_OF)
2827	  || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2828    return 1;
2829
2830  /* Next handle constant cases, those for which we can return 1 even
2831     if ONLY_CONST is set.  */
2832  if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2833    switch (TREE_CODE (arg0))
2834      {
2835      case INTEGER_CST:
2836	return tree_int_cst_equal (arg0, arg1);
2837
2838      case FIXED_CST:
2839	return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
2840				       TREE_FIXED_CST (arg1));
2841
2842      case REAL_CST:
2843	if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2844				   TREE_REAL_CST (arg1)))
2845	  return 1;
2846
2847
2848	if (!HONOR_SIGNED_ZEROS (arg0))
2849	  {
2850	    /* If we do not distinguish between signed and unsigned zero,
2851	       consider them equal.  */
2852	    if (real_zerop (arg0) && real_zerop (arg1))
2853	      return 1;
2854	  }
2855	return 0;
2856
2857      case VECTOR_CST:
2858	{
2859	  unsigned i;
2860
2861	  if (VECTOR_CST_NELTS (arg0) != VECTOR_CST_NELTS (arg1))
2862	    return 0;
2863
2864	  for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
2865	    {
2866	      if (!operand_equal_p (VECTOR_CST_ELT (arg0, i),
2867				    VECTOR_CST_ELT (arg1, i), flags))
2868		return 0;
2869	    }
2870	  return 1;
2871	}
2872
2873      case COMPLEX_CST:
2874	return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
2875				 flags)
2876		&& operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
2877				    flags));
2878
2879      case STRING_CST:
2880	return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
2881		&& ! memcmp (TREE_STRING_POINTER (arg0),
2882			      TREE_STRING_POINTER (arg1),
2883			      TREE_STRING_LENGTH (arg0)));
2884
2885      case ADDR_EXPR:
2886	return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2887				TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1)
2888				? OEP_CONSTANT_ADDRESS_OF | OEP_ADDRESS_OF : 0);
2889      default:
2890	break;
2891      }
2892
2893  if (flags & OEP_ONLY_CONST)
2894    return 0;
2895
2896/* Define macros to test an operand from arg0 and arg1 for equality and a
2897   variant that allows null and views null as being different from any
2898   non-null value.  In the latter case, if either is null, the both
2899   must be; otherwise, do the normal comparison.  */
2900#define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),	\
2901				    TREE_OPERAND (arg1, N), flags)
2902
2903#define OP_SAME_WITH_NULL(N)				\
2904  ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N))	\
2905   ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
2906
2907  switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2908    {
2909    case tcc_unary:
2910      /* Two conversions are equal only if signedness and modes match.  */
2911      switch (TREE_CODE (arg0))
2912        {
2913	CASE_CONVERT:
2914        case FIX_TRUNC_EXPR:
2915	  if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2916	      != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2917	    return 0;
2918	  break;
2919	default:
2920	  break;
2921	}
2922
2923      return OP_SAME (0);
2924
2925
2926    case tcc_comparison:
2927    case tcc_binary:
2928      if (OP_SAME (0) && OP_SAME (1))
2929	return 1;
2930
2931      /* For commutative ops, allow the other order.  */
2932      return (commutative_tree_code (TREE_CODE (arg0))
2933	      && operand_equal_p (TREE_OPERAND (arg0, 0),
2934				  TREE_OPERAND (arg1, 1), flags)
2935	      && operand_equal_p (TREE_OPERAND (arg0, 1),
2936				  TREE_OPERAND (arg1, 0), flags));
2937
2938    case tcc_reference:
2939      /* If either of the pointer (or reference) expressions we are
2940	 dereferencing contain a side effect, these cannot be equal,
2941	 but their addresses can be.  */
2942      if ((flags & OEP_CONSTANT_ADDRESS_OF) == 0
2943	  && (TREE_SIDE_EFFECTS (arg0)
2944	      || TREE_SIDE_EFFECTS (arg1)))
2945	return 0;
2946
2947      switch (TREE_CODE (arg0))
2948	{
2949	case INDIRECT_REF:
2950	  if (!(flags & OEP_ADDRESS_OF)
2951	      && (TYPE_ALIGN (TREE_TYPE (arg0))
2952		  != TYPE_ALIGN (TREE_TYPE (arg1))))
2953	    return 0;
2954	  flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2955	  return OP_SAME (0);
2956
2957	case REALPART_EXPR:
2958	case IMAGPART_EXPR:
2959	  return OP_SAME (0);
2960
2961	case TARGET_MEM_REF:
2962	case MEM_REF:
2963	  /* Require equal access sizes, and similar pointer types.
2964	     We can have incomplete types for array references of
2965	     variable-sized arrays from the Fortran frontend
2966	     though.  Also verify the types are compatible.  */
2967	  if (!((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1))
2968		   || (TYPE_SIZE (TREE_TYPE (arg0))
2969		       && TYPE_SIZE (TREE_TYPE (arg1))
2970		       && operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)),
2971					   TYPE_SIZE (TREE_TYPE (arg1)), flags)))
2972		  && types_compatible_p (TREE_TYPE (arg0), TREE_TYPE (arg1))
2973		  && ((flags & OEP_ADDRESS_OF)
2974		      || (alias_ptr_types_compatible_p
2975			    (TREE_TYPE (TREE_OPERAND (arg0, 1)),
2976			     TREE_TYPE (TREE_OPERAND (arg1, 1)))
2977			  && (MR_DEPENDENCE_CLIQUE (arg0)
2978			      == MR_DEPENDENCE_CLIQUE (arg1))
2979			  && (MR_DEPENDENCE_BASE (arg0)
2980			      == MR_DEPENDENCE_BASE (arg1))
2981			  && (TYPE_ALIGN (TREE_TYPE (arg0))
2982			    == TYPE_ALIGN (TREE_TYPE (arg1)))))))
2983	    return 0;
2984	  flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2985	  return (OP_SAME (0) && OP_SAME (1)
2986		  /* TARGET_MEM_REF require equal extra operands.  */
2987		  && (TREE_CODE (arg0) != TARGET_MEM_REF
2988		      || (OP_SAME_WITH_NULL (2)
2989			  && OP_SAME_WITH_NULL (3)
2990			  && OP_SAME_WITH_NULL (4))));
2991
2992	case ARRAY_REF:
2993	case ARRAY_RANGE_REF:
2994	  /* Operands 2 and 3 may be null.
2995	     Compare the array index by value if it is constant first as we
2996	     may have different types but same value here.  */
2997	  if (!OP_SAME (0))
2998	    return 0;
2999	  flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
3000	  return ((tree_int_cst_equal (TREE_OPERAND (arg0, 1),
3001				       TREE_OPERAND (arg1, 1))
3002		   || OP_SAME (1))
3003		  && OP_SAME_WITH_NULL (2)
3004		  && OP_SAME_WITH_NULL (3));
3005
3006	case COMPONENT_REF:
3007	  /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
3008	     may be NULL when we're called to compare MEM_EXPRs.  */
3009	  if (!OP_SAME_WITH_NULL (0)
3010	      || !OP_SAME (1))
3011	    return 0;
3012	  flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
3013	  return OP_SAME_WITH_NULL (2);
3014
3015	case BIT_FIELD_REF:
3016	  if (!OP_SAME (0))
3017	    return 0;
3018	  flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
3019	  return OP_SAME (1) && OP_SAME (2);
3020
3021	default:
3022	  return 0;
3023	}
3024
3025    case tcc_expression:
3026      switch (TREE_CODE (arg0))
3027	{
3028	case ADDR_EXPR:
3029	  return operand_equal_p (TREE_OPERAND (arg0, 0),
3030				  TREE_OPERAND (arg1, 0),
3031				  flags | OEP_ADDRESS_OF);
3032
3033	case TRUTH_NOT_EXPR:
3034	  return OP_SAME (0);
3035
3036	case TRUTH_ANDIF_EXPR:
3037	case TRUTH_ORIF_EXPR:
3038	  return OP_SAME (0) && OP_SAME (1);
3039
3040	case FMA_EXPR:
3041	case WIDEN_MULT_PLUS_EXPR:
3042	case WIDEN_MULT_MINUS_EXPR:
3043	  if (!OP_SAME (2))
3044	    return 0;
3045	  /* The multiplcation operands are commutative.  */
3046	  /* FALLTHRU */
3047
3048	case TRUTH_AND_EXPR:
3049	case TRUTH_OR_EXPR:
3050	case TRUTH_XOR_EXPR:
3051	  if (OP_SAME (0) && OP_SAME (1))
3052	    return 1;
3053
3054	  /* Otherwise take into account this is a commutative operation.  */
3055	  return (operand_equal_p (TREE_OPERAND (arg0, 0),
3056				   TREE_OPERAND (arg1, 1), flags)
3057		  && operand_equal_p (TREE_OPERAND (arg0, 1),
3058				      TREE_OPERAND (arg1, 0), flags));
3059
3060	case COND_EXPR:
3061	case VEC_COND_EXPR:
3062	case DOT_PROD_EXPR:
3063	  return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3064
3065	default:
3066	  return 0;
3067	}
3068
3069    case tcc_vl_exp:
3070      switch (TREE_CODE (arg0))
3071	{
3072	case CALL_EXPR:
3073	  /* If the CALL_EXPRs call different functions, then they
3074	     clearly can not be equal.  */
3075	  if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3076				 flags))
3077	    return 0;
3078
3079	  {
3080	    unsigned int cef = call_expr_flags (arg0);
3081	    if (flags & OEP_PURE_SAME)
3082	      cef &= ECF_CONST | ECF_PURE;
3083	    else
3084	      cef &= ECF_CONST;
3085	    if (!cef)
3086	      return 0;
3087	  }
3088
3089	  /* Now see if all the arguments are the same.  */
3090	  {
3091	    const_call_expr_arg_iterator iter0, iter1;
3092	    const_tree a0, a1;
3093	    for (a0 = first_const_call_expr_arg (arg0, &iter0),
3094		   a1 = first_const_call_expr_arg (arg1, &iter1);
3095		 a0 && a1;
3096		 a0 = next_const_call_expr_arg (&iter0),
3097		   a1 = next_const_call_expr_arg (&iter1))
3098	      if (! operand_equal_p (a0, a1, flags))
3099		return 0;
3100
3101	    /* If we get here and both argument lists are exhausted
3102	       then the CALL_EXPRs are equal.  */
3103	    return ! (a0 || a1);
3104	  }
3105	default:
3106	  return 0;
3107	}
3108
3109    case tcc_declaration:
3110      /* Consider __builtin_sqrt equal to sqrt.  */
3111      return (TREE_CODE (arg0) == FUNCTION_DECL
3112	      && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3113	      && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3114	      && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3115
3116    default:
3117      return 0;
3118    }
3119
3120#undef OP_SAME
3121#undef OP_SAME_WITH_NULL
3122}
3123
3124/* Similar to operand_equal_p, but see if ARG0 might have been made by
3125   shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3126
3127   When in doubt, return 0.  */
3128
3129static int
3130operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3131{
3132  int unsignedp1, unsignedpo;
3133  tree primarg0, primarg1, primother;
3134  unsigned int correct_width;
3135
3136  if (operand_equal_p (arg0, arg1, 0))
3137    return 1;
3138
3139  if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3140      || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3141    return 0;
3142
3143  /* Discard any conversions that don't change the modes of ARG0 and ARG1
3144     and see if the inner values are the same.  This removes any
3145     signedness comparison, which doesn't matter here.  */
3146  primarg0 = arg0, primarg1 = arg1;
3147  STRIP_NOPS (primarg0);
3148  STRIP_NOPS (primarg1);
3149  if (operand_equal_p (primarg0, primarg1, 0))
3150    return 1;
3151
3152  /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3153     actual comparison operand, ARG0.
3154
3155     First throw away any conversions to wider types
3156     already present in the operands.  */
3157
3158  primarg1 = get_narrower (arg1, &unsignedp1);
3159  primother = get_narrower (other, &unsignedpo);
3160
3161  correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3162  if (unsignedp1 == unsignedpo
3163      && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3164      && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3165    {
3166      tree type = TREE_TYPE (arg0);
3167
3168      /* Make sure shorter operand is extended the right way
3169	 to match the longer operand.  */
3170      primarg1 = fold_convert (signed_or_unsigned_type_for
3171			       (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3172
3173      if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3174	return 1;
3175    }
3176
3177  return 0;
3178}
3179
3180/* See if ARG is an expression that is either a comparison or is performing
3181   arithmetic on comparisons.  The comparisons must only be comparing
3182   two different values, which will be stored in *CVAL1 and *CVAL2; if
3183   they are nonzero it means that some operands have already been found.
3184   No variables may be used anywhere else in the expression except in the
3185   comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3186   the expression and save_expr needs to be called with CVAL1 and CVAL2.
3187
3188   If this is true, return 1.  Otherwise, return zero.  */
3189
3190static int
3191twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3192{
3193  enum tree_code code = TREE_CODE (arg);
3194  enum tree_code_class tclass = TREE_CODE_CLASS (code);
3195
3196  /* We can handle some of the tcc_expression cases here.  */
3197  if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3198    tclass = tcc_unary;
3199  else if (tclass == tcc_expression
3200	   && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3201	       || code == COMPOUND_EXPR))
3202    tclass = tcc_binary;
3203
3204  else if (tclass == tcc_expression && code == SAVE_EXPR
3205	   && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3206    {
3207      /* If we've already found a CVAL1 or CVAL2, this expression is
3208	 two complex to handle.  */
3209      if (*cval1 || *cval2)
3210	return 0;
3211
3212      tclass = tcc_unary;
3213      *save_p = 1;
3214    }
3215
3216  switch (tclass)
3217    {
3218    case tcc_unary:
3219      return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3220
3221    case tcc_binary:
3222      return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3223	      && twoval_comparison_p (TREE_OPERAND (arg, 1),
3224				      cval1, cval2, save_p));
3225
3226    case tcc_constant:
3227      return 1;
3228
3229    case tcc_expression:
3230      if (code == COND_EXPR)
3231	return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3232				     cval1, cval2, save_p)
3233		&& twoval_comparison_p (TREE_OPERAND (arg, 1),
3234					cval1, cval2, save_p)
3235		&& twoval_comparison_p (TREE_OPERAND (arg, 2),
3236					cval1, cval2, save_p));
3237      return 0;
3238
3239    case tcc_comparison:
3240      /* First see if we can handle the first operand, then the second.  For
3241	 the second operand, we know *CVAL1 can't be zero.  It must be that
3242	 one side of the comparison is each of the values; test for the
3243	 case where this isn't true by failing if the two operands
3244	 are the same.  */
3245
3246      if (operand_equal_p (TREE_OPERAND (arg, 0),
3247			   TREE_OPERAND (arg, 1), 0))
3248	return 0;
3249
3250      if (*cval1 == 0)
3251	*cval1 = TREE_OPERAND (arg, 0);
3252      else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3253	;
3254      else if (*cval2 == 0)
3255	*cval2 = TREE_OPERAND (arg, 0);
3256      else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3257	;
3258      else
3259	return 0;
3260
3261      if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3262	;
3263      else if (*cval2 == 0)
3264	*cval2 = TREE_OPERAND (arg, 1);
3265      else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3266	;
3267      else
3268	return 0;
3269
3270      return 1;
3271
3272    default:
3273      return 0;
3274    }
3275}
3276
3277/* ARG is a tree that is known to contain just arithmetic operations and
3278   comparisons.  Evaluate the operations in the tree substituting NEW0 for
3279   any occurrence of OLD0 as an operand of a comparison and likewise for
3280   NEW1 and OLD1.  */
3281
3282static tree
3283eval_subst (location_t loc, tree arg, tree old0, tree new0,
3284	    tree old1, tree new1)
3285{
3286  tree type = TREE_TYPE (arg);
3287  enum tree_code code = TREE_CODE (arg);
3288  enum tree_code_class tclass = TREE_CODE_CLASS (code);
3289
3290  /* We can handle some of the tcc_expression cases here.  */
3291  if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3292    tclass = tcc_unary;
3293  else if (tclass == tcc_expression
3294	   && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3295    tclass = tcc_binary;
3296
3297  switch (tclass)
3298    {
3299    case tcc_unary:
3300      return fold_build1_loc (loc, code, type,
3301			  eval_subst (loc, TREE_OPERAND (arg, 0),
3302				      old0, new0, old1, new1));
3303
3304    case tcc_binary:
3305      return fold_build2_loc (loc, code, type,
3306			  eval_subst (loc, TREE_OPERAND (arg, 0),
3307				      old0, new0, old1, new1),
3308			  eval_subst (loc, TREE_OPERAND (arg, 1),
3309				      old0, new0, old1, new1));
3310
3311    case tcc_expression:
3312      switch (code)
3313	{
3314	case SAVE_EXPR:
3315	  return eval_subst (loc, TREE_OPERAND (arg, 0), old0, new0,
3316			     old1, new1);
3317
3318	case COMPOUND_EXPR:
3319	  return eval_subst (loc, TREE_OPERAND (arg, 1), old0, new0,
3320			     old1, new1);
3321
3322	case COND_EXPR:
3323	  return fold_build3_loc (loc, code, type,
3324			      eval_subst (loc, TREE_OPERAND (arg, 0),
3325					  old0, new0, old1, new1),
3326			      eval_subst (loc, TREE_OPERAND (arg, 1),
3327					  old0, new0, old1, new1),
3328			      eval_subst (loc, TREE_OPERAND (arg, 2),
3329					  old0, new0, old1, new1));
3330	default:
3331	  break;
3332	}
3333      /* Fall through - ???  */
3334
3335    case tcc_comparison:
3336      {
3337	tree arg0 = TREE_OPERAND (arg, 0);
3338	tree arg1 = TREE_OPERAND (arg, 1);
3339
3340	/* We need to check both for exact equality and tree equality.  The
3341	   former will be true if the operand has a side-effect.  In that
3342	   case, we know the operand occurred exactly once.  */
3343
3344	if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3345	  arg0 = new0;
3346	else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3347	  arg0 = new1;
3348
3349	if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3350	  arg1 = new0;
3351	else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3352	  arg1 = new1;
3353
3354	return fold_build2_loc (loc, code, type, arg0, arg1);
3355      }
3356
3357    default:
3358      return arg;
3359    }
3360}
3361
3362/* Return a tree for the case when the result of an expression is RESULT
3363   converted to TYPE and OMITTED was previously an operand of the expression
3364   but is now not needed (e.g., we folded OMITTED * 0).
3365
3366   If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3367   the conversion of RESULT to TYPE.  */
3368
3369tree
3370omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted)
3371{
3372  tree t = fold_convert_loc (loc, type, result);
3373
3374  /* If the resulting operand is an empty statement, just return the omitted
3375     statement casted to void. */
3376  if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3377    return build1_loc (loc, NOP_EXPR, void_type_node,
3378		       fold_ignored_result (omitted));
3379
3380  if (TREE_SIDE_EFFECTS (omitted))
3381    return build2_loc (loc, COMPOUND_EXPR, type,
3382		       fold_ignored_result (omitted), t);
3383
3384  return non_lvalue_loc (loc, t);
3385}
3386
3387/* Return a tree for the case when the result of an expression is RESULT
3388   converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3389   of the expression but are now not needed.
3390
3391   If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3392   If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3393   evaluated before OMITTED2.  Otherwise, if neither has side effects,
3394   just do the conversion of RESULT to TYPE.  */
3395
3396tree
3397omit_two_operands_loc (location_t loc, tree type, tree result,
3398		       tree omitted1, tree omitted2)
3399{
3400  tree t = fold_convert_loc (loc, type, result);
3401
3402  if (TREE_SIDE_EFFECTS (omitted2))
3403    t = build2_loc (loc, COMPOUND_EXPR, type, omitted2, t);
3404  if (TREE_SIDE_EFFECTS (omitted1))
3405    t = build2_loc (loc, COMPOUND_EXPR, type, omitted1, t);
3406
3407  return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t;
3408}
3409
3410
3411/* Return a simplified tree node for the truth-negation of ARG.  This
3412   never alters ARG itself.  We assume that ARG is an operation that
3413   returns a truth value (0 or 1).
3414
3415   FIXME: one would think we would fold the result, but it causes
3416   problems with the dominator optimizer.  */
3417
3418static tree
3419fold_truth_not_expr (location_t loc, tree arg)
3420{
3421  tree type = TREE_TYPE (arg);
3422  enum tree_code code = TREE_CODE (arg);
3423  location_t loc1, loc2;
3424
3425  /* If this is a comparison, we can simply invert it, except for
3426     floating-point non-equality comparisons, in which case we just
3427     enclose a TRUTH_NOT_EXPR around what we have.  */
3428
3429  if (TREE_CODE_CLASS (code) == tcc_comparison)
3430    {
3431      tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3432      if (FLOAT_TYPE_P (op_type)
3433	  && flag_trapping_math
3434	  && code != ORDERED_EXPR && code != UNORDERED_EXPR
3435	  && code != NE_EXPR && code != EQ_EXPR)
3436	return NULL_TREE;
3437
3438      code = invert_tree_comparison (code, HONOR_NANS (op_type));
3439      if (code == ERROR_MARK)
3440	return NULL_TREE;
3441
3442      return build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
3443			 TREE_OPERAND (arg, 1));
3444    }
3445
3446  switch (code)
3447    {
3448    case INTEGER_CST:
3449      return constant_boolean_node (integer_zerop (arg), type);
3450
3451    case TRUTH_AND_EXPR:
3452      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3453      loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3454      return build2_loc (loc, TRUTH_OR_EXPR, type,
3455			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3456			 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3457
3458    case TRUTH_OR_EXPR:
3459      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3460      loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3461      return build2_loc (loc, TRUTH_AND_EXPR, type,
3462			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3463			 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3464
3465    case TRUTH_XOR_EXPR:
3466      /* Here we can invert either operand.  We invert the first operand
3467	 unless the second operand is a TRUTH_NOT_EXPR in which case our
3468	 result is the XOR of the first operand with the inside of the
3469	 negation of the second operand.  */
3470
3471      if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3472	return build2_loc (loc, TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3473			   TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3474      else
3475	return build2_loc (loc, TRUTH_XOR_EXPR, type,
3476			   invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)),
3477			   TREE_OPERAND (arg, 1));
3478
3479    case TRUTH_ANDIF_EXPR:
3480      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3481      loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3482      return build2_loc (loc, TRUTH_ORIF_EXPR, type,
3483			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3484			 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3485
3486    case TRUTH_ORIF_EXPR:
3487      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3488      loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3489      return build2_loc (loc, TRUTH_ANDIF_EXPR, type,
3490			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3491			 invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3492
3493    case TRUTH_NOT_EXPR:
3494      return TREE_OPERAND (arg, 0);
3495
3496    case COND_EXPR:
3497      {
3498	tree arg1 = TREE_OPERAND (arg, 1);
3499	tree arg2 = TREE_OPERAND (arg, 2);
3500
3501	loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3502	loc2 = expr_location_or (TREE_OPERAND (arg, 2), loc);
3503
3504	/* A COND_EXPR may have a throw as one operand, which
3505	   then has void type.  Just leave void operands
3506	   as they are.  */
3507	return build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg, 0),
3508			   VOID_TYPE_P (TREE_TYPE (arg1))
3509			   ? arg1 : invert_truthvalue_loc (loc1, arg1),
3510			   VOID_TYPE_P (TREE_TYPE (arg2))
3511			   ? arg2 : invert_truthvalue_loc (loc2, arg2));
3512      }
3513
3514    case COMPOUND_EXPR:
3515      loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3516      return build2_loc (loc, COMPOUND_EXPR, type,
3517			 TREE_OPERAND (arg, 0),
3518			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1)));
3519
3520    case NON_LVALUE_EXPR:
3521      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3522      return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0));
3523
3524    CASE_CONVERT:
3525      if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3526	return build1_loc (loc, TRUTH_NOT_EXPR, type, arg);
3527
3528      /* ... fall through ...  */
3529
3530    case FLOAT_EXPR:
3531      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3532      return build1_loc (loc, TREE_CODE (arg), type,
3533			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3534
3535    case BIT_AND_EXPR:
3536      if (!integer_onep (TREE_OPERAND (arg, 1)))
3537	return NULL_TREE;
3538      return build2_loc (loc, EQ_EXPR, type, arg, build_int_cst (type, 0));
3539
3540    case SAVE_EXPR:
3541      return build1_loc (loc, TRUTH_NOT_EXPR, type, arg);
3542
3543    case CLEANUP_POINT_EXPR:
3544      loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3545      return build1_loc (loc, CLEANUP_POINT_EXPR, type,
3546			 invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3547
3548    default:
3549      return NULL_TREE;
3550    }
3551}
3552
3553/* Fold the truth-negation of ARG.  This never alters ARG itself.  We
3554   assume that ARG is an operation that returns a truth value (0 or 1
3555   for scalars, 0 or -1 for vectors).  Return the folded expression if
3556   folding is successful.  Otherwise, return NULL_TREE.  */
3557
3558static tree
3559fold_invert_truthvalue (location_t loc, tree arg)
3560{
3561  tree type = TREE_TYPE (arg);
3562  return fold_unary_loc (loc, VECTOR_TYPE_P (type)
3563			      ? BIT_NOT_EXPR
3564			      : TRUTH_NOT_EXPR,
3565			 type, arg);
3566}
3567
3568/* Return a simplified tree node for the truth-negation of ARG.  This
3569   never alters ARG itself.  We assume that ARG is an operation that
3570   returns a truth value (0 or 1 for scalars, 0 or -1 for vectors).  */
3571
3572tree
3573invert_truthvalue_loc (location_t loc, tree arg)
3574{
3575  if (TREE_CODE (arg) == ERROR_MARK)
3576    return arg;
3577
3578  tree type = TREE_TYPE (arg);
3579  return fold_build1_loc (loc, VECTOR_TYPE_P (type)
3580			       ? BIT_NOT_EXPR
3581			       : TRUTH_NOT_EXPR,
3582			  type, arg);
3583}
3584
3585/* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3586   operands are another bit-wise operation with a common input.  If so,
3587   distribute the bit operations to save an operation and possibly two if
3588   constants are involved.  For example, convert
3589	(A | B) & (A | C) into A | (B & C)
3590   Further simplification will occur if B and C are constants.
3591
3592   If this optimization cannot be done, 0 will be returned.  */
3593
3594static tree
3595distribute_bit_expr (location_t loc, enum tree_code code, tree type,
3596		     tree arg0, tree arg1)
3597{
3598  tree common;
3599  tree left, right;
3600
3601  if (TREE_CODE (arg0) != TREE_CODE (arg1)
3602      || TREE_CODE (arg0) == code
3603      || (TREE_CODE (arg0) != BIT_AND_EXPR
3604	  && TREE_CODE (arg0) != BIT_IOR_EXPR))
3605    return 0;
3606
3607  if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3608    {
3609      common = TREE_OPERAND (arg0, 0);
3610      left = TREE_OPERAND (arg0, 1);
3611      right = TREE_OPERAND (arg1, 1);
3612    }
3613  else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3614    {
3615      common = TREE_OPERAND (arg0, 0);
3616      left = TREE_OPERAND (arg0, 1);
3617      right = TREE_OPERAND (arg1, 0);
3618    }
3619  else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3620    {
3621      common = TREE_OPERAND (arg0, 1);
3622      left = TREE_OPERAND (arg0, 0);
3623      right = TREE_OPERAND (arg1, 1);
3624    }
3625  else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3626    {
3627      common = TREE_OPERAND (arg0, 1);
3628      left = TREE_OPERAND (arg0, 0);
3629      right = TREE_OPERAND (arg1, 0);
3630    }
3631  else
3632    return 0;
3633
3634  common = fold_convert_loc (loc, type, common);
3635  left = fold_convert_loc (loc, type, left);
3636  right = fold_convert_loc (loc, type, right);
3637  return fold_build2_loc (loc, TREE_CODE (arg0), type, common,
3638		      fold_build2_loc (loc, code, type, left, right));
3639}
3640
3641/* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3642   with code CODE.  This optimization is unsafe.  */
3643static tree
3644distribute_real_division (location_t loc, enum tree_code code, tree type,
3645			  tree arg0, tree arg1)
3646{
3647  bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3648  bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3649
3650  /* (A / C) +- (B / C) -> (A +- B) / C.  */
3651  if (mul0 == mul1
3652      && operand_equal_p (TREE_OPERAND (arg0, 1),
3653		       TREE_OPERAND (arg1, 1), 0))
3654    return fold_build2_loc (loc, mul0 ? MULT_EXPR : RDIV_EXPR, type,
3655			fold_build2_loc (loc, code, type,
3656				     TREE_OPERAND (arg0, 0),
3657				     TREE_OPERAND (arg1, 0)),
3658			TREE_OPERAND (arg0, 1));
3659
3660  /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3661  if (operand_equal_p (TREE_OPERAND (arg0, 0),
3662		       TREE_OPERAND (arg1, 0), 0)
3663      && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3664      && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3665    {
3666      REAL_VALUE_TYPE r0, r1;
3667      r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3668      r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3669      if (!mul0)
3670	real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3671      if (!mul1)
3672        real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3673      real_arithmetic (&r0, code, &r0, &r1);
3674      return fold_build2_loc (loc, MULT_EXPR, type,
3675			  TREE_OPERAND (arg0, 0),
3676			  build_real (type, r0));
3677    }
3678
3679  return NULL_TREE;
3680}
3681
3682/* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3683   starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
3684
3685static tree
3686make_bit_field_ref (location_t loc, tree inner, tree type,
3687		    HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, int unsignedp)
3688{
3689  tree result, bftype;
3690
3691  if (bitpos == 0)
3692    {
3693      tree size = TYPE_SIZE (TREE_TYPE (inner));
3694      if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3695	   || POINTER_TYPE_P (TREE_TYPE (inner)))
3696	  && tree_fits_shwi_p (size)
3697	  && tree_to_shwi (size) == bitsize)
3698	return fold_convert_loc (loc, type, inner);
3699    }
3700
3701  bftype = type;
3702  if (TYPE_PRECISION (bftype) != bitsize
3703      || TYPE_UNSIGNED (bftype) == !unsignedp)
3704    bftype = build_nonstandard_integer_type (bitsize, 0);
3705
3706  result = build3_loc (loc, BIT_FIELD_REF, bftype, inner,
3707		       size_int (bitsize), bitsize_int (bitpos));
3708
3709  if (bftype != type)
3710    result = fold_convert_loc (loc, type, result);
3711
3712  return result;
3713}
3714
3715/* Optimize a bit-field compare.
3716
3717   There are two cases:  First is a compare against a constant and the
3718   second is a comparison of two items where the fields are at the same
3719   bit position relative to the start of a chunk (byte, halfword, word)
3720   large enough to contain it.  In these cases we can avoid the shift
3721   implicit in bitfield extractions.
3722
3723   For constants, we emit a compare of the shifted constant with the
3724   BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3725   compared.  For two fields at the same position, we do the ANDs with the
3726   similar mask and compare the result of the ANDs.
3727
3728   CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3729   COMPARE_TYPE is the type of the comparison, and LHS and RHS
3730   are the left and right operands of the comparison, respectively.
3731
3732   If the optimization described above can be done, we return the resulting
3733   tree.  Otherwise we return zero.  */
3734
3735static tree
3736optimize_bit_field_compare (location_t loc, enum tree_code code,
3737			    tree compare_type, tree lhs, tree rhs)
3738{
3739  HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3740  tree type = TREE_TYPE (lhs);
3741  tree unsigned_type;
3742  int const_p = TREE_CODE (rhs) == INTEGER_CST;
3743  machine_mode lmode, rmode, nmode;
3744  int lunsignedp, runsignedp;
3745  int lvolatilep = 0, rvolatilep = 0;
3746  tree linner, rinner = NULL_TREE;
3747  tree mask;
3748  tree offset;
3749
3750  /* Get all the information about the extractions being done.  If the bit size
3751     if the same as the size of the underlying object, we aren't doing an
3752     extraction at all and so can do nothing.  We also don't want to
3753     do anything if the inner expression is a PLACEHOLDER_EXPR since we
3754     then will no longer be able to replace it.  */
3755  linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3756				&lunsignedp, &lvolatilep, false);
3757  if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3758      || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR || lvolatilep)
3759    return 0;
3760
3761 if (!const_p)
3762   {
3763     /* If this is not a constant, we can only do something if bit positions,
3764	sizes, and signedness are the same.  */
3765     rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3766				   &runsignedp, &rvolatilep, false);
3767
3768     if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3769	 || lunsignedp != runsignedp || offset != 0
3770	 || TREE_CODE (rinner) == PLACEHOLDER_EXPR || rvolatilep)
3771       return 0;
3772   }
3773
3774  /* See if we can find a mode to refer to this field.  We should be able to,
3775     but fail if we can't.  */
3776  nmode = get_best_mode (lbitsize, lbitpos, 0, 0,
3777			 const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3778			 : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3779				TYPE_ALIGN (TREE_TYPE (rinner))),
3780			 word_mode, false);
3781  if (nmode == VOIDmode)
3782    return 0;
3783
3784  /* Set signed and unsigned types of the precision of this mode for the
3785     shifts below.  */
3786  unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3787
3788  /* Compute the bit position and size for the new reference and our offset
3789     within it. If the new reference is the same size as the original, we
3790     won't optimize anything, so return zero.  */
3791  nbitsize = GET_MODE_BITSIZE (nmode);
3792  nbitpos = lbitpos & ~ (nbitsize - 1);
3793  lbitpos -= nbitpos;
3794  if (nbitsize == lbitsize)
3795    return 0;
3796
3797  if (BYTES_BIG_ENDIAN)
3798    lbitpos = nbitsize - lbitsize - lbitpos;
3799
3800  /* Make the mask to be used against the extracted field.  */
3801  mask = build_int_cst_type (unsigned_type, -1);
3802  mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize));
3803  mask = const_binop (RSHIFT_EXPR, mask,
3804		      size_int (nbitsize - lbitsize - lbitpos));
3805
3806  if (! const_p)
3807    /* If not comparing with constant, just rework the comparison
3808       and return.  */
3809    return fold_build2_loc (loc, code, compare_type,
3810			fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3811				     make_bit_field_ref (loc, linner,
3812							 unsigned_type,
3813							 nbitsize, nbitpos,
3814							 1),
3815				     mask),
3816			fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3817				     make_bit_field_ref (loc, rinner,
3818							 unsigned_type,
3819							 nbitsize, nbitpos,
3820							 1),
3821				     mask));
3822
3823  /* Otherwise, we are handling the constant case. See if the constant is too
3824     big for the field.  Warn and return a tree of for 0 (false) if so.  We do
3825     this not only for its own sake, but to avoid having to test for this
3826     error case below.  If we didn't, we might generate wrong code.
3827
3828     For unsigned fields, the constant shifted right by the field length should
3829     be all zero.  For signed fields, the high-order bits should agree with
3830     the sign bit.  */
3831
3832  if (lunsignedp)
3833    {
3834      if (wi::lrshift (rhs, lbitsize) != 0)
3835	{
3836	  warning (0, "comparison is always %d due to width of bit-field",
3837		   code == NE_EXPR);
3838	  return constant_boolean_node (code == NE_EXPR, compare_type);
3839	}
3840    }
3841  else
3842    {
3843      wide_int tem = wi::arshift (rhs, lbitsize - 1);
3844      if (tem != 0 && tem != -1)
3845	{
3846	  warning (0, "comparison is always %d due to width of bit-field",
3847		   code == NE_EXPR);
3848	  return constant_boolean_node (code == NE_EXPR, compare_type);
3849	}
3850    }
3851
3852  /* Single-bit compares should always be against zero.  */
3853  if (lbitsize == 1 && ! integer_zerop (rhs))
3854    {
3855      code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
3856      rhs = build_int_cst (type, 0);
3857    }
3858
3859  /* Make a new bitfield reference, shift the constant over the
3860     appropriate number of bits and mask it with the computed mask
3861     (in case this was a signed field).  If we changed it, make a new one.  */
3862  lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1);
3863
3864  rhs = const_binop (BIT_AND_EXPR,
3865		     const_binop (LSHIFT_EXPR,
3866				  fold_convert_loc (loc, unsigned_type, rhs),
3867				  size_int (lbitpos)),
3868		     mask);
3869
3870  lhs = build2_loc (loc, code, compare_type,
3871		    build2 (BIT_AND_EXPR, unsigned_type, lhs, mask), rhs);
3872  return lhs;
3873}
3874
3875/* Subroutine for fold_truth_andor_1: decode a field reference.
3876
3877   If EXP is a comparison reference, we return the innermost reference.
3878
3879   *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3880   set to the starting bit number.
3881
3882   If the innermost field can be completely contained in a mode-sized
3883   unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3884
3885   *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3886   otherwise it is not changed.
3887
3888   *PUNSIGNEDP is set to the signedness of the field.
3889
3890   *PMASK is set to the mask used.  This is either contained in a
3891   BIT_AND_EXPR or derived from the width of the field.
3892
3893   *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3894
3895   Return 0 if this is not a component reference or is one that we can't
3896   do anything with.  */
3897
3898static tree
3899decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize,
3900			HOST_WIDE_INT *pbitpos, machine_mode *pmode,
3901			int *punsignedp, int *pvolatilep,
3902			tree *pmask, tree *pand_mask)
3903{
3904  tree outer_type = 0;
3905  tree and_mask = 0;
3906  tree mask, inner, offset;
3907  tree unsigned_type;
3908  unsigned int precision;
3909
3910  /* All the optimizations using this function assume integer fields.
3911     There are problems with FP fields since the type_for_size call
3912     below can fail for, e.g., XFmode.  */
3913  if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3914    return 0;
3915
3916  /* We are interested in the bare arrangement of bits, so strip everything
3917     that doesn't affect the machine mode.  However, record the type of the
3918     outermost expression if it may matter below.  */
3919  if (CONVERT_EXPR_P (exp)
3920      || TREE_CODE (exp) == NON_LVALUE_EXPR)
3921    outer_type = TREE_TYPE (exp);
3922  STRIP_NOPS (exp);
3923
3924  if (TREE_CODE (exp) == BIT_AND_EXPR)
3925    {
3926      and_mask = TREE_OPERAND (exp, 1);
3927      exp = TREE_OPERAND (exp, 0);
3928      STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3929      if (TREE_CODE (and_mask) != INTEGER_CST)
3930	return 0;
3931    }
3932
3933  inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3934			       punsignedp, pvolatilep, false);
3935  if ((inner == exp && and_mask == 0)
3936      || *pbitsize < 0 || offset != 0
3937      || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3938    return 0;
3939
3940  /* If the number of bits in the reference is the same as the bitsize of
3941     the outer type, then the outer type gives the signedness. Otherwise
3942     (in case of a small bitfield) the signedness is unchanged.  */
3943  if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3944    *punsignedp = TYPE_UNSIGNED (outer_type);
3945
3946  /* Compute the mask to access the bitfield.  */
3947  unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3948  precision = TYPE_PRECISION (unsigned_type);
3949
3950  mask = build_int_cst_type (unsigned_type, -1);
3951
3952  mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize));
3953  mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize));
3954
3955  /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3956  if (and_mask != 0)
3957    mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3958			fold_convert_loc (loc, unsigned_type, and_mask), mask);
3959
3960  *pmask = mask;
3961  *pand_mask = and_mask;
3962  return inner;
3963}
3964
3965/* Return nonzero if MASK represents a mask of SIZE ones in the low-order
3966   bit positions and MASK is SIGNED.  */
3967
3968static int
3969all_ones_mask_p (const_tree mask, unsigned int size)
3970{
3971  tree type = TREE_TYPE (mask);
3972  unsigned int precision = TYPE_PRECISION (type);
3973
3974  /* If this function returns true when the type of the mask is
3975     UNSIGNED, then there will be errors.  In particular see
3976     gcc.c-torture/execute/990326-1.c.  There does not appear to be
3977     any documentation paper trail as to why this is so.  But the pre
3978     wide-int worked with that restriction and it has been preserved
3979     here.  */
3980  if (size > precision || TYPE_SIGN (type) == UNSIGNED)
3981    return false;
3982
3983  return wi::mask (size, false, precision) == mask;
3984}
3985
3986/* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3987   represents the sign bit of EXP's type.  If EXP represents a sign
3988   or zero extension, also test VAL against the unextended type.
3989   The return value is the (sub)expression whose sign bit is VAL,
3990   or NULL_TREE otherwise.  */
3991
3992tree
3993sign_bit_p (tree exp, const_tree val)
3994{
3995  int width;
3996  tree t;
3997
3998  /* Tree EXP must have an integral type.  */
3999  t = TREE_TYPE (exp);
4000  if (! INTEGRAL_TYPE_P (t))
4001    return NULL_TREE;
4002
4003  /* Tree VAL must be an integer constant.  */
4004  if (TREE_CODE (val) != INTEGER_CST
4005      || TREE_OVERFLOW (val))
4006    return NULL_TREE;
4007
4008  width = TYPE_PRECISION (t);
4009  if (wi::only_sign_bit_p (val, width))
4010    return exp;
4011
4012  /* Handle extension from a narrower type.  */
4013  if (TREE_CODE (exp) == NOP_EXPR
4014      && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4015    return sign_bit_p (TREE_OPERAND (exp, 0), val);
4016
4017  return NULL_TREE;
4018}
4019
4020/* Subroutine for fold_truth_andor_1: determine if an operand is simple enough
4021   to be evaluated unconditionally.  */
4022
4023static int
4024simple_operand_p (const_tree exp)
4025{
4026  /* Strip any conversions that don't change the machine mode.  */
4027  STRIP_NOPS (exp);
4028
4029  return (CONSTANT_CLASS_P (exp)
4030  	  || TREE_CODE (exp) == SSA_NAME
4031	  || (DECL_P (exp)
4032	      && ! TREE_ADDRESSABLE (exp)
4033	      && ! TREE_THIS_VOLATILE (exp)
4034	      && ! DECL_NONLOCAL (exp)
4035	      /* Don't regard global variables as simple.  They may be
4036		 allocated in ways unknown to the compiler (shared memory,
4037		 #pragma weak, etc).  */
4038	      && ! TREE_PUBLIC (exp)
4039	      && ! DECL_EXTERNAL (exp)
4040	      /* Weakrefs are not safe to be read, since they can be NULL.
4041 		 They are !TREE_PUBLIC && !DECL_EXTERNAL but still
4042		 have DECL_WEAK flag set.  */
4043	      && (! VAR_OR_FUNCTION_DECL_P (exp) || ! DECL_WEAK (exp))
4044	      /* Loading a static variable is unduly expensive, but global
4045		 registers aren't expensive.  */
4046	      && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4047}
4048
4049/* Subroutine for fold_truth_andor: determine if an operand is simple enough
4050   to be evaluated unconditionally.
4051   I addition to simple_operand_p, we assume that comparisons, conversions,
4052   and logic-not operations are simple, if their operands are simple, too.  */
4053
4054static bool
4055simple_operand_p_2 (tree exp)
4056{
4057  enum tree_code code;
4058
4059  if (TREE_SIDE_EFFECTS (exp)
4060      || tree_could_trap_p (exp))
4061    return false;
4062
4063  while (CONVERT_EXPR_P (exp))
4064    exp = TREE_OPERAND (exp, 0);
4065
4066  code = TREE_CODE (exp);
4067
4068  if (TREE_CODE_CLASS (code) == tcc_comparison)
4069    return (simple_operand_p (TREE_OPERAND (exp, 0))
4070	    && simple_operand_p (TREE_OPERAND (exp, 1)));
4071
4072  if (code == TRUTH_NOT_EXPR)
4073      return simple_operand_p_2 (TREE_OPERAND (exp, 0));
4074
4075  return simple_operand_p (exp);
4076}
4077
4078
4079/* The following functions are subroutines to fold_range_test and allow it to
4080   try to change a logical combination of comparisons into a range test.
4081
4082   For example, both
4083	X == 2 || X == 3 || X == 4 || X == 5
4084   and
4085	X >= 2 && X <= 5
4086   are converted to
4087	(unsigned) (X - 2) <= 3
4088
4089   We describe each set of comparisons as being either inside or outside
4090   a range, using a variable named like IN_P, and then describe the
4091   range with a lower and upper bound.  If one of the bounds is omitted,
4092   it represents either the highest or lowest value of the type.
4093
4094   In the comments below, we represent a range by two numbers in brackets
4095   preceded by a "+" to designate being inside that range, or a "-" to
4096   designate being outside that range, so the condition can be inverted by
4097   flipping the prefix.  An omitted bound is represented by a "-".  For
4098   example, "- [-, 10]" means being outside the range starting at the lowest
4099   possible value and ending at 10, in other words, being greater than 10.
4100   The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4101   always false.
4102
4103   We set up things so that the missing bounds are handled in a consistent
4104   manner so neither a missing bound nor "true" and "false" need to be
4105   handled using a special case.  */
4106
4107/* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4108   of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4109   and UPPER1_P are nonzero if the respective argument is an upper bound
4110   and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4111   must be specified for a comparison.  ARG1 will be converted to ARG0's
4112   type if both are specified.  */
4113
4114static tree
4115range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4116	     tree arg1, int upper1_p)
4117{
4118  tree tem;
4119  int result;
4120  int sgn0, sgn1;
4121
4122  /* If neither arg represents infinity, do the normal operation.
4123     Else, if not a comparison, return infinity.  Else handle the special
4124     comparison rules. Note that most of the cases below won't occur, but
4125     are handled for consistency.  */
4126
4127  if (arg0 != 0 && arg1 != 0)
4128    {
4129      tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4130			 arg0, fold_convert (TREE_TYPE (arg0), arg1));
4131      STRIP_NOPS (tem);
4132      return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4133    }
4134
4135  if (TREE_CODE_CLASS (code) != tcc_comparison)
4136    return 0;
4137
4138  /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4139     for neither.  In real maths, we cannot assume open ended ranges are
4140     the same. But, this is computer arithmetic, where numbers are finite.
4141     We can therefore make the transformation of any unbounded range with
4142     the value Z, Z being greater than any representable number. This permits
4143     us to treat unbounded ranges as equal.  */
4144  sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4145  sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4146  switch (code)
4147    {
4148    case EQ_EXPR:
4149      result = sgn0 == sgn1;
4150      break;
4151    case NE_EXPR:
4152      result = sgn0 != sgn1;
4153      break;
4154    case LT_EXPR:
4155      result = sgn0 < sgn1;
4156      break;
4157    case LE_EXPR:
4158      result = sgn0 <= sgn1;
4159      break;
4160    case GT_EXPR:
4161      result = sgn0 > sgn1;
4162      break;
4163    case GE_EXPR:
4164      result = sgn0 >= sgn1;
4165      break;
4166    default:
4167      gcc_unreachable ();
4168    }
4169
4170  return constant_boolean_node (result, type);
4171}
4172
4173/* Helper routine for make_range.  Perform one step for it, return
4174   new expression if the loop should continue or NULL_TREE if it should
4175   stop.  */
4176
4177tree
4178make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1,
4179		 tree exp_type, tree *p_low, tree *p_high, int *p_in_p,
4180		 bool *strict_overflow_p)
4181{
4182  tree arg0_type = TREE_TYPE (arg0);
4183  tree n_low, n_high, low = *p_low, high = *p_high;
4184  int in_p = *p_in_p, n_in_p;
4185
4186  switch (code)
4187    {
4188    case TRUTH_NOT_EXPR:
4189      /* We can only do something if the range is testing for zero.  */
4190      if (low == NULL_TREE || high == NULL_TREE
4191	  || ! integer_zerop (low) || ! integer_zerop (high))
4192	return NULL_TREE;
4193      *p_in_p = ! in_p;
4194      return arg0;
4195
4196    case EQ_EXPR: case NE_EXPR:
4197    case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4198      /* We can only do something if the range is testing for zero
4199	 and if the second operand is an integer constant.  Note that
4200	 saying something is "in" the range we make is done by
4201	 complementing IN_P since it will set in the initial case of
4202	 being not equal to zero; "out" is leaving it alone.  */
4203      if (low == NULL_TREE || high == NULL_TREE
4204	  || ! integer_zerop (low) || ! integer_zerop (high)
4205	  || TREE_CODE (arg1) != INTEGER_CST)
4206	return NULL_TREE;
4207
4208      switch (code)
4209	{
4210	case NE_EXPR:  /* - [c, c]  */
4211	  low = high = arg1;
4212	  break;
4213	case EQ_EXPR:  /* + [c, c]  */
4214	  in_p = ! in_p, low = high = arg1;
4215	  break;
4216	case GT_EXPR:  /* - [-, c] */
4217	  low = 0, high = arg1;
4218	  break;
4219	case GE_EXPR:  /* + [c, -] */
4220	  in_p = ! in_p, low = arg1, high = 0;
4221	  break;
4222	case LT_EXPR:  /* - [c, -] */
4223	  low = arg1, high = 0;
4224	  break;
4225	case LE_EXPR:  /* + [-, c] */
4226	  in_p = ! in_p, low = 0, high = arg1;
4227	  break;
4228	default:
4229	  gcc_unreachable ();
4230	}
4231
4232      /* If this is an unsigned comparison, we also know that EXP is
4233	 greater than or equal to zero.  We base the range tests we make
4234	 on that fact, so we record it here so we can parse existing
4235	 range tests.  We test arg0_type since often the return type
4236	 of, e.g. EQ_EXPR, is boolean.  */
4237      if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4238	{
4239	  if (! merge_ranges (&n_in_p, &n_low, &n_high,
4240			      in_p, low, high, 1,
4241			      build_int_cst (arg0_type, 0),
4242			      NULL_TREE))
4243	    return NULL_TREE;
4244
4245	  in_p = n_in_p, low = n_low, high = n_high;
4246
4247	  /* If the high bound is missing, but we have a nonzero low
4248	     bound, reverse the range so it goes from zero to the low bound
4249	     minus 1.  */
4250	  if (high == 0 && low && ! integer_zerop (low))
4251	    {
4252	      in_p = ! in_p;
4253	      high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4254				  build_int_cst (TREE_TYPE (low), 1), 0);
4255	      low = build_int_cst (arg0_type, 0);
4256	    }
4257	}
4258
4259      *p_low = low;
4260      *p_high = high;
4261      *p_in_p = in_p;
4262      return arg0;
4263
4264    case NEGATE_EXPR:
4265      /* If flag_wrapv and ARG0_TYPE is signed, make sure
4266	 low and high are non-NULL, then normalize will DTRT.  */
4267      if (!TYPE_UNSIGNED (arg0_type)
4268	  && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4269	{
4270	  if (low == NULL_TREE)
4271	    low = TYPE_MIN_VALUE (arg0_type);
4272	  if (high == NULL_TREE)
4273	    high = TYPE_MAX_VALUE (arg0_type);
4274	}
4275
4276      /* (-x) IN [a,b] -> x in [-b, -a]  */
4277      n_low = range_binop (MINUS_EXPR, exp_type,
4278			   build_int_cst (exp_type, 0),
4279			   0, high, 1);
4280      n_high = range_binop (MINUS_EXPR, exp_type,
4281			    build_int_cst (exp_type, 0),
4282			    0, low, 0);
4283      if (n_high != 0 && TREE_OVERFLOW (n_high))
4284	return NULL_TREE;
4285      goto normalize;
4286
4287    case BIT_NOT_EXPR:
4288      /* ~ X -> -X - 1  */
4289      return build2_loc (loc, MINUS_EXPR, exp_type, negate_expr (arg0),
4290			 build_int_cst (exp_type, 1));
4291
4292    case PLUS_EXPR:
4293    case MINUS_EXPR:
4294      if (TREE_CODE (arg1) != INTEGER_CST)
4295	return NULL_TREE;
4296
4297      /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4298	 move a constant to the other side.  */
4299      if (!TYPE_UNSIGNED (arg0_type)
4300	  && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4301	return NULL_TREE;
4302
4303      /* If EXP is signed, any overflow in the computation is undefined,
4304	 so we don't worry about it so long as our computations on
4305	 the bounds don't overflow.  For unsigned, overflow is defined
4306	 and this is exactly the right thing.  */
4307      n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4308			   arg0_type, low, 0, arg1, 0);
4309      n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4310			    arg0_type, high, 1, arg1, 0);
4311      if ((n_low != 0 && TREE_OVERFLOW (n_low))
4312	  || (n_high != 0 && TREE_OVERFLOW (n_high)))
4313	return NULL_TREE;
4314
4315      if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4316	*strict_overflow_p = true;
4317
4318      normalize:
4319	/* Check for an unsigned range which has wrapped around the maximum
4320	   value thus making n_high < n_low, and normalize it.  */
4321	if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4322	  {
4323	    low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4324			       build_int_cst (TREE_TYPE (n_high), 1), 0);
4325	    high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4326				build_int_cst (TREE_TYPE (n_low), 1), 0);
4327
4328	    /* If the range is of the form +/- [ x+1, x ], we won't
4329	       be able to normalize it.  But then, it represents the
4330	       whole range or the empty set, so make it
4331	       +/- [ -, - ].  */
4332	    if (tree_int_cst_equal (n_low, low)
4333		&& tree_int_cst_equal (n_high, high))
4334	      low = high = 0;
4335	    else
4336	      in_p = ! in_p;
4337	  }
4338	else
4339	  low = n_low, high = n_high;
4340
4341	*p_low = low;
4342	*p_high = high;
4343	*p_in_p = in_p;
4344	return arg0;
4345
4346    CASE_CONVERT:
4347    case NON_LVALUE_EXPR:
4348      if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4349	return NULL_TREE;
4350
4351      if (! INTEGRAL_TYPE_P (arg0_type)
4352	  || (low != 0 && ! int_fits_type_p (low, arg0_type))
4353	  || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4354	return NULL_TREE;
4355
4356      n_low = low, n_high = high;
4357
4358      if (n_low != 0)
4359	n_low = fold_convert_loc (loc, arg0_type, n_low);
4360
4361      if (n_high != 0)
4362	n_high = fold_convert_loc (loc, arg0_type, n_high);
4363
4364      /* If we're converting arg0 from an unsigned type, to exp,
4365	 a signed type,  we will be doing the comparison as unsigned.
4366	 The tests above have already verified that LOW and HIGH
4367	 are both positive.
4368
4369	 So we have to ensure that we will handle large unsigned
4370	 values the same way that the current signed bounds treat
4371	 negative values.  */
4372
4373      if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4374	{
4375	  tree high_positive;
4376	  tree equiv_type;
4377	  /* For fixed-point modes, we need to pass the saturating flag
4378	     as the 2nd parameter.  */
4379	  if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4380	    equiv_type
4381	      = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type),
4382						TYPE_SATURATING (arg0_type));
4383	  else
4384	    equiv_type
4385	      = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type), 1);
4386
4387	  /* A range without an upper bound is, naturally, unbounded.
4388	     Since convert would have cropped a very large value, use
4389	     the max value for the destination type.  */
4390	  high_positive
4391	    = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4392	      : TYPE_MAX_VALUE (arg0_type);
4393
4394	  if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4395	    high_positive = fold_build2_loc (loc, RSHIFT_EXPR, arg0_type,
4396					     fold_convert_loc (loc, arg0_type,
4397							       high_positive),
4398					     build_int_cst (arg0_type, 1));
4399
4400	  /* If the low bound is specified, "and" the range with the
4401	     range for which the original unsigned value will be
4402	     positive.  */
4403	  if (low != 0)
4404	    {
4405	      if (! merge_ranges (&n_in_p, &n_low, &n_high, 1, n_low, n_high,
4406				  1, fold_convert_loc (loc, arg0_type,
4407						       integer_zero_node),
4408				  high_positive))
4409		return NULL_TREE;
4410
4411	      in_p = (n_in_p == in_p);
4412	    }
4413	  else
4414	    {
4415	      /* Otherwise, "or" the range with the range of the input
4416		 that will be interpreted as negative.  */
4417	      if (! merge_ranges (&n_in_p, &n_low, &n_high, 0, n_low, n_high,
4418				  1, fold_convert_loc (loc, arg0_type,
4419						       integer_zero_node),
4420				  high_positive))
4421		return NULL_TREE;
4422
4423	      in_p = (in_p != n_in_p);
4424	    }
4425	}
4426
4427      *p_low = n_low;
4428      *p_high = n_high;
4429      *p_in_p = in_p;
4430      return arg0;
4431
4432    default:
4433      return NULL_TREE;
4434    }
4435}
4436
4437/* Given EXP, a logical expression, set the range it is testing into
4438   variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4439   actually being tested.  *PLOW and *PHIGH will be made of the same
4440   type as the returned expression.  If EXP is not a comparison, we
4441   will most likely not be returning a useful value and range.  Set
4442   *STRICT_OVERFLOW_P to true if the return value is only valid
4443   because signed overflow is undefined; otherwise, do not change
4444   *STRICT_OVERFLOW_P.  */
4445
4446tree
4447make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4448	    bool *strict_overflow_p)
4449{
4450  enum tree_code code;
4451  tree arg0, arg1 = NULL_TREE;
4452  tree exp_type, nexp;
4453  int in_p;
4454  tree low, high;
4455  location_t loc = EXPR_LOCATION (exp);
4456
4457  /* Start with simply saying "EXP != 0" and then look at the code of EXP
4458     and see if we can refine the range.  Some of the cases below may not
4459     happen, but it doesn't seem worth worrying about this.  We "continue"
4460     the outer loop when we've changed something; otherwise we "break"
4461     the switch, which will "break" the while.  */
4462
4463  in_p = 0;
4464  low = high = build_int_cst (TREE_TYPE (exp), 0);
4465
4466  while (1)
4467    {
4468      code = TREE_CODE (exp);
4469      exp_type = TREE_TYPE (exp);
4470      arg0 = NULL_TREE;
4471
4472      if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4473	{
4474	  if (TREE_OPERAND_LENGTH (exp) > 0)
4475	    arg0 = TREE_OPERAND (exp, 0);
4476	  if (TREE_CODE_CLASS (code) == tcc_binary
4477	      || TREE_CODE_CLASS (code) == tcc_comparison
4478	      || (TREE_CODE_CLASS (code) == tcc_expression
4479		  && TREE_OPERAND_LENGTH (exp) > 1))
4480	    arg1 = TREE_OPERAND (exp, 1);
4481	}
4482      if (arg0 == NULL_TREE)
4483	break;
4484
4485      nexp = make_range_step (loc, code, arg0, arg1, exp_type, &low,
4486			      &high, &in_p, strict_overflow_p);
4487      if (nexp == NULL_TREE)
4488	break;
4489      exp = nexp;
4490    }
4491
4492  /* If EXP is a constant, we can evaluate whether this is true or false.  */
4493  if (TREE_CODE (exp) == INTEGER_CST)
4494    {
4495      in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4496						 exp, 0, low, 0))
4497		      && integer_onep (range_binop (LE_EXPR, integer_type_node,
4498						    exp, 1, high, 1)));
4499      low = high = 0;
4500      exp = 0;
4501    }
4502
4503  *pin_p = in_p, *plow = low, *phigh = high;
4504  return exp;
4505}
4506
4507/* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4508   type, TYPE, return an expression to test if EXP is in (or out of, depending
4509   on IN_P) the range.  Return 0 if the test couldn't be created.  */
4510
4511tree
4512build_range_check (location_t loc, tree type, tree exp, int in_p,
4513		   tree low, tree high)
4514{
4515  tree etype = TREE_TYPE (exp), value;
4516
4517#ifdef HAVE_canonicalize_funcptr_for_compare
4518  /* Disable this optimization for function pointer expressions
4519     on targets that require function pointer canonicalization.  */
4520  if (HAVE_canonicalize_funcptr_for_compare
4521      && TREE_CODE (etype) == POINTER_TYPE
4522      && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4523    return NULL_TREE;
4524#endif
4525
4526  if (! in_p)
4527    {
4528      value = build_range_check (loc, type, exp, 1, low, high);
4529      if (value != 0)
4530        return invert_truthvalue_loc (loc, value);
4531
4532      return 0;
4533    }
4534
4535  if (low == 0 && high == 0)
4536    return omit_one_operand_loc (loc, type, build_int_cst (type, 1), exp);
4537
4538  if (low == 0)
4539    return fold_build2_loc (loc, LE_EXPR, type, exp,
4540			fold_convert_loc (loc, etype, high));
4541
4542  if (high == 0)
4543    return fold_build2_loc (loc, GE_EXPR, type, exp,
4544			fold_convert_loc (loc, etype, low));
4545
4546  if (operand_equal_p (low, high, 0))
4547    return fold_build2_loc (loc, EQ_EXPR, type, exp,
4548			fold_convert_loc (loc, etype, low));
4549
4550  if (integer_zerop (low))
4551    {
4552      if (! TYPE_UNSIGNED (etype))
4553	{
4554	  etype = unsigned_type_for (etype);
4555	  high = fold_convert_loc (loc, etype, high);
4556	  exp = fold_convert_loc (loc, etype, exp);
4557	}
4558      return build_range_check (loc, type, exp, 1, 0, high);
4559    }
4560
4561  /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4562  if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4563    {
4564      int prec = TYPE_PRECISION (etype);
4565
4566      if (wi::mask (prec - 1, false, prec) == high)
4567	{
4568	  if (TYPE_UNSIGNED (etype))
4569	    {
4570	      tree signed_etype = signed_type_for (etype);
4571	      if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype))
4572		etype
4573		  = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0);
4574	      else
4575		etype = signed_etype;
4576	      exp = fold_convert_loc (loc, etype, exp);
4577	    }
4578	  return fold_build2_loc (loc, GT_EXPR, type, exp,
4579			      build_int_cst (etype, 0));
4580	}
4581    }
4582
4583  /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4584     This requires wrap-around arithmetics for the type of the expression.
4585     First make sure that arithmetics in this type is valid, then make sure
4586     that it wraps around.  */
4587  if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE)
4588    etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4589					    TYPE_UNSIGNED (etype));
4590
4591  if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype))
4592    {
4593      tree utype, minv, maxv;
4594
4595      /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4596	 for the type in question, as we rely on this here.  */
4597      utype = unsigned_type_for (etype);
4598      maxv = fold_convert_loc (loc, utype, TYPE_MAX_VALUE (etype));
4599      maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4600			  build_int_cst (TREE_TYPE (maxv), 1), 1);
4601      minv = fold_convert_loc (loc, utype, TYPE_MIN_VALUE (etype));
4602
4603      if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4604				      minv, 1, maxv, 1)))
4605	etype = utype;
4606      else
4607	return 0;
4608    }
4609
4610  high = fold_convert_loc (loc, etype, high);
4611  low = fold_convert_loc (loc, etype, low);
4612  exp = fold_convert_loc (loc, etype, exp);
4613
4614  value = const_binop (MINUS_EXPR, high, low);
4615
4616
4617  if (POINTER_TYPE_P (etype))
4618    {
4619      if (value != 0 && !TREE_OVERFLOW (value))
4620	{
4621	  low = fold_build1_loc (loc, NEGATE_EXPR, TREE_TYPE (low), low);
4622          return build_range_check (loc, type,
4623			     	    fold_build_pointer_plus_loc (loc, exp, low),
4624			            1, build_int_cst (etype, 0), value);
4625	}
4626      return 0;
4627    }
4628
4629  if (value != 0 && !TREE_OVERFLOW (value))
4630    return build_range_check (loc, type,
4631			      fold_build2_loc (loc, MINUS_EXPR, etype, exp, low),
4632			      1, build_int_cst (etype, 0), value);
4633
4634  return 0;
4635}
4636
4637/* Return the predecessor of VAL in its type, handling the infinite case.  */
4638
4639static tree
4640range_predecessor (tree val)
4641{
4642  tree type = TREE_TYPE (val);
4643
4644  if (INTEGRAL_TYPE_P (type)
4645      && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4646    return 0;
4647  else
4648    return range_binop (MINUS_EXPR, NULL_TREE, val, 0,
4649			build_int_cst (TREE_TYPE (val), 1), 0);
4650}
4651
4652/* Return the successor of VAL in its type, handling the infinite case.  */
4653
4654static tree
4655range_successor (tree val)
4656{
4657  tree type = TREE_TYPE (val);
4658
4659  if (INTEGRAL_TYPE_P (type)
4660      && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4661    return 0;
4662  else
4663    return range_binop (PLUS_EXPR, NULL_TREE, val, 0,
4664			build_int_cst (TREE_TYPE (val), 1), 0);
4665}
4666
4667/* Given two ranges, see if we can merge them into one.  Return 1 if we
4668   can, 0 if we can't.  Set the output range into the specified parameters.  */
4669
4670bool
4671merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4672	      tree high0, int in1_p, tree low1, tree high1)
4673{
4674  int no_overlap;
4675  int subset;
4676  int temp;
4677  tree tem;
4678  int in_p;
4679  tree low, high;
4680  int lowequal = ((low0 == 0 && low1 == 0)
4681		  || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4682						low0, 0, low1, 0)));
4683  int highequal = ((high0 == 0 && high1 == 0)
4684		   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4685						 high0, 1, high1, 1)));
4686
4687  /* Make range 0 be the range that starts first, or ends last if they
4688     start at the same value.  Swap them if it isn't.  */
4689  if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4690				 low0, 0, low1, 0))
4691      || (lowequal
4692	  && integer_onep (range_binop (GT_EXPR, integer_type_node,
4693					high1, 1, high0, 1))))
4694    {
4695      temp = in0_p, in0_p = in1_p, in1_p = temp;
4696      tem = low0, low0 = low1, low1 = tem;
4697      tem = high0, high0 = high1, high1 = tem;
4698    }
4699
4700  /* Now flag two cases, whether the ranges are disjoint or whether the
4701     second range is totally subsumed in the first.  Note that the tests
4702     below are simplified by the ones above.  */
4703  no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4704					  high0, 1, low1, 0));
4705  subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4706				      high1, 1, high0, 1));
4707
4708  /* We now have four cases, depending on whether we are including or
4709     excluding the two ranges.  */
4710  if (in0_p && in1_p)
4711    {
4712      /* If they don't overlap, the result is false.  If the second range
4713	 is a subset it is the result.  Otherwise, the range is from the start
4714	 of the second to the end of the first.  */
4715      if (no_overlap)
4716	in_p = 0, low = high = 0;
4717      else if (subset)
4718	in_p = 1, low = low1, high = high1;
4719      else
4720	in_p = 1, low = low1, high = high0;
4721    }
4722
4723  else if (in0_p && ! in1_p)
4724    {
4725      /* If they don't overlap, the result is the first range.  If they are
4726	 equal, the result is false.  If the second range is a subset of the
4727	 first, and the ranges begin at the same place, we go from just after
4728	 the end of the second range to the end of the first.  If the second
4729	 range is not a subset of the first, or if it is a subset and both
4730	 ranges end at the same place, the range starts at the start of the
4731	 first range and ends just before the second range.
4732	 Otherwise, we can't describe this as a single range.  */
4733      if (no_overlap)
4734	in_p = 1, low = low0, high = high0;
4735      else if (lowequal && highequal)
4736	in_p = 0, low = high = 0;
4737      else if (subset && lowequal)
4738	{
4739	  low = range_successor (high1);
4740	  high = high0;
4741	  in_p = 1;
4742	  if (low == 0)
4743	    {
4744	      /* We are in the weird situation where high0 > high1 but
4745		 high1 has no successor.  Punt.  */
4746	      return 0;
4747	    }
4748	}
4749      else if (! subset || highequal)
4750	{
4751	  low = low0;
4752	  high = range_predecessor (low1);
4753	  in_p = 1;
4754	  if (high == 0)
4755	    {
4756	      /* low0 < low1 but low1 has no predecessor.  Punt.  */
4757	      return 0;
4758	    }
4759	}
4760      else
4761	return 0;
4762    }
4763
4764  else if (! in0_p && in1_p)
4765    {
4766      /* If they don't overlap, the result is the second range.  If the second
4767	 is a subset of the first, the result is false.  Otherwise,
4768	 the range starts just after the first range and ends at the
4769	 end of the second.  */
4770      if (no_overlap)
4771	in_p = 1, low = low1, high = high1;
4772      else if (subset || highequal)
4773	in_p = 0, low = high = 0;
4774      else
4775	{
4776	  low = range_successor (high0);
4777	  high = high1;
4778	  in_p = 1;
4779	  if (low == 0)
4780	    {
4781	      /* high1 > high0 but high0 has no successor.  Punt.  */
4782	      return 0;
4783	    }
4784	}
4785    }
4786
4787  else
4788    {
4789      /* The case where we are excluding both ranges.  Here the complex case
4790	 is if they don't overlap.  In that case, the only time we have a
4791	 range is if they are adjacent.  If the second is a subset of the
4792	 first, the result is the first.  Otherwise, the range to exclude
4793	 starts at the beginning of the first range and ends at the end of the
4794	 second.  */
4795      if (no_overlap)
4796	{
4797	  if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4798					 range_successor (high0),
4799					 1, low1, 0)))
4800	    in_p = 0, low = low0, high = high1;
4801	  else
4802	    {
4803	      /* Canonicalize - [min, x] into - [-, x].  */
4804	      if (low0 && TREE_CODE (low0) == INTEGER_CST)
4805		switch (TREE_CODE (TREE_TYPE (low0)))
4806		  {
4807		  case ENUMERAL_TYPE:
4808		    if (TYPE_PRECISION (TREE_TYPE (low0))
4809			!= GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4810		      break;
4811		    /* FALLTHROUGH */
4812		  case INTEGER_TYPE:
4813		    if (tree_int_cst_equal (low0,
4814					    TYPE_MIN_VALUE (TREE_TYPE (low0))))
4815		      low0 = 0;
4816		    break;
4817		  case POINTER_TYPE:
4818		    if (TYPE_UNSIGNED (TREE_TYPE (low0))
4819			&& integer_zerop (low0))
4820		      low0 = 0;
4821		    break;
4822		  default:
4823		    break;
4824		  }
4825
4826	      /* Canonicalize - [x, max] into - [x, -].  */
4827	      if (high1 && TREE_CODE (high1) == INTEGER_CST)
4828		switch (TREE_CODE (TREE_TYPE (high1)))
4829		  {
4830		  case ENUMERAL_TYPE:
4831		    if (TYPE_PRECISION (TREE_TYPE (high1))
4832			!= GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4833		      break;
4834		    /* FALLTHROUGH */
4835		  case INTEGER_TYPE:
4836		    if (tree_int_cst_equal (high1,
4837					    TYPE_MAX_VALUE (TREE_TYPE (high1))))
4838		      high1 = 0;
4839		    break;
4840		  case POINTER_TYPE:
4841		    if (TYPE_UNSIGNED (TREE_TYPE (high1))
4842			&& integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4843						       high1, 1,
4844						       build_int_cst (TREE_TYPE (high1), 1),
4845						       1)))
4846		      high1 = 0;
4847		    break;
4848		  default:
4849		    break;
4850		  }
4851
4852	      /* The ranges might be also adjacent between the maximum and
4853	         minimum values of the given type.  For
4854	         - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4855	         return + [x + 1, y - 1].  */
4856	      if (low0 == 0 && high1 == 0)
4857	        {
4858		  low = range_successor (high0);
4859		  high = range_predecessor (low1);
4860		  if (low == 0 || high == 0)
4861		    return 0;
4862
4863		  in_p = 1;
4864		}
4865	      else
4866		return 0;
4867	    }
4868	}
4869      else if (subset)
4870	in_p = 0, low = low0, high = high0;
4871      else
4872	in_p = 0, low = low0, high = high1;
4873    }
4874
4875  *pin_p = in_p, *plow = low, *phigh = high;
4876  return 1;
4877}
4878
4879
4880/* Subroutine of fold, looking inside expressions of the form
4881   A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4882   of the COND_EXPR.  This function is being used also to optimize
4883   A op B ? C : A, by reversing the comparison first.
4884
4885   Return a folded expression whose code is not a COND_EXPR
4886   anymore, or NULL_TREE if no folding opportunity is found.  */
4887
4888static tree
4889fold_cond_expr_with_comparison (location_t loc, tree type,
4890				tree arg0, tree arg1, tree arg2)
4891{
4892  enum tree_code comp_code = TREE_CODE (arg0);
4893  tree arg00 = TREE_OPERAND (arg0, 0);
4894  tree arg01 = TREE_OPERAND (arg0, 1);
4895  tree arg1_type = TREE_TYPE (arg1);
4896  tree tem;
4897
4898  STRIP_NOPS (arg1);
4899  STRIP_NOPS (arg2);
4900
4901  /* If we have A op 0 ? A : -A, consider applying the following
4902     transformations:
4903
4904     A == 0? A : -A    same as -A
4905     A != 0? A : -A    same as A
4906     A >= 0? A : -A    same as abs (A)
4907     A > 0?  A : -A    same as abs (A)
4908     A <= 0? A : -A    same as -abs (A)
4909     A < 0?  A : -A    same as -abs (A)
4910
4911     None of these transformations work for modes with signed
4912     zeros.  If A is +/-0, the first two transformations will
4913     change the sign of the result (from +0 to -0, or vice
4914     versa).  The last four will fix the sign of the result,
4915     even though the original expressions could be positive or
4916     negative, depending on the sign of A.
4917
4918     Note that all these transformations are correct if A is
4919     NaN, since the two alternatives (A and -A) are also NaNs.  */
4920  if (!HONOR_SIGNED_ZEROS (element_mode (type))
4921      && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4922	  ? real_zerop (arg01)
4923	  : integer_zerop (arg01))
4924      && ((TREE_CODE (arg2) == NEGATE_EXPR
4925	   && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4926	     /* In the case that A is of the form X-Y, '-A' (arg2) may
4927	        have already been folded to Y-X, check for that. */
4928	  || (TREE_CODE (arg1) == MINUS_EXPR
4929	      && TREE_CODE (arg2) == MINUS_EXPR
4930	      && operand_equal_p (TREE_OPERAND (arg1, 0),
4931				  TREE_OPERAND (arg2, 1), 0)
4932	      && operand_equal_p (TREE_OPERAND (arg1, 1),
4933				  TREE_OPERAND (arg2, 0), 0))))
4934    switch (comp_code)
4935      {
4936      case EQ_EXPR:
4937      case UNEQ_EXPR:
4938	tem = fold_convert_loc (loc, arg1_type, arg1);
4939	return pedantic_non_lvalue_loc (loc,
4940				    fold_convert_loc (loc, type,
4941						  negate_expr (tem)));
4942      case NE_EXPR:
4943      case LTGT_EXPR:
4944	return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4945      case UNGE_EXPR:
4946      case UNGT_EXPR:
4947	if (flag_trapping_math)
4948	  break;
4949	/* Fall through.  */
4950      case GE_EXPR:
4951      case GT_EXPR:
4952	if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4953	  break;
4954	tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
4955	return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
4956      case UNLE_EXPR:
4957      case UNLT_EXPR:
4958	if (flag_trapping_math)
4959	  break;
4960      case LE_EXPR:
4961      case LT_EXPR:
4962	if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4963	  break;
4964	tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
4965	return negate_expr (fold_convert_loc (loc, type, tem));
4966      default:
4967	gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4968	break;
4969      }
4970
4971  /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4972     A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4973     both transformations are correct when A is NaN: A != 0
4974     is then true, and A == 0 is false.  */
4975
4976  if (!HONOR_SIGNED_ZEROS (element_mode (type))
4977      && integer_zerop (arg01) && integer_zerop (arg2))
4978    {
4979      if (comp_code == NE_EXPR)
4980	return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4981      else if (comp_code == EQ_EXPR)
4982	return build_zero_cst (type);
4983    }
4984
4985  /* Try some transformations of A op B ? A : B.
4986
4987     A == B? A : B    same as B
4988     A != B? A : B    same as A
4989     A >= B? A : B    same as max (A, B)
4990     A > B?  A : B    same as max (B, A)
4991     A <= B? A : B    same as min (A, B)
4992     A < B?  A : B    same as min (B, A)
4993
4994     As above, these transformations don't work in the presence
4995     of signed zeros.  For example, if A and B are zeros of
4996     opposite sign, the first two transformations will change
4997     the sign of the result.  In the last four, the original
4998     expressions give different results for (A=+0, B=-0) and
4999     (A=-0, B=+0), but the transformed expressions do not.
5000
5001     The first two transformations are correct if either A or B
5002     is a NaN.  In the first transformation, the condition will
5003     be false, and B will indeed be chosen.  In the case of the
5004     second transformation, the condition A != B will be true,
5005     and A will be chosen.
5006
5007     The conversions to max() and min() are not correct if B is
5008     a number and A is not.  The conditions in the original
5009     expressions will be false, so all four give B.  The min()
5010     and max() versions would give a NaN instead.  */
5011  if (!HONOR_SIGNED_ZEROS (element_mode (type))
5012      && operand_equal_for_comparison_p (arg01, arg2, arg00)
5013      /* Avoid these transformations if the COND_EXPR may be used
5014	 as an lvalue in the C++ front-end.  PR c++/19199.  */
5015      && (in_gimple_form
5016	  || VECTOR_TYPE_P (type)
5017	  || (! lang_GNU_CXX ()
5018	      && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
5019	  || ! maybe_lvalue_p (arg1)
5020	  || ! maybe_lvalue_p (arg2)))
5021    {
5022      tree comp_op0 = arg00;
5023      tree comp_op1 = arg01;
5024      tree comp_type = TREE_TYPE (comp_op0);
5025
5026      /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
5027      if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
5028	{
5029	  comp_type = type;
5030	  comp_op0 = arg1;
5031	  comp_op1 = arg2;
5032	}
5033
5034      switch (comp_code)
5035	{
5036	case EQ_EXPR:
5037	  return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg2));
5038	case NE_EXPR:
5039	  return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5040	case LE_EXPR:
5041	case LT_EXPR:
5042	case UNLE_EXPR:
5043	case UNLT_EXPR:
5044	  /* In C++ a ?: expression can be an lvalue, so put the
5045	     operand which will be used if they are equal first
5046	     so that we can convert this back to the
5047	     corresponding COND_EXPR.  */
5048	  if (!HONOR_NANS (arg1))
5049	    {
5050	      comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5051	      comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5052	      tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
5053		    ? fold_build2_loc (loc, MIN_EXPR, comp_type, comp_op0, comp_op1)
5054		    : fold_build2_loc (loc, MIN_EXPR, comp_type,
5055				   comp_op1, comp_op0);
5056	      return pedantic_non_lvalue_loc (loc,
5057					  fold_convert_loc (loc, type, tem));
5058	    }
5059	  break;
5060	case GE_EXPR:
5061	case GT_EXPR:
5062	case UNGE_EXPR:
5063	case UNGT_EXPR:
5064	  if (!HONOR_NANS (arg1))
5065	    {
5066	      comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5067	      comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5068	      tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5069		    ? fold_build2_loc (loc, MAX_EXPR, comp_type, comp_op0, comp_op1)
5070		    : fold_build2_loc (loc, MAX_EXPR, comp_type,
5071				   comp_op1, comp_op0);
5072	      return pedantic_non_lvalue_loc (loc,
5073					  fold_convert_loc (loc, type, tem));
5074	    }
5075	  break;
5076	case UNEQ_EXPR:
5077	  if (!HONOR_NANS (arg1))
5078	    return pedantic_non_lvalue_loc (loc,
5079					fold_convert_loc (loc, type, arg2));
5080	  break;
5081	case LTGT_EXPR:
5082	  if (!HONOR_NANS (arg1))
5083	    return pedantic_non_lvalue_loc (loc,
5084					fold_convert_loc (loc, type, arg1));
5085	  break;
5086	default:
5087	  gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5088	  break;
5089	}
5090    }
5091
5092  /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5093     we might still be able to simplify this.  For example,
5094     if C1 is one less or one more than C2, this might have started
5095     out as a MIN or MAX and been transformed by this function.
5096     Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5097
5098  if (INTEGRAL_TYPE_P (type)
5099      && TREE_CODE (arg01) == INTEGER_CST
5100      && TREE_CODE (arg2) == INTEGER_CST)
5101    switch (comp_code)
5102      {
5103      case EQ_EXPR:
5104	if (TREE_CODE (arg1) == INTEGER_CST)
5105	  break;
5106	/* We can replace A with C1 in this case.  */
5107	arg1 = fold_convert_loc (loc, type, arg01);
5108	return fold_build3_loc (loc, COND_EXPR, type, arg0, arg1, arg2);
5109
5110      case LT_EXPR:
5111	/* If C1 is C2 + 1, this is min(A, C2), but use ARG00's type for
5112	   MIN_EXPR, to preserve the signedness of the comparison.  */
5113	if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5114			       OEP_ONLY_CONST)
5115	    && operand_equal_p (arg01,
5116				const_binop (PLUS_EXPR, arg2,
5117					     build_int_cst (type, 1)),
5118				OEP_ONLY_CONST))
5119	  {
5120	    tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5121				   fold_convert_loc (loc, TREE_TYPE (arg00),
5122						     arg2));
5123	    return pedantic_non_lvalue_loc (loc,
5124					    fold_convert_loc (loc, type, tem));
5125	  }
5126	break;
5127
5128      case LE_EXPR:
5129	/* If C1 is C2 - 1, this is min(A, C2), with the same care
5130	   as above.  */
5131	if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5132			       OEP_ONLY_CONST)
5133	    && operand_equal_p (arg01,
5134				const_binop (MINUS_EXPR, arg2,
5135					     build_int_cst (type, 1)),
5136				OEP_ONLY_CONST))
5137	  {
5138	    tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5139				   fold_convert_loc (loc, TREE_TYPE (arg00),
5140						     arg2));
5141	    return pedantic_non_lvalue_loc (loc,
5142					    fold_convert_loc (loc, type, tem));
5143	  }
5144	break;
5145
5146      case GT_EXPR:
5147	/* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for
5148	   MAX_EXPR, to preserve the signedness of the comparison.  */
5149	if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5150			       OEP_ONLY_CONST)
5151	    && operand_equal_p (arg01,
5152				const_binop (MINUS_EXPR, arg2,
5153					     build_int_cst (type, 1)),
5154				OEP_ONLY_CONST))
5155	  {
5156	    tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5157				   fold_convert_loc (loc, TREE_TYPE (arg00),
5158						     arg2));
5159	    return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5160	  }
5161	break;
5162
5163      case GE_EXPR:
5164	/* If C1 is C2 + 1, this is max(A, C2), with the same care as above.  */
5165	if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5166			       OEP_ONLY_CONST)
5167	    && operand_equal_p (arg01,
5168				const_binop (PLUS_EXPR, arg2,
5169					     build_int_cst (type, 1)),
5170				OEP_ONLY_CONST))
5171	  {
5172	    tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5173				   fold_convert_loc (loc, TREE_TYPE (arg00),
5174						     arg2));
5175	    return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5176	  }
5177	break;
5178      case NE_EXPR:
5179	break;
5180      default:
5181	gcc_unreachable ();
5182      }
5183
5184  return NULL_TREE;
5185}
5186
5187
5188
5189#ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5190#define LOGICAL_OP_NON_SHORT_CIRCUIT \
5191  (BRANCH_COST (optimize_function_for_speed_p (cfun), \
5192		false) >= 2)
5193#endif
5194
5195/* EXP is some logical combination of boolean tests.  See if we can
5196   merge it into some range test.  Return the new tree if so.  */
5197
5198static tree
5199fold_range_test (location_t loc, enum tree_code code, tree type,
5200		 tree op0, tree op1)
5201{
5202  int or_op = (code == TRUTH_ORIF_EXPR
5203	       || code == TRUTH_OR_EXPR);
5204  int in0_p, in1_p, in_p;
5205  tree low0, low1, low, high0, high1, high;
5206  bool strict_overflow_p = false;
5207  tree tem, lhs, rhs;
5208  const char * const warnmsg = G_("assuming signed overflow does not occur "
5209				  "when simplifying range test");
5210
5211  if (!INTEGRAL_TYPE_P (type))
5212    return 0;
5213
5214  lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5215  rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5216
5217  /* If this is an OR operation, invert both sides; we will invert
5218     again at the end.  */
5219  if (or_op)
5220    in0_p = ! in0_p, in1_p = ! in1_p;
5221
5222  /* If both expressions are the same, if we can merge the ranges, and we
5223     can build the range test, return it or it inverted.  If one of the
5224     ranges is always true or always false, consider it to be the same
5225     expression as the other.  */
5226  if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5227      && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5228		       in1_p, low1, high1)
5229      && 0 != (tem = (build_range_check (loc, type,
5230					 lhs != 0 ? lhs
5231					 : rhs != 0 ? rhs : integer_zero_node,
5232					 in_p, low, high))))
5233    {
5234      if (strict_overflow_p)
5235	fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5236      return or_op ? invert_truthvalue_loc (loc, tem) : tem;
5237    }
5238
5239  /* On machines where the branch cost is expensive, if this is a
5240     short-circuited branch and the underlying object on both sides
5241     is the same, make a non-short-circuit operation.  */
5242  else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5243	   && lhs != 0 && rhs != 0
5244	   && (code == TRUTH_ANDIF_EXPR
5245	       || code == TRUTH_ORIF_EXPR)
5246	   && operand_equal_p (lhs, rhs, 0))
5247    {
5248      /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5249	 unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5250	 which cases we can't do this.  */
5251      if (simple_operand_p (lhs))
5252	return build2_loc (loc, code == TRUTH_ANDIF_EXPR
5253			   ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5254			   type, op0, op1);
5255
5256      else if (!lang_hooks.decls.global_bindings_p ()
5257	       && !CONTAINS_PLACEHOLDER_P (lhs))
5258	{
5259	  tree common = save_expr (lhs);
5260
5261	  if (0 != (lhs = build_range_check (loc, type, common,
5262					     or_op ? ! in0_p : in0_p,
5263					     low0, high0))
5264	      && (0 != (rhs = build_range_check (loc, type, common,
5265						 or_op ? ! in1_p : in1_p,
5266						 low1, high1))))
5267	    {
5268	      if (strict_overflow_p)
5269		fold_overflow_warning (warnmsg,
5270				       WARN_STRICT_OVERFLOW_COMPARISON);
5271	      return build2_loc (loc, code == TRUTH_ANDIF_EXPR
5272				 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5273				 type, lhs, rhs);
5274	    }
5275	}
5276    }
5277
5278  return 0;
5279}
5280
5281/* Subroutine for fold_truth_andor_1: C is an INTEGER_CST interpreted as a P
5282   bit value.  Arrange things so the extra bits will be set to zero if and
5283   only if C is signed-extended to its full width.  If MASK is nonzero,
5284   it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5285
5286static tree
5287unextend (tree c, int p, int unsignedp, tree mask)
5288{
5289  tree type = TREE_TYPE (c);
5290  int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5291  tree temp;
5292
5293  if (p == modesize || unsignedp)
5294    return c;
5295
5296  /* We work by getting just the sign bit into the low-order bit, then
5297     into the high-order bit, then sign-extend.  We then XOR that value
5298     with C.  */
5299  temp = build_int_cst (TREE_TYPE (c), wi::extract_uhwi (c, p - 1, 1));
5300
5301  /* We must use a signed type in order to get an arithmetic right shift.
5302     However, we must also avoid introducing accidental overflows, so that
5303     a subsequent call to integer_zerop will work.  Hence we must
5304     do the type conversion here.  At this point, the constant is either
5305     zero or one, and the conversion to a signed type can never overflow.
5306     We could get an overflow if this conversion is done anywhere else.  */
5307  if (TYPE_UNSIGNED (type))
5308    temp = fold_convert (signed_type_for (type), temp);
5309
5310  temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1));
5311  temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1));
5312  if (mask != 0)
5313    temp = const_binop (BIT_AND_EXPR, temp,
5314			fold_convert (TREE_TYPE (c), mask));
5315  /* If necessary, convert the type back to match the type of C.  */
5316  if (TYPE_UNSIGNED (type))
5317    temp = fold_convert (type, temp);
5318
5319  return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp));
5320}
5321
5322/* For an expression that has the form
5323     (A && B) || ~B
5324   or
5325     (A || B) && ~B,
5326   we can drop one of the inner expressions and simplify to
5327     A || ~B
5328   or
5329     A && ~B
5330   LOC is the location of the resulting expression.  OP is the inner
5331   logical operation; the left-hand side in the examples above, while CMPOP
5332   is the right-hand side.  RHS_ONLY is used to prevent us from accidentally
5333   removing a condition that guards another, as in
5334     (A != NULL && A->...) || A == NULL
5335   which we must not transform.  If RHS_ONLY is true, only eliminate the
5336   right-most operand of the inner logical operation.  */
5337
5338static tree
5339merge_truthop_with_opposite_arm (location_t loc, tree op, tree cmpop,
5340				 bool rhs_only)
5341{
5342  tree type = TREE_TYPE (cmpop);
5343  enum tree_code code = TREE_CODE (cmpop);
5344  enum tree_code truthop_code = TREE_CODE (op);
5345  tree lhs = TREE_OPERAND (op, 0);
5346  tree rhs = TREE_OPERAND (op, 1);
5347  tree orig_lhs = lhs, orig_rhs = rhs;
5348  enum tree_code rhs_code = TREE_CODE (rhs);
5349  enum tree_code lhs_code = TREE_CODE (lhs);
5350  enum tree_code inv_code;
5351
5352  if (TREE_SIDE_EFFECTS (op) || TREE_SIDE_EFFECTS (cmpop))
5353    return NULL_TREE;
5354
5355  if (TREE_CODE_CLASS (code) != tcc_comparison)
5356    return NULL_TREE;
5357
5358  if (rhs_code == truthop_code)
5359    {
5360      tree newrhs = merge_truthop_with_opposite_arm (loc, rhs, cmpop, rhs_only);
5361      if (newrhs != NULL_TREE)
5362	{
5363	  rhs = newrhs;
5364	  rhs_code = TREE_CODE (rhs);
5365	}
5366    }
5367  if (lhs_code == truthop_code && !rhs_only)
5368    {
5369      tree newlhs = merge_truthop_with_opposite_arm (loc, lhs, cmpop, false);
5370      if (newlhs != NULL_TREE)
5371	{
5372	  lhs = newlhs;
5373	  lhs_code = TREE_CODE (lhs);
5374	}
5375    }
5376
5377  inv_code = invert_tree_comparison (code, HONOR_NANS (type));
5378  if (inv_code == rhs_code
5379      && operand_equal_p (TREE_OPERAND (rhs, 0), TREE_OPERAND (cmpop, 0), 0)
5380      && operand_equal_p (TREE_OPERAND (rhs, 1), TREE_OPERAND (cmpop, 1), 0))
5381    return lhs;
5382  if (!rhs_only && inv_code == lhs_code
5383      && operand_equal_p (TREE_OPERAND (lhs, 0), TREE_OPERAND (cmpop, 0), 0)
5384      && operand_equal_p (TREE_OPERAND (lhs, 1), TREE_OPERAND (cmpop, 1), 0))
5385    return rhs;
5386  if (rhs != orig_rhs || lhs != orig_lhs)
5387    return fold_build2_loc (loc, truthop_code, TREE_TYPE (cmpop),
5388			    lhs, rhs);
5389  return NULL_TREE;
5390}
5391
5392/* Find ways of folding logical expressions of LHS and RHS:
5393   Try to merge two comparisons to the same innermost item.
5394   Look for range tests like "ch >= '0' && ch <= '9'".
5395   Look for combinations of simple terms on machines with expensive branches
5396   and evaluate the RHS unconditionally.
5397
5398   For example, if we have p->a == 2 && p->b == 4 and we can make an
5399   object large enough to span both A and B, we can do this with a comparison
5400   against the object ANDed with the a mask.
5401
5402   If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5403   operations to do this with one comparison.
5404
5405   We check for both normal comparisons and the BIT_AND_EXPRs made this by
5406   function and the one above.
5407
5408   CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5409   TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5410
5411   TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5412   two operands.
5413
5414   We return the simplified tree or 0 if no optimization is possible.  */
5415
5416static tree
5417fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
5418		    tree lhs, tree rhs)
5419{
5420  /* If this is the "or" of two comparisons, we can do something if
5421     the comparisons are NE_EXPR.  If this is the "and", we can do something
5422     if the comparisons are EQ_EXPR.  I.e.,
5423	(a->b == 2 && a->c == 4) can become (a->new == NEW).
5424
5425     WANTED_CODE is this operation code.  For single bit fields, we can
5426     convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5427     comparison for one-bit fields.  */
5428
5429  enum tree_code wanted_code;
5430  enum tree_code lcode, rcode;
5431  tree ll_arg, lr_arg, rl_arg, rr_arg;
5432  tree ll_inner, lr_inner, rl_inner, rr_inner;
5433  HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5434  HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5435  HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5436  HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5437  int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5438  machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5439  machine_mode lnmode, rnmode;
5440  tree ll_mask, lr_mask, rl_mask, rr_mask;
5441  tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5442  tree l_const, r_const;
5443  tree lntype, rntype, result;
5444  HOST_WIDE_INT first_bit, end_bit;
5445  int volatilep;
5446
5447  /* Start by getting the comparison codes.  Fail if anything is volatile.
5448     If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5449     it were surrounded with a NE_EXPR.  */
5450
5451  if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5452    return 0;
5453
5454  lcode = TREE_CODE (lhs);
5455  rcode = TREE_CODE (rhs);
5456
5457  if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5458    {
5459      lhs = build2 (NE_EXPR, truth_type, lhs,
5460		    build_int_cst (TREE_TYPE (lhs), 0));
5461      lcode = NE_EXPR;
5462    }
5463
5464  if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5465    {
5466      rhs = build2 (NE_EXPR, truth_type, rhs,
5467		    build_int_cst (TREE_TYPE (rhs), 0));
5468      rcode = NE_EXPR;
5469    }
5470
5471  if (TREE_CODE_CLASS (lcode) != tcc_comparison
5472      || TREE_CODE_CLASS (rcode) != tcc_comparison)
5473    return 0;
5474
5475  ll_arg = TREE_OPERAND (lhs, 0);
5476  lr_arg = TREE_OPERAND (lhs, 1);
5477  rl_arg = TREE_OPERAND (rhs, 0);
5478  rr_arg = TREE_OPERAND (rhs, 1);
5479
5480  /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5481  if (simple_operand_p (ll_arg)
5482      && simple_operand_p (lr_arg))
5483    {
5484      if (operand_equal_p (ll_arg, rl_arg, 0)
5485          && operand_equal_p (lr_arg, rr_arg, 0))
5486	{
5487          result = combine_comparisons (loc, code, lcode, rcode,
5488					truth_type, ll_arg, lr_arg);
5489	  if (result)
5490	    return result;
5491	}
5492      else if (operand_equal_p (ll_arg, rr_arg, 0)
5493               && operand_equal_p (lr_arg, rl_arg, 0))
5494	{
5495          result = combine_comparisons (loc, code, lcode,
5496					swap_tree_comparison (rcode),
5497					truth_type, ll_arg, lr_arg);
5498	  if (result)
5499	    return result;
5500	}
5501    }
5502
5503  code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5504	  ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5505
5506  /* If the RHS can be evaluated unconditionally and its operands are
5507     simple, it wins to evaluate the RHS unconditionally on machines
5508     with expensive branches.  In this case, this isn't a comparison
5509     that can be merged.  */
5510
5511  if (BRANCH_COST (optimize_function_for_speed_p (cfun),
5512		   false) >= 2
5513      && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5514      && simple_operand_p (rl_arg)
5515      && simple_operand_p (rr_arg))
5516    {
5517      /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5518      if (code == TRUTH_OR_EXPR
5519	  && lcode == NE_EXPR && integer_zerop (lr_arg)
5520	  && rcode == NE_EXPR && integer_zerop (rr_arg)
5521	  && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5522	  && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5523	return build2_loc (loc, NE_EXPR, truth_type,
5524			   build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5525				   ll_arg, rl_arg),
5526			   build_int_cst (TREE_TYPE (ll_arg), 0));
5527
5528      /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5529      if (code == TRUTH_AND_EXPR
5530	  && lcode == EQ_EXPR && integer_zerop (lr_arg)
5531	  && rcode == EQ_EXPR && integer_zerop (rr_arg)
5532	  && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5533	  && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5534	return build2_loc (loc, EQ_EXPR, truth_type,
5535			   build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5536				   ll_arg, rl_arg),
5537			   build_int_cst (TREE_TYPE (ll_arg), 0));
5538    }
5539
5540  /* See if the comparisons can be merged.  Then get all the parameters for
5541     each side.  */
5542
5543  if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5544      || (rcode != EQ_EXPR && rcode != NE_EXPR))
5545    return 0;
5546
5547  volatilep = 0;
5548  ll_inner = decode_field_reference (loc, ll_arg,
5549				     &ll_bitsize, &ll_bitpos, &ll_mode,
5550				     &ll_unsignedp, &volatilep, &ll_mask,
5551				     &ll_and_mask);
5552  lr_inner = decode_field_reference (loc, lr_arg,
5553				     &lr_bitsize, &lr_bitpos, &lr_mode,
5554				     &lr_unsignedp, &volatilep, &lr_mask,
5555				     &lr_and_mask);
5556  rl_inner = decode_field_reference (loc, rl_arg,
5557				     &rl_bitsize, &rl_bitpos, &rl_mode,
5558				     &rl_unsignedp, &volatilep, &rl_mask,
5559				     &rl_and_mask);
5560  rr_inner = decode_field_reference (loc, rr_arg,
5561				     &rr_bitsize, &rr_bitpos, &rr_mode,
5562				     &rr_unsignedp, &volatilep, &rr_mask,
5563				     &rr_and_mask);
5564
5565  /* It must be true that the inner operation on the lhs of each
5566     comparison must be the same if we are to be able to do anything.
5567     Then see if we have constants.  If not, the same must be true for
5568     the rhs's.  */
5569  if (volatilep || ll_inner == 0 || rl_inner == 0
5570      || ! operand_equal_p (ll_inner, rl_inner, 0))
5571    return 0;
5572
5573  if (TREE_CODE (lr_arg) == INTEGER_CST
5574      && TREE_CODE (rr_arg) == INTEGER_CST)
5575    l_const = lr_arg, r_const = rr_arg;
5576  else if (lr_inner == 0 || rr_inner == 0
5577	   || ! operand_equal_p (lr_inner, rr_inner, 0))
5578    return 0;
5579  else
5580    l_const = r_const = 0;
5581
5582  /* If either comparison code is not correct for our logical operation,
5583     fail.  However, we can convert a one-bit comparison against zero into
5584     the opposite comparison against that bit being set in the field.  */
5585
5586  wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5587  if (lcode != wanted_code)
5588    {
5589      if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5590	{
5591	  /* Make the left operand unsigned, since we are only interested
5592	     in the value of one bit.  Otherwise we are doing the wrong
5593	     thing below.  */
5594	  ll_unsignedp = 1;
5595	  l_const = ll_mask;
5596	}
5597      else
5598	return 0;
5599    }
5600
5601  /* This is analogous to the code for l_const above.  */
5602  if (rcode != wanted_code)
5603    {
5604      if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5605	{
5606	  rl_unsignedp = 1;
5607	  r_const = rl_mask;
5608	}
5609      else
5610	return 0;
5611    }
5612
5613  /* See if we can find a mode that contains both fields being compared on
5614     the left.  If we can't, fail.  Otherwise, update all constants and masks
5615     to be relative to a field of that size.  */
5616  first_bit = MIN (ll_bitpos, rl_bitpos);
5617  end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5618  lnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0,
5619			  TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5620			  volatilep);
5621  if (lnmode == VOIDmode)
5622    return 0;
5623
5624  lnbitsize = GET_MODE_BITSIZE (lnmode);
5625  lnbitpos = first_bit & ~ (lnbitsize - 1);
5626  lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5627  xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5628
5629  if (BYTES_BIG_ENDIAN)
5630    {
5631      xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5632      xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5633    }
5634
5635  ll_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, ll_mask),
5636			 size_int (xll_bitpos));
5637  rl_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, rl_mask),
5638			 size_int (xrl_bitpos));
5639
5640  if (l_const)
5641    {
5642      l_const = fold_convert_loc (loc, lntype, l_const);
5643      l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5644      l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos));
5645      if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5646					fold_build1_loc (loc, BIT_NOT_EXPR,
5647						     lntype, ll_mask))))
5648	{
5649	  warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5650
5651	  return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5652	}
5653    }
5654  if (r_const)
5655    {
5656      r_const = fold_convert_loc (loc, lntype, r_const);
5657      r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5658      r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos));
5659      if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5660					fold_build1_loc (loc, BIT_NOT_EXPR,
5661						     lntype, rl_mask))))
5662	{
5663	  warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5664
5665	  return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5666	}
5667    }
5668
5669  /* If the right sides are not constant, do the same for it.  Also,
5670     disallow this optimization if a size or signedness mismatch occurs
5671     between the left and right sides.  */
5672  if (l_const == 0)
5673    {
5674      if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5675	  || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5676	  /* Make sure the two fields on the right
5677	     correspond to the left without being swapped.  */
5678	  || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5679	return 0;
5680
5681      first_bit = MIN (lr_bitpos, rr_bitpos);
5682      end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5683      rnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0,
5684			      TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5685			      volatilep);
5686      if (rnmode == VOIDmode)
5687	return 0;
5688
5689      rnbitsize = GET_MODE_BITSIZE (rnmode);
5690      rnbitpos = first_bit & ~ (rnbitsize - 1);
5691      rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5692      xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5693
5694      if (BYTES_BIG_ENDIAN)
5695	{
5696	  xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5697	  xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5698	}
5699
5700      lr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
5701							    rntype, lr_mask),
5702			     size_int (xlr_bitpos));
5703      rr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
5704							    rntype, rr_mask),
5705			     size_int (xrr_bitpos));
5706
5707      /* Make a mask that corresponds to both fields being compared.
5708	 Do this for both items being compared.  If the operands are the
5709	 same size and the bits being compared are in the same position
5710	 then we can do this by masking both and comparing the masked
5711	 results.  */
5712      ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
5713      lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask);
5714      if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5715	{
5716	  lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
5717				    ll_unsignedp || rl_unsignedp);
5718	  if (! all_ones_mask_p (ll_mask, lnbitsize))
5719	    lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5720
5721	  rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos,
5722				    lr_unsignedp || rr_unsignedp);
5723	  if (! all_ones_mask_p (lr_mask, rnbitsize))
5724	    rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5725
5726	  return build2_loc (loc, wanted_code, truth_type, lhs, rhs);
5727	}
5728
5729      /* There is still another way we can do something:  If both pairs of
5730	 fields being compared are adjacent, we may be able to make a wider
5731	 field containing them both.
5732
5733	 Note that we still must mask the lhs/rhs expressions.  Furthermore,
5734	 the mask must be shifted to account for the shift done by
5735	 make_bit_field_ref.  */
5736      if ((ll_bitsize + ll_bitpos == rl_bitpos
5737	   && lr_bitsize + lr_bitpos == rr_bitpos)
5738	  || (ll_bitpos == rl_bitpos + rl_bitsize
5739	      && lr_bitpos == rr_bitpos + rr_bitsize))
5740	{
5741	  tree type;
5742
5743	  lhs = make_bit_field_ref (loc, ll_inner, lntype,
5744				    ll_bitsize + rl_bitsize,
5745				    MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5746	  rhs = make_bit_field_ref (loc, lr_inner, rntype,
5747				    lr_bitsize + rr_bitsize,
5748				    MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5749
5750	  ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5751				 size_int (MIN (xll_bitpos, xrl_bitpos)));
5752	  lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5753				 size_int (MIN (xlr_bitpos, xrr_bitpos)));
5754
5755	  /* Convert to the smaller type before masking out unwanted bits.  */
5756	  type = lntype;
5757	  if (lntype != rntype)
5758	    {
5759	      if (lnbitsize > rnbitsize)
5760		{
5761		  lhs = fold_convert_loc (loc, rntype, lhs);
5762		  ll_mask = fold_convert_loc (loc, rntype, ll_mask);
5763		  type = rntype;
5764		}
5765	      else if (lnbitsize < rnbitsize)
5766		{
5767		  rhs = fold_convert_loc (loc, lntype, rhs);
5768		  lr_mask = fold_convert_loc (loc, lntype, lr_mask);
5769		  type = lntype;
5770		}
5771	    }
5772
5773	  if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5774	    lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5775
5776	  if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5777	    rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5778
5779	  return build2_loc (loc, wanted_code, truth_type, lhs, rhs);
5780	}
5781
5782      return 0;
5783    }
5784
5785  /* Handle the case of comparisons with constants.  If there is something in
5786     common between the masks, those bits of the constants must be the same.
5787     If not, the condition is always false.  Test for this to avoid generating
5788     incorrect code below.  */
5789  result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask);
5790  if (! integer_zerop (result)
5791      && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const),
5792			   const_binop (BIT_AND_EXPR, result, r_const)) != 1)
5793    {
5794      if (wanted_code == NE_EXPR)
5795	{
5796	  warning (0, "%<or%> of unmatched not-equal tests is always 1");
5797	  return constant_boolean_node (true, truth_type);
5798	}
5799      else
5800	{
5801	  warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5802	  return constant_boolean_node (false, truth_type);
5803	}
5804    }
5805
5806  /* Construct the expression we will return.  First get the component
5807     reference we will make.  Unless the mask is all ones the width of
5808     that field, perform the mask operation.  Then compare with the
5809     merged constant.  */
5810  result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
5811			       ll_unsignedp || rl_unsignedp);
5812
5813  ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
5814  if (! all_ones_mask_p (ll_mask, lnbitsize))
5815    result = build2_loc (loc, BIT_AND_EXPR, lntype, result, ll_mask);
5816
5817  return build2_loc (loc, wanted_code, truth_type, result,
5818		     const_binop (BIT_IOR_EXPR, l_const, r_const));
5819}
5820
5821/* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5822   constant.  */
5823
5824static tree
5825optimize_minmax_comparison (location_t loc, enum tree_code code, tree type,
5826			    tree op0, tree op1)
5827{
5828  tree arg0 = op0;
5829  enum tree_code op_code;
5830  tree comp_const;
5831  tree minmax_const;
5832  int consts_equal, consts_lt;
5833  tree inner;
5834
5835  STRIP_SIGN_NOPS (arg0);
5836
5837  op_code = TREE_CODE (arg0);
5838  minmax_const = TREE_OPERAND (arg0, 1);
5839  comp_const = fold_convert_loc (loc, TREE_TYPE (arg0), op1);
5840  consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5841  consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5842  inner = TREE_OPERAND (arg0, 0);
5843
5844  /* If something does not permit us to optimize, return the original tree.  */
5845  if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5846      || TREE_CODE (comp_const) != INTEGER_CST
5847      || TREE_OVERFLOW (comp_const)
5848      || TREE_CODE (minmax_const) != INTEGER_CST
5849      || TREE_OVERFLOW (minmax_const))
5850    return NULL_TREE;
5851
5852  /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5853     and GT_EXPR, doing the rest with recursive calls using logical
5854     simplifications.  */
5855  switch (code)
5856    {
5857    case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5858      {
5859	tree tem
5860	  = optimize_minmax_comparison (loc,
5861					invert_tree_comparison (code, false),
5862					type, op0, op1);
5863	if (tem)
5864	  return invert_truthvalue_loc (loc, tem);
5865	return NULL_TREE;
5866      }
5867
5868    case GE_EXPR:
5869      return
5870	fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
5871		     optimize_minmax_comparison
5872		     (loc, EQ_EXPR, type, arg0, comp_const),
5873		     optimize_minmax_comparison
5874		     (loc, GT_EXPR, type, arg0, comp_const));
5875
5876    case EQ_EXPR:
5877      if (op_code == MAX_EXPR && consts_equal)
5878	/* MAX (X, 0) == 0  ->  X <= 0  */
5879	return fold_build2_loc (loc, LE_EXPR, type, inner, comp_const);
5880
5881      else if (op_code == MAX_EXPR && consts_lt)
5882	/* MAX (X, 0) == 5  ->  X == 5   */
5883	return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
5884
5885      else if (op_code == MAX_EXPR)
5886	/* MAX (X, 0) == -1  ->  false  */
5887	return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5888
5889      else if (consts_equal)
5890	/* MIN (X, 0) == 0  ->  X >= 0  */
5891	return fold_build2_loc (loc, GE_EXPR, type, inner, comp_const);
5892
5893      else if (consts_lt)
5894	/* MIN (X, 0) == 5  ->  false  */
5895	return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5896
5897      else
5898	/* MIN (X, 0) == -1  ->  X == -1  */
5899	return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
5900
5901    case GT_EXPR:
5902      if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5903	/* MAX (X, 0) > 0  ->  X > 0
5904	   MAX (X, 0) > 5  ->  X > 5  */
5905	return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
5906
5907      else if (op_code == MAX_EXPR)
5908	/* MAX (X, 0) > -1  ->  true  */
5909	return omit_one_operand_loc (loc, type, integer_one_node, inner);
5910
5911      else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5912	/* MIN (X, 0) > 0  ->  false
5913	   MIN (X, 0) > 5  ->  false  */
5914	return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5915
5916      else
5917	/* MIN (X, 0) > -1  ->  X > -1  */
5918	return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
5919
5920    default:
5921      return NULL_TREE;
5922    }
5923}
5924
5925/* T is an integer expression that is being multiplied, divided, or taken a
5926   modulus (CODE says which and what kind of divide or modulus) by a
5927   constant C.  See if we can eliminate that operation by folding it with
5928   other operations already in T.  WIDE_TYPE, if non-null, is a type that
5929   should be used for the computation if wider than our type.
5930
5931   For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5932   (X * 2) + (Y * 4).  We must, however, be assured that either the original
5933   expression would not overflow or that overflow is undefined for the type
5934   in the language in question.
5935
5936   If we return a non-null expression, it is an equivalent form of the
5937   original computation, but need not be in the original type.
5938
5939   We set *STRICT_OVERFLOW_P to true if the return values depends on
5940   signed overflow being undefined.  Otherwise we do not change
5941   *STRICT_OVERFLOW_P.  */
5942
5943static tree
5944extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5945		bool *strict_overflow_p)
5946{
5947  /* To avoid exponential search depth, refuse to allow recursion past
5948     three levels.  Beyond that (1) it's highly unlikely that we'll find
5949     something interesting and (2) we've probably processed it before
5950     when we built the inner expression.  */
5951
5952  static int depth;
5953  tree ret;
5954
5955  if (depth > 3)
5956    return NULL;
5957
5958  depth++;
5959  ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5960  depth--;
5961
5962  return ret;
5963}
5964
5965static tree
5966extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5967		  bool *strict_overflow_p)
5968{
5969  tree type = TREE_TYPE (t);
5970  enum tree_code tcode = TREE_CODE (t);
5971  tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5972				   > GET_MODE_SIZE (TYPE_MODE (type)))
5973		? wide_type : type);
5974  tree t1, t2;
5975  int same_p = tcode == code;
5976  tree op0 = NULL_TREE, op1 = NULL_TREE;
5977  bool sub_strict_overflow_p;
5978
5979  /* Don't deal with constants of zero here; they confuse the code below.  */
5980  if (integer_zerop (c))
5981    return NULL_TREE;
5982
5983  if (TREE_CODE_CLASS (tcode) == tcc_unary)
5984    op0 = TREE_OPERAND (t, 0);
5985
5986  if (TREE_CODE_CLASS (tcode) == tcc_binary)
5987    op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5988
5989  /* Note that we need not handle conditional operations here since fold
5990     already handles those cases.  So just do arithmetic here.  */
5991  switch (tcode)
5992    {
5993    case INTEGER_CST:
5994      /* For a constant, we can always simplify if we are a multiply
5995	 or (for divide and modulus) if it is a multiple of our constant.  */
5996      if (code == MULT_EXPR
5997	  || wi::multiple_of_p (t, c, TYPE_SIGN (type)))
5998	{
5999	  tree tem = const_binop (code, fold_convert (ctype, t),
6000				  fold_convert (ctype, c));
6001	  /* If the multiplication overflowed, we lost information on it.
6002	     See PR68142 and PR69845.  */
6003	  if (TREE_OVERFLOW (tem))
6004	    return NULL_TREE;
6005	  return tem;
6006	}
6007      break;
6008
6009    CASE_CONVERT: case NON_LVALUE_EXPR:
6010      /* If op0 is an expression ...  */
6011      if ((COMPARISON_CLASS_P (op0)
6012	   || UNARY_CLASS_P (op0)
6013	   || BINARY_CLASS_P (op0)
6014	   || VL_EXP_CLASS_P (op0)
6015	   || EXPRESSION_CLASS_P (op0))
6016	  /* ... and has wrapping overflow, and its type is smaller
6017	     than ctype, then we cannot pass through as widening.  */
6018	  && (((ANY_INTEGRAL_TYPE_P (TREE_TYPE (op0))
6019		&& TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0)))
6020	       && (TYPE_PRECISION (ctype)
6021	           > TYPE_PRECISION (TREE_TYPE (op0))))
6022	      /* ... or this is a truncation (t is narrower than op0),
6023		 then we cannot pass through this narrowing.  */
6024	      || (TYPE_PRECISION (type)
6025		  < TYPE_PRECISION (TREE_TYPE (op0)))
6026	      /* ... or signedness changes for division or modulus,
6027		 then we cannot pass through this conversion.  */
6028	      || (code != MULT_EXPR
6029		  && (TYPE_UNSIGNED (ctype)
6030		      != TYPE_UNSIGNED (TREE_TYPE (op0))))
6031	      /* ... or has undefined overflow while the converted to
6032		 type has not, we cannot do the operation in the inner type
6033		 as that would introduce undefined overflow.  */
6034	      || ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (op0))
6035		   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
6036		  && !TYPE_OVERFLOW_UNDEFINED (type))))
6037	break;
6038
6039      /* Pass the constant down and see if we can make a simplification.  If
6040	 we can, replace this expression with the inner simplification for
6041	 possible later conversion to our or some other type.  */
6042      if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
6043	  && TREE_CODE (t2) == INTEGER_CST
6044	  && !TREE_OVERFLOW (t2)
6045	  && (0 != (t1 = extract_muldiv (op0, t2, code,
6046					 code == MULT_EXPR
6047					 ? ctype : NULL_TREE,
6048					 strict_overflow_p))))
6049	return t1;
6050      break;
6051
6052    case ABS_EXPR:
6053      /* If widening the type changes it from signed to unsigned, then we
6054         must avoid building ABS_EXPR itself as unsigned.  */
6055      if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
6056        {
6057          tree cstype = (*signed_type_for) (ctype);
6058          if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
6059	      != 0)
6060            {
6061              t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
6062              return fold_convert (ctype, t1);
6063            }
6064          break;
6065        }
6066      /* If the constant is negative, we cannot simplify this.  */
6067      if (tree_int_cst_sgn (c) == -1)
6068        break;
6069      /* FALLTHROUGH */
6070    case NEGATE_EXPR:
6071      /* For division and modulus, type can't be unsigned, as e.g.
6072	 (-(x / 2U)) / 2U isn't equal to -((x / 2U) / 2U) for x >= 2.
6073	 For signed types, even with wrapping overflow, this is fine.  */
6074      if (code != MULT_EXPR && TYPE_UNSIGNED (type))
6075	break;
6076      if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
6077	  != 0)
6078	return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
6079      break;
6080
6081    case MIN_EXPR:  case MAX_EXPR:
6082      /* If widening the type changes the signedness, then we can't perform
6083	 this optimization as that changes the result.  */
6084      if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
6085	break;
6086
6087      /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
6088      sub_strict_overflow_p = false;
6089      if ((t1 = extract_muldiv (op0, c, code, wide_type,
6090				&sub_strict_overflow_p)) != 0
6091	  && (t2 = extract_muldiv (op1, c, code, wide_type,
6092				   &sub_strict_overflow_p)) != 0)
6093	{
6094	  if (tree_int_cst_sgn (c) < 0)
6095	    tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
6096	  if (sub_strict_overflow_p)
6097	    *strict_overflow_p = true;
6098	  return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6099			      fold_convert (ctype, t2));
6100	}
6101      break;
6102
6103    case LSHIFT_EXPR:  case RSHIFT_EXPR:
6104      /* If the second operand is constant, this is a multiplication
6105	 or floor division, by a power of two, so we can treat it that
6106	 way unless the multiplier or divisor overflows.  Signed
6107	 left-shift overflow is implementation-defined rather than
6108	 undefined in C90, so do not convert signed left shift into
6109	 multiplication.  */
6110      if (TREE_CODE (op1) == INTEGER_CST
6111	  && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
6112	  /* const_binop may not detect overflow correctly,
6113	     so check for it explicitly here.  */
6114	  && wi::gtu_p (TYPE_PRECISION (TREE_TYPE (size_one_node)), op1)
6115	  && 0 != (t1 = fold_convert (ctype,
6116				      const_binop (LSHIFT_EXPR,
6117						   size_one_node,
6118						   op1)))
6119	  && !TREE_OVERFLOW (t1))
6120	return extract_muldiv (build2 (tcode == LSHIFT_EXPR
6121				       ? MULT_EXPR : FLOOR_DIV_EXPR,
6122				       ctype,
6123				       fold_convert (ctype, op0),
6124				       t1),
6125			       c, code, wide_type, strict_overflow_p);
6126      break;
6127
6128    case PLUS_EXPR:  case MINUS_EXPR:
6129      /* See if we can eliminate the operation on both sides.  If we can, we
6130	 can return a new PLUS or MINUS.  If we can't, the only remaining
6131	 cases where we can do anything are if the second operand is a
6132	 constant.  */
6133      sub_strict_overflow_p = false;
6134      t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
6135      t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
6136      if (t1 != 0 && t2 != 0
6137	  && (code == MULT_EXPR
6138	      /* If not multiplication, we can only do this if both operands
6139		 are divisible by c.  */
6140	      || (multiple_of_p (ctype, op0, c)
6141	          && multiple_of_p (ctype, op1, c))))
6142	{
6143	  if (sub_strict_overflow_p)
6144	    *strict_overflow_p = true;
6145	  return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6146			      fold_convert (ctype, t2));
6147	}
6148
6149      /* If this was a subtraction, negate OP1 and set it to be an addition.
6150	 This simplifies the logic below.  */
6151      if (tcode == MINUS_EXPR)
6152	{
6153	  tcode = PLUS_EXPR, op1 = negate_expr (op1);
6154	  /* If OP1 was not easily negatable, the constant may be OP0.  */
6155	  if (TREE_CODE (op0) == INTEGER_CST)
6156	    {
6157	      tree tem = op0;
6158	      op0 = op1;
6159	      op1 = tem;
6160	      tem = t1;
6161	      t1 = t2;
6162	      t2 = tem;
6163	    }
6164	}
6165
6166      if (TREE_CODE (op1) != INTEGER_CST)
6167	break;
6168
6169      /* If either OP1 or C are negative, this optimization is not safe for
6170	 some of the division and remainder types while for others we need
6171	 to change the code.  */
6172      if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
6173	{
6174	  if (code == CEIL_DIV_EXPR)
6175	    code = FLOOR_DIV_EXPR;
6176	  else if (code == FLOOR_DIV_EXPR)
6177	    code = CEIL_DIV_EXPR;
6178	  else if (code != MULT_EXPR
6179		   && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
6180	    break;
6181	}
6182
6183      /* If it's a multiply or a division/modulus operation of a multiple
6184         of our constant, do the operation and verify it doesn't overflow.  */
6185      if (code == MULT_EXPR
6186	  || wi::multiple_of_p (op1, c, TYPE_SIGN (type)))
6187	{
6188	  op1 = const_binop (code, fold_convert (ctype, op1),
6189			     fold_convert (ctype, c));
6190	  /* We allow the constant to overflow with wrapping semantics.  */
6191	  if (op1 == 0
6192	      || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
6193	    break;
6194	}
6195      else
6196	break;
6197
6198      /* If we have an unsigned type, we cannot widen the operation since it
6199	 will change the result if the original computation overflowed.  */
6200      if (TYPE_UNSIGNED (ctype) && ctype != type)
6201	break;
6202
6203      /* If we were able to eliminate our operation from the first side,
6204	 apply our operation to the second side and reform the PLUS.  */
6205      if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
6206	return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
6207
6208      /* The last case is if we are a multiply.  In that case, we can
6209	 apply the distributive law to commute the multiply and addition
6210	 if the multiplication of the constants doesn't overflow
6211	 and overflow is defined.  With undefined overflow
6212	 op0 * c might overflow, while (op0 + orig_op1) * c doesn't.  */
6213      if (code == MULT_EXPR && TYPE_OVERFLOW_WRAPS (ctype))
6214	return fold_build2 (tcode, ctype,
6215			    fold_build2 (code, ctype,
6216					 fold_convert (ctype, op0),
6217					 fold_convert (ctype, c)),
6218			    op1);
6219
6220      break;
6221
6222    case MULT_EXPR:
6223      /* We have a special case here if we are doing something like
6224	 (C * 8) % 4 since we know that's zero.  */
6225      if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
6226	   || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
6227	  /* If the multiplication can overflow we cannot optimize this.  */
6228	  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
6229	  && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
6230	  && wi::multiple_of_p (op1, c, TYPE_SIGN (type)))
6231	{
6232	  *strict_overflow_p = true;
6233	  return omit_one_operand (type, integer_zero_node, op0);
6234	}
6235
6236      /* ... fall through ...  */
6237
6238    case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
6239    case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
6240      /* If we can extract our operation from the LHS, do so and return a
6241	 new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
6242	 do something only if the second operand is a constant.  */
6243      if (same_p
6244	  && (t1 = extract_muldiv (op0, c, code, wide_type,
6245				   strict_overflow_p)) != 0)
6246	return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6247			    fold_convert (ctype, op1));
6248      else if (tcode == MULT_EXPR && code == MULT_EXPR
6249	       && (t1 = extract_muldiv (op1, c, code, wide_type,
6250					strict_overflow_p)) != 0)
6251	return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6252			    fold_convert (ctype, t1));
6253      else if (TREE_CODE (op1) != INTEGER_CST)
6254	return 0;
6255
6256      /* If these are the same operation types, we can associate them
6257	 assuming no overflow.  */
6258      if (tcode == code)
6259	{
6260	  bool overflow_p = false;
6261	  bool overflow_mul_p;
6262	  signop sign = TYPE_SIGN (ctype);
6263	  unsigned prec = TYPE_PRECISION (ctype);
6264	  wide_int mul = wi::mul (wide_int::from (op1, prec,
6265						  TYPE_SIGN (TREE_TYPE (op1))),
6266				  wide_int::from (c, prec,
6267						  TYPE_SIGN (TREE_TYPE (c))),
6268				  sign, &overflow_mul_p);
6269	  overflow_p = TREE_OVERFLOW (c) | TREE_OVERFLOW (op1);
6270	  if (overflow_mul_p
6271	      && ((sign == UNSIGNED && tcode != MULT_EXPR) || sign == SIGNED))
6272	    overflow_p = true;
6273	  if (!overflow_p)
6274	    return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6275				wide_int_to_tree (ctype, mul));
6276	}
6277
6278      /* If these operations "cancel" each other, we have the main
6279	 optimizations of this pass, which occur when either constant is a
6280	 multiple of the other, in which case we replace this with either an
6281	 operation or CODE or TCODE.
6282
6283	 If we have an unsigned type, we cannot do this since it will change
6284	 the result if the original computation overflowed.  */
6285      if (TYPE_OVERFLOW_UNDEFINED (ctype)
6286	  && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
6287	      || (tcode == MULT_EXPR
6288		  && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
6289		  && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
6290		  && code != MULT_EXPR)))
6291	{
6292	  if (wi::multiple_of_p (op1, c, TYPE_SIGN (type)))
6293	    {
6294	      if (TYPE_OVERFLOW_UNDEFINED (ctype))
6295		*strict_overflow_p = true;
6296	      return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6297				  fold_convert (ctype,
6298						const_binop (TRUNC_DIV_EXPR,
6299							     op1, c)));
6300	    }
6301	  else if (wi::multiple_of_p (c, op1, TYPE_SIGN (type)))
6302	    {
6303	      if (TYPE_OVERFLOW_UNDEFINED (ctype))
6304		*strict_overflow_p = true;
6305	      return fold_build2 (code, ctype, fold_convert (ctype, op0),
6306				  fold_convert (ctype,
6307						const_binop (TRUNC_DIV_EXPR,
6308							     c, op1)));
6309	    }
6310	}
6311      break;
6312
6313    default:
6314      break;
6315    }
6316
6317  return 0;
6318}
6319
6320/* Return a node which has the indicated constant VALUE (either 0 or
6321   1 for scalars or {-1,-1,..} or {0,0,...} for vectors),
6322   and is of the indicated TYPE.  */
6323
6324tree
6325constant_boolean_node (bool value, tree type)
6326{
6327  if (type == integer_type_node)
6328    return value ? integer_one_node : integer_zero_node;
6329  else if (type == boolean_type_node)
6330    return value ? boolean_true_node : boolean_false_node;
6331  else if (TREE_CODE (type) == VECTOR_TYPE)
6332    return build_vector_from_val (type,
6333				  build_int_cst (TREE_TYPE (type),
6334						 value ? -1 : 0));
6335  else
6336    return fold_convert (type, value ? integer_one_node : integer_zero_node);
6337}
6338
6339
6340/* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6341   Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6342   CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6343   expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6344   COND is the first argument to CODE; otherwise (as in the example
6345   given here), it is the second argument.  TYPE is the type of the
6346   original expression.  Return NULL_TREE if no simplification is
6347   possible.  */
6348
6349static tree
6350fold_binary_op_with_conditional_arg (location_t loc,
6351				     enum tree_code code,
6352				     tree type, tree op0, tree op1,
6353				     tree cond, tree arg, int cond_first_p)
6354{
6355  tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6356  tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6357  tree test, true_value, false_value;
6358  tree lhs = NULL_TREE;
6359  tree rhs = NULL_TREE;
6360  enum tree_code cond_code = COND_EXPR;
6361
6362  if (TREE_CODE (cond) == COND_EXPR
6363      || TREE_CODE (cond) == VEC_COND_EXPR)
6364    {
6365      test = TREE_OPERAND (cond, 0);
6366      true_value = TREE_OPERAND (cond, 1);
6367      false_value = TREE_OPERAND (cond, 2);
6368      /* If this operand throws an expression, then it does not make
6369	 sense to try to perform a logical or arithmetic operation
6370	 involving it.  */
6371      if (VOID_TYPE_P (TREE_TYPE (true_value)))
6372	lhs = true_value;
6373      if (VOID_TYPE_P (TREE_TYPE (false_value)))
6374	rhs = false_value;
6375    }
6376  else
6377    {
6378      tree testtype = TREE_TYPE (cond);
6379      test = cond;
6380      true_value = constant_boolean_node (true, testtype);
6381      false_value = constant_boolean_node (false, testtype);
6382    }
6383
6384  if (TREE_CODE (TREE_TYPE (test)) == VECTOR_TYPE)
6385    cond_code = VEC_COND_EXPR;
6386
6387  /* This transformation is only worthwhile if we don't have to wrap ARG
6388     in a SAVE_EXPR and the operation can be simplified without recursing
6389     on at least one of the branches once its pushed inside the COND_EXPR.  */
6390  if (!TREE_CONSTANT (arg)
6391      && (TREE_SIDE_EFFECTS (arg)
6392	  || TREE_CODE (arg) == COND_EXPR || TREE_CODE (arg) == VEC_COND_EXPR
6393	  || TREE_CONSTANT (true_value) || TREE_CONSTANT (false_value)))
6394    return NULL_TREE;
6395
6396  arg = fold_convert_loc (loc, arg_type, arg);
6397  if (lhs == 0)
6398    {
6399      true_value = fold_convert_loc (loc, cond_type, true_value);
6400      if (cond_first_p)
6401	lhs = fold_build2_loc (loc, code, type, true_value, arg);
6402      else
6403	lhs = fold_build2_loc (loc, code, type, arg, true_value);
6404    }
6405  if (rhs == 0)
6406    {
6407      false_value = fold_convert_loc (loc, cond_type, false_value);
6408      if (cond_first_p)
6409	rhs = fold_build2_loc (loc, code, type, false_value, arg);
6410      else
6411	rhs = fold_build2_loc (loc, code, type, arg, false_value);
6412    }
6413
6414  /* Check that we have simplified at least one of the branches.  */
6415  if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs))
6416    return NULL_TREE;
6417
6418  return fold_build3_loc (loc, cond_code, type, test, lhs, rhs);
6419}
6420
6421
6422/* Subroutine of fold() that checks for the addition of +/- 0.0.
6423
6424   If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6425   TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6426   ADDEND is the same as X.
6427
6428   X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6429   and finite.  The problematic cases are when X is zero, and its mode
6430   has signed zeros.  In the case of rounding towards -infinity,
6431   X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6432   modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6433
6434bool
6435fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6436{
6437  if (!real_zerop (addend))
6438    return false;
6439
6440  /* Don't allow the fold with -fsignaling-nans.  */
6441  if (HONOR_SNANS (element_mode (type)))
6442    return false;
6443
6444  /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6445  if (!HONOR_SIGNED_ZEROS (element_mode (type)))
6446    return true;
6447
6448  /* In a vector or complex, we would need to check the sign of all zeros.  */
6449  if (TREE_CODE (addend) != REAL_CST)
6450    return false;
6451
6452  /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6453  if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6454    negate = !negate;
6455
6456  /* The mode has signed zeros, and we have to honor their sign.
6457     In this situation, there is only one case we can return true for.
6458     X - 0 is the same as X unless rounding towards -infinity is
6459     supported.  */
6460  return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type));
6461}
6462
6463/* Subroutine of fold() that checks comparisons of built-in math
6464   functions against real constants.
6465
6466   FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6467   operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6468   is the type of the result and ARG0 and ARG1 are the operands of the
6469   comparison.  ARG1 must be a TREE_REAL_CST.
6470
6471   The function returns the constant folded tree if a simplification
6472   can be made, and NULL_TREE otherwise.  */
6473
6474static tree
6475fold_mathfn_compare (location_t loc,
6476		     enum built_in_function fcode, enum tree_code code,
6477		     tree type, tree arg0, tree arg1)
6478{
6479  REAL_VALUE_TYPE c;
6480
6481  if (BUILTIN_SQRT_P (fcode))
6482    {
6483      tree arg = CALL_EXPR_ARG (arg0, 0);
6484      machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6485
6486      c = TREE_REAL_CST (arg1);
6487      if (REAL_VALUE_NEGATIVE (c))
6488	{
6489	  /* sqrt(x) < y is always false, if y is negative.  */
6490	  if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6491	    return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6492
6493	  /* sqrt(x) > y is always true, if y is negative and we
6494	     don't care about NaNs, i.e. negative values of x.  */
6495	  if (code == NE_EXPR || !HONOR_NANS (mode))
6496	    return omit_one_operand_loc (loc, type, integer_one_node, arg);
6497
6498	  /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6499	  return fold_build2_loc (loc, GE_EXPR, type, arg,
6500			      build_real (TREE_TYPE (arg), dconst0));
6501	}
6502      else if (code == GT_EXPR || code == GE_EXPR)
6503	{
6504	  REAL_VALUE_TYPE c2;
6505
6506	  REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6507	  real_convert (&c2, mode, &c2);
6508
6509	  if (REAL_VALUE_ISINF (c2))
6510	    {
6511	      /* sqrt(x) > y is x == +Inf, when y is very large.  */
6512	      if (HONOR_INFINITIES (mode))
6513		return fold_build2_loc (loc, EQ_EXPR, type, arg,
6514				    build_real (TREE_TYPE (arg), c2));
6515
6516	      /* sqrt(x) > y is always false, when y is very large
6517		 and we don't care about infinities.  */
6518	      return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6519	    }
6520
6521	  /* sqrt(x) > c is the same as x > c*c.  */
6522	  return fold_build2_loc (loc, code, type, arg,
6523			      build_real (TREE_TYPE (arg), c2));
6524	}
6525      else if (code == LT_EXPR || code == LE_EXPR)
6526	{
6527	  REAL_VALUE_TYPE c2;
6528
6529	  REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6530	  real_convert (&c2, mode, &c2);
6531
6532	  if (REAL_VALUE_ISINF (c2))
6533	    {
6534	      /* sqrt(x) < y is always true, when y is a very large
6535		 value and we don't care about NaNs or Infinities.  */
6536	      if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6537		return omit_one_operand_loc (loc, type, integer_one_node, arg);
6538
6539	      /* sqrt(x) < y is x != +Inf when y is very large and we
6540		 don't care about NaNs.  */
6541	      if (! HONOR_NANS (mode))
6542		return fold_build2_loc (loc, NE_EXPR, type, arg,
6543				    build_real (TREE_TYPE (arg), c2));
6544
6545	      /* sqrt(x) < y is x >= 0 when y is very large and we
6546		 don't care about Infinities.  */
6547	      if (! HONOR_INFINITIES (mode))
6548		return fold_build2_loc (loc, GE_EXPR, type, arg,
6549				    build_real (TREE_TYPE (arg), dconst0));
6550
6551	      /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6552	      arg = save_expr (arg);
6553	      return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6554				  fold_build2_loc (loc, GE_EXPR, type, arg,
6555					       build_real (TREE_TYPE (arg),
6556							   dconst0)),
6557				  fold_build2_loc (loc, NE_EXPR, type, arg,
6558					       build_real (TREE_TYPE (arg),
6559							   c2)));
6560	    }
6561
6562	  /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6563	  if (! HONOR_NANS (mode))
6564	    return fold_build2_loc (loc, code, type, arg,
6565				build_real (TREE_TYPE (arg), c2));
6566
6567	  /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6568	  arg = save_expr (arg);
6569	  return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6570				  fold_build2_loc (loc, GE_EXPR, type, arg,
6571					       build_real (TREE_TYPE (arg),
6572							   dconst0)),
6573				  fold_build2_loc (loc, code, type, arg,
6574					       build_real (TREE_TYPE (arg),
6575							   c2)));
6576	}
6577    }
6578
6579  return NULL_TREE;
6580}
6581
6582/* Subroutine of fold() that optimizes comparisons against Infinities,
6583   either +Inf or -Inf.
6584
6585   CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6586   GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6587   are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6588
6589   The function returns the constant folded tree if a simplification
6590   can be made, and NULL_TREE otherwise.  */
6591
6592static tree
6593fold_inf_compare (location_t loc, enum tree_code code, tree type,
6594		  tree arg0, tree arg1)
6595{
6596  machine_mode mode;
6597  REAL_VALUE_TYPE max;
6598  tree temp;
6599  bool neg;
6600
6601  mode = TYPE_MODE (TREE_TYPE (arg0));
6602
6603  /* For negative infinity swap the sense of the comparison.  */
6604  neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6605  if (neg)
6606    code = swap_tree_comparison (code);
6607
6608  switch (code)
6609    {
6610    case GT_EXPR:
6611      /* x > +Inf is always false, if with ignore sNANs.  */
6612      if (HONOR_SNANS (mode))
6613        return NULL_TREE;
6614      return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6615
6616    case LE_EXPR:
6617      /* x <= +Inf is always true, if we don't case about NaNs.  */
6618      if (! HONOR_NANS (mode))
6619	return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6620
6621      /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6622      arg0 = save_expr (arg0);
6623      return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg0);
6624
6625    case EQ_EXPR:
6626    case GE_EXPR:
6627      /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6628      real_maxval (&max, neg, mode);
6629      return fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6630			  arg0, build_real (TREE_TYPE (arg0), max));
6631
6632    case LT_EXPR:
6633      /* x < +Inf is always equal to x <= DBL_MAX.  */
6634      real_maxval (&max, neg, mode);
6635      return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6636			  arg0, build_real (TREE_TYPE (arg0), max));
6637
6638    case NE_EXPR:
6639      /* x != +Inf is always equal to !(x > DBL_MAX).  */
6640      real_maxval (&max, neg, mode);
6641      if (! HONOR_NANS (mode))
6642	return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6643			    arg0, build_real (TREE_TYPE (arg0), max));
6644
6645      temp = fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6646			  arg0, build_real (TREE_TYPE (arg0), max));
6647      return fold_build1_loc (loc, TRUTH_NOT_EXPR, type, temp);
6648
6649    default:
6650      break;
6651    }
6652
6653  return NULL_TREE;
6654}
6655
6656/* Subroutine of fold() that optimizes comparisons of a division by
6657   a nonzero integer constant against an integer constant, i.e.
6658   X/C1 op C2.
6659
6660   CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6661   GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6662   are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6663
6664   The function returns the constant folded tree if a simplification
6665   can be made, and NULL_TREE otherwise.  */
6666
6667static tree
6668fold_div_compare (location_t loc,
6669		  enum tree_code code, tree type, tree arg0, tree arg1)
6670{
6671  tree prod, tmp, hi, lo;
6672  tree arg00 = TREE_OPERAND (arg0, 0);
6673  tree arg01 = TREE_OPERAND (arg0, 1);
6674  signop sign = TYPE_SIGN (TREE_TYPE (arg0));
6675  bool neg_overflow = false;
6676  bool overflow;
6677
6678  /* We have to do this the hard way to detect unsigned overflow.
6679     prod = int_const_binop (MULT_EXPR, arg01, arg1);  */
6680  wide_int val = wi::mul (arg01, arg1, sign, &overflow);
6681  prod = force_fit_type (TREE_TYPE (arg00), val, -1, overflow);
6682  neg_overflow = false;
6683
6684  if (sign == UNSIGNED)
6685    {
6686      tmp = int_const_binop (MINUS_EXPR, arg01,
6687                             build_int_cst (TREE_TYPE (arg01), 1));
6688      lo = prod;
6689
6690      /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp).  */
6691      val = wi::add (prod, tmp, sign, &overflow);
6692      hi = force_fit_type (TREE_TYPE (arg00), val,
6693			   -1, overflow | TREE_OVERFLOW (prod));
6694    }
6695  else if (tree_int_cst_sgn (arg01) >= 0)
6696    {
6697      tmp = int_const_binop (MINUS_EXPR, arg01,
6698			     build_int_cst (TREE_TYPE (arg01), 1));
6699      switch (tree_int_cst_sgn (arg1))
6700	{
6701	case -1:
6702	  neg_overflow = true;
6703	  lo = int_const_binop (MINUS_EXPR, prod, tmp);
6704	  hi = prod;
6705	  break;
6706
6707	case  0:
6708	  lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6709	  hi = tmp;
6710	  break;
6711
6712	case  1:
6713          hi = int_const_binop (PLUS_EXPR, prod, tmp);
6714	  lo = prod;
6715	  break;
6716
6717	default:
6718	  gcc_unreachable ();
6719	}
6720    }
6721  else
6722    {
6723      /* A negative divisor reverses the relational operators.  */
6724      code = swap_tree_comparison (code);
6725
6726      tmp = int_const_binop (PLUS_EXPR, arg01,
6727			     build_int_cst (TREE_TYPE (arg01), 1));
6728      switch (tree_int_cst_sgn (arg1))
6729	{
6730	case -1:
6731	  hi = int_const_binop (MINUS_EXPR, prod, tmp);
6732	  lo = prod;
6733	  break;
6734
6735	case  0:
6736	  hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6737	  lo = tmp;
6738	  break;
6739
6740	case  1:
6741	  neg_overflow = true;
6742	  lo = int_const_binop (PLUS_EXPR, prod, tmp);
6743	  hi = prod;
6744	  break;
6745
6746	default:
6747	  gcc_unreachable ();
6748	}
6749    }
6750
6751  switch (code)
6752    {
6753    case EQ_EXPR:
6754      if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6755	return omit_one_operand_loc (loc, type, integer_zero_node, arg00);
6756      if (TREE_OVERFLOW (hi))
6757	return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
6758      if (TREE_OVERFLOW (lo))
6759	return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
6760      return build_range_check (loc, type, arg00, 1, lo, hi);
6761
6762    case NE_EXPR:
6763      if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6764	return omit_one_operand_loc (loc, type, integer_one_node, arg00);
6765      if (TREE_OVERFLOW (hi))
6766	return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
6767      if (TREE_OVERFLOW (lo))
6768	return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
6769      return build_range_check (loc, type, arg00, 0, lo, hi);
6770
6771    case LT_EXPR:
6772      if (TREE_OVERFLOW (lo))
6773	{
6774	  tmp = neg_overflow ? integer_zero_node : integer_one_node;
6775	  return omit_one_operand_loc (loc, type, tmp, arg00);
6776	}
6777      return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
6778
6779    case LE_EXPR:
6780      if (TREE_OVERFLOW (hi))
6781	{
6782	  tmp = neg_overflow ? integer_zero_node : integer_one_node;
6783	  return omit_one_operand_loc (loc, type, tmp, arg00);
6784	}
6785      return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
6786
6787    case GT_EXPR:
6788      if (TREE_OVERFLOW (hi))
6789	{
6790	  tmp = neg_overflow ? integer_one_node : integer_zero_node;
6791	  return omit_one_operand_loc (loc, type, tmp, arg00);
6792	}
6793      return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
6794
6795    case GE_EXPR:
6796      if (TREE_OVERFLOW (lo))
6797	{
6798	  tmp = neg_overflow ? integer_one_node : integer_zero_node;
6799	  return omit_one_operand_loc (loc, type, tmp, arg00);
6800	}
6801      return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
6802
6803    default:
6804      break;
6805    }
6806
6807  return NULL_TREE;
6808}
6809
6810
6811/* If CODE with arguments ARG0 and ARG1 represents a single bit
6812   equality/inequality test, then return a simplified form of the test
6813   using a sign testing.  Otherwise return NULL.  TYPE is the desired
6814   result type.  */
6815
6816static tree
6817fold_single_bit_test_into_sign_test (location_t loc,
6818				     enum tree_code code, tree arg0, tree arg1,
6819				     tree result_type)
6820{
6821  /* If this is testing a single bit, we can optimize the test.  */
6822  if ((code == NE_EXPR || code == EQ_EXPR)
6823      && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6824      && integer_pow2p (TREE_OPERAND (arg0, 1)))
6825    {
6826      /* If we have (A & C) != 0 where C is the sign bit of A, convert
6827	 this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6828      tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6829
6830      if (arg00 != NULL_TREE
6831	  /* This is only a win if casting to a signed type is cheap,
6832	     i.e. when arg00's type is not a partial mode.  */
6833	  && TYPE_PRECISION (TREE_TYPE (arg00))
6834	     == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (arg00))))
6835	{
6836	  tree stype = signed_type_for (TREE_TYPE (arg00));
6837	  return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6838			      result_type,
6839			      fold_convert_loc (loc, stype, arg00),
6840			      build_int_cst (stype, 0));
6841	}
6842    }
6843
6844  return NULL_TREE;
6845}
6846
6847/* If CODE with arguments ARG0 and ARG1 represents a single bit
6848   equality/inequality test, then return a simplified form of
6849   the test using shifts and logical operations.  Otherwise return
6850   NULL.  TYPE is the desired result type.  */
6851
6852tree
6853fold_single_bit_test (location_t loc, enum tree_code code,
6854		      tree arg0, tree arg1, tree result_type)
6855{
6856  /* If this is testing a single bit, we can optimize the test.  */
6857  if ((code == NE_EXPR || code == EQ_EXPR)
6858      && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6859      && integer_pow2p (TREE_OPERAND (arg0, 1)))
6860    {
6861      tree inner = TREE_OPERAND (arg0, 0);
6862      tree type = TREE_TYPE (arg0);
6863      int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6864      machine_mode operand_mode = TYPE_MODE (type);
6865      int ops_unsigned;
6866      tree signed_type, unsigned_type, intermediate_type;
6867      tree tem, one;
6868
6869      /* First, see if we can fold the single bit test into a sign-bit
6870	 test.  */
6871      tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1,
6872						 result_type);
6873      if (tem)
6874	return tem;
6875
6876      /* Otherwise we have (A & C) != 0 where C is a single bit,
6877	 convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6878	 Similarly for (A & C) == 0.  */
6879
6880      /* If INNER is a right shift of a constant and it plus BITNUM does
6881	 not overflow, adjust BITNUM and INNER.  */
6882      if (TREE_CODE (inner) == RSHIFT_EXPR
6883	  && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6884	  && bitnum < TYPE_PRECISION (type)
6885	  && wi::ltu_p (TREE_OPERAND (inner, 1),
6886			TYPE_PRECISION (type) - bitnum))
6887	{
6888	  bitnum += tree_to_uhwi (TREE_OPERAND (inner, 1));
6889	  inner = TREE_OPERAND (inner, 0);
6890	}
6891
6892      /* If we are going to be able to omit the AND below, we must do our
6893	 operations as unsigned.  If we must use the AND, we have a choice.
6894	 Normally unsigned is faster, but for some machines signed is.  */
6895#ifdef LOAD_EXTEND_OP
6896      ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND
6897		      && !flag_syntax_only) ? 0 : 1;
6898#else
6899      ops_unsigned = 1;
6900#endif
6901
6902      signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6903      unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6904      intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6905      inner = fold_convert_loc (loc, intermediate_type, inner);
6906
6907      if (bitnum != 0)
6908	inner = build2 (RSHIFT_EXPR, intermediate_type,
6909			inner, size_int (bitnum));
6910
6911      one = build_int_cst (intermediate_type, 1);
6912
6913      if (code == EQ_EXPR)
6914	inner = fold_build2_loc (loc, BIT_XOR_EXPR, intermediate_type, inner, one);
6915
6916      /* Put the AND last so it can combine with more things.  */
6917      inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6918
6919      /* Make sure to return the proper type.  */
6920      inner = fold_convert_loc (loc, result_type, inner);
6921
6922      return inner;
6923    }
6924  return NULL_TREE;
6925}
6926
6927/* Check whether we are allowed to reorder operands arg0 and arg1,
6928   such that the evaluation of arg1 occurs before arg0.  */
6929
6930static bool
6931reorder_operands_p (const_tree arg0, const_tree arg1)
6932{
6933  if (! flag_evaluation_order)
6934      return true;
6935  if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6936    return true;
6937  return ! TREE_SIDE_EFFECTS (arg0)
6938	 && ! TREE_SIDE_EFFECTS (arg1);
6939}
6940
6941/* Test whether it is preferable two swap two operands, ARG0 and
6942   ARG1, for example because ARG0 is an integer constant and ARG1
6943   isn't.  If REORDER is true, only recommend swapping if we can
6944   evaluate the operands in reverse order.  */
6945
6946bool
6947tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6948{
6949  if (CONSTANT_CLASS_P (arg1))
6950    return 0;
6951  if (CONSTANT_CLASS_P (arg0))
6952    return 1;
6953
6954  STRIP_NOPS (arg0);
6955  STRIP_NOPS (arg1);
6956
6957  if (TREE_CONSTANT (arg1))
6958    return 0;
6959  if (TREE_CONSTANT (arg0))
6960    return 1;
6961
6962  if (reorder && flag_evaluation_order
6963      && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6964    return 0;
6965
6966  /* It is preferable to swap two SSA_NAME to ensure a canonical form
6967     for commutative and comparison operators.  Ensuring a canonical
6968     form allows the optimizers to find additional redundancies without
6969     having to explicitly check for both orderings.  */
6970  if (TREE_CODE (arg0) == SSA_NAME
6971      && TREE_CODE (arg1) == SSA_NAME
6972      && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6973    return 1;
6974
6975  /* Put SSA_NAMEs last.  */
6976  if (TREE_CODE (arg1) == SSA_NAME)
6977    return 0;
6978  if (TREE_CODE (arg0) == SSA_NAME)
6979    return 1;
6980
6981  /* Put variables last.  */
6982  if (DECL_P (arg1))
6983    return 0;
6984  if (DECL_P (arg0))
6985    return 1;
6986
6987  return 0;
6988}
6989
6990/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6991   ARG0 is extended to a wider type.  */
6992
6993static tree
6994fold_widened_comparison (location_t loc, enum tree_code code,
6995			 tree type, tree arg0, tree arg1)
6996{
6997  tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6998  tree arg1_unw;
6999  tree shorter_type, outer_type;
7000  tree min, max;
7001  bool above, below;
7002
7003  if (arg0_unw == arg0)
7004    return NULL_TREE;
7005  shorter_type = TREE_TYPE (arg0_unw);
7006
7007#ifdef HAVE_canonicalize_funcptr_for_compare
7008  /* Disable this optimization if we're casting a function pointer
7009     type on targets that require function pointer canonicalization.  */
7010  if (HAVE_canonicalize_funcptr_for_compare
7011      && TREE_CODE (shorter_type) == POINTER_TYPE
7012      && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
7013    return NULL_TREE;
7014#endif
7015
7016  if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
7017    return NULL_TREE;
7018
7019  arg1_unw = get_unwidened (arg1, NULL_TREE);
7020
7021  /* If possible, express the comparison in the shorter mode.  */
7022  if ((code == EQ_EXPR || code == NE_EXPR
7023       || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
7024      && (TREE_TYPE (arg1_unw) == shorter_type
7025	  || ((TYPE_PRECISION (shorter_type)
7026	       >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
7027	      && (TYPE_UNSIGNED (shorter_type)
7028		  == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
7029	  || (TREE_CODE (arg1_unw) == INTEGER_CST
7030	      && (TREE_CODE (shorter_type) == INTEGER_TYPE
7031		  || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
7032	      && int_fits_type_p (arg1_unw, shorter_type))))
7033    return fold_build2_loc (loc, code, type, arg0_unw,
7034			fold_convert_loc (loc, shorter_type, arg1_unw));
7035
7036  if (TREE_CODE (arg1_unw) != INTEGER_CST
7037      || TREE_CODE (shorter_type) != INTEGER_TYPE
7038      || !int_fits_type_p (arg1_unw, shorter_type))
7039    return NULL_TREE;
7040
7041  /* If we are comparing with the integer that does not fit into the range
7042     of the shorter type, the result is known.  */
7043  outer_type = TREE_TYPE (arg1_unw);
7044  min = lower_bound_in_type (outer_type, shorter_type);
7045  max = upper_bound_in_type (outer_type, shorter_type);
7046
7047  above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7048						   max, arg1_unw));
7049  below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7050						   arg1_unw, min));
7051
7052  switch (code)
7053    {
7054    case EQ_EXPR:
7055      if (above || below)
7056	return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7057      break;
7058
7059    case NE_EXPR:
7060      if (above || below)
7061	return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7062      break;
7063
7064    case LT_EXPR:
7065    case LE_EXPR:
7066      if (above)
7067	return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7068      else if (below)
7069	return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7070
7071    case GT_EXPR:
7072    case GE_EXPR:
7073      if (above)
7074	return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7075      else if (below)
7076	return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7077
7078    default:
7079      break;
7080    }
7081
7082  return NULL_TREE;
7083}
7084
7085/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
7086   ARG0 just the signedness is changed.  */
7087
7088static tree
7089fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type,
7090			      tree arg0, tree arg1)
7091{
7092  tree arg0_inner;
7093  tree inner_type, outer_type;
7094
7095  if (!CONVERT_EXPR_P (arg0))
7096    return NULL_TREE;
7097
7098  outer_type = TREE_TYPE (arg0);
7099  arg0_inner = TREE_OPERAND (arg0, 0);
7100  inner_type = TREE_TYPE (arg0_inner);
7101
7102#ifdef HAVE_canonicalize_funcptr_for_compare
7103  /* Disable this optimization if we're casting a function pointer
7104     type on targets that require function pointer canonicalization.  */
7105  if (HAVE_canonicalize_funcptr_for_compare
7106      && TREE_CODE (inner_type) == POINTER_TYPE
7107      && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
7108    return NULL_TREE;
7109#endif
7110
7111  if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
7112    return NULL_TREE;
7113
7114  if (TREE_CODE (arg1) != INTEGER_CST
7115      && !(CONVERT_EXPR_P (arg1)
7116	   && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
7117    return NULL_TREE;
7118
7119  if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
7120      && code != NE_EXPR
7121      && code != EQ_EXPR)
7122    return NULL_TREE;
7123
7124  if (POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type))
7125    return NULL_TREE;
7126
7127  if (TREE_CODE (arg1) == INTEGER_CST)
7128    arg1 = force_fit_type (inner_type, wi::to_widest (arg1), 0,
7129			   TREE_OVERFLOW (arg1));
7130  else
7131    arg1 = fold_convert_loc (loc, inner_type, arg1);
7132
7133  return fold_build2_loc (loc, code, type, arg0_inner, arg1);
7134}
7135
7136
7137/* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
7138   means A >= Y && A != MAX, but in this case we know that
7139   A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
7140
7141static tree
7142fold_to_nonsharp_ineq_using_bound (location_t loc, tree ineq, tree bound)
7143{
7144  tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7145
7146  if (TREE_CODE (bound) == LT_EXPR)
7147    a = TREE_OPERAND (bound, 0);
7148  else if (TREE_CODE (bound) == GT_EXPR)
7149    a = TREE_OPERAND (bound, 1);
7150  else
7151    return NULL_TREE;
7152
7153  typea = TREE_TYPE (a);
7154  if (!INTEGRAL_TYPE_P (typea)
7155      && !POINTER_TYPE_P (typea))
7156    return NULL_TREE;
7157
7158  if (TREE_CODE (ineq) == LT_EXPR)
7159    {
7160      a1 = TREE_OPERAND (ineq, 1);
7161      y = TREE_OPERAND (ineq, 0);
7162    }
7163  else if (TREE_CODE (ineq) == GT_EXPR)
7164    {
7165      a1 = TREE_OPERAND (ineq, 0);
7166      y = TREE_OPERAND (ineq, 1);
7167    }
7168  else
7169    return NULL_TREE;
7170
7171  if (TREE_TYPE (a1) != typea)
7172    return NULL_TREE;
7173
7174  if (POINTER_TYPE_P (typea))
7175    {
7176      /* Convert the pointer types into integer before taking the difference.  */
7177      tree ta = fold_convert_loc (loc, ssizetype, a);
7178      tree ta1 = fold_convert_loc (loc, ssizetype, a1);
7179      diff = fold_binary_loc (loc, MINUS_EXPR, ssizetype, ta1, ta);
7180    }
7181  else
7182    diff = fold_binary_loc (loc, MINUS_EXPR, typea, a1, a);
7183
7184  if (!diff || !integer_onep (diff))
7185   return NULL_TREE;
7186
7187  return fold_build2_loc (loc, GE_EXPR, type, a, y);
7188}
7189
7190/* Fold a sum or difference of at least one multiplication.
7191   Returns the folded tree or NULL if no simplification could be made.  */
7192
7193static tree
7194fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
7195			  tree arg0, tree arg1)
7196{
7197  tree arg00, arg01, arg10, arg11;
7198  tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7199
7200  /* (A * C) +- (B * C) -> (A+-B) * C.
7201     (A * C) +- A -> A * (C+-1).
7202     We are most concerned about the case where C is a constant,
7203     but other combinations show up during loop reduction.  Since
7204     it is not difficult, try all four possibilities.  */
7205
7206  if (TREE_CODE (arg0) == MULT_EXPR)
7207    {
7208      arg00 = TREE_OPERAND (arg0, 0);
7209      arg01 = TREE_OPERAND (arg0, 1);
7210    }
7211  else if (TREE_CODE (arg0) == INTEGER_CST)
7212    {
7213      arg00 = build_one_cst (type);
7214      arg01 = arg0;
7215    }
7216  else
7217    {
7218      /* We cannot generate constant 1 for fract.  */
7219      if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7220	return NULL_TREE;
7221      arg00 = arg0;
7222      arg01 = build_one_cst (type);
7223    }
7224  if (TREE_CODE (arg1) == MULT_EXPR)
7225    {
7226      arg10 = TREE_OPERAND (arg1, 0);
7227      arg11 = TREE_OPERAND (arg1, 1);
7228    }
7229  else if (TREE_CODE (arg1) == INTEGER_CST)
7230    {
7231      arg10 = build_one_cst (type);
7232      /* As we canonicalize A - 2 to A + -2 get rid of that sign for
7233	 the purpose of this canonicalization.  */
7234      if (wi::neg_p (arg1, TYPE_SIGN (TREE_TYPE (arg1)))
7235	  && negate_expr_p (arg1)
7236	  && code == PLUS_EXPR)
7237	{
7238	  arg11 = negate_expr (arg1);
7239	  code = MINUS_EXPR;
7240	}
7241      else
7242	arg11 = arg1;
7243    }
7244  else
7245    {
7246      /* We cannot generate constant 1 for fract.  */
7247      if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7248	return NULL_TREE;
7249      arg10 = arg1;
7250      arg11 = build_one_cst (type);
7251    }
7252  same = NULL_TREE;
7253
7254  if (operand_equal_p (arg01, arg11, 0))
7255    same = arg01, alt0 = arg00, alt1 = arg10;
7256  else if (operand_equal_p (arg00, arg10, 0))
7257    same = arg00, alt0 = arg01, alt1 = arg11;
7258  else if (operand_equal_p (arg00, arg11, 0))
7259    same = arg00, alt0 = arg01, alt1 = arg10;
7260  else if (operand_equal_p (arg01, arg10, 0))
7261    same = arg01, alt0 = arg00, alt1 = arg11;
7262
7263  /* No identical multiplicands; see if we can find a common
7264     power-of-two factor in non-power-of-two multiplies.  This
7265     can help in multi-dimensional array access.  */
7266  else if (tree_fits_shwi_p (arg01)
7267	   && tree_fits_shwi_p (arg11))
7268    {
7269      HOST_WIDE_INT int01, int11, tmp;
7270      bool swap = false;
7271      tree maybe_same;
7272      int01 = tree_to_shwi (arg01);
7273      int11 = tree_to_shwi (arg11);
7274
7275      /* Move min of absolute values to int11.  */
7276      if (absu_hwi (int01) < absu_hwi (int11))
7277        {
7278	  tmp = int01, int01 = int11, int11 = tmp;
7279	  alt0 = arg00, arg00 = arg10, arg10 = alt0;
7280	  maybe_same = arg01;
7281	  swap = true;
7282	}
7283      else
7284	maybe_same = arg11;
7285
7286      if (exact_log2 (absu_hwi (int11)) > 0 && int01 % int11 == 0
7287	  /* The remainder should not be a constant, otherwise we
7288	     end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
7289	     increased the number of multiplications necessary.  */
7290	  && TREE_CODE (arg10) != INTEGER_CST)
7291        {
7292	  alt0 = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg00), arg00,
7293			      build_int_cst (TREE_TYPE (arg00),
7294					     int01 / int11));
7295	  alt1 = arg10;
7296	  same = maybe_same;
7297	  if (swap)
7298	    maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7299	}
7300    }
7301
7302  if (same)
7303    return fold_build2_loc (loc, MULT_EXPR, type,
7304			fold_build2_loc (loc, code, type,
7305				     fold_convert_loc (loc, type, alt0),
7306				     fold_convert_loc (loc, type, alt1)),
7307			fold_convert_loc (loc, type, same));
7308
7309  return NULL_TREE;
7310}
7311
7312/* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7313   specified by EXPR into the buffer PTR of length LEN bytes.
7314   Return the number of bytes placed in the buffer, or zero
7315   upon failure.  */
7316
7317static int
7318native_encode_int (const_tree expr, unsigned char *ptr, int len, int off)
7319{
7320  tree type = TREE_TYPE (expr);
7321  int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7322  int byte, offset, word, words;
7323  unsigned char value;
7324
7325  if ((off == -1 && total_bytes > len)
7326      || off >= total_bytes)
7327    return 0;
7328  if (off == -1)
7329    off = 0;
7330  words = total_bytes / UNITS_PER_WORD;
7331
7332  for (byte = 0; byte < total_bytes; byte++)
7333    {
7334      int bitpos = byte * BITS_PER_UNIT;
7335      /* Extend EXPR according to TYPE_SIGN if the precision isn't a whole
7336	 number of bytes.  */
7337      value = wi::extract_uhwi (wi::to_widest (expr), bitpos, BITS_PER_UNIT);
7338
7339      if (total_bytes > UNITS_PER_WORD)
7340	{
7341	  word = byte / UNITS_PER_WORD;
7342	  if (WORDS_BIG_ENDIAN)
7343	    word = (words - 1) - word;
7344	  offset = word * UNITS_PER_WORD;
7345	  if (BYTES_BIG_ENDIAN)
7346	    offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7347	  else
7348	    offset += byte % UNITS_PER_WORD;
7349	}
7350      else
7351	offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7352      if (offset >= off
7353	  && offset - off < len)
7354	ptr[offset - off] = value;
7355    }
7356  return MIN (len, total_bytes - off);
7357}
7358
7359
7360/* Subroutine of native_encode_expr.  Encode the FIXED_CST
7361   specified by EXPR into the buffer PTR of length LEN bytes.
7362   Return the number of bytes placed in the buffer, or zero
7363   upon failure.  */
7364
7365static int
7366native_encode_fixed (const_tree expr, unsigned char *ptr, int len, int off)
7367{
7368  tree type = TREE_TYPE (expr);
7369  machine_mode mode = TYPE_MODE (type);
7370  int total_bytes = GET_MODE_SIZE (mode);
7371  FIXED_VALUE_TYPE value;
7372  tree i_value, i_type;
7373
7374  if (total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
7375    return 0;
7376
7377  i_type = lang_hooks.types.type_for_size (GET_MODE_BITSIZE (mode), 1);
7378
7379  if (NULL_TREE == i_type
7380      || TYPE_PRECISION (i_type) != total_bytes)
7381    return 0;
7382
7383  value = TREE_FIXED_CST (expr);
7384  i_value = double_int_to_tree (i_type, value.data);
7385
7386  return native_encode_int (i_value, ptr, len, off);
7387}
7388
7389
7390/* Subroutine of native_encode_expr.  Encode the REAL_CST
7391   specified by EXPR into the buffer PTR of length LEN bytes.
7392   Return the number of bytes placed in the buffer, or zero
7393   upon failure.  */
7394
7395static int
7396native_encode_real (const_tree expr, unsigned char *ptr, int len, int off)
7397{
7398  tree type = TREE_TYPE (expr);
7399  int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7400  int byte, offset, word, words, bitpos;
7401  unsigned char value;
7402
7403  /* There are always 32 bits in each long, no matter the size of
7404     the hosts long.  We handle floating point representations with
7405     up to 192 bits.  */
7406  long tmp[6];
7407
7408  if ((off == -1 && total_bytes > len)
7409      || off >= total_bytes)
7410    return 0;
7411  if (off == -1)
7412    off = 0;
7413  words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7414
7415  real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7416
7417  for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7418       bitpos += BITS_PER_UNIT)
7419    {
7420      byte = (bitpos / BITS_PER_UNIT) & 3;
7421      value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7422
7423      if (UNITS_PER_WORD < 4)
7424	{
7425	  word = byte / UNITS_PER_WORD;
7426	  if (WORDS_BIG_ENDIAN)
7427	    word = (words - 1) - word;
7428	  offset = word * UNITS_PER_WORD;
7429	  if (BYTES_BIG_ENDIAN)
7430	    offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7431	  else
7432	    offset += byte % UNITS_PER_WORD;
7433	}
7434      else
7435	offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7436      offset = offset + ((bitpos / BITS_PER_UNIT) & ~3);
7437      if (offset >= off
7438	  && offset - off < len)
7439	ptr[offset - off] = value;
7440    }
7441  return MIN (len, total_bytes - off);
7442}
7443
7444/* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7445   specified by EXPR into the buffer PTR of length LEN bytes.
7446   Return the number of bytes placed in the buffer, or zero
7447   upon failure.  */
7448
7449static int
7450native_encode_complex (const_tree expr, unsigned char *ptr, int len, int off)
7451{
7452  int rsize, isize;
7453  tree part;
7454
7455  part = TREE_REALPART (expr);
7456  rsize = native_encode_expr (part, ptr, len, off);
7457  if (off == -1
7458      && rsize == 0)
7459    return 0;
7460  part = TREE_IMAGPART (expr);
7461  if (off != -1)
7462    off = MAX (0, off - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (part))));
7463  isize = native_encode_expr (part, ptr+rsize, len-rsize, off);
7464  if (off == -1
7465      && isize != rsize)
7466    return 0;
7467  return rsize + isize;
7468}
7469
7470
7471/* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7472   specified by EXPR into the buffer PTR of length LEN bytes.
7473   Return the number of bytes placed in the buffer, or zero
7474   upon failure.  */
7475
7476static int
7477native_encode_vector (const_tree expr, unsigned char *ptr, int len, int off)
7478{
7479  unsigned i, count;
7480  int size, offset;
7481  tree itype, elem;
7482
7483  offset = 0;
7484  count = VECTOR_CST_NELTS (expr);
7485  itype = TREE_TYPE (TREE_TYPE (expr));
7486  size = GET_MODE_SIZE (TYPE_MODE (itype));
7487  for (i = 0; i < count; i++)
7488    {
7489      if (off >= size)
7490	{
7491	  off -= size;
7492	  continue;
7493	}
7494      elem = VECTOR_CST_ELT (expr, i);
7495      int res = native_encode_expr (elem, ptr+offset, len-offset, off);
7496      if ((off == -1 && res != size)
7497	  || res == 0)
7498	return 0;
7499      offset += res;
7500      if (offset >= len)
7501	return offset;
7502      if (off != -1)
7503	off = 0;
7504    }
7505  return offset;
7506}
7507
7508
7509/* Subroutine of native_encode_expr.  Encode the STRING_CST
7510   specified by EXPR into the buffer PTR of length LEN bytes.
7511   Return the number of bytes placed in the buffer, or zero
7512   upon failure.  */
7513
7514static int
7515native_encode_string (const_tree expr, unsigned char *ptr, int len, int off)
7516{
7517  tree type = TREE_TYPE (expr);
7518  HOST_WIDE_INT total_bytes;
7519
7520  if (TREE_CODE (type) != ARRAY_TYPE
7521      || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE
7522      || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT
7523      || !tree_fits_shwi_p (TYPE_SIZE_UNIT (type)))
7524    return 0;
7525  total_bytes = tree_to_shwi (TYPE_SIZE_UNIT (type));
7526  if ((off == -1 && total_bytes > len)
7527      || off >= total_bytes)
7528    return 0;
7529  if (off == -1)
7530    off = 0;
7531  if (TREE_STRING_LENGTH (expr) - off < MIN (total_bytes, len))
7532    {
7533      int written = 0;
7534      if (off < TREE_STRING_LENGTH (expr))
7535	{
7536	  written = MIN (len, TREE_STRING_LENGTH (expr) - off);
7537	  memcpy (ptr, TREE_STRING_POINTER (expr) + off, written);
7538	}
7539      memset (ptr + written, 0,
7540	      MIN (total_bytes - written, len - written));
7541    }
7542  else
7543    memcpy (ptr, TREE_STRING_POINTER (expr) + off, MIN (total_bytes, len));
7544  return MIN (total_bytes - off, len);
7545}
7546
7547
7548/* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7549   REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7550   buffer PTR of length LEN bytes.  If OFF is not -1 then start
7551   the encoding at byte offset OFF and encode at most LEN bytes.
7552   Return the number of bytes placed in the buffer, or zero upon failure.  */
7553
7554int
7555native_encode_expr (const_tree expr, unsigned char *ptr, int len, int off)
7556{
7557  /* We don't support starting at negative offset and -1 is special.  */
7558  if (off < -1)
7559    return 0;
7560
7561  switch (TREE_CODE (expr))
7562    {
7563    case INTEGER_CST:
7564      return native_encode_int (expr, ptr, len, off);
7565
7566    case REAL_CST:
7567      return native_encode_real (expr, ptr, len, off);
7568
7569    case FIXED_CST:
7570      return native_encode_fixed (expr, ptr, len, off);
7571
7572    case COMPLEX_CST:
7573      return native_encode_complex (expr, ptr, len, off);
7574
7575    case VECTOR_CST:
7576      return native_encode_vector (expr, ptr, len, off);
7577
7578    case STRING_CST:
7579      return native_encode_string (expr, ptr, len, off);
7580
7581    default:
7582      return 0;
7583    }
7584}
7585
7586
7587/* Subroutine of native_interpret_expr.  Interpret the contents of
7588   the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7589   If the buffer cannot be interpreted, return NULL_TREE.  */
7590
7591static tree
7592native_interpret_int (tree type, const unsigned char *ptr, int len)
7593{
7594  int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7595
7596  if (total_bytes > len
7597      || total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
7598    return NULL_TREE;
7599
7600  wide_int result = wi::from_buffer (ptr, total_bytes);
7601
7602  return wide_int_to_tree (type, result);
7603}
7604
7605
7606/* Subroutine of native_interpret_expr.  Interpret the contents of
7607   the buffer PTR of length LEN as a FIXED_CST of type TYPE.
7608   If the buffer cannot be interpreted, return NULL_TREE.  */
7609
7610static tree
7611native_interpret_fixed (tree type, const unsigned char *ptr, int len)
7612{
7613  int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7614  double_int result;
7615  FIXED_VALUE_TYPE fixed_value;
7616
7617  if (total_bytes > len
7618      || total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
7619    return NULL_TREE;
7620
7621  result = double_int::from_buffer (ptr, total_bytes);
7622  fixed_value = fixed_from_double_int (result, TYPE_MODE (type));
7623
7624  return build_fixed (type, fixed_value);
7625}
7626
7627
7628/* Subroutine of native_interpret_expr.  Interpret the contents of
7629   the buffer PTR of length LEN as a REAL_CST of type TYPE.
7630   If the buffer cannot be interpreted, return NULL_TREE.  */
7631
7632static tree
7633native_interpret_real (tree type, const unsigned char *ptr, int len)
7634{
7635  machine_mode mode = TYPE_MODE (type);
7636  int total_bytes = GET_MODE_SIZE (mode);
7637  int byte, offset, word, words, bitpos;
7638  unsigned char value;
7639  /* There are always 32 bits in each long, no matter the size of
7640     the hosts long.  We handle floating point representations with
7641     up to 192 bits.  */
7642  REAL_VALUE_TYPE r;
7643  long tmp[6];
7644
7645  total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7646  if (total_bytes > len || total_bytes > 24)
7647    return NULL_TREE;
7648  words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7649
7650  memset (tmp, 0, sizeof (tmp));
7651  for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7652       bitpos += BITS_PER_UNIT)
7653    {
7654      byte = (bitpos / BITS_PER_UNIT) & 3;
7655      if (UNITS_PER_WORD < 4)
7656	{
7657	  word = byte / UNITS_PER_WORD;
7658	  if (WORDS_BIG_ENDIAN)
7659	    word = (words - 1) - word;
7660	  offset = word * UNITS_PER_WORD;
7661	  if (BYTES_BIG_ENDIAN)
7662	    offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7663	  else
7664	    offset += byte % UNITS_PER_WORD;
7665	}
7666      else
7667	offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7668      value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7669
7670      tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7671    }
7672
7673  real_from_target (&r, tmp, mode);
7674  return build_real (type, r);
7675}
7676
7677
7678/* Subroutine of native_interpret_expr.  Interpret the contents of
7679   the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7680   If the buffer cannot be interpreted, return NULL_TREE.  */
7681
7682static tree
7683native_interpret_complex (tree type, const unsigned char *ptr, int len)
7684{
7685  tree etype, rpart, ipart;
7686  int size;
7687
7688  etype = TREE_TYPE (type);
7689  size = GET_MODE_SIZE (TYPE_MODE (etype));
7690  if (size * 2 > len)
7691    return NULL_TREE;
7692  rpart = native_interpret_expr (etype, ptr, size);
7693  if (!rpart)
7694    return NULL_TREE;
7695  ipart = native_interpret_expr (etype, ptr+size, size);
7696  if (!ipart)
7697    return NULL_TREE;
7698  return build_complex (type, rpart, ipart);
7699}
7700
7701
7702/* Subroutine of native_interpret_expr.  Interpret the contents of
7703   the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7704   If the buffer cannot be interpreted, return NULL_TREE.  */
7705
7706static tree
7707native_interpret_vector (tree type, const unsigned char *ptr, int len)
7708{
7709  tree etype, elem;
7710  int i, size, count;
7711  tree *elements;
7712
7713  etype = TREE_TYPE (type);
7714  size = GET_MODE_SIZE (TYPE_MODE (etype));
7715  count = TYPE_VECTOR_SUBPARTS (type);
7716  if (size * count > len)
7717    return NULL_TREE;
7718
7719  elements = XALLOCAVEC (tree, count);
7720  for (i = count - 1; i >= 0; i--)
7721    {
7722      elem = native_interpret_expr (etype, ptr+(i*size), size);
7723      if (!elem)
7724	return NULL_TREE;
7725      elements[i] = elem;
7726    }
7727  return build_vector (type, elements);
7728}
7729
7730
7731/* Subroutine of fold_view_convert_expr.  Interpret the contents of
7732   the buffer PTR of length LEN as a constant of type TYPE.  For
7733   INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7734   we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7735   return NULL_TREE.  */
7736
7737tree
7738native_interpret_expr (tree type, const unsigned char *ptr, int len)
7739{
7740  switch (TREE_CODE (type))
7741    {
7742    case INTEGER_TYPE:
7743    case ENUMERAL_TYPE:
7744    case BOOLEAN_TYPE:
7745    case POINTER_TYPE:
7746    case REFERENCE_TYPE:
7747      return native_interpret_int (type, ptr, len);
7748
7749    case REAL_TYPE:
7750      return native_interpret_real (type, ptr, len);
7751
7752    case FIXED_POINT_TYPE:
7753      return native_interpret_fixed (type, ptr, len);
7754
7755    case COMPLEX_TYPE:
7756      return native_interpret_complex (type, ptr, len);
7757
7758    case VECTOR_TYPE:
7759      return native_interpret_vector (type, ptr, len);
7760
7761    default:
7762      return NULL_TREE;
7763    }
7764}
7765
7766/* Returns true if we can interpret the contents of a native encoding
7767   as TYPE.  */
7768
7769static bool
7770can_native_interpret_type_p (tree type)
7771{
7772  switch (TREE_CODE (type))
7773    {
7774    case INTEGER_TYPE:
7775    case ENUMERAL_TYPE:
7776    case BOOLEAN_TYPE:
7777    case POINTER_TYPE:
7778    case REFERENCE_TYPE:
7779    case FIXED_POINT_TYPE:
7780    case REAL_TYPE:
7781    case COMPLEX_TYPE:
7782    case VECTOR_TYPE:
7783      return true;
7784    default:
7785      return false;
7786    }
7787}
7788
7789/* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7790   TYPE at compile-time.  If we're unable to perform the conversion
7791   return NULL_TREE.  */
7792
7793static tree
7794fold_view_convert_expr (tree type, tree expr)
7795{
7796  /* We support up to 512-bit values (for V8DFmode).  */
7797  unsigned char buffer[64];
7798  int len;
7799
7800  /* Check that the host and target are sane.  */
7801  if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7802    return NULL_TREE;
7803
7804  len = native_encode_expr (expr, buffer, sizeof (buffer));
7805  if (len == 0)
7806    return NULL_TREE;
7807
7808  return native_interpret_expr (type, buffer, len);
7809}
7810
7811/* Build an expression for the address of T.  Folds away INDIRECT_REF
7812   to avoid confusing the gimplify process.  */
7813
7814tree
7815build_fold_addr_expr_with_type_loc (location_t loc, tree t, tree ptrtype)
7816{
7817  /* The size of the object is not relevant when talking about its address.  */
7818  if (TREE_CODE (t) == WITH_SIZE_EXPR)
7819    t = TREE_OPERAND (t, 0);
7820
7821  if (TREE_CODE (t) == INDIRECT_REF)
7822    {
7823      t = TREE_OPERAND (t, 0);
7824
7825      if (TREE_TYPE (t) != ptrtype)
7826	t = build1_loc (loc, NOP_EXPR, ptrtype, t);
7827    }
7828  else if (TREE_CODE (t) == MEM_REF
7829	   && integer_zerop (TREE_OPERAND (t, 1)))
7830    return TREE_OPERAND (t, 0);
7831  else if (TREE_CODE (t) == MEM_REF
7832	   && TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST)
7833    return fold_binary (POINTER_PLUS_EXPR, ptrtype,
7834			TREE_OPERAND (t, 0),
7835			convert_to_ptrofftype (TREE_OPERAND (t, 1)));
7836  else if (TREE_CODE (t) == VIEW_CONVERT_EXPR)
7837    {
7838      t = build_fold_addr_expr_loc (loc, TREE_OPERAND (t, 0));
7839
7840      if (TREE_TYPE (t) != ptrtype)
7841	t = fold_convert_loc (loc, ptrtype, t);
7842    }
7843  else
7844    t = build1_loc (loc, ADDR_EXPR, ptrtype, t);
7845
7846  return t;
7847}
7848
7849/* Build an expression for the address of T.  */
7850
7851tree
7852build_fold_addr_expr_loc (location_t loc, tree t)
7853{
7854  tree ptrtype = build_pointer_type (TREE_TYPE (t));
7855
7856  return build_fold_addr_expr_with_type_loc (loc, t, ptrtype);
7857}
7858
7859/* Fold a unary expression of code CODE and type TYPE with operand
7860   OP0.  Return the folded expression if folding is successful.
7861   Otherwise, return NULL_TREE.  */
7862
7863tree
7864fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
7865{
7866  tree tem;
7867  tree arg0;
7868  enum tree_code_class kind = TREE_CODE_CLASS (code);
7869
7870  gcc_assert (IS_EXPR_CODE_CLASS (kind)
7871	      && TREE_CODE_LENGTH (code) == 1);
7872
7873  arg0 = op0;
7874  if (arg0)
7875    {
7876      if (CONVERT_EXPR_CODE_P (code)
7877	  || code == FLOAT_EXPR || code == ABS_EXPR || code == NEGATE_EXPR)
7878	{
7879	  /* Don't use STRIP_NOPS, because signedness of argument type
7880	     matters.  */
7881	  STRIP_SIGN_NOPS (arg0);
7882	}
7883      else
7884	{
7885	  /* Strip any conversions that don't change the mode.  This
7886	     is safe for every expression, except for a comparison
7887	     expression because its signedness is derived from its
7888	     operands.
7889
7890	     Note that this is done as an internal manipulation within
7891	     the constant folder, in order to find the simplest
7892	     representation of the arguments so that their form can be
7893	     studied.  In any cases, the appropriate type conversions
7894	     should be put back in the tree that will get out of the
7895	     constant folder.  */
7896	  STRIP_NOPS (arg0);
7897	}
7898
7899      if (CONSTANT_CLASS_P (arg0))
7900	{
7901	  tree tem = const_unop (code, type, arg0);
7902	  if (tem)
7903	    {
7904	      if (TREE_TYPE (tem) != type)
7905		tem = fold_convert_loc (loc, type, tem);
7906	      return tem;
7907	    }
7908	}
7909    }
7910
7911  tem = generic_simplify (loc, code, type, op0);
7912  if (tem)
7913    return tem;
7914
7915  if (TREE_CODE_CLASS (code) == tcc_unary)
7916    {
7917      if (TREE_CODE (arg0) == COMPOUND_EXPR)
7918	return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7919		       fold_build1_loc (loc, code, type,
7920				    fold_convert_loc (loc, TREE_TYPE (op0),
7921						      TREE_OPERAND (arg0, 1))));
7922      else if (TREE_CODE (arg0) == COND_EXPR)
7923	{
7924	  tree arg01 = TREE_OPERAND (arg0, 1);
7925	  tree arg02 = TREE_OPERAND (arg0, 2);
7926	  if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7927	    arg01 = fold_build1_loc (loc, code, type,
7928				 fold_convert_loc (loc,
7929						   TREE_TYPE (op0), arg01));
7930	  if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7931	    arg02 = fold_build1_loc (loc, code, type,
7932				 fold_convert_loc (loc,
7933						   TREE_TYPE (op0), arg02));
7934	  tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0, 0),
7935			     arg01, arg02);
7936
7937	  /* If this was a conversion, and all we did was to move into
7938	     inside the COND_EXPR, bring it back out.  But leave it if
7939	     it is a conversion from integer to integer and the
7940	     result precision is no wider than a word since such a
7941	     conversion is cheap and may be optimized away by combine,
7942	     while it couldn't if it were outside the COND_EXPR.  Then return
7943	     so we don't get into an infinite recursion loop taking the
7944	     conversion out and then back in.  */
7945
7946	  if ((CONVERT_EXPR_CODE_P (code)
7947	       || code == NON_LVALUE_EXPR)
7948	      && TREE_CODE (tem) == COND_EXPR
7949	      && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7950	      && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7951	      && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7952	      && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7953	      && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7954		  == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7955	      && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7956		     && (INTEGRAL_TYPE_P
7957			 (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7958		     && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7959		  || flag_syntax_only))
7960	    tem = build1_loc (loc, code, type,
7961			      build3 (COND_EXPR,
7962				      TREE_TYPE (TREE_OPERAND
7963						 (TREE_OPERAND (tem, 1), 0)),
7964				      TREE_OPERAND (tem, 0),
7965				      TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7966				      TREE_OPERAND (TREE_OPERAND (tem, 2),
7967						    0)));
7968	  return tem;
7969	}
7970   }
7971
7972  switch (code)
7973    {
7974    case NON_LVALUE_EXPR:
7975      if (!maybe_lvalue_p (op0))
7976	return fold_convert_loc (loc, type, op0);
7977      return NULL_TREE;
7978
7979    CASE_CONVERT:
7980    case FLOAT_EXPR:
7981    case FIX_TRUNC_EXPR:
7982      if (COMPARISON_CLASS_P (op0))
7983	{
7984	  /* If we have (type) (a CMP b) and type is an integral type, return
7985	     new expression involving the new type.  Canonicalize
7986	     (type) (a CMP b) to (a CMP b) ? (type) true : (type) false for
7987	     non-integral type.
7988	     Do not fold the result as that would not simplify further, also
7989	     folding again results in recursions.  */
7990	  if (TREE_CODE (type) == BOOLEAN_TYPE)
7991	    return build2_loc (loc, TREE_CODE (op0), type,
7992			       TREE_OPERAND (op0, 0),
7993			       TREE_OPERAND (op0, 1));
7994	  else if (!INTEGRAL_TYPE_P (type) && !VOID_TYPE_P (type)
7995		   && TREE_CODE (type) != VECTOR_TYPE)
7996	    return build3_loc (loc, COND_EXPR, type, op0,
7997			       constant_boolean_node (true, type),
7998			       constant_boolean_node (false, type));
7999	}
8000
8001      /* Handle (T *)&A.B.C for A being of type T and B and C
8002	 living at offset zero.  This occurs frequently in
8003	 C++ upcasting and then accessing the base.  */
8004      if (TREE_CODE (op0) == ADDR_EXPR
8005	  && POINTER_TYPE_P (type)
8006	  && handled_component_p (TREE_OPERAND (op0, 0)))
8007        {
8008	  HOST_WIDE_INT bitsize, bitpos;
8009	  tree offset;
8010	  machine_mode mode;
8011	  int unsignedp, volatilep;
8012          tree base = TREE_OPERAND (op0, 0);
8013	  base = get_inner_reference (base, &bitsize, &bitpos, &offset,
8014				      &mode, &unsignedp, &volatilep, false);
8015	  /* If the reference was to a (constant) zero offset, we can use
8016	     the address of the base if it has the same base type
8017	     as the result type and the pointer type is unqualified.  */
8018	  if (! offset && bitpos == 0
8019	      && (TYPE_MAIN_VARIANT (TREE_TYPE (type))
8020		  == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
8021	      && TYPE_QUALS (type) == TYPE_UNQUALIFIED)
8022	    return fold_convert_loc (loc, type,
8023				     build_fold_addr_expr_loc (loc, base));
8024        }
8025
8026      if (TREE_CODE (op0) == MODIFY_EXPR
8027	  && TREE_CONSTANT (TREE_OPERAND (op0, 1))
8028	  /* Detect assigning a bitfield.  */
8029	  && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
8030	       && DECL_BIT_FIELD
8031	       (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
8032	{
8033	  /* Don't leave an assignment inside a conversion
8034	     unless assigning a bitfield.  */
8035	  tem = fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 1));
8036	  /* First do the assignment, then return converted constant.  */
8037	  tem = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
8038	  TREE_NO_WARNING (tem) = 1;
8039	  TREE_USED (tem) = 1;
8040	  return tem;
8041	}
8042
8043      /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
8044	 constants (if x has signed type, the sign bit cannot be set
8045	 in c).  This folds extension into the BIT_AND_EXPR.
8046	 ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they
8047	 very likely don't have maximal range for their precision and this
8048	 transformation effectively doesn't preserve non-maximal ranges.  */
8049      if (TREE_CODE (type) == INTEGER_TYPE
8050	  && TREE_CODE (op0) == BIT_AND_EXPR
8051	  && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
8052	{
8053	  tree and_expr = op0;
8054	  tree and0 = TREE_OPERAND (and_expr, 0);
8055	  tree and1 = TREE_OPERAND (and_expr, 1);
8056	  int change = 0;
8057
8058	  if (TYPE_UNSIGNED (TREE_TYPE (and_expr))
8059	      || (TYPE_PRECISION (type)
8060		  <= TYPE_PRECISION (TREE_TYPE (and_expr))))
8061	    change = 1;
8062	  else if (TYPE_PRECISION (TREE_TYPE (and1))
8063		   <= HOST_BITS_PER_WIDE_INT
8064		   && tree_fits_uhwi_p (and1))
8065	    {
8066	      unsigned HOST_WIDE_INT cst;
8067
8068	      cst = tree_to_uhwi (and1);
8069	      cst &= HOST_WIDE_INT_M1U
8070		     << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
8071	      change = (cst == 0);
8072#ifdef LOAD_EXTEND_OP
8073	      if (change
8074		  && !flag_syntax_only
8075		  && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
8076		      == ZERO_EXTEND))
8077		{
8078		  tree uns = unsigned_type_for (TREE_TYPE (and0));
8079		  and0 = fold_convert_loc (loc, uns, and0);
8080		  and1 = fold_convert_loc (loc, uns, and1);
8081		}
8082#endif
8083	    }
8084	  if (change)
8085	    {
8086	      tem = force_fit_type (type, wi::to_widest (and1), 0,
8087				    TREE_OVERFLOW (and1));
8088	      return fold_build2_loc (loc, BIT_AND_EXPR, type,
8089				      fold_convert_loc (loc, type, and0), tem);
8090	    }
8091	}
8092
8093      /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
8094         when one of the new casts will fold away. Conservatively we assume
8095	 that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
8096      if (POINTER_TYPE_P (type)
8097	  && TREE_CODE (arg0) == POINTER_PLUS_EXPR
8098	  && (!TYPE_RESTRICT (type) || TYPE_RESTRICT (TREE_TYPE (arg0)))
8099	  && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8100	      || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
8101	      || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
8102	{
8103	  tree arg00 = TREE_OPERAND (arg0, 0);
8104	  tree arg01 = TREE_OPERAND (arg0, 1);
8105
8106	  return fold_build_pointer_plus_loc
8107		   (loc, fold_convert_loc (loc, type, arg00), arg01);
8108	}
8109
8110      /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
8111	 of the same precision, and X is an integer type not narrower than
8112	 types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
8113      if (INTEGRAL_TYPE_P (type)
8114	  && TREE_CODE (op0) == BIT_NOT_EXPR
8115	  && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8116	  && CONVERT_EXPR_P (TREE_OPERAND (op0, 0))
8117	  && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8118	{
8119	  tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
8120	  if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8121	      && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
8122	    return fold_build1_loc (loc, BIT_NOT_EXPR, type,
8123				fold_convert_loc (loc, type, tem));
8124	}
8125
8126      /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
8127	 type of X and Y (integer types only).  */
8128      if (INTEGRAL_TYPE_P (type)
8129	  && TREE_CODE (op0) == MULT_EXPR
8130	  && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8131	  && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
8132	{
8133	  /* Be careful not to introduce new overflows.  */
8134	  tree mult_type;
8135          if (TYPE_OVERFLOW_WRAPS (type))
8136	    mult_type = type;
8137	  else
8138	    mult_type = unsigned_type_for (type);
8139
8140	  if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
8141	    {
8142	      tem = fold_build2_loc (loc, MULT_EXPR, mult_type,
8143				 fold_convert_loc (loc, mult_type,
8144						   TREE_OPERAND (op0, 0)),
8145				 fold_convert_loc (loc, mult_type,
8146						   TREE_OPERAND (op0, 1)));
8147	      return fold_convert_loc (loc, type, tem);
8148	    }
8149	}
8150
8151      return NULL_TREE;
8152
8153    case VIEW_CONVERT_EXPR:
8154      if (TREE_CODE (op0) == MEM_REF)
8155	{
8156	  if (TYPE_ALIGN (TREE_TYPE (op0)) != TYPE_ALIGN (type))
8157	    type = build_aligned_type (type, TYPE_ALIGN (TREE_TYPE (op0)));
8158	  tem = fold_build2_loc (loc, MEM_REF, type,
8159				 TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 1));
8160	  return tem;
8161	}
8162
8163      return NULL_TREE;
8164
8165    case NEGATE_EXPR:
8166      tem = fold_negate_expr (loc, arg0);
8167      if (tem)
8168	return fold_convert_loc (loc, type, tem);
8169      return NULL_TREE;
8170
8171    case ABS_EXPR:
8172      /* Convert fabs((double)float) into (double)fabsf(float).  */
8173      if (TREE_CODE (arg0) == NOP_EXPR
8174	  && TREE_CODE (type) == REAL_TYPE)
8175	{
8176	  tree targ0 = strip_float_extensions (arg0);
8177	  if (targ0 != arg0)
8178	    return fold_convert_loc (loc, type,
8179				     fold_build1_loc (loc, ABS_EXPR,
8180						  TREE_TYPE (targ0),
8181						  targ0));
8182	}
8183      /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8184      else if (TREE_CODE (arg0) == ABS_EXPR)
8185	return arg0;
8186
8187      /* Strip sign ops from argument.  */
8188      if (TREE_CODE (type) == REAL_TYPE)
8189	{
8190	  tem = fold_strip_sign_ops (arg0);
8191	  if (tem)
8192	    return fold_build1_loc (loc, ABS_EXPR, type,
8193				fold_convert_loc (loc, type, tem));
8194	}
8195      return NULL_TREE;
8196
8197    case CONJ_EXPR:
8198      if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8199	return fold_convert_loc (loc, type, arg0);
8200      if (TREE_CODE (arg0) == COMPLEX_EXPR)
8201	{
8202	  tree itype = TREE_TYPE (type);
8203	  tree rpart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 0));
8204	  tree ipart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 1));
8205	  return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart,
8206			      negate_expr (ipart));
8207	}
8208      if (TREE_CODE (arg0) == CONJ_EXPR)
8209	return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8210      return NULL_TREE;
8211
8212    case BIT_NOT_EXPR:
8213      /* Convert ~ (-A) to A - 1.  */
8214      if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8215	return fold_build2_loc (loc, MINUS_EXPR, type,
8216			    fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)),
8217			    build_int_cst (type, 1));
8218      /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8219      else if (INTEGRAL_TYPE_P (type)
8220	       && ((TREE_CODE (arg0) == MINUS_EXPR
8221		    && integer_onep (TREE_OPERAND (arg0, 1)))
8222		   || (TREE_CODE (arg0) == PLUS_EXPR
8223		       && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8224	{
8225	  /* Perform the negation in ARG0's type and only then convert
8226	     to TYPE as to avoid introducing undefined behavior.  */
8227	  tree t = fold_build1_loc (loc, NEGATE_EXPR,
8228				    TREE_TYPE (TREE_OPERAND (arg0, 0)),
8229				    TREE_OPERAND (arg0, 0));
8230	  return fold_convert_loc (loc, type, t);
8231	}
8232      /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8233      else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8234	       && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8235			       	     fold_convert_loc (loc, type,
8236						       TREE_OPERAND (arg0, 0)))))
8237	return fold_build2_loc (loc, BIT_XOR_EXPR, type, tem,
8238			    fold_convert_loc (loc, type,
8239					      TREE_OPERAND (arg0, 1)));
8240      else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8241	       && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8242			       	     fold_convert_loc (loc, type,
8243						       TREE_OPERAND (arg0, 1)))))
8244	return fold_build2_loc (loc, BIT_XOR_EXPR, type,
8245			    fold_convert_loc (loc, type,
8246					      TREE_OPERAND (arg0, 0)), tem);
8247
8248      return NULL_TREE;
8249
8250    case TRUTH_NOT_EXPR:
8251      /* Note that the operand of this must be an int
8252	 and its values must be 0 or 1.
8253	 ("true" is a fixed value perhaps depending on the language,
8254	 but we don't handle values other than 1 correctly yet.)  */
8255      tem = fold_truth_not_expr (loc, arg0);
8256      if (!tem)
8257	return NULL_TREE;
8258      return fold_convert_loc (loc, type, tem);
8259
8260    case REALPART_EXPR:
8261      if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8262	return fold_convert_loc (loc, type, arg0);
8263      if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8264	{
8265	  tree itype = TREE_TYPE (TREE_TYPE (arg0));
8266	  tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8267			     fold_build1_loc (loc, REALPART_EXPR, itype,
8268					  TREE_OPERAND (arg0, 0)),
8269			     fold_build1_loc (loc, REALPART_EXPR, itype,
8270					  TREE_OPERAND (arg0, 1)));
8271	  return fold_convert_loc (loc, type, tem);
8272	}
8273      if (TREE_CODE (arg0) == CONJ_EXPR)
8274	{
8275	  tree itype = TREE_TYPE (TREE_TYPE (arg0));
8276	  tem = fold_build1_loc (loc, REALPART_EXPR, itype,
8277			     TREE_OPERAND (arg0, 0));
8278	  return fold_convert_loc (loc, type, tem);
8279	}
8280      if (TREE_CODE (arg0) == CALL_EXPR)
8281	{
8282	  tree fn = get_callee_fndecl (arg0);
8283	  if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8284	    switch (DECL_FUNCTION_CODE (fn))
8285	      {
8286	      CASE_FLT_FN (BUILT_IN_CEXPI):
8287	        fn = mathfn_built_in (type, BUILT_IN_COS);
8288		if (fn)
8289	          return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8290		break;
8291
8292	      default:
8293		break;
8294	      }
8295	}
8296      return NULL_TREE;
8297
8298    case IMAGPART_EXPR:
8299      if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8300	return build_zero_cst (type);
8301      if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8302	{
8303	  tree itype = TREE_TYPE (TREE_TYPE (arg0));
8304	  tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8305			     fold_build1_loc (loc, IMAGPART_EXPR, itype,
8306					  TREE_OPERAND (arg0, 0)),
8307			     fold_build1_loc (loc, IMAGPART_EXPR, itype,
8308					  TREE_OPERAND (arg0, 1)));
8309	  return fold_convert_loc (loc, type, tem);
8310	}
8311      if (TREE_CODE (arg0) == CONJ_EXPR)
8312	{
8313	  tree itype = TREE_TYPE (TREE_TYPE (arg0));
8314	  tem = fold_build1_loc (loc, IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8315	  return fold_convert_loc (loc, type, negate_expr (tem));
8316	}
8317      if (TREE_CODE (arg0) == CALL_EXPR)
8318	{
8319	  tree fn = get_callee_fndecl (arg0);
8320	  if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8321	    switch (DECL_FUNCTION_CODE (fn))
8322	      {
8323	      CASE_FLT_FN (BUILT_IN_CEXPI):
8324	        fn = mathfn_built_in (type, BUILT_IN_SIN);
8325		if (fn)
8326	          return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8327		break;
8328
8329	      default:
8330		break;
8331	      }
8332	}
8333      return NULL_TREE;
8334
8335    case INDIRECT_REF:
8336      /* Fold *&X to X if X is an lvalue.  */
8337      if (TREE_CODE (op0) == ADDR_EXPR)
8338	{
8339	  tree op00 = TREE_OPERAND (op0, 0);
8340	  if ((TREE_CODE (op00) == VAR_DECL
8341	       || TREE_CODE (op00) == PARM_DECL
8342	       || TREE_CODE (op00) == RESULT_DECL)
8343	      && !TREE_READONLY (op00))
8344	    return op00;
8345	}
8346      return NULL_TREE;
8347
8348    default:
8349      return NULL_TREE;
8350    } /* switch (code) */
8351}
8352
8353
8354/* If the operation was a conversion do _not_ mark a resulting constant
8355   with TREE_OVERFLOW if the original constant was not.  These conversions
8356   have implementation defined behavior and retaining the TREE_OVERFLOW
8357   flag here would confuse later passes such as VRP.  */
8358tree
8359fold_unary_ignore_overflow_loc (location_t loc, enum tree_code code,
8360				tree type, tree op0)
8361{
8362  tree res = fold_unary_loc (loc, code, type, op0);
8363  if (res
8364      && TREE_CODE (res) == INTEGER_CST
8365      && TREE_CODE (op0) == INTEGER_CST
8366      && CONVERT_EXPR_CODE_P (code))
8367    TREE_OVERFLOW (res) = TREE_OVERFLOW (op0);
8368
8369  return res;
8370}
8371
8372/* Fold a binary bitwise/truth expression of code CODE and type TYPE with
8373   operands OP0 and OP1.  LOC is the location of the resulting expression.
8374   ARG0 and ARG1 are the NOP_STRIPed results of OP0 and OP1.
8375   Return the folded expression if folding is successful.  Otherwise,
8376   return NULL_TREE.  */
8377static tree
8378fold_truth_andor (location_t loc, enum tree_code code, tree type,
8379		  tree arg0, tree arg1, tree op0, tree op1)
8380{
8381  tree tem;
8382
8383  /* We only do these simplifications if we are optimizing.  */
8384  if (!optimize)
8385    return NULL_TREE;
8386
8387  /* Check for things like (A || B) && (A || C).  We can convert this
8388     to A || (B && C).  Note that either operator can be any of the four
8389     truth and/or operations and the transformation will still be
8390     valid.   Also note that we only care about order for the
8391     ANDIF and ORIF operators.  If B contains side effects, this
8392     might change the truth-value of A.  */
8393  if (TREE_CODE (arg0) == TREE_CODE (arg1)
8394      && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
8395	  || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
8396	  || TREE_CODE (arg0) == TRUTH_AND_EXPR
8397	  || TREE_CODE (arg0) == TRUTH_OR_EXPR)
8398      && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
8399    {
8400      tree a00 = TREE_OPERAND (arg0, 0);
8401      tree a01 = TREE_OPERAND (arg0, 1);
8402      tree a10 = TREE_OPERAND (arg1, 0);
8403      tree a11 = TREE_OPERAND (arg1, 1);
8404      int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
8405			  || TREE_CODE (arg0) == TRUTH_AND_EXPR)
8406			 && (code == TRUTH_AND_EXPR
8407			     || code == TRUTH_OR_EXPR));
8408
8409      if (operand_equal_p (a00, a10, 0))
8410	return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
8411			    fold_build2_loc (loc, code, type, a01, a11));
8412      else if (commutative && operand_equal_p (a00, a11, 0))
8413	return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
8414			    fold_build2_loc (loc, code, type, a01, a10));
8415      else if (commutative && operand_equal_p (a01, a10, 0))
8416	return fold_build2_loc (loc, TREE_CODE (arg0), type, a01,
8417			    fold_build2_loc (loc, code, type, a00, a11));
8418
8419      /* This case if tricky because we must either have commutative
8420	 operators or else A10 must not have side-effects.  */
8421
8422      else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
8423	       && operand_equal_p (a01, a11, 0))
8424	return fold_build2_loc (loc, TREE_CODE (arg0), type,
8425			    fold_build2_loc (loc, code, type, a00, a10),
8426			    a01);
8427    }
8428
8429  /* See if we can build a range comparison.  */
8430  if (0 != (tem = fold_range_test (loc, code, type, op0, op1)))
8431    return tem;
8432
8433  if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg0) == TRUTH_ORIF_EXPR)
8434      || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg0) == TRUTH_ANDIF_EXPR))
8435    {
8436      tem = merge_truthop_with_opposite_arm (loc, arg0, arg1, true);
8437      if (tem)
8438	return fold_build2_loc (loc, code, type, tem, arg1);
8439    }
8440
8441  if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg1) == TRUTH_ORIF_EXPR)
8442      || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg1) == TRUTH_ANDIF_EXPR))
8443    {
8444      tem = merge_truthop_with_opposite_arm (loc, arg1, arg0, false);
8445      if (tem)
8446	return fold_build2_loc (loc, code, type, arg0, tem);
8447    }
8448
8449  /* Check for the possibility of merging component references.  If our
8450     lhs is another similar operation, try to merge its rhs with our
8451     rhs.  Then try to merge our lhs and rhs.  */
8452  if (TREE_CODE (arg0) == code
8453      && 0 != (tem = fold_truth_andor_1 (loc, code, type,
8454					 TREE_OPERAND (arg0, 1), arg1)))
8455    return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
8456
8457  if ((tem = fold_truth_andor_1 (loc, code, type, arg0, arg1)) != 0)
8458    return tem;
8459
8460  if (LOGICAL_OP_NON_SHORT_CIRCUIT
8461      && (code == TRUTH_AND_EXPR
8462          || code == TRUTH_ANDIF_EXPR
8463          || code == TRUTH_OR_EXPR
8464          || code == TRUTH_ORIF_EXPR))
8465    {
8466      enum tree_code ncode, icode;
8467
8468      ncode = (code == TRUTH_ANDIF_EXPR || code == TRUTH_AND_EXPR)
8469	      ? TRUTH_AND_EXPR : TRUTH_OR_EXPR;
8470      icode = ncode == TRUTH_AND_EXPR ? TRUTH_ANDIF_EXPR : TRUTH_ORIF_EXPR;
8471
8472      /* Transform ((A AND-IF B) AND[-IF] C) into (A AND-IF (B AND C)),
8473	 or ((A OR-IF B) OR[-IF] C) into (A OR-IF (B OR C))
8474	 We don't want to pack more than two leafs to a non-IF AND/OR
8475	 expression.
8476	 If tree-code of left-hand operand isn't an AND/OR-IF code and not
8477	 equal to IF-CODE, then we don't want to add right-hand operand.
8478	 If the inner right-hand side of left-hand operand has
8479	 side-effects, or isn't simple, then we can't add to it,
8480	 as otherwise we might destroy if-sequence.  */
8481      if (TREE_CODE (arg0) == icode
8482	  && simple_operand_p_2 (arg1)
8483	  /* Needed for sequence points to handle trappings, and
8484	     side-effects.  */
8485	  && simple_operand_p_2 (TREE_OPERAND (arg0, 1)))
8486	{
8487	  tem = fold_build2_loc (loc, ncode, type, TREE_OPERAND (arg0, 1),
8488				 arg1);
8489	  return fold_build2_loc (loc, icode, type, TREE_OPERAND (arg0, 0),
8490				  tem);
8491	}
8492	/* Same as abouve but for (A AND[-IF] (B AND-IF C)) -> ((A AND B) AND-IF C),
8493	   or (A OR[-IF] (B OR-IF C) -> ((A OR B) OR-IF C).  */
8494      else if (TREE_CODE (arg1) == icode
8495	  && simple_operand_p_2 (arg0)
8496	  /* Needed for sequence points to handle trappings, and
8497	     side-effects.  */
8498	  && simple_operand_p_2 (TREE_OPERAND (arg1, 0)))
8499	{
8500	  tem = fold_build2_loc (loc, ncode, type,
8501				 arg0, TREE_OPERAND (arg1, 0));
8502	  return fold_build2_loc (loc, icode, type, tem,
8503				  TREE_OPERAND (arg1, 1));
8504	}
8505      /* Transform (A AND-IF B) into (A AND B), or (A OR-IF B)
8506	 into (A OR B).
8507	 For sequence point consistancy, we need to check for trapping,
8508	 and side-effects.  */
8509      else if (code == icode && simple_operand_p_2 (arg0)
8510               && simple_operand_p_2 (arg1))
8511	return fold_build2_loc (loc, ncode, type, arg0, arg1);
8512    }
8513
8514  return NULL_TREE;
8515}
8516
8517/* Fold a binary expression of code CODE and type TYPE with operands
8518   OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8519   Return the folded expression if folding is successful.  Otherwise,
8520   return NULL_TREE.  */
8521
8522static tree
8523fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1)
8524{
8525  enum tree_code compl_code;
8526
8527  if (code == MIN_EXPR)
8528    compl_code = MAX_EXPR;
8529  else if (code == MAX_EXPR)
8530    compl_code = MIN_EXPR;
8531  else
8532    gcc_unreachable ();
8533
8534  /* MIN (MAX (a, b), b) == b.  */
8535  if (TREE_CODE (op0) == compl_code
8536      && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8537    return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0));
8538
8539  /* MIN (MAX (b, a), b) == b.  */
8540  if (TREE_CODE (op0) == compl_code
8541      && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8542      && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8543    return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1));
8544
8545  /* MIN (a, MAX (a, b)) == a.  */
8546  if (TREE_CODE (op1) == compl_code
8547      && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8548      && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8549    return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1));
8550
8551  /* MIN (a, MAX (b, a)) == a.  */
8552  if (TREE_CODE (op1) == compl_code
8553      && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8554      && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8555    return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0));
8556
8557  return NULL_TREE;
8558}
8559
8560/* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8561   by changing CODE to reduce the magnitude of constants involved in
8562   ARG0 of the comparison.
8563   Returns a canonicalized comparison tree if a simplification was
8564   possible, otherwise returns NULL_TREE.
8565   Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8566   valid if signed overflow is undefined.  */
8567
8568static tree
8569maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
8570				 tree arg0, tree arg1,
8571				 bool *strict_overflow_p)
8572{
8573  enum tree_code code0 = TREE_CODE (arg0);
8574  tree t, cst0 = NULL_TREE;
8575  int sgn0;
8576  bool swap = false;
8577
8578  /* Match A +- CST code arg1 and CST code arg1.  We can change the
8579     first form only if overflow is undefined.  */
8580  if (!(((ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8581	  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)))
8582	 /* In principle pointers also have undefined overflow behavior,
8583	    but that causes problems elsewhere.  */
8584	 && !POINTER_TYPE_P (TREE_TYPE (arg0))
8585	 && (code0 == MINUS_EXPR
8586	     || code0 == PLUS_EXPR)
8587         && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8588	|| code0 == INTEGER_CST))
8589    return NULL_TREE;
8590
8591  /* Identify the constant in arg0 and its sign.  */
8592  if (code0 == INTEGER_CST)
8593    cst0 = arg0;
8594  else
8595    cst0 = TREE_OPERAND (arg0, 1);
8596  sgn0 = tree_int_cst_sgn (cst0);
8597
8598  /* Overflowed constants and zero will cause problems.  */
8599  if (integer_zerop (cst0)
8600      || TREE_OVERFLOW (cst0))
8601    return NULL_TREE;
8602
8603  /* See if we can reduce the magnitude of the constant in
8604     arg0 by changing the comparison code.  */
8605  if (code0 == INTEGER_CST)
8606    {
8607      /* CST <= arg1  ->  CST-1 < arg1.  */
8608      if (code == LE_EXPR && sgn0 == 1)
8609	code = LT_EXPR;
8610      /* -CST < arg1  ->  -CST-1 <= arg1.  */
8611      else if (code == LT_EXPR && sgn0 == -1)
8612	code = LE_EXPR;
8613      /* CST > arg1  ->  CST-1 >= arg1.  */
8614      else if (code == GT_EXPR && sgn0 == 1)
8615	code = GE_EXPR;
8616      /* -CST >= arg1  ->  -CST-1 > arg1.  */
8617      else if (code == GE_EXPR && sgn0 == -1)
8618	code = GT_EXPR;
8619      else
8620        return NULL_TREE;
8621      /* arg1 code' CST' might be more canonical.  */
8622      swap = true;
8623    }
8624  else
8625    {
8626      /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8627      if (code == LT_EXPR
8628	  && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8629	code = LE_EXPR;
8630      /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8631      else if (code == GT_EXPR
8632	       && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8633	code = GE_EXPR;
8634      /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8635      else if (code == LE_EXPR
8636	       && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8637	code = LT_EXPR;
8638      /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8639      else if (code == GE_EXPR
8640	       && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8641	code = GT_EXPR;
8642      else
8643	return NULL_TREE;
8644      *strict_overflow_p = true;
8645    }
8646
8647  /* Now build the constant reduced in magnitude.  But not if that
8648     would produce one outside of its types range.  */
8649  if (INTEGRAL_TYPE_P (TREE_TYPE (cst0))
8650      && ((sgn0 == 1
8651	   && TYPE_MIN_VALUE (TREE_TYPE (cst0))
8652	   && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0))))
8653	  || (sgn0 == -1
8654	      && TYPE_MAX_VALUE (TREE_TYPE (cst0))
8655	      && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0))))))
8656    /* We cannot swap the comparison here as that would cause us to
8657       endlessly recurse.  */
8658    return NULL_TREE;
8659
8660  t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8661		       cst0, build_int_cst (TREE_TYPE (cst0), 1));
8662  if (code0 != INTEGER_CST)
8663    t = fold_build2_loc (loc, code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8664  t = fold_convert (TREE_TYPE (arg1), t);
8665
8666  /* If swapping might yield to a more canonical form, do so.  */
8667  if (swap)
8668    return fold_build2_loc (loc, swap_tree_comparison (code), type, arg1, t);
8669  else
8670    return fold_build2_loc (loc, code, type, t, arg1);
8671}
8672
8673/* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8674   overflow further.  Try to decrease the magnitude of constants involved
8675   by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8676   and put sole constants at the second argument position.
8677   Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8678
8679static tree
8680maybe_canonicalize_comparison (location_t loc, enum tree_code code, tree type,
8681			       tree arg0, tree arg1)
8682{
8683  tree t;
8684  bool strict_overflow_p;
8685  const char * const warnmsg = G_("assuming signed overflow does not occur "
8686				  "when reducing constant in comparison");
8687
8688  /* Try canonicalization by simplifying arg0.  */
8689  strict_overflow_p = false;
8690  t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1,
8691				       &strict_overflow_p);
8692  if (t)
8693    {
8694      if (strict_overflow_p)
8695	fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8696      return t;
8697    }
8698
8699  /* Try canonicalization by simplifying arg1 using the swapped
8700     comparison.  */
8701  code = swap_tree_comparison (code);
8702  strict_overflow_p = false;
8703  t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0,
8704				       &strict_overflow_p);
8705  if (t && strict_overflow_p)
8706    fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8707  return t;
8708}
8709
8710/* Return whether BASE + OFFSET + BITPOS may wrap around the address
8711   space.  This is used to avoid issuing overflow warnings for
8712   expressions like &p->x which can not wrap.  */
8713
8714static bool
8715pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
8716{
8717  if (!POINTER_TYPE_P (TREE_TYPE (base)))
8718    return true;
8719
8720  if (bitpos < 0)
8721    return true;
8722
8723  wide_int wi_offset;
8724  int precision = TYPE_PRECISION (TREE_TYPE (base));
8725  if (offset == NULL_TREE)
8726    wi_offset = wi::zero (precision);
8727  else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
8728    return true;
8729  else
8730    wi_offset = offset;
8731
8732  bool overflow;
8733  wide_int units = wi::shwi (bitpos / BITS_PER_UNIT, precision);
8734  wide_int total = wi::add (wi_offset, units, UNSIGNED, &overflow);
8735  if (overflow)
8736    return true;
8737
8738  if (!wi::fits_uhwi_p (total))
8739    return true;
8740
8741  HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
8742  if (size <= 0)
8743    return true;
8744
8745  /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
8746     array.  */
8747  if (TREE_CODE (base) == ADDR_EXPR)
8748    {
8749      HOST_WIDE_INT base_size;
8750
8751      base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
8752      if (base_size > 0 && size < base_size)
8753	size = base_size;
8754    }
8755
8756  return total.to_uhwi () > (unsigned HOST_WIDE_INT) size;
8757}
8758
8759/* Subroutine of fold_binary.  This routine performs all of the
8760   transformations that are common to the equality/inequality
8761   operators (EQ_EXPR and NE_EXPR) and the ordering operators
8762   (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8763   fold_binary should call fold_binary.  Fold a comparison with
8764   tree code CODE and type TYPE with operands OP0 and OP1.  Return
8765   the folded comparison or NULL_TREE.  */
8766
8767static tree
8768fold_comparison (location_t loc, enum tree_code code, tree type,
8769		 tree op0, tree op1)
8770{
8771  const bool equality_code = (code == EQ_EXPR || code == NE_EXPR);
8772  tree arg0, arg1, tem;
8773
8774  arg0 = op0;
8775  arg1 = op1;
8776
8777  STRIP_SIGN_NOPS (arg0);
8778  STRIP_SIGN_NOPS (arg1);
8779
8780  /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 -+ C1.  */
8781  if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8782      && (equality_code
8783	  || (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8784	      && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))))
8785      && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8786      && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8787      && TREE_CODE (arg1) == INTEGER_CST
8788      && !TREE_OVERFLOW (arg1))
8789    {
8790      const enum tree_code
8791	reverse_op = TREE_CODE (arg0) == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR;
8792      tree const1 = TREE_OPERAND (arg0, 1);
8793      tree const2 = fold_convert_loc (loc, TREE_TYPE (const1), arg1);
8794      tree variable = TREE_OPERAND (arg0, 0);
8795      tree new_const = int_const_binop (reverse_op, const2, const1);
8796
8797      /* If the constant operation overflowed this can be
8798	 simplified as a comparison against INT_MAX/INT_MIN.  */
8799      if (TREE_OVERFLOW (new_const)
8800	  && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
8801	{
8802	  int const1_sgn = tree_int_cst_sgn (const1);
8803	  enum tree_code code2 = code;
8804
8805	  /* Get the sign of the constant on the lhs if the
8806	     operation were VARIABLE + CONST1.  */
8807	  if (TREE_CODE (arg0) == MINUS_EXPR)
8808	    const1_sgn = -const1_sgn;
8809
8810	  /* The sign of the constant determines if we overflowed
8811	     INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8812	     Canonicalize to the INT_MIN overflow by swapping the comparison
8813	     if necessary.  */
8814	  if (const1_sgn == -1)
8815	    code2 = swap_tree_comparison (code);
8816
8817	  /* We now can look at the canonicalized case
8818	       VARIABLE + 1  CODE2  INT_MIN
8819	     and decide on the result.  */
8820	  switch (code2)
8821	    {
8822	    case EQ_EXPR:
8823	    case LT_EXPR:
8824	    case LE_EXPR:
8825	      return
8826		omit_one_operand_loc (loc, type, boolean_false_node, variable);
8827
8828	    case NE_EXPR:
8829	    case GE_EXPR:
8830	    case GT_EXPR:
8831	      return
8832		omit_one_operand_loc (loc, type, boolean_true_node, variable);
8833
8834	    default:
8835	      gcc_unreachable ();
8836	    }
8837	}
8838      else
8839	{
8840	  if (!equality_code)
8841	    fold_overflow_warning ("assuming signed overflow does not occur "
8842				   "when changing X +- C1 cmp C2 to "
8843				   "X cmp C2 -+ C1",
8844				   WARN_STRICT_OVERFLOW_COMPARISON);
8845	  return fold_build2_loc (loc, code, type, variable, new_const);
8846	}
8847    }
8848
8849  /* Transform comparisons of the form X - Y CMP 0 to X CMP Y.  */
8850  if (TREE_CODE (arg0) == MINUS_EXPR
8851      && equality_code
8852      && integer_zerop (arg1))
8853    {
8854      /* ??? The transformation is valid for the other operators if overflow
8855	 is undefined for the type, but performing it here badly interacts
8856	 with the transformation in fold_cond_expr_with_comparison which
8857	 attempts to synthetize ABS_EXPR.  */
8858      if (!equality_code)
8859	fold_overflow_warning ("assuming signed overflow does not occur "
8860			       "when changing X - Y cmp 0 to X cmp Y",
8861			       WARN_STRICT_OVERFLOW_COMPARISON);
8862      return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
8863			      TREE_OPERAND (arg0, 1));
8864    }
8865
8866  /* For comparisons of pointers we can decompose it to a compile time
8867     comparison of the base objects and the offsets into the object.
8868     This requires at least one operand being an ADDR_EXPR or a
8869     POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8870  if (POINTER_TYPE_P (TREE_TYPE (arg0))
8871      && (TREE_CODE (arg0) == ADDR_EXPR
8872	  || TREE_CODE (arg1) == ADDR_EXPR
8873	  || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8874	  || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8875    {
8876      tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8877      HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8878      machine_mode mode;
8879      int volatilep, unsignedp;
8880      bool indirect_base0 = false, indirect_base1 = false;
8881
8882      /* Get base and offset for the access.  Strip ADDR_EXPR for
8883	 get_inner_reference, but put it back by stripping INDIRECT_REF
8884	 off the base object if possible.  indirect_baseN will be true
8885	 if baseN is not an address but refers to the object itself.  */
8886      base0 = arg0;
8887      if (TREE_CODE (arg0) == ADDR_EXPR)
8888	{
8889	  base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8890				       &bitsize, &bitpos0, &offset0, &mode,
8891				       &unsignedp, &volatilep, false);
8892	  if (TREE_CODE (base0) == INDIRECT_REF)
8893	    base0 = TREE_OPERAND (base0, 0);
8894	  else
8895	    indirect_base0 = true;
8896	}
8897      else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8898	{
8899	  base0 = TREE_OPERAND (arg0, 0);
8900	  STRIP_SIGN_NOPS (base0);
8901	  if (TREE_CODE (base0) == ADDR_EXPR)
8902	    {
8903	      base0
8904		= get_inner_reference (TREE_OPERAND (base0, 0),
8905				       &bitsize, &bitpos0, &offset0, &mode,
8906				       &unsignedp, &volatilep, false);
8907	      if (TREE_CODE (base0) == INDIRECT_REF)
8908		base0 = TREE_OPERAND (base0, 0);
8909	      else
8910		indirect_base0 = true;
8911	    }
8912	  if (offset0 == NULL_TREE || integer_zerop (offset0))
8913	    offset0 = TREE_OPERAND (arg0, 1);
8914	  else
8915	    offset0 = size_binop (PLUS_EXPR, offset0,
8916				  TREE_OPERAND (arg0, 1));
8917	  if (TREE_CODE (offset0) == INTEGER_CST)
8918	    {
8919	      offset_int tem = wi::sext (wi::to_offset (offset0),
8920					 TYPE_PRECISION (sizetype));
8921	      tem = wi::lshift (tem, LOG2_BITS_PER_UNIT);
8922	      tem += bitpos0;
8923	      if (wi::fits_shwi_p (tem))
8924		{
8925		  bitpos0 = tem.to_shwi ();
8926		  offset0 = NULL_TREE;
8927		}
8928	    }
8929	}
8930
8931      base1 = arg1;
8932      if (TREE_CODE (arg1) == ADDR_EXPR)
8933	{
8934	  base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8935				       &bitsize, &bitpos1, &offset1, &mode,
8936				       &unsignedp, &volatilep, false);
8937	  if (TREE_CODE (base1) == INDIRECT_REF)
8938	    base1 = TREE_OPERAND (base1, 0);
8939	  else
8940	    indirect_base1 = true;
8941	}
8942      else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8943	{
8944	  base1 = TREE_OPERAND (arg1, 0);
8945	  STRIP_SIGN_NOPS (base1);
8946	  if (TREE_CODE (base1) == ADDR_EXPR)
8947	    {
8948	      base1
8949		= get_inner_reference (TREE_OPERAND (base1, 0),
8950				       &bitsize, &bitpos1, &offset1, &mode,
8951				       &unsignedp, &volatilep, false);
8952	      if (TREE_CODE (base1) == INDIRECT_REF)
8953		base1 = TREE_OPERAND (base1, 0);
8954	      else
8955		indirect_base1 = true;
8956	    }
8957	  if (offset1 == NULL_TREE || integer_zerop (offset1))
8958	    offset1 = TREE_OPERAND (arg1, 1);
8959	  else
8960	    offset1 = size_binop (PLUS_EXPR, offset1,
8961				  TREE_OPERAND (arg1, 1));
8962	  if (TREE_CODE (offset1) == INTEGER_CST)
8963	    {
8964	      offset_int tem = wi::sext (wi::to_offset (offset1),
8965					 TYPE_PRECISION (sizetype));
8966	      tem = wi::lshift (tem, LOG2_BITS_PER_UNIT);
8967	      tem += bitpos1;
8968	      if (wi::fits_shwi_p (tem))
8969		{
8970		  bitpos1 = tem.to_shwi ();
8971		  offset1 = NULL_TREE;
8972		}
8973	    }
8974	}
8975
8976      /* A local variable can never be pointed to by
8977         the default SSA name of an incoming parameter.  */
8978      if ((TREE_CODE (arg0) == ADDR_EXPR
8979           && indirect_base0
8980           && TREE_CODE (base0) == VAR_DECL
8981           && auto_var_in_fn_p (base0, current_function_decl)
8982           && !indirect_base1
8983           && TREE_CODE (base1) == SSA_NAME
8984           && SSA_NAME_IS_DEFAULT_DEF (base1)
8985	   && TREE_CODE (SSA_NAME_VAR (base1)) == PARM_DECL)
8986          || (TREE_CODE (arg1) == ADDR_EXPR
8987              && indirect_base1
8988              && TREE_CODE (base1) == VAR_DECL
8989              && auto_var_in_fn_p (base1, current_function_decl)
8990              && !indirect_base0
8991              && TREE_CODE (base0) == SSA_NAME
8992              && SSA_NAME_IS_DEFAULT_DEF (base0)
8993	      && TREE_CODE (SSA_NAME_VAR (base0)) == PARM_DECL))
8994        {
8995          if (code == NE_EXPR)
8996            return constant_boolean_node (1, type);
8997          else if (code == EQ_EXPR)
8998            return constant_boolean_node (0, type);
8999        }
9000      /* If we have equivalent bases we might be able to simplify.  */
9001      else if (indirect_base0 == indirect_base1
9002               && operand_equal_p (base0, base1, 0))
9003	{
9004	  /* We can fold this expression to a constant if the non-constant
9005	     offset parts are equal.  */
9006	  if ((offset0 == offset1
9007	       || (offset0 && offset1
9008		   && operand_equal_p (offset0, offset1, 0)))
9009	      && (code == EQ_EXPR
9010		  || code == NE_EXPR
9011		  || (indirect_base0 && DECL_P (base0))
9012		  || POINTER_TYPE_OVERFLOW_UNDEFINED))
9013
9014	    {
9015	      if (!equality_code
9016		  && bitpos0 != bitpos1
9017		  && (pointer_may_wrap_p (base0, offset0, bitpos0)
9018		      || pointer_may_wrap_p (base1, offset1, bitpos1)))
9019		fold_overflow_warning (("assuming pointer wraparound does not "
9020					"occur when comparing P +- C1 with "
9021					"P +- C2"),
9022				       WARN_STRICT_OVERFLOW_CONDITIONAL);
9023
9024	      switch (code)
9025		{
9026		case EQ_EXPR:
9027		  return constant_boolean_node (bitpos0 == bitpos1, type);
9028		case NE_EXPR:
9029		  return constant_boolean_node (bitpos0 != bitpos1, type);
9030		case LT_EXPR:
9031		  return constant_boolean_node (bitpos0 < bitpos1, type);
9032		case LE_EXPR:
9033		  return constant_boolean_node (bitpos0 <= bitpos1, type);
9034		case GE_EXPR:
9035		  return constant_boolean_node (bitpos0 >= bitpos1, type);
9036		case GT_EXPR:
9037		  return constant_boolean_node (bitpos0 > bitpos1, type);
9038		default:;
9039		}
9040	    }
9041	  /* We can simplify the comparison to a comparison of the variable
9042	     offset parts if the constant offset parts are equal.
9043	     Be careful to use signed sizetype here because otherwise we
9044	     mess with array offsets in the wrong way.  This is possible
9045	     because pointer arithmetic is restricted to retain within an
9046	     object and overflow on pointer differences is undefined as of
9047	     6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
9048	  else if (bitpos0 == bitpos1
9049		   && (equality_code
9050		       || (indirect_base0 && DECL_P (base0))
9051		       || POINTER_TYPE_OVERFLOW_UNDEFINED))
9052	    {
9053	      /* By converting to signed sizetype we cover middle-end pointer
9054	         arithmetic which operates on unsigned pointer types of size
9055	         type size and ARRAY_REF offsets which are properly sign or
9056	         zero extended from their type in case it is narrower than
9057	         sizetype.  */
9058	      if (offset0 == NULL_TREE)
9059		offset0 = build_int_cst (ssizetype, 0);
9060	      else
9061		offset0 = fold_convert_loc (loc, ssizetype, offset0);
9062	      if (offset1 == NULL_TREE)
9063		offset1 = build_int_cst (ssizetype, 0);
9064	      else
9065		offset1 = fold_convert_loc (loc, ssizetype, offset1);
9066
9067	      if (!equality_code
9068		  && (pointer_may_wrap_p (base0, offset0, bitpos0)
9069		      || pointer_may_wrap_p (base1, offset1, bitpos1)))
9070		fold_overflow_warning (("assuming pointer wraparound does not "
9071					"occur when comparing P +- C1 with "
9072					"P +- C2"),
9073				       WARN_STRICT_OVERFLOW_COMPARISON);
9074
9075	      return fold_build2_loc (loc, code, type, offset0, offset1);
9076	    }
9077	}
9078      /* For non-equal bases we can simplify if they are addresses
9079	 declarations with different addresses.  */
9080      else if (indirect_base0 && indirect_base1
9081	       /* We know that !operand_equal_p (base0, base1, 0)
9082		  because the if condition was false.  But make
9083		  sure two decls are not the same.  */
9084	       && base0 != base1
9085	       && TREE_CODE (arg0) == ADDR_EXPR
9086	       && TREE_CODE (arg1) == ADDR_EXPR
9087	       && DECL_P (base0)
9088	       && DECL_P (base1)
9089	       /* Watch for aliases.  */
9090	       && (!decl_in_symtab_p (base0)
9091		   || !decl_in_symtab_p (base1)
9092		   || !symtab_node::get_create (base0)->equal_address_to
9093			 (symtab_node::get_create (base1))))
9094	{
9095	  if (code == EQ_EXPR)
9096	    return omit_two_operands_loc (loc, type, boolean_false_node,
9097				      arg0, arg1);
9098	  else if (code == NE_EXPR)
9099	    return omit_two_operands_loc (loc, type, boolean_true_node,
9100				      arg0, arg1);
9101	}
9102      /* For equal offsets we can simplify to a comparison of the
9103	 base addresses.  */
9104      else if (bitpos0 == bitpos1
9105	       && (indirect_base0
9106		   ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
9107	       && (indirect_base1
9108		   ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
9109	       && ((offset0 == offset1)
9110		   || (offset0 && offset1
9111		       && operand_equal_p (offset0, offset1, 0))))
9112	{
9113	  if (indirect_base0)
9114	    base0 = build_fold_addr_expr_loc (loc, base0);
9115	  if (indirect_base1)
9116	    base1 = build_fold_addr_expr_loc (loc, base1);
9117	  return fold_build2_loc (loc, code, type, base0, base1);
9118	}
9119    }
9120
9121  /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
9122     X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
9123     the resulting offset is smaller in absolute value than the
9124     original one and has the same sign.  */
9125  if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
9126      && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9127      && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9128      && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9129	  && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9130      && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
9131      && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9132	  && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
9133    {
9134      tree const1 = TREE_OPERAND (arg0, 1);
9135      tree const2 = TREE_OPERAND (arg1, 1);
9136      tree variable1 = TREE_OPERAND (arg0, 0);
9137      tree variable2 = TREE_OPERAND (arg1, 0);
9138      tree cst;
9139      const char * const warnmsg = G_("assuming signed overflow does not "
9140				      "occur when combining constants around "
9141				      "a comparison");
9142
9143      /* Put the constant on the side where it doesn't overflow and is
9144	 of lower absolute value and of same sign than before.  */
9145      cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9146			     ? MINUS_EXPR : PLUS_EXPR,
9147			     const2, const1);
9148      if (!TREE_OVERFLOW (cst)
9149	  && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)
9150	  && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2))
9151	{
9152	  fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9153	  return fold_build2_loc (loc, code, type,
9154				  variable1,
9155				  fold_build2_loc (loc, TREE_CODE (arg1),
9156						   TREE_TYPE (arg1),
9157						   variable2, cst));
9158	}
9159
9160      cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9161			     ? MINUS_EXPR : PLUS_EXPR,
9162			     const1, const2);
9163      if (!TREE_OVERFLOW (cst)
9164	  && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)
9165	  && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1))
9166	{
9167	  fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9168	  return fold_build2_loc (loc, code, type,
9169				  fold_build2_loc (loc, TREE_CODE (arg0),
9170						   TREE_TYPE (arg0),
9171						   variable1, cst),
9172				  variable2);
9173	}
9174    }
9175
9176  /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
9177     signed arithmetic case.  That form is created by the compiler
9178     often enough for folding it to be of value.  One example is in
9179     computing loop trip counts after Operator Strength Reduction.  */
9180  if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
9181      && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9182      && TREE_CODE (arg0) == MULT_EXPR
9183      && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9184          && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9185      && integer_zerop (arg1))
9186    {
9187      tree const1 = TREE_OPERAND (arg0, 1);
9188      tree const2 = arg1;                       /* zero */
9189      tree variable1 = TREE_OPERAND (arg0, 0);
9190      enum tree_code cmp_code = code;
9191
9192      /* Handle unfolded multiplication by zero.  */
9193      if (integer_zerop (const1))
9194	return fold_build2_loc (loc, cmp_code, type, const1, const2);
9195
9196      fold_overflow_warning (("assuming signed overflow does not occur when "
9197			      "eliminating multiplication in comparison "
9198			      "with zero"),
9199			     WARN_STRICT_OVERFLOW_COMPARISON);
9200
9201      /* If const1 is negative we swap the sense of the comparison.  */
9202      if (tree_int_cst_sgn (const1) < 0)
9203        cmp_code = swap_tree_comparison (cmp_code);
9204
9205      return fold_build2_loc (loc, cmp_code, type, variable1, const2);
9206    }
9207
9208  tem = maybe_canonicalize_comparison (loc, code, type, arg0, arg1);
9209  if (tem)
9210    return tem;
9211
9212  if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9213    {
9214      tree targ0 = strip_float_extensions (arg0);
9215      tree targ1 = strip_float_extensions (arg1);
9216      tree newtype = TREE_TYPE (targ0);
9217
9218      if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9219	newtype = TREE_TYPE (targ1);
9220
9221      /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9222      if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9223	return fold_build2_loc (loc, code, type,
9224			    fold_convert_loc (loc, newtype, targ0),
9225			    fold_convert_loc (loc, newtype, targ1));
9226
9227      /* (-a) CMP (-b) -> b CMP a  */
9228      if (TREE_CODE (arg0) == NEGATE_EXPR
9229	  && TREE_CODE (arg1) == NEGATE_EXPR)
9230	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg1, 0),
9231			    TREE_OPERAND (arg0, 0));
9232
9233      if (TREE_CODE (arg1) == REAL_CST)
9234	{
9235	  REAL_VALUE_TYPE cst;
9236	  cst = TREE_REAL_CST (arg1);
9237
9238	  /* (-a) CMP CST -> a swap(CMP) (-CST)  */
9239	  if (TREE_CODE (arg0) == NEGATE_EXPR)
9240	    return fold_build2_loc (loc, swap_tree_comparison (code), type,
9241				TREE_OPERAND (arg0, 0),
9242				build_real (TREE_TYPE (arg1),
9243					    real_value_negate (&cst)));
9244
9245	  /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
9246	  /* a CMP (-0) -> a CMP 0  */
9247	  if (REAL_VALUE_MINUS_ZERO (cst))
9248	    return fold_build2_loc (loc, code, type, arg0,
9249				build_real (TREE_TYPE (arg1), dconst0));
9250
9251	  /* x != NaN is always true, other ops are always false.  */
9252	  if (REAL_VALUE_ISNAN (cst)
9253	      && ! HONOR_SNANS (arg1))
9254	    {
9255	      tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9256	      return omit_one_operand_loc (loc, type, tem, arg0);
9257	    }
9258
9259	  /* Fold comparisons against infinity.  */
9260	  if (REAL_VALUE_ISINF (cst)
9261	      && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
9262	    {
9263	      tem = fold_inf_compare (loc, code, type, arg0, arg1);
9264	      if (tem != NULL_TREE)
9265		return tem;
9266	    }
9267	}
9268
9269      /* If this is a comparison of a real constant with a PLUS_EXPR
9270	 or a MINUS_EXPR of a real constant, we can convert it into a
9271	 comparison with a revised real constant as long as no overflow
9272	 occurs when unsafe_math_optimizations are enabled.  */
9273      if (flag_unsafe_math_optimizations
9274	  && TREE_CODE (arg1) == REAL_CST
9275	  && (TREE_CODE (arg0) == PLUS_EXPR
9276	      || TREE_CODE (arg0) == MINUS_EXPR)
9277	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9278	  && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9279				      ? MINUS_EXPR : PLUS_EXPR,
9280				      arg1, TREE_OPERAND (arg0, 1)))
9281	  && !TREE_OVERFLOW (tem))
9282	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
9283
9284      /* Likewise, we can simplify a comparison of a real constant with
9285         a MINUS_EXPR whose first operand is also a real constant, i.e.
9286         (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on
9287         floating-point types only if -fassociative-math is set.  */
9288      if (flag_associative_math
9289	  && TREE_CODE (arg1) == REAL_CST
9290	  && TREE_CODE (arg0) == MINUS_EXPR
9291	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9292	  && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9293				      arg1))
9294	  && !TREE_OVERFLOW (tem))
9295	return fold_build2_loc (loc, swap_tree_comparison (code), type,
9296			    TREE_OPERAND (arg0, 1), tem);
9297
9298      /* Fold comparisons against built-in math functions.  */
9299      if (TREE_CODE (arg1) == REAL_CST
9300	  && flag_unsafe_math_optimizations
9301	  && ! flag_errno_math)
9302	{
9303	  enum built_in_function fcode = builtin_mathfn_code (arg0);
9304
9305	  if (fcode != END_BUILTINS)
9306	    {
9307	      tem = fold_mathfn_compare (loc, fcode, code, type, arg0, arg1);
9308	      if (tem != NULL_TREE)
9309		return tem;
9310	    }
9311	}
9312    }
9313
9314  if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9315      && CONVERT_EXPR_P (arg0))
9316    {
9317      /* If we are widening one operand of an integer comparison,
9318	 see if the other operand is similarly being widened.  Perhaps we
9319	 can do the comparison in the narrower type.  */
9320      tem = fold_widened_comparison (loc, code, type, arg0, arg1);
9321      if (tem)
9322	return tem;
9323
9324      /* Or if we are changing signedness.  */
9325      tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1);
9326      if (tem)
9327	return tem;
9328    }
9329
9330  /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9331     constant, we can simplify it.  */
9332  if (TREE_CODE (arg1) == INTEGER_CST
9333      && (TREE_CODE (arg0) == MIN_EXPR
9334	  || TREE_CODE (arg0) == MAX_EXPR)
9335      && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9336    {
9337      tem = optimize_minmax_comparison (loc, code, type, op0, op1);
9338      if (tem)
9339	return tem;
9340    }
9341
9342  /* Simplify comparison of something with itself.  (For IEEE
9343     floating-point, we can only do some of these simplifications.)  */
9344  if (operand_equal_p (arg0, arg1, 0))
9345    {
9346      switch (code)
9347	{
9348	case EQ_EXPR:
9349	  if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9350	      || ! HONOR_NANS (arg0))
9351	    return constant_boolean_node (1, type);
9352	  break;
9353
9354	case GE_EXPR:
9355	case LE_EXPR:
9356	  if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9357	      || ! HONOR_NANS (arg0))
9358	    return constant_boolean_node (1, type);
9359	  return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg1);
9360
9361	case NE_EXPR:
9362	  /* For NE, we can only do this simplification if integer
9363	     or we don't honor IEEE floating point NaNs.  */
9364	  if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9365	      && HONOR_NANS (arg0))
9366	    break;
9367	  /* ... fall through ...  */
9368	case GT_EXPR:
9369	case LT_EXPR:
9370	  return constant_boolean_node (0, type);
9371	default:
9372	  gcc_unreachable ();
9373	}
9374    }
9375
9376  /* If we are comparing an expression that just has comparisons
9377     of two integer values, arithmetic expressions of those comparisons,
9378     and constants, we can simplify it.  There are only three cases
9379     to check: the two values can either be equal, the first can be
9380     greater, or the second can be greater.  Fold the expression for
9381     those three values.  Since each value must be 0 or 1, we have
9382     eight possibilities, each of which corresponds to the constant 0
9383     or 1 or one of the six possible comparisons.
9384
9385     This handles common cases like (a > b) == 0 but also handles
9386     expressions like  ((x > y) - (y > x)) > 0, which supposedly
9387     occur in macroized code.  */
9388
9389  if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9390    {
9391      tree cval1 = 0, cval2 = 0;
9392      int save_p = 0;
9393
9394      if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9395	  /* Don't handle degenerate cases here; they should already
9396	     have been handled anyway.  */
9397	  && cval1 != 0 && cval2 != 0
9398	  && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9399	  && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9400	  && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9401	  && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9402	  && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9403	  && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9404				TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9405	{
9406	  tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9407	  tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9408
9409	  /* We can't just pass T to eval_subst in case cval1 or cval2
9410	     was the same as ARG1.  */
9411
9412	  tree high_result
9413		= fold_build2_loc (loc, code, type,
9414			       eval_subst (loc, arg0, cval1, maxval,
9415					   cval2, minval),
9416			       arg1);
9417	  tree equal_result
9418		= fold_build2_loc (loc, code, type,
9419			       eval_subst (loc, arg0, cval1, maxval,
9420					   cval2, maxval),
9421			       arg1);
9422	  tree low_result
9423		= fold_build2_loc (loc, code, type,
9424			       eval_subst (loc, arg0, cval1, minval,
9425					   cval2, maxval),
9426			       arg1);
9427
9428	  /* All three of these results should be 0 or 1.  Confirm they are.
9429	     Then use those values to select the proper code to use.  */
9430
9431	  if (TREE_CODE (high_result) == INTEGER_CST
9432	      && TREE_CODE (equal_result) == INTEGER_CST
9433	      && TREE_CODE (low_result) == INTEGER_CST)
9434	    {
9435	      /* Make a 3-bit mask with the high-order bit being the
9436		 value for `>', the next for '=', and the low for '<'.  */
9437	      switch ((integer_onep (high_result) * 4)
9438		      + (integer_onep (equal_result) * 2)
9439		      + integer_onep (low_result))
9440		{
9441		case 0:
9442		  /* Always false.  */
9443		  return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
9444		case 1:
9445		  code = LT_EXPR;
9446		  break;
9447		case 2:
9448		  code = EQ_EXPR;
9449		  break;
9450		case 3:
9451		  code = LE_EXPR;
9452		  break;
9453		case 4:
9454		  code = GT_EXPR;
9455		  break;
9456		case 5:
9457		  code = NE_EXPR;
9458		  break;
9459		case 6:
9460		  code = GE_EXPR;
9461		  break;
9462		case 7:
9463		  /* Always true.  */
9464		  return omit_one_operand_loc (loc, type, integer_one_node, arg0);
9465		}
9466
9467	      if (save_p)
9468		{
9469		  tem = save_expr (build2 (code, type, cval1, cval2));
9470		  SET_EXPR_LOCATION (tem, loc);
9471		  return tem;
9472		}
9473	      return fold_build2_loc (loc, code, type, cval1, cval2);
9474	    }
9475	}
9476    }
9477
9478  /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9479     into a single range test.  */
9480  if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9481       || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9482      && TREE_CODE (arg1) == INTEGER_CST
9483      && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9484      && !integer_zerop (TREE_OPERAND (arg0, 1))
9485      && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9486      && !TREE_OVERFLOW (arg1))
9487    {
9488      tem = fold_div_compare (loc, code, type, arg0, arg1);
9489      if (tem != NULL_TREE)
9490	return tem;
9491    }
9492
9493  /* Fold ~X op ~Y as Y op X.  */
9494  if (TREE_CODE (arg0) == BIT_NOT_EXPR
9495      && TREE_CODE (arg1) == BIT_NOT_EXPR)
9496    {
9497      tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9498      return fold_build2_loc (loc, code, type,
9499			  fold_convert_loc (loc, cmp_type,
9500					    TREE_OPERAND (arg1, 0)),
9501			  TREE_OPERAND (arg0, 0));
9502    }
9503
9504  /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9505  if (TREE_CODE (arg0) == BIT_NOT_EXPR
9506      && (TREE_CODE (arg1) == INTEGER_CST || TREE_CODE (arg1) == VECTOR_CST))
9507    {
9508      tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9509      return fold_build2_loc (loc, swap_tree_comparison (code), type,
9510			  TREE_OPERAND (arg0, 0),
9511			  fold_build1_loc (loc, BIT_NOT_EXPR, cmp_type,
9512				       fold_convert_loc (loc, cmp_type, arg1)));
9513    }
9514
9515  return NULL_TREE;
9516}
9517
9518
9519/* Subroutine of fold_binary.  Optimize complex multiplications of the
9520   form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9521   argument EXPR represents the expression "z" of type TYPE.  */
9522
9523static tree
9524fold_mult_zconjz (location_t loc, tree type, tree expr)
9525{
9526  tree itype = TREE_TYPE (type);
9527  tree rpart, ipart, tem;
9528
9529  if (TREE_CODE (expr) == COMPLEX_EXPR)
9530    {
9531      rpart = TREE_OPERAND (expr, 0);
9532      ipart = TREE_OPERAND (expr, 1);
9533    }
9534  else if (TREE_CODE (expr) == COMPLEX_CST)
9535    {
9536      rpart = TREE_REALPART (expr);
9537      ipart = TREE_IMAGPART (expr);
9538    }
9539  else
9540    {
9541      expr = save_expr (expr);
9542      rpart = fold_build1_loc (loc, REALPART_EXPR, itype, expr);
9543      ipart = fold_build1_loc (loc, IMAGPART_EXPR, itype, expr);
9544    }
9545
9546  rpart = save_expr (rpart);
9547  ipart = save_expr (ipart);
9548  tem = fold_build2_loc (loc, PLUS_EXPR, itype,
9549		     fold_build2_loc (loc, MULT_EXPR, itype, rpart, rpart),
9550		     fold_build2_loc (loc, MULT_EXPR, itype, ipart, ipart));
9551  return fold_build2_loc (loc, COMPLEX_EXPR, type, tem,
9552			  build_zero_cst (itype));
9553}
9554
9555
9556/* Subroutine of fold_binary.  If P is the value of EXPR, computes
9557   power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9558   guarantees that P and N have the same least significant log2(M) bits.
9559   N is not otherwise constrained.  In particular, N is not normalized to
9560   0 <= N < M as is common.  In general, the precise value of P is unknown.
9561   M is chosen as large as possible such that constant N can be determined.
9562
9563   Returns M and sets *RESIDUE to N.
9564
9565   If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into
9566   account.  This is not always possible due to PR 35705.
9567 */
9568
9569static unsigned HOST_WIDE_INT
9570get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
9571				 bool allow_func_align)
9572{
9573  enum tree_code code;
9574
9575  *residue = 0;
9576
9577  code = TREE_CODE (expr);
9578  if (code == ADDR_EXPR)
9579    {
9580      unsigned int bitalign;
9581      get_object_alignment_1 (TREE_OPERAND (expr, 0), &bitalign, residue);
9582      *residue /= BITS_PER_UNIT;
9583      return bitalign / BITS_PER_UNIT;
9584    }
9585  else if (code == POINTER_PLUS_EXPR)
9586    {
9587      tree op0, op1;
9588      unsigned HOST_WIDE_INT modulus;
9589      enum tree_code inner_code;
9590
9591      op0 = TREE_OPERAND (expr, 0);
9592      STRIP_NOPS (op0);
9593      modulus = get_pointer_modulus_and_residue (op0, residue,
9594						 allow_func_align);
9595
9596      op1 = TREE_OPERAND (expr, 1);
9597      STRIP_NOPS (op1);
9598      inner_code = TREE_CODE (op1);
9599      if (inner_code == INTEGER_CST)
9600	{
9601	  *residue += TREE_INT_CST_LOW (op1);
9602	  return modulus;
9603	}
9604      else if (inner_code == MULT_EXPR)
9605	{
9606	  op1 = TREE_OPERAND (op1, 1);
9607	  if (TREE_CODE (op1) == INTEGER_CST)
9608	    {
9609	      unsigned HOST_WIDE_INT align;
9610
9611	      /* Compute the greatest power-of-2 divisor of op1.  */
9612	      align = TREE_INT_CST_LOW (op1);
9613	      align &= -align;
9614
9615	      /* If align is non-zero and less than *modulus, replace
9616		 *modulus with align., If align is 0, then either op1 is 0
9617		 or the greatest power-of-2 divisor of op1 doesn't fit in an
9618		 unsigned HOST_WIDE_INT.  In either case, no additional
9619		 constraint is imposed.  */
9620	      if (align)
9621		modulus = MIN (modulus, align);
9622
9623	      return modulus;
9624	    }
9625	}
9626    }
9627
9628  /* If we get here, we were unable to determine anything useful about the
9629     expression.  */
9630  return 1;
9631}
9632
9633/* Helper function for fold_vec_perm.  Store elements of VECTOR_CST or
9634   CONSTRUCTOR ARG into array ELTS and return true if successful.  */
9635
9636static bool
9637vec_cst_ctor_to_array (tree arg, tree *elts)
9638{
9639  unsigned int nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)), i;
9640
9641  if (TREE_CODE (arg) == VECTOR_CST)
9642    {
9643      for (i = 0; i < VECTOR_CST_NELTS (arg); ++i)
9644	elts[i] = VECTOR_CST_ELT (arg, i);
9645    }
9646  else if (TREE_CODE (arg) == CONSTRUCTOR)
9647    {
9648      constructor_elt *elt;
9649
9650      FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (arg), i, elt)
9651	if (i >= nelts || TREE_CODE (TREE_TYPE (elt->value)) == VECTOR_TYPE)
9652	  return false;
9653	else
9654	  elts[i] = elt->value;
9655    }
9656  else
9657    return false;
9658  for (; i < nelts; i++)
9659    elts[i]
9660      = fold_convert (TREE_TYPE (TREE_TYPE (arg)), integer_zero_node);
9661  return true;
9662}
9663
9664/* Attempt to fold vector permutation of ARG0 and ARG1 vectors using SEL
9665   selector.  Return the folded VECTOR_CST or CONSTRUCTOR if successful,
9666   NULL_TREE otherwise.  */
9667
9668static tree
9669fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel)
9670{
9671  unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
9672  tree *elts;
9673  bool need_ctor = false;
9674
9675  gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts
9676	      && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts);
9677  if (TREE_TYPE (TREE_TYPE (arg0)) != TREE_TYPE (type)
9678      || TREE_TYPE (TREE_TYPE (arg1)) != TREE_TYPE (type))
9679    return NULL_TREE;
9680
9681  elts = XALLOCAVEC (tree, nelts * 3);
9682  if (!vec_cst_ctor_to_array (arg0, elts)
9683      || !vec_cst_ctor_to_array (arg1, elts + nelts))
9684    return NULL_TREE;
9685
9686  for (i = 0; i < nelts; i++)
9687    {
9688      if (!CONSTANT_CLASS_P (elts[sel[i]]))
9689	need_ctor = true;
9690      elts[i + 2 * nelts] = unshare_expr (elts[sel[i]]);
9691    }
9692
9693  if (need_ctor)
9694    {
9695      vec<constructor_elt, va_gc> *v;
9696      vec_alloc (v, nelts);
9697      for (i = 0; i < nelts; i++)
9698	CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, elts[2 * nelts + i]);
9699      return build_constructor (type, v);
9700    }
9701  else
9702    return build_vector (type, &elts[2 * nelts]);
9703}
9704
9705/* Try to fold a pointer difference of type TYPE two address expressions of
9706   array references AREF0 and AREF1 using location LOC.  Return a
9707   simplified expression for the difference or NULL_TREE.  */
9708
9709static tree
9710fold_addr_of_array_ref_difference (location_t loc, tree type,
9711				   tree aref0, tree aref1)
9712{
9713  tree base0 = TREE_OPERAND (aref0, 0);
9714  tree base1 = TREE_OPERAND (aref1, 0);
9715  tree base_offset = build_int_cst (type, 0);
9716
9717  /* If the bases are array references as well, recurse.  If the bases
9718     are pointer indirections compute the difference of the pointers.
9719     If the bases are equal, we are set.  */
9720  if ((TREE_CODE (base0) == ARRAY_REF
9721       && TREE_CODE (base1) == ARRAY_REF
9722       && (base_offset
9723	   = fold_addr_of_array_ref_difference (loc, type, base0, base1)))
9724      || (INDIRECT_REF_P (base0)
9725	  && INDIRECT_REF_P (base1)
9726	  && (base_offset = fold_binary_loc (loc, MINUS_EXPR, type,
9727					     TREE_OPERAND (base0, 0),
9728					     TREE_OPERAND (base1, 0))))
9729      || operand_equal_p (base0, base1, 0))
9730    {
9731      tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1));
9732      tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1));
9733      tree esz = fold_convert_loc (loc, type, array_ref_element_size (aref0));
9734      tree diff = build2 (MINUS_EXPR, type, op0, op1);
9735      return fold_build2_loc (loc, PLUS_EXPR, type,
9736			      base_offset,
9737			      fold_build2_loc (loc, MULT_EXPR, type,
9738					       diff, esz));
9739    }
9740  return NULL_TREE;
9741}
9742
9743/* If the real or vector real constant CST of type TYPE has an exact
9744   inverse, return it, else return NULL.  */
9745
9746tree
9747exact_inverse (tree type, tree cst)
9748{
9749  REAL_VALUE_TYPE r;
9750  tree unit_type, *elts;
9751  machine_mode mode;
9752  unsigned vec_nelts, i;
9753
9754  switch (TREE_CODE (cst))
9755    {
9756    case REAL_CST:
9757      r = TREE_REAL_CST (cst);
9758
9759      if (exact_real_inverse (TYPE_MODE (type), &r))
9760	return build_real (type, r);
9761
9762      return NULL_TREE;
9763
9764    case VECTOR_CST:
9765      vec_nelts = VECTOR_CST_NELTS (cst);
9766      elts = XALLOCAVEC (tree, vec_nelts);
9767      unit_type = TREE_TYPE (type);
9768      mode = TYPE_MODE (unit_type);
9769
9770      for (i = 0; i < vec_nelts; i++)
9771	{
9772	  r = TREE_REAL_CST (VECTOR_CST_ELT (cst, i));
9773	  if (!exact_real_inverse (mode, &r))
9774	    return NULL_TREE;
9775	  elts[i] = build_real (unit_type, r);
9776	}
9777
9778      return build_vector (type, elts);
9779
9780    default:
9781      return NULL_TREE;
9782    }
9783}
9784
9785/*  Mask out the tz least significant bits of X of type TYPE where
9786    tz is the number of trailing zeroes in Y.  */
9787static wide_int
9788mask_with_tz (tree type, const wide_int &x, const wide_int &y)
9789{
9790  int tz = wi::ctz (y);
9791  if (tz > 0)
9792    return wi::mask (tz, true, TYPE_PRECISION (type)) & x;
9793  return x;
9794}
9795
9796/* Return true when T is an address and is known to be nonzero.
9797   For floating point we further ensure that T is not denormal.
9798   Similar logic is present in nonzero_address in rtlanal.h.
9799
9800   If the return value is based on the assumption that signed overflow
9801   is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
9802   change *STRICT_OVERFLOW_P.  */
9803
9804static bool
9805tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
9806{
9807  tree type = TREE_TYPE (t);
9808  enum tree_code code;
9809
9810  /* Doing something useful for floating point would need more work.  */
9811  if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
9812    return false;
9813
9814  code = TREE_CODE (t);
9815  switch (TREE_CODE_CLASS (code))
9816    {
9817    case tcc_unary:
9818      return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
9819					      strict_overflow_p);
9820    case tcc_binary:
9821    case tcc_comparison:
9822      return tree_binary_nonzero_warnv_p (code, type,
9823					       TREE_OPERAND (t, 0),
9824					       TREE_OPERAND (t, 1),
9825					       strict_overflow_p);
9826    case tcc_constant:
9827    case tcc_declaration:
9828    case tcc_reference:
9829      return tree_single_nonzero_warnv_p (t, strict_overflow_p);
9830
9831    default:
9832      break;
9833    }
9834
9835  switch (code)
9836    {
9837    case TRUTH_NOT_EXPR:
9838      return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
9839					      strict_overflow_p);
9840
9841    case TRUTH_AND_EXPR:
9842    case TRUTH_OR_EXPR:
9843    case TRUTH_XOR_EXPR:
9844      return tree_binary_nonzero_warnv_p (code, type,
9845					       TREE_OPERAND (t, 0),
9846					       TREE_OPERAND (t, 1),
9847					       strict_overflow_p);
9848
9849    case COND_EXPR:
9850    case CONSTRUCTOR:
9851    case OBJ_TYPE_REF:
9852    case ASSERT_EXPR:
9853    case ADDR_EXPR:
9854    case WITH_SIZE_EXPR:
9855    case SSA_NAME:
9856      return tree_single_nonzero_warnv_p (t, strict_overflow_p);
9857
9858    case COMPOUND_EXPR:
9859    case MODIFY_EXPR:
9860    case BIND_EXPR:
9861      return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
9862					strict_overflow_p);
9863
9864    case SAVE_EXPR:
9865      return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
9866					strict_overflow_p);
9867
9868    case CALL_EXPR:
9869      {
9870	tree fndecl = get_callee_fndecl (t);
9871	if (!fndecl) return false;
9872	if (flag_delete_null_pointer_checks && !flag_check_new
9873	    && DECL_IS_OPERATOR_NEW (fndecl)
9874	    && !TREE_NOTHROW (fndecl))
9875	  return true;
9876	if (flag_delete_null_pointer_checks
9877	    && lookup_attribute ("returns_nonnull",
9878		 TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
9879	  return true;
9880	return alloca_call_p (t);
9881      }
9882
9883    default:
9884      break;
9885    }
9886  return false;
9887}
9888
9889/* Return true when T is an address and is known to be nonzero.
9890   Handle warnings about undefined signed overflow.  */
9891
9892static bool
9893tree_expr_nonzero_p (tree t)
9894{
9895  bool ret, strict_overflow_p;
9896
9897  strict_overflow_p = false;
9898  ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
9899  if (strict_overflow_p)
9900    fold_overflow_warning (("assuming signed overflow does not occur when "
9901			    "determining that expression is always "
9902			    "non-zero"),
9903			   WARN_STRICT_OVERFLOW_MISC);
9904  return ret;
9905}
9906
9907/* Fold a binary expression of code CODE and type TYPE with operands
9908   OP0 and OP1.  LOC is the location of the resulting expression.
9909   Return the folded expression if folding is successful.  Otherwise,
9910   return NULL_TREE.  */
9911
9912tree
9913fold_binary_loc (location_t loc,
9914	     enum tree_code code, tree type, tree op0, tree op1)
9915{
9916  enum tree_code_class kind = TREE_CODE_CLASS (code);
9917  tree arg0, arg1, tem;
9918  tree t1 = NULL_TREE;
9919  bool strict_overflow_p;
9920  unsigned int prec;
9921
9922  gcc_assert (IS_EXPR_CODE_CLASS (kind)
9923	      && TREE_CODE_LENGTH (code) == 2
9924	      && op0 != NULL_TREE
9925	      && op1 != NULL_TREE);
9926
9927  arg0 = op0;
9928  arg1 = op1;
9929
9930  /* Strip any conversions that don't change the mode.  This is
9931     safe for every expression, except for a comparison expression
9932     because its signedness is derived from its operands.  So, in
9933     the latter case, only strip conversions that don't change the
9934     signedness.  MIN_EXPR/MAX_EXPR also need signedness of arguments
9935     preserved.
9936
9937     Note that this is done as an internal manipulation within the
9938     constant folder, in order to find the simplest representation
9939     of the arguments so that their form can be studied.  In any
9940     cases, the appropriate type conversions should be put back in
9941     the tree that will get out of the constant folder.  */
9942
9943  if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
9944    {
9945      STRIP_SIGN_NOPS (arg0);
9946      STRIP_SIGN_NOPS (arg1);
9947    }
9948  else
9949    {
9950      STRIP_NOPS (arg0);
9951      STRIP_NOPS (arg1);
9952    }
9953
9954  /* Note that TREE_CONSTANT isn't enough: static var addresses are
9955     constant but we can't do arithmetic on them.  */
9956  if (CONSTANT_CLASS_P (arg0) && CONSTANT_CLASS_P (arg1))
9957    {
9958      tem = const_binop (code, type, arg0, arg1);
9959      if (tem != NULL_TREE)
9960	{
9961	  if (TREE_TYPE (tem) != type)
9962	    tem = fold_convert_loc (loc, type, tem);
9963	  return tem;
9964	}
9965    }
9966
9967  /* If this is a commutative operation, and ARG0 is a constant, move it
9968     to ARG1 to reduce the number of tests below.  */
9969  if (commutative_tree_code (code)
9970      && tree_swap_operands_p (arg0, arg1, true))
9971    return fold_build2_loc (loc, code, type, op1, op0);
9972
9973  /* Likewise if this is a comparison, and ARG0 is a constant, move it
9974     to ARG1 to reduce the number of tests below.  */
9975  if (kind == tcc_comparison
9976      && tree_swap_operands_p (arg0, arg1, true))
9977    return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
9978
9979  tem = generic_simplify (loc, code, type, op0, op1);
9980  if (tem)
9981    return tem;
9982
9983  /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9984
9985     First check for cases where an arithmetic operation is applied to a
9986     compound, conditional, or comparison operation.  Push the arithmetic
9987     operation inside the compound or conditional to see if any folding
9988     can then be done.  Convert comparison to conditional for this purpose.
9989     The also optimizes non-constant cases that used to be done in
9990     expand_expr.
9991
9992     Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9993     one of the operands is a comparison and the other is a comparison, a
9994     BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9995     code below would make the expression more complex.  Change it to a
9996     TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9997     TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9998
9999  if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
10000       || code == EQ_EXPR || code == NE_EXPR)
10001      && TREE_CODE (type) != VECTOR_TYPE
10002      && ((truth_value_p (TREE_CODE (arg0))
10003	   && (truth_value_p (TREE_CODE (arg1))
10004	       || (TREE_CODE (arg1) == BIT_AND_EXPR
10005		   && integer_onep (TREE_OPERAND (arg1, 1)))))
10006	  || (truth_value_p (TREE_CODE (arg1))
10007	      && (truth_value_p (TREE_CODE (arg0))
10008		  || (TREE_CODE (arg0) == BIT_AND_EXPR
10009		      && integer_onep (TREE_OPERAND (arg0, 1)))))))
10010    {
10011      tem = fold_build2_loc (loc, code == BIT_AND_EXPR ? TRUTH_AND_EXPR
10012			 : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
10013			 : TRUTH_XOR_EXPR,
10014			 boolean_type_node,
10015			 fold_convert_loc (loc, boolean_type_node, arg0),
10016			 fold_convert_loc (loc, boolean_type_node, arg1));
10017
10018      if (code == EQ_EXPR)
10019	tem = invert_truthvalue_loc (loc, tem);
10020
10021      return fold_convert_loc (loc, type, tem);
10022    }
10023
10024  if (TREE_CODE_CLASS (code) == tcc_binary
10025      || TREE_CODE_CLASS (code) == tcc_comparison)
10026    {
10027      if (TREE_CODE (arg0) == COMPOUND_EXPR)
10028	{
10029	  tem = fold_build2_loc (loc, code, type,
10030			     fold_convert_loc (loc, TREE_TYPE (op0),
10031					       TREE_OPERAND (arg0, 1)), op1);
10032	  return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
10033			     tem);
10034	}
10035      if (TREE_CODE (arg1) == COMPOUND_EXPR
10036	  && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
10037	{
10038	  tem = fold_build2_loc (loc, code, type, op0,
10039			     fold_convert_loc (loc, TREE_TYPE (op1),
10040					       TREE_OPERAND (arg1, 1)));
10041	  return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
10042			     tem);
10043	}
10044
10045      if (TREE_CODE (arg0) == COND_EXPR
10046	  || TREE_CODE (arg0) == VEC_COND_EXPR
10047	  || COMPARISON_CLASS_P (arg0))
10048	{
10049	  tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10050						     arg0, arg1,
10051						     /*cond_first_p=*/1);
10052	  if (tem != NULL_TREE)
10053	    return tem;
10054	}
10055
10056      if (TREE_CODE (arg1) == COND_EXPR
10057	  || TREE_CODE (arg1) == VEC_COND_EXPR
10058	  || COMPARISON_CLASS_P (arg1))
10059	{
10060	  tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10061						     arg1, arg0,
10062					             /*cond_first_p=*/0);
10063	  if (tem != NULL_TREE)
10064	    return tem;
10065	}
10066    }
10067
10068  switch (code)
10069    {
10070    case MEM_REF:
10071      /* MEM[&MEM[p, CST1], CST2] -> MEM[p, CST1 + CST2].  */
10072      if (TREE_CODE (arg0) == ADDR_EXPR
10073	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == MEM_REF)
10074	{
10075	  tree iref = TREE_OPERAND (arg0, 0);
10076	  return fold_build2 (MEM_REF, type,
10077			      TREE_OPERAND (iref, 0),
10078			      int_const_binop (PLUS_EXPR, arg1,
10079					       TREE_OPERAND (iref, 1)));
10080	}
10081
10082      /* MEM[&a.b, CST2] -> MEM[&a, offsetof (a, b) + CST2].  */
10083      if (TREE_CODE (arg0) == ADDR_EXPR
10084	  && handled_component_p (TREE_OPERAND (arg0, 0)))
10085	{
10086	  tree base;
10087	  HOST_WIDE_INT coffset;
10088	  base = get_addr_base_and_unit_offset (TREE_OPERAND (arg0, 0),
10089						&coffset);
10090	  if (!base)
10091	    return NULL_TREE;
10092	  return fold_build2 (MEM_REF, type,
10093			      build_fold_addr_expr (base),
10094			      int_const_binop (PLUS_EXPR, arg1,
10095					       size_int (coffset)));
10096	}
10097
10098      return NULL_TREE;
10099
10100    case POINTER_PLUS_EXPR:
10101      /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
10102      if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
10103	   && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
10104        return fold_convert_loc (loc, type,
10105				 fold_build2_loc (loc, PLUS_EXPR, sizetype,
10106					      fold_convert_loc (loc, sizetype,
10107								arg1),
10108					      fold_convert_loc (loc, sizetype,
10109								arg0)));
10110
10111      return NULL_TREE;
10112
10113    case PLUS_EXPR:
10114      if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
10115	{
10116	  /* X + (X / CST) * -CST is X % CST.  */
10117	  if (TREE_CODE (arg1) == MULT_EXPR
10118	      && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10119	      && operand_equal_p (arg0,
10120				  TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
10121	    {
10122	      tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
10123	      tree cst1 = TREE_OPERAND (arg1, 1);
10124	      tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (cst1),
10125				      cst1, cst0);
10126	      if (sum && integer_zerop (sum))
10127		return fold_convert_loc (loc, type,
10128					 fold_build2_loc (loc, TRUNC_MOD_EXPR,
10129						      TREE_TYPE (arg0), arg0,
10130						      cst0));
10131	    }
10132	}
10133
10134      /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or
10135	 one.  Make sure the type is not saturating and has the signedness of
10136	 the stripped operands, as fold_plusminus_mult_expr will re-associate.
10137	 ??? The latter condition should use TYPE_OVERFLOW_* flags instead.  */
10138      if ((TREE_CODE (arg0) == MULT_EXPR
10139	   || TREE_CODE (arg1) == MULT_EXPR)
10140	  && !TYPE_SATURATING (type)
10141	  && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
10142	  && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
10143	  && (!FLOAT_TYPE_P (type) || flag_associative_math))
10144        {
10145	  tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10146	  if (tem)
10147	    return tem;
10148	}
10149
10150      if (! FLOAT_TYPE_P (type))
10151	{
10152	  /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
10153	     with a constant, and the two constants have no bits in common,
10154	     we should treat this as a BIT_IOR_EXPR since this may produce more
10155	     simplifications.  */
10156	  if (TREE_CODE (arg0) == BIT_AND_EXPR
10157	      && TREE_CODE (arg1) == BIT_AND_EXPR
10158	      && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10159	      && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10160	      && wi::bit_and (TREE_OPERAND (arg0, 1),
10161			      TREE_OPERAND (arg1, 1)) == 0)
10162	    {
10163	      code = BIT_IOR_EXPR;
10164	      goto bit_ior;
10165	    }
10166
10167	  /* Reassociate (plus (plus (mult) (foo)) (mult)) as
10168	     (plus (plus (mult) (mult)) (foo)) so that we can
10169	     take advantage of the factoring cases below.  */
10170	  if (ANY_INTEGRAL_TYPE_P (type)
10171	      && TYPE_OVERFLOW_WRAPS (type)
10172	      && (((TREE_CODE (arg0) == PLUS_EXPR
10173		    || TREE_CODE (arg0) == MINUS_EXPR)
10174		   && TREE_CODE (arg1) == MULT_EXPR)
10175		  || ((TREE_CODE (arg1) == PLUS_EXPR
10176		       || TREE_CODE (arg1) == MINUS_EXPR)
10177		      && TREE_CODE (arg0) == MULT_EXPR)))
10178	    {
10179	      tree parg0, parg1, parg, marg;
10180	      enum tree_code pcode;
10181
10182	      if (TREE_CODE (arg1) == MULT_EXPR)
10183		parg = arg0, marg = arg1;
10184	      else
10185		parg = arg1, marg = arg0;
10186	      pcode = TREE_CODE (parg);
10187	      parg0 = TREE_OPERAND (parg, 0);
10188	      parg1 = TREE_OPERAND (parg, 1);
10189	      STRIP_NOPS (parg0);
10190	      STRIP_NOPS (parg1);
10191
10192	      if (TREE_CODE (parg0) == MULT_EXPR
10193		  && TREE_CODE (parg1) != MULT_EXPR)
10194		return fold_build2_loc (loc, pcode, type,
10195				    fold_build2_loc (loc, PLUS_EXPR, type,
10196						 fold_convert_loc (loc, type,
10197								   parg0),
10198						 fold_convert_loc (loc, type,
10199								   marg)),
10200				    fold_convert_loc (loc, type, parg1));
10201	      if (TREE_CODE (parg0) != MULT_EXPR
10202		  && TREE_CODE (parg1) == MULT_EXPR)
10203		return
10204		  fold_build2_loc (loc, PLUS_EXPR, type,
10205			       fold_convert_loc (loc, type, parg0),
10206			       fold_build2_loc (loc, pcode, type,
10207					    fold_convert_loc (loc, type, marg),
10208					    fold_convert_loc (loc, type,
10209							      parg1)));
10210	    }
10211	}
10212      else
10213	{
10214	  /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
10215	     to __complex__ ( x, y ).  This is not the same for SNaNs or
10216	     if signed zeros are involved.  */
10217	  if (!HONOR_SNANS (element_mode (arg0))
10218              && !HONOR_SIGNED_ZEROS (element_mode (arg0))
10219	      && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10220	    {
10221	      tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10222	      tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10223	      tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10224	      bool arg0rz = false, arg0iz = false;
10225	      if ((arg0r && (arg0rz = real_zerop (arg0r)))
10226		  || (arg0i && (arg0iz = real_zerop (arg0i))))
10227		{
10228		  tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10229		  tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10230		  if (arg0rz && arg1i && real_zerop (arg1i))
10231		    {
10232		      tree rp = arg1r ? arg1r
10233				  : build1 (REALPART_EXPR, rtype, arg1);
10234		      tree ip = arg0i ? arg0i
10235				  : build1 (IMAGPART_EXPR, rtype, arg0);
10236		      return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10237		    }
10238		  else if (arg0iz && arg1r && real_zerop (arg1r))
10239		    {
10240		      tree rp = arg0r ? arg0r
10241				  : build1 (REALPART_EXPR, rtype, arg0);
10242		      tree ip = arg1i ? arg1i
10243				  : build1 (IMAGPART_EXPR, rtype, arg1);
10244		      return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10245		    }
10246		}
10247	    }
10248
10249	  if (flag_unsafe_math_optimizations
10250	      && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10251	      && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10252	      && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10253	    return tem;
10254
10255          /* Convert a + (b*c + d*e) into (a + b*c) + d*e.
10256             We associate floats only if the user has specified
10257             -fassociative-math.  */
10258          if (flag_associative_math
10259              && TREE_CODE (arg1) == PLUS_EXPR
10260              && TREE_CODE (arg0) != MULT_EXPR)
10261            {
10262              tree tree10 = TREE_OPERAND (arg1, 0);
10263              tree tree11 = TREE_OPERAND (arg1, 1);
10264              if (TREE_CODE (tree11) == MULT_EXPR
10265		  && TREE_CODE (tree10) == MULT_EXPR)
10266                {
10267                  tree tree0;
10268                  tree0 = fold_build2_loc (loc, PLUS_EXPR, type, arg0, tree10);
10269                  return fold_build2_loc (loc, PLUS_EXPR, type, tree0, tree11);
10270                }
10271            }
10272          /* Convert (b*c + d*e) + a into b*c + (d*e +a).
10273             We associate floats only if the user has specified
10274             -fassociative-math.  */
10275          if (flag_associative_math
10276              && TREE_CODE (arg0) == PLUS_EXPR
10277              && TREE_CODE (arg1) != MULT_EXPR)
10278            {
10279              tree tree00 = TREE_OPERAND (arg0, 0);
10280              tree tree01 = TREE_OPERAND (arg0, 1);
10281              if (TREE_CODE (tree01) == MULT_EXPR
10282		  && TREE_CODE (tree00) == MULT_EXPR)
10283                {
10284                  tree tree0;
10285                  tree0 = fold_build2_loc (loc, PLUS_EXPR, type, tree01, arg1);
10286                  return fold_build2_loc (loc, PLUS_EXPR, type, tree00, tree0);
10287                }
10288            }
10289	}
10290
10291     bit_rotate:
10292      /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
10293	 is a rotate of A by C1 bits.  */
10294      /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
10295	 is a rotate of A by B bits.  */
10296      {
10297	enum tree_code code0, code1;
10298	tree rtype;
10299	code0 = TREE_CODE (arg0);
10300	code1 = TREE_CODE (arg1);
10301	if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
10302	     || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
10303	    && operand_equal_p (TREE_OPERAND (arg0, 0),
10304			        TREE_OPERAND (arg1, 0), 0)
10305	    && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
10306	        TYPE_UNSIGNED (rtype))
10307	    /* Only create rotates in complete modes.  Other cases are not
10308	       expanded properly.  */
10309	    && (element_precision (rtype)
10310		== element_precision (TYPE_MODE (rtype))))
10311	  {
10312	    tree tree01, tree11;
10313	    enum tree_code code01, code11;
10314
10315	    tree01 = TREE_OPERAND (arg0, 1);
10316	    tree11 = TREE_OPERAND (arg1, 1);
10317	    STRIP_NOPS (tree01);
10318	    STRIP_NOPS (tree11);
10319	    code01 = TREE_CODE (tree01);
10320	    code11 = TREE_CODE (tree11);
10321	    if (code01 == INTEGER_CST
10322		&& code11 == INTEGER_CST
10323		&& (wi::to_widest (tree01) + wi::to_widest (tree11)
10324		    == element_precision (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
10325	      {
10326		tem = build2_loc (loc, LROTATE_EXPR,
10327				  TREE_TYPE (TREE_OPERAND (arg0, 0)),
10328				  TREE_OPERAND (arg0, 0),
10329				  code0 == LSHIFT_EXPR
10330				  ? TREE_OPERAND (arg0, 1)
10331				  : TREE_OPERAND (arg1, 1));
10332		return fold_convert_loc (loc, type, tem);
10333	      }
10334	    else if (code11 == MINUS_EXPR)
10335	      {
10336		tree tree110, tree111;
10337		tree110 = TREE_OPERAND (tree11, 0);
10338		tree111 = TREE_OPERAND (tree11, 1);
10339		STRIP_NOPS (tree110);
10340		STRIP_NOPS (tree111);
10341		if (TREE_CODE (tree110) == INTEGER_CST
10342		    && 0 == compare_tree_int (tree110,
10343					      element_precision
10344					      (TREE_TYPE (TREE_OPERAND
10345							  (arg0, 0))))
10346		    && operand_equal_p (tree01, tree111, 0))
10347		  return
10348		    fold_convert_loc (loc, type,
10349				      build2 ((code0 == LSHIFT_EXPR
10350					       ? LROTATE_EXPR
10351					       : RROTATE_EXPR),
10352					      TREE_TYPE (TREE_OPERAND (arg0, 0)),
10353					      TREE_OPERAND (arg0, 0),
10354					      TREE_OPERAND (arg0, 1)));
10355	      }
10356	    else if (code01 == MINUS_EXPR)
10357	      {
10358		tree tree010, tree011;
10359		tree010 = TREE_OPERAND (tree01, 0);
10360		tree011 = TREE_OPERAND (tree01, 1);
10361		STRIP_NOPS (tree010);
10362		STRIP_NOPS (tree011);
10363		if (TREE_CODE (tree010) == INTEGER_CST
10364		    && 0 == compare_tree_int (tree010,
10365					      element_precision
10366					      (TREE_TYPE (TREE_OPERAND
10367							  (arg0, 0))))
10368		    && operand_equal_p (tree11, tree011, 0))
10369		    return fold_convert_loc
10370		      (loc, type,
10371		       build2 ((code0 != LSHIFT_EXPR
10372				? LROTATE_EXPR
10373				: RROTATE_EXPR),
10374			       TREE_TYPE (TREE_OPERAND (arg0, 0)),
10375			       TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1)));
10376	      }
10377	  }
10378      }
10379
10380    associate:
10381      /* In most languages, can't associate operations on floats through
10382	 parentheses.  Rather than remember where the parentheses were, we
10383	 don't associate floats at all, unless the user has specified
10384	 -fassociative-math.
10385	 And, we need to make sure type is not saturating.  */
10386
10387      if ((! FLOAT_TYPE_P (type) || flag_associative_math)
10388	  && !TYPE_SATURATING (type))
10389	{
10390	  tree var0, con0, lit0, minus_lit0;
10391	  tree var1, con1, lit1, minus_lit1;
10392	  tree atype = type;
10393	  bool ok = true;
10394
10395	  /* Split both trees into variables, constants, and literals.  Then
10396	     associate each group together, the constants with literals,
10397	     then the result with variables.  This increases the chances of
10398	     literals being recombined later and of generating relocatable
10399	     expressions for the sum of a constant and literal.  */
10400	  var0 = split_tree (loc, arg0, type, code,
10401			     &con0, &lit0, &minus_lit0, 0);
10402	  var1 = split_tree (loc, arg1, type, code,
10403			     &con1, &lit1, &minus_lit1, code == MINUS_EXPR);
10404
10405	  /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
10406	  if (code == MINUS_EXPR)
10407	    code = PLUS_EXPR;
10408
10409	  /* With undefined overflow prefer doing association in a type
10410	     which wraps on overflow, if that is one of the operand types.  */
10411	  if ((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10412	      || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
10413	    {
10414	      if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
10415		  && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
10416		atype = TREE_TYPE (arg0);
10417	      else if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
10418		       && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))
10419		atype = TREE_TYPE (arg1);
10420	      gcc_assert (TYPE_PRECISION (atype) == TYPE_PRECISION (type));
10421	    }
10422
10423	  /* With undefined overflow we can only associate constants with one
10424	     variable, and constants whose association doesn't overflow.  */
10425	  if ((POINTER_TYPE_P (atype) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10426	      || (INTEGRAL_TYPE_P (atype) && !TYPE_OVERFLOW_WRAPS (atype)))
10427	    {
10428	      if (var0 && var1)
10429		{
10430		  tree tmp0 = var0;
10431		  tree tmp1 = var1;
10432		  bool one_neg = false;
10433
10434		  if (TREE_CODE (tmp0) == NEGATE_EXPR)
10435		    {
10436		      tmp0 = TREE_OPERAND (tmp0, 0);
10437		      one_neg = !one_neg;
10438		    }
10439		  if (CONVERT_EXPR_P (tmp0)
10440		      && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (tmp0, 0)))
10441		      && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (tmp0, 0)))
10442			  <= TYPE_PRECISION (atype)))
10443		    tmp0 = TREE_OPERAND (tmp0, 0);
10444		  if (TREE_CODE (tmp1) == NEGATE_EXPR)
10445		    {
10446		      tmp1 = TREE_OPERAND (tmp1, 0);
10447		      one_neg = !one_neg;
10448		    }
10449		  if (CONVERT_EXPR_P (tmp1)
10450		      && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (tmp1, 0)))
10451		      && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (tmp1, 0)))
10452			  <= TYPE_PRECISION (atype)))
10453		    tmp1 = TREE_OPERAND (tmp1, 0);
10454		  /* The only case we can still associate with two variables
10455		     is if they cancel out.  */
10456		  if (!one_neg
10457		      || !operand_equal_p (tmp0, tmp1, 0))
10458		    ok = false;
10459		}
10460	    }
10461
10462	  /* Only do something if we found more than two objects.  Otherwise,
10463	     nothing has changed and we risk infinite recursion.  */
10464	  if (ok
10465	      && (2 < ((var0 != 0) + (var1 != 0)
10466		       + (con0 != 0) + (con1 != 0)
10467		       + (lit0 != 0) + (lit1 != 0)
10468		       + (minus_lit0 != 0) + (minus_lit1 != 0))))
10469	    {
10470	      bool any_overflows = false;
10471	      if (lit0) any_overflows |= TREE_OVERFLOW (lit0);
10472	      if (lit1) any_overflows |= TREE_OVERFLOW (lit1);
10473	      if (minus_lit0) any_overflows |= TREE_OVERFLOW (minus_lit0);
10474	      if (minus_lit1) any_overflows |= TREE_OVERFLOW (minus_lit1);
10475	      var0 = associate_trees (loc, var0, var1, code, atype);
10476	      con0 = associate_trees (loc, con0, con1, code, atype);
10477	      lit0 = associate_trees (loc, lit0, lit1, code, atype);
10478	      minus_lit0 = associate_trees (loc, minus_lit0, minus_lit1,
10479					    code, atype);
10480
10481	      /* Preserve the MINUS_EXPR if the negative part of the literal is
10482		 greater than the positive part.  Otherwise, the multiplicative
10483		 folding code (i.e extract_muldiv) may be fooled in case
10484		 unsigned constants are subtracted, like in the following
10485		 example: ((X*2 + 4) - 8U)/2.  */
10486	      if (minus_lit0 && lit0)
10487		{
10488		  if (TREE_CODE (lit0) == INTEGER_CST
10489		      && TREE_CODE (minus_lit0) == INTEGER_CST
10490		      && tree_int_cst_lt (lit0, minus_lit0))
10491		    {
10492		      minus_lit0 = associate_trees (loc, minus_lit0, lit0,
10493						    MINUS_EXPR, atype);
10494		      lit0 = 0;
10495		    }
10496		  else
10497		    {
10498		      lit0 = associate_trees (loc, lit0, minus_lit0,
10499					      MINUS_EXPR, atype);
10500		      minus_lit0 = 0;
10501		    }
10502		}
10503
10504	      /* Don't introduce overflows through reassociation.  */
10505	      if (!any_overflows
10506		  && ((lit0 && TREE_OVERFLOW_P (lit0))
10507		      || (minus_lit0 && TREE_OVERFLOW_P (minus_lit0))))
10508		return NULL_TREE;
10509
10510	      if (minus_lit0)
10511		{
10512		  if (con0 == 0)
10513		    return
10514		      fold_convert_loc (loc, type,
10515					associate_trees (loc, var0, minus_lit0,
10516							 MINUS_EXPR, atype));
10517		  else
10518		    {
10519		      con0 = associate_trees (loc, con0, minus_lit0,
10520					      MINUS_EXPR, atype);
10521		      return
10522			fold_convert_loc (loc, type,
10523					  associate_trees (loc, var0, con0,
10524							   PLUS_EXPR, atype));
10525		    }
10526		}
10527
10528	      con0 = associate_trees (loc, con0, lit0, code, atype);
10529	      return
10530		fold_convert_loc (loc, type, associate_trees (loc, var0, con0,
10531							      code, atype));
10532	    }
10533	}
10534
10535      return NULL_TREE;
10536
10537    case MINUS_EXPR:
10538      /* Pointer simplifications for subtraction, simple reassociations. */
10539      if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
10540	{
10541	  /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
10542	  if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
10543	      && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10544	    {
10545	      tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10546	      tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10547	      tree arg10 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
10548	      tree arg11 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
10549	      return fold_build2_loc (loc, PLUS_EXPR, type,
10550				  fold_build2_loc (loc, MINUS_EXPR, type,
10551					       arg00, arg10),
10552				  fold_build2_loc (loc, MINUS_EXPR, type,
10553					       arg01, arg11));
10554	    }
10555	  /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
10556	  else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10557	    {
10558	      tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10559	      tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10560	      tree tmp = fold_binary_loc (loc, MINUS_EXPR, type, arg00,
10561				      fold_convert_loc (loc, type, arg1));
10562	      if (tmp)
10563	        return fold_build2_loc (loc, PLUS_EXPR, type, tmp, arg01);
10564	    }
10565	  /* PTR0 - (PTR1 p+ A) -> (PTR0 - PTR1) - A, assuming PTR0 - PTR1
10566	     simplifies. */
10567	  else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10568	    {
10569	      tree arg10 = fold_convert_loc (loc, type,
10570					     TREE_OPERAND (arg1, 0));
10571	      tree arg11 = fold_convert_loc (loc, type,
10572					     TREE_OPERAND (arg1, 1));
10573	      tree tmp = fold_binary_loc (loc, MINUS_EXPR, type,
10574					  fold_convert_loc (loc, type, arg0),
10575					  arg10);
10576	      if (tmp)
10577		return fold_build2_loc (loc, MINUS_EXPR, type, tmp, arg11);
10578	    }
10579	}
10580      /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
10581      if (TREE_CODE (arg0) == NEGATE_EXPR
10582	  && negate_expr_p (op1)
10583	  && reorder_operands_p (arg0, arg1))
10584	return fold_build2_loc (loc, MINUS_EXPR, type,
10585				negate_expr (op1),
10586				fold_convert_loc (loc, type,
10587						  TREE_OPERAND (arg0, 0)));
10588
10589      /* X - (X / Y) * Y is X % Y.  */
10590      if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
10591	  && TREE_CODE (arg1) == MULT_EXPR
10592	  && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10593	  && operand_equal_p (arg0,
10594			      TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
10595	  && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
10596			      TREE_OPERAND (arg1, 1), 0))
10597	return
10598	  fold_convert_loc (loc, type,
10599			    fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0),
10600					 arg0, TREE_OPERAND (arg1, 1)));
10601
10602      if (! FLOAT_TYPE_P (type))
10603	{
10604	  /* Fold A - (A & B) into ~B & A.  */
10605	  if (!TREE_SIDE_EFFECTS (arg0)
10606	      && TREE_CODE (arg1) == BIT_AND_EXPR)
10607	    {
10608	      if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
10609		{
10610		  tree arg10 = fold_convert_loc (loc, type,
10611						 TREE_OPERAND (arg1, 0));
10612		  return fold_build2_loc (loc, BIT_AND_EXPR, type,
10613				      fold_build1_loc (loc, BIT_NOT_EXPR,
10614						   type, arg10),
10615				      fold_convert_loc (loc, type, arg0));
10616		}
10617	      if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10618		{
10619		  tree arg11 = fold_convert_loc (loc,
10620						 type, TREE_OPERAND (arg1, 1));
10621		  return fold_build2_loc (loc, BIT_AND_EXPR, type,
10622				      fold_build1_loc (loc, BIT_NOT_EXPR,
10623						   type, arg11),
10624				      fold_convert_loc (loc, type, arg0));
10625		}
10626	    }
10627
10628	  /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
10629	     any power of 2 minus 1.  */
10630	  if (TREE_CODE (arg0) == BIT_AND_EXPR
10631	      && TREE_CODE (arg1) == BIT_AND_EXPR
10632	      && operand_equal_p (TREE_OPERAND (arg0, 0),
10633				  TREE_OPERAND (arg1, 0), 0))
10634	    {
10635	      tree mask0 = TREE_OPERAND (arg0, 1);
10636	      tree mask1 = TREE_OPERAND (arg1, 1);
10637	      tree tem = fold_build1_loc (loc, BIT_NOT_EXPR, type, mask0);
10638
10639	      if (operand_equal_p (tem, mask1, 0))
10640		{
10641		  tem = fold_build2_loc (loc, BIT_XOR_EXPR, type,
10642				     TREE_OPERAND (arg0, 0), mask1);
10643		  return fold_build2_loc (loc, MINUS_EXPR, type, tem, mask1);
10644		}
10645	    }
10646	}
10647
10648      /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10649	 __complex__ ( x, -y ).  This is not the same for SNaNs or if
10650	 signed zeros are involved.  */
10651      if (!HONOR_SNANS (element_mode (arg0))
10652	  && !HONOR_SIGNED_ZEROS (element_mode (arg0))
10653	  && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10654        {
10655	  tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10656	  tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10657	  tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10658	  bool arg0rz = false, arg0iz = false;
10659	  if ((arg0r && (arg0rz = real_zerop (arg0r)))
10660	      || (arg0i && (arg0iz = real_zerop (arg0i))))
10661	    {
10662	      tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10663	      tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10664	      if (arg0rz && arg1i && real_zerop (arg1i))
10665	        {
10666		  tree rp = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10667					 arg1r ? arg1r
10668					 : build1 (REALPART_EXPR, rtype, arg1));
10669		  tree ip = arg0i ? arg0i
10670		    : build1 (IMAGPART_EXPR, rtype, arg0);
10671		  return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10672		}
10673	      else if (arg0iz && arg1r && real_zerop (arg1r))
10674	        {
10675		  tree rp = arg0r ? arg0r
10676		    : build1 (REALPART_EXPR, rtype, arg0);
10677		  tree ip = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10678					 arg1i ? arg1i
10679					 : build1 (IMAGPART_EXPR, rtype, arg1));
10680		  return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10681		}
10682	    }
10683	}
10684
10685      /* A - B -> A + (-B) if B is easily negatable.  */
10686      if (negate_expr_p (op1)
10687	  && ! TYPE_OVERFLOW_SANITIZED (type)
10688	  && ((FLOAT_TYPE_P (type)
10689               /* Avoid this transformation if B is a positive REAL_CST.  */
10690	       && (TREE_CODE (op1) != REAL_CST
10691		   || REAL_VALUE_NEGATIVE (TREE_REAL_CST (op1))))
10692	      || INTEGRAL_TYPE_P (type)))
10693	return fold_build2_loc (loc, PLUS_EXPR, type,
10694				fold_convert_loc (loc, type, arg0),
10695				negate_expr (op1));
10696
10697      /* Try folding difference of addresses.  */
10698      {
10699	HOST_WIDE_INT diff;
10700
10701	if ((TREE_CODE (arg0) == ADDR_EXPR
10702	     || TREE_CODE (arg1) == ADDR_EXPR)
10703	    && ptr_difference_const (arg0, arg1, &diff))
10704	  return build_int_cst_type (type, diff);
10705      }
10706
10707      /* Fold &a[i] - &a[j] to i-j.  */
10708      if (TREE_CODE (arg0) == ADDR_EXPR
10709	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10710	  && TREE_CODE (arg1) == ADDR_EXPR
10711	  && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10712        {
10713	  tree tem = fold_addr_of_array_ref_difference (loc, type,
10714							TREE_OPERAND (arg0, 0),
10715							TREE_OPERAND (arg1, 0));
10716	  if (tem)
10717	    return tem;
10718	}
10719
10720      if (FLOAT_TYPE_P (type)
10721	  && flag_unsafe_math_optimizations
10722	  && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10723	  && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10724	  && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10725	return tem;
10726
10727      /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or
10728	 one.  Make sure the type is not saturating and has the signedness of
10729	 the stripped operands, as fold_plusminus_mult_expr will re-associate.
10730	 ??? The latter condition should use TYPE_OVERFLOW_* flags instead.  */
10731      if ((TREE_CODE (arg0) == MULT_EXPR
10732	   || TREE_CODE (arg1) == MULT_EXPR)
10733	  && !TYPE_SATURATING (type)
10734	  && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
10735	  && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
10736	  && (!FLOAT_TYPE_P (type) || flag_associative_math))
10737        {
10738	  tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10739	  if (tem)
10740	    return tem;
10741	}
10742
10743      goto associate;
10744
10745    case MULT_EXPR:
10746      /* (-A) * (-B) -> A * B  */
10747      if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10748	return fold_build2_loc (loc, MULT_EXPR, type,
10749			    fold_convert_loc (loc, type,
10750					      TREE_OPERAND (arg0, 0)),
10751			    fold_convert_loc (loc, type,
10752					      negate_expr (arg1)));
10753      if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10754	return fold_build2_loc (loc, MULT_EXPR, type,
10755			    fold_convert_loc (loc, type,
10756					      negate_expr (arg0)),
10757			    fold_convert_loc (loc, type,
10758					      TREE_OPERAND (arg1, 0)));
10759
10760      if (! FLOAT_TYPE_P (type))
10761	{
10762	  /* Transform x * -C into -x * C if x is easily negatable.  */
10763	  if (TREE_CODE (op1) == INTEGER_CST
10764	      && tree_int_cst_sgn (op1) == -1
10765	      && negate_expr_p (op0)
10766	      && (tem = negate_expr (op1)) != op1
10767	      && ! TREE_OVERFLOW (tem))
10768	    return fold_build2_loc (loc, MULT_EXPR, type,
10769				    fold_convert_loc (loc, type,
10770						      negate_expr (op0)), tem);
10771
10772	  /* (a * (1 << b)) is (a << b)  */
10773	  if (TREE_CODE (arg1) == LSHIFT_EXPR
10774	      && integer_onep (TREE_OPERAND (arg1, 0)))
10775	    return fold_build2_loc (loc, LSHIFT_EXPR, type, op0,
10776				TREE_OPERAND (arg1, 1));
10777	  if (TREE_CODE (arg0) == LSHIFT_EXPR
10778	      && integer_onep (TREE_OPERAND (arg0, 0)))
10779	    return fold_build2_loc (loc, LSHIFT_EXPR, type, op1,
10780				TREE_OPERAND (arg0, 1));
10781
10782	  /* (A + A) * C -> A * 2 * C  */
10783	  if (TREE_CODE (arg0) == PLUS_EXPR
10784	      && TREE_CODE (arg1) == INTEGER_CST
10785	      && operand_equal_p (TREE_OPERAND (arg0, 0),
10786			          TREE_OPERAND (arg0, 1), 0))
10787	    return fold_build2_loc (loc, MULT_EXPR, type,
10788				omit_one_operand_loc (loc, type,
10789						  TREE_OPERAND (arg0, 0),
10790						  TREE_OPERAND (arg0, 1)),
10791				fold_build2_loc (loc, MULT_EXPR, type,
10792					     build_int_cst (type, 2) , arg1));
10793
10794	  /* ((T) (X /[ex] C)) * C cancels out if the conversion is
10795	     sign-changing only.  */
10796	  if (TREE_CODE (arg1) == INTEGER_CST
10797	      && TREE_CODE (arg0) == EXACT_DIV_EXPR
10798	      && operand_equal_p (arg1, TREE_OPERAND (arg0, 1), 0))
10799	    return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10800
10801	  strict_overflow_p = false;
10802	  if (TREE_CODE (arg1) == INTEGER_CST
10803	      && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10804					     &strict_overflow_p)))
10805	    {
10806	      if (strict_overflow_p)
10807		fold_overflow_warning (("assuming signed overflow does not "
10808					"occur when simplifying "
10809					"multiplication"),
10810				       WARN_STRICT_OVERFLOW_MISC);
10811	      return fold_convert_loc (loc, type, tem);
10812	    }
10813
10814	  /* Optimize z * conj(z) for integer complex numbers.  */
10815	  if (TREE_CODE (arg0) == CONJ_EXPR
10816	      && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10817	    return fold_mult_zconjz (loc, type, arg1);
10818	  if (TREE_CODE (arg1) == CONJ_EXPR
10819	      && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10820	    return fold_mult_zconjz (loc, type, arg0);
10821	}
10822      else
10823	{
10824	  /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10825             the result for floating point types due to rounding so it is applied
10826             only if -fassociative-math was specify.  */
10827	  if (flag_associative_math
10828	      && TREE_CODE (arg0) == RDIV_EXPR
10829	      && TREE_CODE (arg1) == REAL_CST
10830	      && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10831	    {
10832	      tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10833				      arg1);
10834	      if (tem)
10835		return fold_build2_loc (loc, RDIV_EXPR, type, tem,
10836				    TREE_OPERAND (arg0, 1));
10837	    }
10838
10839          /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10840	  if (operand_equal_p (arg0, arg1, 0))
10841	    {
10842	      tree tem = fold_strip_sign_ops (arg0);
10843	      if (tem != NULL_TREE)
10844		{
10845		  tem = fold_convert_loc (loc, type, tem);
10846		  return fold_build2_loc (loc, MULT_EXPR, type, tem, tem);
10847		}
10848	    }
10849
10850	  /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10851	     This is not the same for NaNs or if signed zeros are
10852	     involved.  */
10853	  if (!HONOR_NANS (arg0)
10854              && !HONOR_SIGNED_ZEROS (element_mode (arg0))
10855	      && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10856	      && TREE_CODE (arg1) == COMPLEX_CST
10857	      && real_zerop (TREE_REALPART (arg1)))
10858	    {
10859	      tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10860	      if (real_onep (TREE_IMAGPART (arg1)))
10861		return
10862		  fold_build2_loc (loc, COMPLEX_EXPR, type,
10863			       negate_expr (fold_build1_loc (loc, IMAGPART_EXPR,
10864							     rtype, arg0)),
10865			       fold_build1_loc (loc, REALPART_EXPR, rtype, arg0));
10866	      else if (real_minus_onep (TREE_IMAGPART (arg1)))
10867		return
10868		  fold_build2_loc (loc, COMPLEX_EXPR, type,
10869			       fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0),
10870			       negate_expr (fold_build1_loc (loc, REALPART_EXPR,
10871							     rtype, arg0)));
10872	    }
10873
10874	  /* Optimize z * conj(z) for floating point complex numbers.
10875	     Guarded by flag_unsafe_math_optimizations as non-finite
10876	     imaginary components don't produce scalar results.  */
10877	  if (flag_unsafe_math_optimizations
10878	      && TREE_CODE (arg0) == CONJ_EXPR
10879	      && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10880	    return fold_mult_zconjz (loc, type, arg1);
10881	  if (flag_unsafe_math_optimizations
10882	      && TREE_CODE (arg1) == CONJ_EXPR
10883	      && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10884	    return fold_mult_zconjz (loc, type, arg0);
10885
10886	  if (flag_unsafe_math_optimizations)
10887	    {
10888	      enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10889	      enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10890
10891	      /* Optimizations of root(...)*root(...).  */
10892	      if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10893		{
10894		  tree rootfn, arg;
10895		  tree arg00 = CALL_EXPR_ARG (arg0, 0);
10896		  tree arg10 = CALL_EXPR_ARG (arg1, 0);
10897
10898		  /* Optimize sqrt(x)*sqrt(x) as x.  */
10899		  if (BUILTIN_SQRT_P (fcode0)
10900		      && operand_equal_p (arg00, arg10, 0)
10901		      && ! HONOR_SNANS (element_mode (type)))
10902		    return arg00;
10903
10904	          /* Optimize root(x)*root(y) as root(x*y).  */
10905		  rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10906		  arg = fold_build2_loc (loc, MULT_EXPR, type, arg00, arg10);
10907		  return build_call_expr_loc (loc, rootfn, 1, arg);
10908		}
10909
10910	      /* Optimize expN(x)*expN(y) as expN(x+y).  */
10911	      if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10912		{
10913		  tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10914		  tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
10915					  CALL_EXPR_ARG (arg0, 0),
10916					  CALL_EXPR_ARG (arg1, 0));
10917		  return build_call_expr_loc (loc, expfn, 1, arg);
10918		}
10919
10920	      /* Optimizations of pow(...)*pow(...).  */
10921	      if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10922		  || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10923		  || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10924		{
10925		  tree arg00 = CALL_EXPR_ARG (arg0, 0);
10926		  tree arg01 = CALL_EXPR_ARG (arg0, 1);
10927		  tree arg10 = CALL_EXPR_ARG (arg1, 0);
10928		  tree arg11 = CALL_EXPR_ARG (arg1, 1);
10929
10930		  /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10931		  if (operand_equal_p (arg01, arg11, 0))
10932		    {
10933		      tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10934		      tree arg = fold_build2_loc (loc, MULT_EXPR, type,
10935					      arg00, arg10);
10936		      return build_call_expr_loc (loc, powfn, 2, arg, arg01);
10937		    }
10938
10939		  /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10940		  if (operand_equal_p (arg00, arg10, 0))
10941		    {
10942		      tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10943		      tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
10944					      arg01, arg11);
10945		      return build_call_expr_loc (loc, powfn, 2, arg00, arg);
10946		    }
10947		}
10948
10949	      /* Optimize tan(x)*cos(x) as sin(x).  */
10950	      if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10951		   || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10952		   || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10953		   || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10954		   || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10955		   || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10956		  && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10957				      CALL_EXPR_ARG (arg1, 0), 0))
10958		{
10959		  tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10960
10961		  if (sinfn != NULL_TREE)
10962		    return build_call_expr_loc (loc, sinfn, 1,
10963					    CALL_EXPR_ARG (arg0, 0));
10964		}
10965
10966	      /* Optimize x*pow(x,c) as pow(x,c+1).  */
10967	      if (fcode1 == BUILT_IN_POW
10968		  || fcode1 == BUILT_IN_POWF
10969		  || fcode1 == BUILT_IN_POWL)
10970		{
10971		  tree arg10 = CALL_EXPR_ARG (arg1, 0);
10972		  tree arg11 = CALL_EXPR_ARG (arg1, 1);
10973		  if (TREE_CODE (arg11) == REAL_CST
10974		      && !TREE_OVERFLOW (arg11)
10975		      && operand_equal_p (arg0, arg10, 0))
10976		    {
10977		      tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10978		      REAL_VALUE_TYPE c;
10979		      tree arg;
10980
10981		      c = TREE_REAL_CST (arg11);
10982		      real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10983		      arg = build_real (type, c);
10984		      return build_call_expr_loc (loc, powfn, 2, arg0, arg);
10985		    }
10986		}
10987
10988	      /* Optimize pow(x,c)*x as pow(x,c+1).  */
10989	      if (fcode0 == BUILT_IN_POW
10990		  || fcode0 == BUILT_IN_POWF
10991		  || fcode0 == BUILT_IN_POWL)
10992		{
10993		  tree arg00 = CALL_EXPR_ARG (arg0, 0);
10994		  tree arg01 = CALL_EXPR_ARG (arg0, 1);
10995		  if (TREE_CODE (arg01) == REAL_CST
10996		      && !TREE_OVERFLOW (arg01)
10997		      && operand_equal_p (arg1, arg00, 0))
10998		    {
10999		      tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11000		      REAL_VALUE_TYPE c;
11001		      tree arg;
11002
11003		      c = TREE_REAL_CST (arg01);
11004		      real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
11005		      arg = build_real (type, c);
11006		      return build_call_expr_loc (loc, powfn, 2, arg1, arg);
11007		    }
11008		}
11009
11010	      /* Canonicalize x*x as pow(x,2.0), which is expanded as x*x.  */
11011	      if (!in_gimple_form
11012		  && optimize
11013		  && operand_equal_p (arg0, arg1, 0))
11014		{
11015		  tree powfn = mathfn_built_in (type, BUILT_IN_POW);
11016
11017		  if (powfn)
11018		    {
11019		      tree arg = build_real (type, dconst2);
11020		      return build_call_expr_loc (loc, powfn, 2, arg0, arg);
11021		    }
11022		}
11023	    }
11024	}
11025      goto associate;
11026
11027    case BIT_IOR_EXPR:
11028    bit_ior:
11029      /* ~X | X is -1.  */
11030      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11031	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11032	{
11033	  t1 = build_zero_cst (type);
11034	  t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11035	  return omit_one_operand_loc (loc, type, t1, arg1);
11036	}
11037
11038      /* X | ~X is -1.  */
11039      if (TREE_CODE (arg1) == BIT_NOT_EXPR
11040	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11041	{
11042	  t1 = build_zero_cst (type);
11043	  t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11044	  return omit_one_operand_loc (loc, type, t1, arg0);
11045	}
11046
11047      /* Canonicalize (X & C1) | C2.  */
11048      if (TREE_CODE (arg0) == BIT_AND_EXPR
11049	  && TREE_CODE (arg1) == INTEGER_CST
11050	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11051	{
11052	  int width = TYPE_PRECISION (type), w;
11053	  wide_int c1 = TREE_OPERAND (arg0, 1);
11054	  wide_int c2 = arg1;
11055
11056	  /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
11057	  if ((c1 & c2) == c1)
11058	    return omit_one_operand_loc (loc, type, arg1,
11059					 TREE_OPERAND (arg0, 0));
11060
11061	  wide_int msk = wi::mask (width, false,
11062				   TYPE_PRECISION (TREE_TYPE (arg1)));
11063
11064	  /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
11065	  if (msk.and_not (c1 | c2) == 0)
11066	    return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11067				    TREE_OPERAND (arg0, 0), arg1);
11068
11069	  /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
11070	     unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
11071	     mode which allows further optimizations.  */
11072	  c1 &= msk;
11073	  c2 &= msk;
11074	  wide_int c3 = c1.and_not (c2);
11075	  for (w = BITS_PER_UNIT; w <= width; w <<= 1)
11076	    {
11077	      wide_int mask = wi::mask (w, false,
11078					TYPE_PRECISION (type));
11079	      if (((c1 | c2) & mask) == mask && c1.and_not (mask) == 0)
11080		{
11081		  c3 = mask;
11082		  break;
11083		}
11084	    }
11085
11086	  if (c3 != c1)
11087	    return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11088				    fold_build2_loc (loc, BIT_AND_EXPR, type,
11089						     TREE_OPERAND (arg0, 0),
11090						     wide_int_to_tree (type,
11091								       c3)),
11092				    arg1);
11093	}
11094
11095      /* (X & ~Y) | (~X & Y) is X ^ Y */
11096      if (TREE_CODE (arg0) == BIT_AND_EXPR
11097	  && TREE_CODE (arg1) == BIT_AND_EXPR)
11098        {
11099	  tree a0, a1, l0, l1, n0, n1;
11100
11101	  a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11102	  a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11103
11104	  l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11105	  l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11106
11107	  n0 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l0);
11108	  n1 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l1);
11109
11110	  if ((operand_equal_p (n0, a0, 0)
11111	       && operand_equal_p (n1, a1, 0))
11112	      || (operand_equal_p (n0, a1, 0)
11113		  && operand_equal_p (n1, a0, 0)))
11114	    return fold_build2_loc (loc, BIT_XOR_EXPR, type, l0, n1);
11115	}
11116
11117      t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11118      if (t1 != NULL_TREE)
11119	return t1;
11120
11121      /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
11122
11123	 This results in more efficient code for machines without a NAND
11124	 instruction.  Combine will canonicalize to the first form
11125	 which will allow use of NAND instructions provided by the
11126	 backend if they exist.  */
11127      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11128	  && TREE_CODE (arg1) == BIT_NOT_EXPR)
11129	{
11130	  return
11131	    fold_build1_loc (loc, BIT_NOT_EXPR, type,
11132			 build2 (BIT_AND_EXPR, type,
11133				 fold_convert_loc (loc, type,
11134						   TREE_OPERAND (arg0, 0)),
11135				 fold_convert_loc (loc, type,
11136						   TREE_OPERAND (arg1, 0))));
11137	}
11138
11139      /* See if this can be simplified into a rotate first.  If that
11140	 is unsuccessful continue in the association code.  */
11141      goto bit_rotate;
11142
11143    case BIT_XOR_EXPR:
11144      /* ~X ^ X is -1.  */
11145      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11146	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11147	{
11148	  t1 = build_zero_cst (type);
11149	  t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11150	  return omit_one_operand_loc (loc, type, t1, arg1);
11151	}
11152
11153      /* X ^ ~X is -1.  */
11154      if (TREE_CODE (arg1) == BIT_NOT_EXPR
11155	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11156	{
11157	  t1 = build_zero_cst (type);
11158	  t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11159	  return omit_one_operand_loc (loc, type, t1, arg0);
11160	}
11161
11162      /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
11163         with a constant, and the two constants have no bits in common,
11164	 we should treat this as a BIT_IOR_EXPR since this may produce more
11165	 simplifications.  */
11166      if (TREE_CODE (arg0) == BIT_AND_EXPR
11167	  && TREE_CODE (arg1) == BIT_AND_EXPR
11168	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11169	  && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
11170	  && wi::bit_and (TREE_OPERAND (arg0, 1),
11171			  TREE_OPERAND (arg1, 1)) == 0)
11172	{
11173	  code = BIT_IOR_EXPR;
11174	  goto bit_ior;
11175	}
11176
11177      /* (X | Y) ^ X -> Y & ~ X*/
11178      if (TREE_CODE (arg0) == BIT_IOR_EXPR
11179          && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11180        {
11181	  tree t2 = TREE_OPERAND (arg0, 1);
11182	  t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11183			    arg1);
11184	  t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11185			    fold_convert_loc (loc, type, t2),
11186			    fold_convert_loc (loc, type, t1));
11187	  return t1;
11188	}
11189
11190      /* (Y | X) ^ X -> Y & ~ X*/
11191      if (TREE_CODE (arg0) == BIT_IOR_EXPR
11192          && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11193        {
11194	  tree t2 = TREE_OPERAND (arg0, 0);
11195	  t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11196			    arg1);
11197	  t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11198			    fold_convert_loc (loc, type, t2),
11199			    fold_convert_loc (loc, type, t1));
11200	  return t1;
11201	}
11202
11203      /* X ^ (X | Y) -> Y & ~ X*/
11204      if (TREE_CODE (arg1) == BIT_IOR_EXPR
11205          && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
11206        {
11207	  tree t2 = TREE_OPERAND (arg1, 1);
11208	  t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11209			    arg0);
11210	  t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11211			    fold_convert_loc (loc, type, t2),
11212			    fold_convert_loc (loc, type, t1));
11213	  return t1;
11214	}
11215
11216      /* X ^ (Y | X) -> Y & ~ X*/
11217      if (TREE_CODE (arg1) == BIT_IOR_EXPR
11218          && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
11219        {
11220	  tree t2 = TREE_OPERAND (arg1, 0);
11221	  t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11222			    arg0);
11223	  t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11224			    fold_convert_loc (loc, type, t2),
11225			    fold_convert_loc (loc, type, t1));
11226	  return t1;
11227	}
11228
11229      /* Convert ~X ^ ~Y to X ^ Y.  */
11230      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11231	  && TREE_CODE (arg1) == BIT_NOT_EXPR)
11232	return fold_build2_loc (loc, code, type,
11233			    fold_convert_loc (loc, type,
11234					      TREE_OPERAND (arg0, 0)),
11235			    fold_convert_loc (loc, type,
11236					      TREE_OPERAND (arg1, 0)));
11237
11238      /* Convert ~X ^ C to X ^ ~C.  */
11239      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11240	  && TREE_CODE (arg1) == INTEGER_CST)
11241	return fold_build2_loc (loc, code, type,
11242			    fold_convert_loc (loc, type,
11243					      TREE_OPERAND (arg0, 0)),
11244			    fold_build1_loc (loc, BIT_NOT_EXPR, type, arg1));
11245
11246      /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
11247      if (TREE_CODE (arg0) == BIT_AND_EXPR
11248	  && INTEGRAL_TYPE_P (type)
11249	  && integer_onep (TREE_OPERAND (arg0, 1))
11250	  && integer_onep (arg1))
11251	return fold_build2_loc (loc, EQ_EXPR, type, arg0,
11252				build_zero_cst (TREE_TYPE (arg0)));
11253
11254      /* Fold (X & Y) ^ Y as ~X & Y.  */
11255      if (TREE_CODE (arg0) == BIT_AND_EXPR
11256	  && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11257	{
11258	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11259	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11260			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11261			      fold_convert_loc (loc, type, arg1));
11262	}
11263      /* Fold (X & Y) ^ X as ~Y & X.  */
11264      if (TREE_CODE (arg0) == BIT_AND_EXPR
11265	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11266	  && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11267	{
11268	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11269	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11270			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11271			      fold_convert_loc (loc, type, arg1));
11272	}
11273      /* Fold X ^ (X & Y) as X & ~Y.  */
11274      if (TREE_CODE (arg1) == BIT_AND_EXPR
11275	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11276	{
11277	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11278	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11279			      fold_convert_loc (loc, type, arg0),
11280			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11281	}
11282      /* Fold X ^ (Y & X) as ~Y & X.  */
11283      if (TREE_CODE (arg1) == BIT_AND_EXPR
11284	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11285	  && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11286	{
11287	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11288	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11289			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11290			      fold_convert_loc (loc, type, arg0));
11291	}
11292
11293      /* See if this can be simplified into a rotate first.  If that
11294	 is unsuccessful continue in the association code.  */
11295      goto bit_rotate;
11296
11297    case BIT_AND_EXPR:
11298      /* ~X & X, (X == 0) & X, and !X & X are always zero.  */
11299      if ((TREE_CODE (arg0) == BIT_NOT_EXPR
11300	   || TREE_CODE (arg0) == TRUTH_NOT_EXPR
11301	   || (TREE_CODE (arg0) == EQ_EXPR
11302	       && integer_zerop (TREE_OPERAND (arg0, 1))))
11303	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11304	return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
11305
11306      /* X & ~X , X & (X == 0), and X & !X are always zero.  */
11307      if ((TREE_CODE (arg1) == BIT_NOT_EXPR
11308	   || TREE_CODE (arg1) == TRUTH_NOT_EXPR
11309	   || (TREE_CODE (arg1) == EQ_EXPR
11310	       && integer_zerop (TREE_OPERAND (arg1, 1))))
11311	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11312	return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11313
11314      /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
11315      if (TREE_CODE (arg0) == BIT_XOR_EXPR
11316	  && INTEGRAL_TYPE_P (type)
11317	  && integer_onep (TREE_OPERAND (arg0, 1))
11318	  && integer_onep (arg1))
11319	{
11320	  tree tem2;
11321	  tem = TREE_OPERAND (arg0, 0);
11322	  tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1);
11323	  tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem),
11324				  tem, tem2);
11325	  return fold_build2_loc (loc, EQ_EXPR, type, tem2,
11326				  build_zero_cst (TREE_TYPE (tem)));
11327	}
11328      /* Fold ~X & 1 as (X & 1) == 0.  */
11329      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11330	  && INTEGRAL_TYPE_P (type)
11331	  && integer_onep (arg1))
11332	{
11333	  tree tem2;
11334	  tem = TREE_OPERAND (arg0, 0);
11335	  tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1);
11336	  tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem),
11337				  tem, tem2);
11338	  return fold_build2_loc (loc, EQ_EXPR, type, tem2,
11339				  build_zero_cst (TREE_TYPE (tem)));
11340	}
11341      /* Fold !X & 1 as X == 0.  */
11342      if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11343	  && integer_onep (arg1))
11344	{
11345	  tem = TREE_OPERAND (arg0, 0);
11346	  return fold_build2_loc (loc, EQ_EXPR, type, tem,
11347				  build_zero_cst (TREE_TYPE (tem)));
11348	}
11349
11350      /* Fold (X ^ Y) & Y as ~X & Y.  */
11351      if (TREE_CODE (arg0) == BIT_XOR_EXPR
11352	  && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11353	{
11354	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11355	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11356			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11357			      fold_convert_loc (loc, type, arg1));
11358	}
11359      /* Fold (X ^ Y) & X as ~Y & X.  */
11360      if (TREE_CODE (arg0) == BIT_XOR_EXPR
11361	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11362	  && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11363	{
11364	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11365	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11366			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11367			      fold_convert_loc (loc, type, arg1));
11368	}
11369      /* Fold X & (X ^ Y) as X & ~Y.  */
11370      if (TREE_CODE (arg1) == BIT_XOR_EXPR
11371	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11372	{
11373	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11374	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11375			      fold_convert_loc (loc, type, arg0),
11376			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11377	}
11378      /* Fold X & (Y ^ X) as ~Y & X.  */
11379      if (TREE_CODE (arg1) == BIT_XOR_EXPR
11380	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11381	  && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11382	{
11383	  tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11384	  return fold_build2_loc (loc, BIT_AND_EXPR, type,
11385			      fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11386			      fold_convert_loc (loc, type, arg0));
11387	}
11388
11389      /* Fold (X * Y) & -(1 << CST) to X * Y if Y is a constant
11390         multiple of 1 << CST.  */
11391      if (TREE_CODE (arg1) == INTEGER_CST)
11392	{
11393	  wide_int cst1 = arg1;
11394	  wide_int ncst1 = -cst1;
11395	  if ((cst1 & ncst1) == ncst1
11396	      && multiple_of_p (type, arg0,
11397				wide_int_to_tree (TREE_TYPE (arg1), ncst1)))
11398	    return fold_convert_loc (loc, type, arg0);
11399	}
11400
11401      /* Fold (X * CST1) & CST2 to zero if we can, or drop known zero
11402         bits from CST2.  */
11403      if (TREE_CODE (arg1) == INTEGER_CST
11404	  && TREE_CODE (arg0) == MULT_EXPR
11405	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11406	{
11407	  wide_int warg1 = arg1;
11408	  wide_int masked = mask_with_tz (type, warg1, TREE_OPERAND (arg0, 1));
11409
11410	  if (masked == 0)
11411	    return omit_two_operands_loc (loc, type, build_zero_cst (type),
11412	                                  arg0, arg1);
11413	  else if (masked != warg1)
11414	    {
11415	      /* Avoid the transform if arg1 is a mask of some
11416	         mode which allows further optimizations.  */
11417	      int pop = wi::popcount (warg1);
11418	      if (!(pop >= BITS_PER_UNIT
11419		    && exact_log2 (pop) != -1
11420		    && wi::mask (pop, false, warg1.get_precision ()) == warg1))
11421		return fold_build2_loc (loc, code, type, op0,
11422					wide_int_to_tree (type, masked));
11423	    }
11424	}
11425
11426      /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
11427	 ((A & N) + B) & M -> (A + B) & M
11428	 Similarly if (N & M) == 0,
11429	 ((A | N) + B) & M -> (A + B) & M
11430	 and for - instead of + (or unary - instead of +)
11431	 and/or ^ instead of |.
11432	 If B is constant and (B & M) == 0, fold into A & M.  */
11433      if (TREE_CODE (arg1) == INTEGER_CST)
11434	{
11435	  wide_int cst1 = arg1;
11436	  if ((~cst1 != 0) && (cst1 & (cst1 + 1)) == 0
11437	      && INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11438	      && (TREE_CODE (arg0) == PLUS_EXPR
11439		  || TREE_CODE (arg0) == MINUS_EXPR
11440		  || TREE_CODE (arg0) == NEGATE_EXPR)
11441	      && (TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
11442		  || TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE))
11443	    {
11444	      tree pmop[2];
11445	      int which = 0;
11446	      wide_int cst0;
11447
11448	      /* Now we know that arg0 is (C + D) or (C - D) or
11449		 -C and arg1 (M) is == (1LL << cst) - 1.
11450		 Store C into PMOP[0] and D into PMOP[1].  */
11451	      pmop[0] = TREE_OPERAND (arg0, 0);
11452	      pmop[1] = NULL;
11453	      if (TREE_CODE (arg0) != NEGATE_EXPR)
11454		{
11455		  pmop[1] = TREE_OPERAND (arg0, 1);
11456		  which = 1;
11457		}
11458
11459	      if ((wi::max_value (TREE_TYPE (arg0)) & cst1) != cst1)
11460		which = -1;
11461
11462	      for (; which >= 0; which--)
11463		switch (TREE_CODE (pmop[which]))
11464		  {
11465		  case BIT_AND_EXPR:
11466		  case BIT_IOR_EXPR:
11467		  case BIT_XOR_EXPR:
11468		    if (TREE_CODE (TREE_OPERAND (pmop[which], 1))
11469			!= INTEGER_CST)
11470		      break;
11471		    cst0 = TREE_OPERAND (pmop[which], 1);
11472		    cst0 &= cst1;
11473		    if (TREE_CODE (pmop[which]) == BIT_AND_EXPR)
11474		      {
11475			if (cst0 != cst1)
11476			  break;
11477		      }
11478		    else if (cst0 != 0)
11479		      break;
11480		    /* If C or D is of the form (A & N) where
11481		       (N & M) == M, or of the form (A | N) or
11482		       (A ^ N) where (N & M) == 0, replace it with A.  */
11483		    pmop[which] = TREE_OPERAND (pmop[which], 0);
11484		    break;
11485		  case INTEGER_CST:
11486		    /* If C or D is a N where (N & M) == 0, it can be
11487		       omitted (assumed 0).  */
11488		    if ((TREE_CODE (arg0) == PLUS_EXPR
11489			 || (TREE_CODE (arg0) == MINUS_EXPR && which == 0))
11490			&& (cst1 & pmop[which]) == 0)
11491		      pmop[which] = NULL;
11492		    break;
11493		  default:
11494		    break;
11495		  }
11496
11497	      /* Only build anything new if we optimized one or both arguments
11498		 above.  */
11499	      if (pmop[0] != TREE_OPERAND (arg0, 0)
11500		  || (TREE_CODE (arg0) != NEGATE_EXPR
11501		      && pmop[1] != TREE_OPERAND (arg0, 1)))
11502		{
11503		  tree utype = TREE_TYPE (arg0);
11504		  if (! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
11505		    {
11506		      /* Perform the operations in a type that has defined
11507			 overflow behavior.  */
11508		      utype = unsigned_type_for (TREE_TYPE (arg0));
11509		      if (pmop[0] != NULL)
11510			pmop[0] = fold_convert_loc (loc, utype, pmop[0]);
11511		      if (pmop[1] != NULL)
11512			pmop[1] = fold_convert_loc (loc, utype, pmop[1]);
11513		    }
11514
11515		  if (TREE_CODE (arg0) == NEGATE_EXPR)
11516		    tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[0]);
11517		  else if (TREE_CODE (arg0) == PLUS_EXPR)
11518		    {
11519		      if (pmop[0] != NULL && pmop[1] != NULL)
11520			tem = fold_build2_loc (loc, PLUS_EXPR, utype,
11521					       pmop[0], pmop[1]);
11522		      else if (pmop[0] != NULL)
11523			tem = pmop[0];
11524		      else if (pmop[1] != NULL)
11525			tem = pmop[1];
11526		      else
11527			return build_int_cst (type, 0);
11528		    }
11529		  else if (pmop[0] == NULL)
11530		    tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[1]);
11531		  else
11532		    tem = fold_build2_loc (loc, MINUS_EXPR, utype,
11533					   pmop[0], pmop[1]);
11534		  /* TEM is now the new binary +, - or unary - replacement.  */
11535		  tem = fold_build2_loc (loc, BIT_AND_EXPR, utype, tem,
11536					 fold_convert_loc (loc, utype, arg1));
11537		  return fold_convert_loc (loc, type, tem);
11538		}
11539	    }
11540	}
11541
11542      t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11543      if (t1 != NULL_TREE)
11544	return t1;
11545      /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
11546      if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
11547	  && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
11548	{
11549	  prec = element_precision (TREE_TYPE (TREE_OPERAND (arg0, 0)));
11550
11551	  wide_int mask = wide_int::from (arg1, prec, UNSIGNED);
11552	  if (mask == -1)
11553	    return
11554	      fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11555	}
11556
11557      /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
11558
11559	 This results in more efficient code for machines without a NOR
11560	 instruction.  Combine will canonicalize to the first form
11561	 which will allow use of NOR instructions provided by the
11562	 backend if they exist.  */
11563      if (TREE_CODE (arg0) == BIT_NOT_EXPR
11564	  && TREE_CODE (arg1) == BIT_NOT_EXPR)
11565	{
11566	  return fold_build1_loc (loc, BIT_NOT_EXPR, type,
11567			      build2 (BIT_IOR_EXPR, type,
11568				      fold_convert_loc (loc, type,
11569							TREE_OPERAND (arg0, 0)),
11570				      fold_convert_loc (loc, type,
11571							TREE_OPERAND (arg1, 0))));
11572	}
11573
11574      /* If arg0 is derived from the address of an object or function, we may
11575	 be able to fold this expression using the object or function's
11576	 alignment.  */
11577      if (POINTER_TYPE_P (TREE_TYPE (arg0)) && tree_fits_uhwi_p (arg1))
11578	{
11579	  unsigned HOST_WIDE_INT modulus, residue;
11580	  unsigned HOST_WIDE_INT low = tree_to_uhwi (arg1);
11581
11582	  modulus = get_pointer_modulus_and_residue (arg0, &residue,
11583						     integer_onep (arg1));
11584
11585	  /* This works because modulus is a power of 2.  If this weren't the
11586	     case, we'd have to replace it by its greatest power-of-2
11587	     divisor: modulus & -modulus.  */
11588	  if (low < modulus)
11589	    return build_int_cst (type, residue & low);
11590	}
11591
11592      /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
11593	      (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
11594	 if the new mask might be further optimized.  */
11595      if ((TREE_CODE (arg0) == LSHIFT_EXPR
11596	   || TREE_CODE (arg0) == RSHIFT_EXPR)
11597	  && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
11598	  && TREE_CODE (arg1) == INTEGER_CST
11599	  && tree_fits_uhwi_p (TREE_OPERAND (arg0, 1))
11600	  && tree_to_uhwi (TREE_OPERAND (arg0, 1)) > 0
11601	  && (tree_to_uhwi (TREE_OPERAND (arg0, 1))
11602	      < TYPE_PRECISION (TREE_TYPE (arg0))))
11603	{
11604	  unsigned int shiftc = tree_to_uhwi (TREE_OPERAND (arg0, 1));
11605	  unsigned HOST_WIDE_INT mask = TREE_INT_CST_LOW (arg1);
11606	  unsigned HOST_WIDE_INT newmask, zerobits = 0;
11607	  tree shift_type = TREE_TYPE (arg0);
11608
11609	  if (TREE_CODE (arg0) == LSHIFT_EXPR)
11610	    zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
11611	  else if (TREE_CODE (arg0) == RSHIFT_EXPR
11612		   && TYPE_PRECISION (TREE_TYPE (arg0))
11613		      == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (arg0))))
11614	    {
11615	      prec = TYPE_PRECISION (TREE_TYPE (arg0));
11616	      tree arg00 = TREE_OPERAND (arg0, 0);
11617	      /* See if more bits can be proven as zero because of
11618		 zero extension.  */
11619	      if (TREE_CODE (arg00) == NOP_EXPR
11620		  && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
11621		{
11622		  tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
11623		  if (TYPE_PRECISION (inner_type)
11624		      == GET_MODE_PRECISION (TYPE_MODE (inner_type))
11625		      && TYPE_PRECISION (inner_type) < prec)
11626		    {
11627		      prec = TYPE_PRECISION (inner_type);
11628		      /* See if we can shorten the right shift.  */
11629		      if (shiftc < prec)
11630			shift_type = inner_type;
11631		      /* Otherwise X >> C1 is all zeros, so we'll optimize
11632			 it into (X, 0) later on by making sure zerobits
11633			 is all ones.  */
11634		    }
11635		}
11636	      zerobits = ~(unsigned HOST_WIDE_INT) 0;
11637	      if (shiftc < prec)
11638		{
11639		  zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
11640		  zerobits <<= prec - shiftc;
11641		}
11642	      /* For arithmetic shift if sign bit could be set, zerobits
11643		 can contain actually sign bits, so no transformation is
11644		 possible, unless MASK masks them all away.  In that
11645		 case the shift needs to be converted into logical shift.  */
11646	      if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
11647		  && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
11648		{
11649		  if ((mask & zerobits) == 0)
11650		    shift_type = unsigned_type_for (TREE_TYPE (arg0));
11651		  else
11652		    zerobits = 0;
11653		}
11654	    }
11655
11656	  /* ((X << 16) & 0xff00) is (X, 0).  */
11657	  if ((mask & zerobits) == mask)
11658	    return omit_one_operand_loc (loc, type,
11659					 build_int_cst (type, 0), arg0);
11660
11661	  newmask = mask | zerobits;
11662	  if (newmask != mask && (newmask & (newmask + 1)) == 0)
11663	    {
11664	      /* Only do the transformation if NEWMASK is some integer
11665		 mode's mask.  */
11666	      for (prec = BITS_PER_UNIT;
11667		   prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
11668		if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
11669		  break;
11670	      if (prec < HOST_BITS_PER_WIDE_INT
11671		  || newmask == ~(unsigned HOST_WIDE_INT) 0)
11672		{
11673		  tree newmaskt;
11674
11675		  if (shift_type != TREE_TYPE (arg0))
11676		    {
11677		      tem = fold_build2_loc (loc, TREE_CODE (arg0), shift_type,
11678					 fold_convert_loc (loc, shift_type,
11679							   TREE_OPERAND (arg0, 0)),
11680					 TREE_OPERAND (arg0, 1));
11681		      tem = fold_convert_loc (loc, type, tem);
11682		    }
11683		  else
11684		    tem = op0;
11685		  newmaskt = build_int_cst_type (TREE_TYPE (op1), newmask);
11686		  if (!tree_int_cst_equal (newmaskt, arg1))
11687		    return fold_build2_loc (loc, BIT_AND_EXPR, type, tem, newmaskt);
11688		}
11689	    }
11690	}
11691
11692      goto associate;
11693
11694    case RDIV_EXPR:
11695      /* Don't touch a floating-point divide by zero unless the mode
11696	 of the constant can represent infinity.  */
11697      if (TREE_CODE (arg1) == REAL_CST
11698	  && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
11699	  && real_zerop (arg1))
11700	return NULL_TREE;
11701
11702      /* (-A) / (-B) -> A / B  */
11703      if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
11704	return fold_build2_loc (loc, RDIV_EXPR, type,
11705			    TREE_OPERAND (arg0, 0),
11706			    negate_expr (arg1));
11707      if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
11708	return fold_build2_loc (loc, RDIV_EXPR, type,
11709			    negate_expr (arg0),
11710			    TREE_OPERAND (arg1, 0));
11711
11712      /* Convert A/B/C to A/(B*C).  */
11713      if (flag_reciprocal_math
11714	  && TREE_CODE (arg0) == RDIV_EXPR)
11715	return fold_build2_loc (loc, RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11716			    fold_build2_loc (loc, MULT_EXPR, type,
11717					 TREE_OPERAND (arg0, 1), arg1));
11718
11719      /* Convert A/(B/C) to (A/B)*C.  */
11720      if (flag_reciprocal_math
11721	  && TREE_CODE (arg1) == RDIV_EXPR)
11722	return fold_build2_loc (loc, MULT_EXPR, type,
11723			    fold_build2_loc (loc, RDIV_EXPR, type, arg0,
11724					 TREE_OPERAND (arg1, 0)),
11725			    TREE_OPERAND (arg1, 1));
11726
11727      /* Convert C1/(X*C2) into (C1/C2)/X.  */
11728      if (flag_reciprocal_math
11729	  && TREE_CODE (arg1) == MULT_EXPR
11730	  && TREE_CODE (arg0) == REAL_CST
11731	  && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11732	{
11733	  tree tem = const_binop (RDIV_EXPR, arg0,
11734				  TREE_OPERAND (arg1, 1));
11735	  if (tem)
11736	    return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11737				TREE_OPERAND (arg1, 0));
11738	}
11739
11740      if (flag_unsafe_math_optimizations)
11741	{
11742	  enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11743	  enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11744
11745	  /* Optimize sin(x)/cos(x) as tan(x).  */
11746	  if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11747	       || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11748	       || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11749	      && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11750				  CALL_EXPR_ARG (arg1, 0), 0))
11751	    {
11752	      tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11753
11754	      if (tanfn != NULL_TREE)
11755		return build_call_expr_loc (loc, tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11756	    }
11757
11758	  /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11759	  if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11760	       || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11761	       || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11762	      && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11763				  CALL_EXPR_ARG (arg1, 0), 0))
11764	    {
11765	      tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11766
11767	      if (tanfn != NULL_TREE)
11768		{
11769		  tree tmp = build_call_expr_loc (loc, tanfn, 1,
11770					      CALL_EXPR_ARG (arg0, 0));
11771		  return fold_build2_loc (loc, RDIV_EXPR, type,
11772				      build_real (type, dconst1), tmp);
11773		}
11774	    }
11775
11776 	  /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11777	     NaNs or Infinities.  */
11778 	  if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11779 	       || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11780 	       || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11781	    {
11782	      tree arg00 = CALL_EXPR_ARG (arg0, 0);
11783	      tree arg01 = CALL_EXPR_ARG (arg1, 0);
11784
11785	      if (! HONOR_NANS (arg00)
11786		  && ! HONOR_INFINITIES (element_mode (arg00))
11787		  && operand_equal_p (arg00, arg01, 0))
11788		{
11789		  tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11790
11791		  if (cosfn != NULL_TREE)
11792		    return build_call_expr_loc (loc, cosfn, 1, arg00);
11793		}
11794	    }
11795
11796 	  /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11797	     NaNs or Infinities.  */
11798 	  if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11799 	       || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11800 	       || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11801	    {
11802	      tree arg00 = CALL_EXPR_ARG (arg0, 0);
11803	      tree arg01 = CALL_EXPR_ARG (arg1, 0);
11804
11805	      if (! HONOR_NANS (arg00)
11806		  && ! HONOR_INFINITIES (element_mode (arg00))
11807		  && operand_equal_p (arg00, arg01, 0))
11808		{
11809		  tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11810
11811		  if (cosfn != NULL_TREE)
11812		    {
11813		      tree tmp = build_call_expr_loc (loc, cosfn, 1, arg00);
11814		      return fold_build2_loc (loc, RDIV_EXPR, type,
11815					  build_real (type, dconst1),
11816					  tmp);
11817		    }
11818		}
11819	    }
11820
11821	  /* Optimize pow(x,c)/x as pow(x,c-1).  */
11822	  if (fcode0 == BUILT_IN_POW
11823	      || fcode0 == BUILT_IN_POWF
11824	      || fcode0 == BUILT_IN_POWL)
11825	    {
11826	      tree arg00 = CALL_EXPR_ARG (arg0, 0);
11827	      tree arg01 = CALL_EXPR_ARG (arg0, 1);
11828	      if (TREE_CODE (arg01) == REAL_CST
11829		  && !TREE_OVERFLOW (arg01)
11830		  && operand_equal_p (arg1, arg00, 0))
11831		{
11832		  tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11833		  REAL_VALUE_TYPE c;
11834		  tree arg;
11835
11836		  c = TREE_REAL_CST (arg01);
11837		  real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11838		  arg = build_real (type, c);
11839		  return build_call_expr_loc (loc, powfn, 2, arg1, arg);
11840		}
11841	    }
11842
11843	  /* Optimize a/root(b/c) into a*root(c/b).  */
11844	  if (BUILTIN_ROOT_P (fcode1))
11845	    {
11846	      tree rootarg = CALL_EXPR_ARG (arg1, 0);
11847
11848	      if (TREE_CODE (rootarg) == RDIV_EXPR)
11849		{
11850		  tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11851		  tree b = TREE_OPERAND (rootarg, 0);
11852		  tree c = TREE_OPERAND (rootarg, 1);
11853
11854		  tree tmp = fold_build2_loc (loc, RDIV_EXPR, type, c, b);
11855
11856		  tmp = build_call_expr_loc (loc, rootfn, 1, tmp);
11857		  return fold_build2_loc (loc, MULT_EXPR, type, arg0, tmp);
11858		}
11859	    }
11860
11861	  /* Optimize x/expN(y) into x*expN(-y).  */
11862	  if (BUILTIN_EXPONENT_P (fcode1))
11863	    {
11864	      tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11865	      tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11866	      arg1 = build_call_expr_loc (loc,
11867				      expfn, 1,
11868				      fold_convert_loc (loc, type, arg));
11869	      return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
11870	    }
11871
11872	  /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11873	  if (fcode1 == BUILT_IN_POW
11874	      || fcode1 == BUILT_IN_POWF
11875	      || fcode1 == BUILT_IN_POWL)
11876	    {
11877	      tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11878	      tree arg10 = CALL_EXPR_ARG (arg1, 0);
11879	      tree arg11 = CALL_EXPR_ARG (arg1, 1);
11880	      tree neg11 = fold_convert_loc (loc, type,
11881					     negate_expr (arg11));
11882	      arg1 = build_call_expr_loc (loc, powfn, 2, arg10, neg11);
11883	      return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
11884	    }
11885	}
11886      return NULL_TREE;
11887
11888    case TRUNC_DIV_EXPR:
11889      /* Optimize (X & (-A)) / A where A is a power of 2,
11890	 to X >> log2(A) */
11891      if (TREE_CODE (arg0) == BIT_AND_EXPR
11892	  && !TYPE_UNSIGNED (type) && TREE_CODE (arg1) == INTEGER_CST
11893	  && integer_pow2p (arg1) && tree_int_cst_sgn (arg1) > 0)
11894	{
11895	  tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (arg1),
11896				      arg1, TREE_OPERAND (arg0, 1));
11897	  if (sum && integer_zerop (sum)) {
11898	    tree pow2 = build_int_cst (integer_type_node,
11899				       wi::exact_log2 (arg1));
11900	    return fold_build2_loc (loc, RSHIFT_EXPR, type,
11901				    TREE_OPERAND (arg0, 0), pow2);
11902	  }
11903	}
11904
11905      /* Fall through */
11906
11907    case FLOOR_DIV_EXPR:
11908      /* Simplify A / (B << N) where A and B are positive and B is
11909	 a power of 2, to A >> (N + log2(B)).  */
11910      strict_overflow_p = false;
11911      if (TREE_CODE (arg1) == LSHIFT_EXPR
11912	  && (TYPE_UNSIGNED (type)
11913	      || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11914	{
11915	  tree sval = TREE_OPERAND (arg1, 0);
11916	  if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11917	    {
11918	      tree sh_cnt = TREE_OPERAND (arg1, 1);
11919	      tree pow2 = build_int_cst (TREE_TYPE (sh_cnt),
11920					 wi::exact_log2 (sval));
11921
11922	      if (strict_overflow_p)
11923		fold_overflow_warning (("assuming signed overflow does not "
11924					"occur when simplifying A / (B << N)"),
11925				       WARN_STRICT_OVERFLOW_MISC);
11926
11927	      sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
11928					sh_cnt, pow2);
11929	      return fold_build2_loc (loc, RSHIFT_EXPR, type,
11930				      fold_convert_loc (loc, type, arg0), sh_cnt);
11931	    }
11932	}
11933
11934      /* Fall through */
11935
11936    case ROUND_DIV_EXPR:
11937    case CEIL_DIV_EXPR:
11938    case EXACT_DIV_EXPR:
11939      if (integer_zerop (arg1))
11940	return NULL_TREE;
11941
11942      /* Convert -A / -B to A / B when the type is signed and overflow is
11943	 undefined.  */
11944      if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11945	  && TREE_CODE (op0) == NEGATE_EXPR
11946	  && negate_expr_p (op1))
11947	{
11948	  if (INTEGRAL_TYPE_P (type))
11949	    fold_overflow_warning (("assuming signed overflow does not occur "
11950				    "when distributing negation across "
11951				    "division"),
11952				   WARN_STRICT_OVERFLOW_MISC);
11953	  return fold_build2_loc (loc, code, type,
11954				  fold_convert_loc (loc, type,
11955						    TREE_OPERAND (arg0, 0)),
11956				  negate_expr (op1));
11957	}
11958      if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11959	  && TREE_CODE (op1) == NEGATE_EXPR
11960	  && negate_expr_p (op0))
11961	{
11962	  if (INTEGRAL_TYPE_P (type))
11963	    fold_overflow_warning (("assuming signed overflow does not occur "
11964				    "when distributing negation across "
11965				    "division"),
11966				   WARN_STRICT_OVERFLOW_MISC);
11967	  return fold_build2_loc (loc, code, type,
11968				  negate_expr (op0),
11969				  fold_convert_loc (loc, type,
11970						    TREE_OPERAND (arg1, 0)));
11971	}
11972
11973      /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11974	 operation, EXACT_DIV_EXPR.
11975
11976	 Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11977	 At one time others generated faster code, it's not clear if they do
11978	 after the last round to changes to the DIV code in expmed.c.  */
11979      if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11980	  && multiple_of_p (type, arg0, arg1))
11981	return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1);
11982
11983      strict_overflow_p = false;
11984      if (TREE_CODE (arg1) == INTEGER_CST
11985	  && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11986					 &strict_overflow_p)))
11987	{
11988	  if (strict_overflow_p)
11989	    fold_overflow_warning (("assuming signed overflow does not occur "
11990				    "when simplifying division"),
11991				   WARN_STRICT_OVERFLOW_MISC);
11992	  return fold_convert_loc (loc, type, tem);
11993	}
11994
11995      return NULL_TREE;
11996
11997    case CEIL_MOD_EXPR:
11998    case FLOOR_MOD_EXPR:
11999    case ROUND_MOD_EXPR:
12000    case TRUNC_MOD_EXPR:
12001      /* X % -Y is the same as X % Y.  */
12002      if (code == TRUNC_MOD_EXPR
12003	  && !TYPE_UNSIGNED (type)
12004	  && TREE_CODE (arg1) == NEGATE_EXPR
12005	  && !TYPE_OVERFLOW_TRAPS (type))
12006	return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, arg0),
12007			    fold_convert_loc (loc, type,
12008					      TREE_OPERAND (arg1, 0)));
12009
12010      strict_overflow_p = false;
12011      if (TREE_CODE (arg1) == INTEGER_CST
12012	  && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
12013					 &strict_overflow_p)))
12014	{
12015	  if (strict_overflow_p)
12016	    fold_overflow_warning (("assuming signed overflow does not occur "
12017				    "when simplifying modulus"),
12018				   WARN_STRICT_OVERFLOW_MISC);
12019	  return fold_convert_loc (loc, type, tem);
12020	}
12021
12022      /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
12023         i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
12024      if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
12025	  && (TYPE_UNSIGNED (type)
12026	      || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
12027	{
12028	  tree c = arg1;
12029	  /* Also optimize A % (C << N)  where C is a power of 2,
12030	     to A & ((C << N) - 1).  */
12031	  if (TREE_CODE (arg1) == LSHIFT_EXPR)
12032	    c = TREE_OPERAND (arg1, 0);
12033
12034	  if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
12035	    {
12036	      tree mask
12037		= fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (arg1), arg1,
12038				   build_int_cst (TREE_TYPE (arg1), 1));
12039	      if (strict_overflow_p)
12040		fold_overflow_warning (("assuming signed overflow does not "
12041					"occur when simplifying "
12042					"X % (power of two)"),
12043				       WARN_STRICT_OVERFLOW_MISC);
12044	      return fold_build2_loc (loc, BIT_AND_EXPR, type,
12045				      fold_convert_loc (loc, type, arg0),
12046				      fold_convert_loc (loc, type, mask));
12047	    }
12048	}
12049
12050      return NULL_TREE;
12051
12052    case LROTATE_EXPR:
12053    case RROTATE_EXPR:
12054    case RSHIFT_EXPR:
12055    case LSHIFT_EXPR:
12056      /* Since negative shift count is not well-defined,
12057	 don't try to compute it in the compiler.  */
12058      if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
12059	return NULL_TREE;
12060
12061      prec = element_precision (type);
12062
12063      /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
12064      if (TREE_CODE (op0) == code && tree_fits_uhwi_p (arg1)
12065	  && tree_to_uhwi (arg1) < prec
12066	  && tree_fits_uhwi_p (TREE_OPERAND (arg0, 1))
12067	  && tree_to_uhwi (TREE_OPERAND (arg0, 1)) < prec)
12068	{
12069	  unsigned int low = (tree_to_uhwi (TREE_OPERAND (arg0, 1))
12070			      + tree_to_uhwi (arg1));
12071
12072	  /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
12073	     being well defined.  */
12074	  if (low >= prec)
12075	    {
12076	      if (code == LROTATE_EXPR || code == RROTATE_EXPR)
12077	        low = low % prec;
12078	      else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
12079		return omit_one_operand_loc (loc, type, build_zero_cst (type),
12080					 TREE_OPERAND (arg0, 0));
12081	      else
12082		low = prec - 1;
12083	    }
12084
12085	  return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12086				  build_int_cst (TREE_TYPE (arg1), low));
12087	}
12088
12089      /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
12090         into x & ((unsigned)-1 >> c) for unsigned types.  */
12091      if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
12092           || (TYPE_UNSIGNED (type)
12093	       && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
12094	  && tree_fits_uhwi_p (arg1)
12095	  && tree_to_uhwi (arg1) < prec
12096	  && tree_fits_uhwi_p (TREE_OPERAND (arg0, 1))
12097	  && tree_to_uhwi (TREE_OPERAND (arg0, 1)) < prec)
12098	{
12099	  HOST_WIDE_INT low0 = tree_to_uhwi (TREE_OPERAND (arg0, 1));
12100	  HOST_WIDE_INT low1 = tree_to_uhwi (arg1);
12101	  tree lshift;
12102	  tree arg00;
12103
12104	  if (low0 == low1)
12105	    {
12106	      arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12107
12108	      lshift = build_minus_one_cst (type);
12109	      lshift = const_binop (code, lshift, arg1);
12110
12111	      return fold_build2_loc (loc, BIT_AND_EXPR, type, arg00, lshift);
12112	    }
12113	}
12114
12115      /* If we have a rotate of a bit operation with the rotate count and
12116	 the second operand of the bit operation both constant,
12117	 permute the two operations.  */
12118      if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12119	  && (TREE_CODE (arg0) == BIT_AND_EXPR
12120	      || TREE_CODE (arg0) == BIT_IOR_EXPR
12121	      || TREE_CODE (arg0) == BIT_XOR_EXPR)
12122	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12123	{
12124	  tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12125	  tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
12126	  return fold_build2_loc (loc, TREE_CODE (arg0), type,
12127				  fold_build2_loc (loc, code, type,
12128						   arg00, arg1),
12129				  fold_build2_loc (loc, code, type,
12130						   arg01, arg1));
12131	}
12132
12133      /* Two consecutive rotates adding up to the some integer
12134	 multiple of the precision of the type can be ignored.  */
12135      if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12136	  && TREE_CODE (arg0) == RROTATE_EXPR
12137	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12138	  && wi::umod_trunc (wi::add (arg1, TREE_OPERAND (arg0, 1)),
12139			     prec) == 0)
12140	return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12141
12142      /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
12143	      (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
12144	 if the latter can be further optimized.  */
12145      if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
12146	  && TREE_CODE (arg0) == BIT_AND_EXPR
12147	  && TREE_CODE (arg1) == INTEGER_CST
12148	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12149	{
12150	  tree mask = fold_build2_loc (loc, code, type,
12151				   fold_convert_loc (loc, type,
12152						     TREE_OPERAND (arg0, 1)),
12153				   arg1);
12154	  tree shift = fold_build2_loc (loc, code, type,
12155				    fold_convert_loc (loc, type,
12156						      TREE_OPERAND (arg0, 0)),
12157				    arg1);
12158	  tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask);
12159	  if (tem)
12160	    return tem;
12161	}
12162
12163      return NULL_TREE;
12164
12165    case MIN_EXPR:
12166      tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
12167      if (tem)
12168	return tem;
12169      goto associate;
12170
12171    case MAX_EXPR:
12172      tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
12173      if (tem)
12174	return tem;
12175      goto associate;
12176
12177    case TRUTH_ANDIF_EXPR:
12178      /* Note that the operands of this must be ints
12179	 and their values must be 0 or 1.
12180	 ("true" is a fixed value perhaps depending on the language.)  */
12181      /* If first arg is constant zero, return it.  */
12182      if (integer_zerop (arg0))
12183	return fold_convert_loc (loc, type, arg0);
12184    case TRUTH_AND_EXPR:
12185      /* If either arg is constant true, drop it.  */
12186      if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12187	return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12188      if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
12189	  /* Preserve sequence points.  */
12190	  && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12191	return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12192      /* If second arg is constant zero, result is zero, but first arg
12193	 must be evaluated.  */
12194      if (integer_zerop (arg1))
12195	return omit_one_operand_loc (loc, type, arg1, arg0);
12196      /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
12197	 case will be handled here.  */
12198      if (integer_zerop (arg0))
12199	return omit_one_operand_loc (loc, type, arg0, arg1);
12200
12201      /* !X && X is always false.  */
12202      if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12203	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12204	return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12205      /* X && !X is always false.  */
12206      if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12207	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12208	return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12209
12210      /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
12211	 means A >= Y && A != MAX, but in this case we know that
12212	 A < X <= MAX.  */
12213
12214      if (!TREE_SIDE_EFFECTS (arg0)
12215	  && !TREE_SIDE_EFFECTS (arg1))
12216	{
12217	  tem = fold_to_nonsharp_ineq_using_bound (loc, arg0, arg1);
12218	  if (tem && !operand_equal_p (tem, arg0, 0))
12219	    return fold_build2_loc (loc, code, type, tem, arg1);
12220
12221	  tem = fold_to_nonsharp_ineq_using_bound (loc, arg1, arg0);
12222	  if (tem && !operand_equal_p (tem, arg1, 0))
12223	    return fold_build2_loc (loc, code, type, arg0, tem);
12224	}
12225
12226      if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1))
12227          != NULL_TREE)
12228        return tem;
12229
12230      return NULL_TREE;
12231
12232    case TRUTH_ORIF_EXPR:
12233      /* Note that the operands of this must be ints
12234	 and their values must be 0 or true.
12235	 ("true" is a fixed value perhaps depending on the language.)  */
12236      /* If first arg is constant true, return it.  */
12237      if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12238	return fold_convert_loc (loc, type, arg0);
12239    case TRUTH_OR_EXPR:
12240      /* If either arg is constant zero, drop it.  */
12241      if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
12242	return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12243      if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
12244	  /* Preserve sequence points.  */
12245	  && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12246	return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12247      /* If second arg is constant true, result is true, but we must
12248	 evaluate first arg.  */
12249      if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
12250	return omit_one_operand_loc (loc, type, arg1, arg0);
12251      /* Likewise for first arg, but note this only occurs here for
12252	 TRUTH_OR_EXPR.  */
12253      if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12254	return omit_one_operand_loc (loc, type, arg0, arg1);
12255
12256      /* !X || X is always true.  */
12257      if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12258	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12259	return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12260      /* X || !X is always true.  */
12261      if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12262	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12263	return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12264
12265      /* (X && !Y) || (!X && Y) is X ^ Y */
12266      if (TREE_CODE (arg0) == TRUTH_AND_EXPR
12267	  && TREE_CODE (arg1) == TRUTH_AND_EXPR)
12268        {
12269	  tree a0, a1, l0, l1, n0, n1;
12270
12271	  a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
12272	  a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
12273
12274	  l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12275	  l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
12276
12277	  n0 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l0);
12278	  n1 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l1);
12279
12280	  if ((operand_equal_p (n0, a0, 0)
12281	       && operand_equal_p (n1, a1, 0))
12282	      || (operand_equal_p (n0, a1, 0)
12283		  && operand_equal_p (n1, a0, 0)))
12284	    return fold_build2_loc (loc, TRUTH_XOR_EXPR, type, l0, n1);
12285	}
12286
12287      if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1))
12288          != NULL_TREE)
12289        return tem;
12290
12291      return NULL_TREE;
12292
12293    case TRUTH_XOR_EXPR:
12294      /* If the second arg is constant zero, drop it.  */
12295      if (integer_zerop (arg1))
12296	return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12297      /* If the second arg is constant true, this is a logical inversion.  */
12298      if (integer_onep (arg1))
12299	{
12300	  tem = invert_truthvalue_loc (loc, arg0);
12301	  return non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
12302	}
12303      /* Identical arguments cancel to zero.  */
12304      if (operand_equal_p (arg0, arg1, 0))
12305	return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12306
12307      /* !X ^ X is always true.  */
12308      if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12309	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12310	return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12311
12312      /* X ^ !X is always true.  */
12313      if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12314	  && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12315	return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12316
12317      return NULL_TREE;
12318
12319    case EQ_EXPR:
12320    case NE_EXPR:
12321      STRIP_NOPS (arg0);
12322      STRIP_NOPS (arg1);
12323
12324      tem = fold_comparison (loc, code, type, op0, op1);
12325      if (tem != NULL_TREE)
12326	return tem;
12327
12328      /* bool_var != 0 becomes bool_var. */
12329      if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12330          && code == NE_EXPR)
12331        return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12332
12333      /* bool_var == 1 becomes bool_var. */
12334      if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12335          && code == EQ_EXPR)
12336        return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12337
12338      /* bool_var != 1 becomes !bool_var. */
12339      if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12340          && code == NE_EXPR)
12341        return fold_convert_loc (loc, type,
12342				 fold_build1_loc (loc, TRUTH_NOT_EXPR,
12343						  TREE_TYPE (arg0), arg0));
12344
12345      /* bool_var == 0 becomes !bool_var. */
12346      if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12347          && code == EQ_EXPR)
12348        return fold_convert_loc (loc, type,
12349				 fold_build1_loc (loc, TRUTH_NOT_EXPR,
12350						  TREE_TYPE (arg0), arg0));
12351
12352      /* !exp != 0 becomes !exp */
12353      if (TREE_CODE (arg0) == TRUTH_NOT_EXPR && integer_zerop (arg1)
12354	  && code == NE_EXPR)
12355        return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12356
12357      /* If this is an equality comparison of the address of two non-weak,
12358	 unaliased symbols neither of which are extern (since we do not
12359	 have access to attributes for externs), then we know the result.  */
12360      if (TREE_CODE (arg0) == ADDR_EXPR
12361	  && DECL_P (TREE_OPERAND (arg0, 0))
12362	  && TREE_CODE (arg1) == ADDR_EXPR
12363	  && DECL_P (TREE_OPERAND (arg1, 0)))
12364	{
12365	  int equal;
12366
12367	  if (decl_in_symtab_p (TREE_OPERAND (arg0, 0))
12368	      && decl_in_symtab_p (TREE_OPERAND (arg1, 0)))
12369	    equal = symtab_node::get_create (TREE_OPERAND (arg0, 0))
12370		    ->equal_address_to (symtab_node::get_create
12371					  (TREE_OPERAND (arg1, 0)));
12372	  else
12373	    equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
12374	  if (equal != 2)
12375	    return constant_boolean_node (equal
12376				          ? code == EQ_EXPR : code != EQ_EXPR,
12377				          type);
12378	}
12379
12380      /* Similarly for a NEGATE_EXPR.  */
12381      if (TREE_CODE (arg0) == NEGATE_EXPR
12382	  && TREE_CODE (arg1) == INTEGER_CST
12383	  && 0 != (tem = negate_expr (fold_convert_loc (loc, TREE_TYPE (arg0),
12384							arg1)))
12385	  && TREE_CODE (tem) == INTEGER_CST
12386	  && !TREE_OVERFLOW (tem))
12387	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12388
12389      /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
12390      if (TREE_CODE (arg0) == BIT_XOR_EXPR
12391	  && TREE_CODE (arg1) == INTEGER_CST
12392	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12393	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12394			    fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg0),
12395					 fold_convert_loc (loc,
12396							   TREE_TYPE (arg0),
12397							   arg1),
12398					 TREE_OPERAND (arg0, 1)));
12399
12400      /* Transform comparisons of the form X +- Y CMP X to Y CMP 0.  */
12401      if ((TREE_CODE (arg0) == PLUS_EXPR
12402	   || TREE_CODE (arg0) == POINTER_PLUS_EXPR
12403	   || TREE_CODE (arg0) == MINUS_EXPR)
12404	  && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
12405									0)),
12406			      arg1, 0)
12407	  && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
12408	      || POINTER_TYPE_P (TREE_TYPE (arg0))))
12409	{
12410	  tree val = TREE_OPERAND (arg0, 1);
12411	  val = fold_build2_loc (loc, code, type, val,
12412				 build_int_cst (TREE_TYPE (val), 0));
12413	  return omit_two_operands_loc (loc, type, val,
12414					TREE_OPERAND (arg0, 0), arg1);
12415	}
12416
12417      /* Transform comparisons of the form X CMP X +- Y to Y CMP 0.  */
12418      if ((TREE_CODE (arg1) == PLUS_EXPR
12419	   || TREE_CODE (arg1) == POINTER_PLUS_EXPR
12420	   || TREE_CODE (arg1) == MINUS_EXPR)
12421	  && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg1,
12422									0)),
12423			      arg0, 0)
12424	  && (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
12425	      || POINTER_TYPE_P (TREE_TYPE (arg1))))
12426	{
12427	  tree val = TREE_OPERAND (arg1, 1);
12428	  val = fold_build2_loc (loc, code, type, val,
12429				 build_int_cst (TREE_TYPE (val), 0));
12430	  return omit_two_operands_loc (loc, type, val,
12431					TREE_OPERAND (arg1, 0), arg0);
12432	}
12433
12434      /* Transform comparisons of the form C - X CMP X if C % 2 == 1.  */
12435      if (TREE_CODE (arg0) == MINUS_EXPR
12436	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
12437	  && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
12438									1)),
12439			      arg1, 0)
12440	  && wi::extract_uhwi (TREE_OPERAND (arg0, 0), 0, 1) == 1)
12441	return omit_two_operands_loc (loc, type,
12442				      code == NE_EXPR
12443				      ? boolean_true_node : boolean_false_node,
12444				      TREE_OPERAND (arg0, 1), arg1);
12445
12446      /* Transform comparisons of the form X CMP C - X if C % 2 == 1.  */
12447      if (TREE_CODE (arg1) == MINUS_EXPR
12448	  && TREE_CODE (TREE_OPERAND (arg1, 0)) == INTEGER_CST
12449	  && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg1,
12450									1)),
12451			      arg0, 0)
12452	  && wi::extract_uhwi (TREE_OPERAND (arg1, 0), 0, 1) == 1)
12453	return omit_two_operands_loc (loc, type,
12454				      code == NE_EXPR
12455				      ? boolean_true_node : boolean_false_node,
12456				      TREE_OPERAND (arg1, 1), arg0);
12457
12458      /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
12459      if (TREE_CODE (arg0) == ABS_EXPR
12460	  && (integer_zerop (arg1) || real_zerop (arg1)))
12461	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), arg1);
12462
12463      /* If this is an EQ or NE comparison with zero and ARG0 is
12464	 (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
12465	 two operations, but the latter can be done in one less insn
12466	 on machines that have only two-operand insns or on which a
12467	 constant cannot be the first operand.  */
12468      if (TREE_CODE (arg0) == BIT_AND_EXPR
12469	  && integer_zerop (arg1))
12470	{
12471	  tree arg00 = TREE_OPERAND (arg0, 0);
12472	  tree arg01 = TREE_OPERAND (arg0, 1);
12473	  if (TREE_CODE (arg00) == LSHIFT_EXPR
12474	      && integer_onep (TREE_OPERAND (arg00, 0)))
12475	    {
12476	      tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg00),
12477				      arg01, TREE_OPERAND (arg00, 1));
12478	      tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12479				 build_int_cst (TREE_TYPE (arg0), 1));
12480	      return fold_build2_loc (loc, code, type,
12481				  fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12482				  arg1);
12483	    }
12484	  else if (TREE_CODE (arg01) == LSHIFT_EXPR
12485		   && integer_onep (TREE_OPERAND (arg01, 0)))
12486	    {
12487	      tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg01),
12488				      arg00, TREE_OPERAND (arg01, 1));
12489	      tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12490				 build_int_cst (TREE_TYPE (arg0), 1));
12491	      return fold_build2_loc (loc, code, type,
12492				  fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12493				  arg1);
12494	    }
12495	}
12496
12497      /* If this is an NE or EQ comparison of zero against the result of a
12498	 signed MOD operation whose second operand is a power of 2, make
12499	 the MOD operation unsigned since it is simpler and equivalent.  */
12500      if (integer_zerop (arg1)
12501	  && !TYPE_UNSIGNED (TREE_TYPE (arg0))
12502	  && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
12503	      || TREE_CODE (arg0) == CEIL_MOD_EXPR
12504	      || TREE_CODE (arg0) == FLOOR_MOD_EXPR
12505	      || TREE_CODE (arg0) == ROUND_MOD_EXPR)
12506	  && integer_pow2p (TREE_OPERAND (arg0, 1)))
12507	{
12508	  tree newtype = unsigned_type_for (TREE_TYPE (arg0));
12509	  tree newmod = fold_build2_loc (loc, TREE_CODE (arg0), newtype,
12510				     fold_convert_loc (loc, newtype,
12511						       TREE_OPERAND (arg0, 0)),
12512				     fold_convert_loc (loc, newtype,
12513						       TREE_OPERAND (arg0, 1)));
12514
12515	  return fold_build2_loc (loc, code, type, newmod,
12516			      fold_convert_loc (loc, newtype, arg1));
12517	}
12518
12519      /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
12520	 C1 is a valid shift constant, and C2 is a power of two, i.e.
12521	 a single bit.  */
12522      if (TREE_CODE (arg0) == BIT_AND_EXPR
12523	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
12524	  && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
12525	     == INTEGER_CST
12526	  && integer_pow2p (TREE_OPERAND (arg0, 1))
12527	  && integer_zerop (arg1))
12528	{
12529	  tree itype = TREE_TYPE (arg0);
12530	  tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
12531	  prec = TYPE_PRECISION (itype);
12532
12533	  /* Check for a valid shift count.  */
12534	  if (wi::ltu_p (arg001, prec))
12535	    {
12536	      tree arg01 = TREE_OPERAND (arg0, 1);
12537	      tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12538	      unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
12539	      /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
12540		 can be rewritten as (X & (C2 << C1)) != 0.  */
12541	      if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
12542		{
12543		  tem = fold_build2_loc (loc, LSHIFT_EXPR, itype, arg01, arg001);
12544		  tem = fold_build2_loc (loc, BIT_AND_EXPR, itype, arg000, tem);
12545		  return fold_build2_loc (loc, code, type, tem,
12546					  fold_convert_loc (loc, itype, arg1));
12547		}
12548	      /* Otherwise, for signed (arithmetic) shifts,
12549		 ((X >> C1) & C2) != 0 is rewritten as X < 0, and
12550		 ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
12551	      else if (!TYPE_UNSIGNED (itype))
12552		return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
12553				    arg000, build_int_cst (itype, 0));
12554	      /* Otherwise, of unsigned (logical) shifts,
12555		 ((X >> C1) & C2) != 0 is rewritten as (X,false), and
12556		 ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
12557	      else
12558		return omit_one_operand_loc (loc, type,
12559					 code == EQ_EXPR ? integer_one_node
12560							 : integer_zero_node,
12561					 arg000);
12562	    }
12563	}
12564
12565      /* If we have (A & C) == C where C is a power of 2, convert this into
12566	 (A & C) != 0.  Similarly for NE_EXPR.  */
12567      if (TREE_CODE (arg0) == BIT_AND_EXPR
12568	  && integer_pow2p (TREE_OPERAND (arg0, 1))
12569	  && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12570	return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12571			    arg0, fold_convert_loc (loc, TREE_TYPE (arg0),
12572						    integer_zero_node));
12573
12574      /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
12575	 bit, then fold the expression into A < 0 or A >= 0.  */
12576      tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, type);
12577      if (tem)
12578	return tem;
12579
12580      /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
12581	 Similarly for NE_EXPR.  */
12582      if (TREE_CODE (arg0) == BIT_AND_EXPR
12583	  && TREE_CODE (arg1) == INTEGER_CST
12584	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12585	{
12586	  tree notc = fold_build1_loc (loc, BIT_NOT_EXPR,
12587				   TREE_TYPE (TREE_OPERAND (arg0, 1)),
12588				   TREE_OPERAND (arg0, 1));
12589	  tree dandnotc
12590	    = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12591			       fold_convert_loc (loc, TREE_TYPE (arg0), arg1),
12592			       notc);
12593	  tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12594	  if (integer_nonzerop (dandnotc))
12595	    return omit_one_operand_loc (loc, type, rslt, arg0);
12596	}
12597
12598      /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
12599	 Similarly for NE_EXPR.  */
12600      if (TREE_CODE (arg0) == BIT_IOR_EXPR
12601	  && TREE_CODE (arg1) == INTEGER_CST
12602	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12603	{
12604	  tree notd = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
12605	  tree candnotd
12606	    = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12607			       TREE_OPERAND (arg0, 1),
12608			       fold_convert_loc (loc, TREE_TYPE (arg0), notd));
12609	  tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12610	  if (integer_nonzerop (candnotd))
12611	    return omit_one_operand_loc (loc, type, rslt, arg0);
12612	}
12613
12614      /* If this is a comparison of a field, we may be able to simplify it.  */
12615      if ((TREE_CODE (arg0) == COMPONENT_REF
12616	   || TREE_CODE (arg0) == BIT_FIELD_REF)
12617	  /* Handle the constant case even without -O
12618	     to make sure the warnings are given.  */
12619	  && (optimize || TREE_CODE (arg1) == INTEGER_CST))
12620	{
12621	  t1 = optimize_bit_field_compare (loc, code, type, arg0, arg1);
12622	  if (t1)
12623	    return t1;
12624	}
12625
12626      /* Optimize comparisons of strlen vs zero to a compare of the
12627	 first character of the string vs zero.  To wit,
12628		strlen(ptr) == 0   =>  *ptr == 0
12629		strlen(ptr) != 0   =>  *ptr != 0
12630	 Other cases should reduce to one of these two (or a constant)
12631	 due to the return value of strlen being unsigned.  */
12632      if (TREE_CODE (arg0) == CALL_EXPR
12633	  && integer_zerop (arg1))
12634	{
12635	  tree fndecl = get_callee_fndecl (arg0);
12636
12637	  if (fndecl
12638	      && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12639	      && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12640	      && call_expr_nargs (arg0) == 1
12641	      && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12642	    {
12643	      tree iref = build_fold_indirect_ref_loc (loc,
12644						   CALL_EXPR_ARG (arg0, 0));
12645	      return fold_build2_loc (loc, code, type, iref,
12646				  build_int_cst (TREE_TYPE (iref), 0));
12647	    }
12648	}
12649
12650      /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12651	 of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12652      if (TREE_CODE (arg0) == RSHIFT_EXPR
12653	  && integer_zerop (arg1)
12654	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12655	{
12656	  tree arg00 = TREE_OPERAND (arg0, 0);
12657	  tree arg01 = TREE_OPERAND (arg0, 1);
12658	  tree itype = TREE_TYPE (arg00);
12659	  if (wi::eq_p (arg01, element_precision (itype) - 1))
12660	    {
12661	      if (TYPE_UNSIGNED (itype))
12662		{
12663		  itype = signed_type_for (itype);
12664		  arg00 = fold_convert_loc (loc, itype, arg00);
12665		}
12666	      return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12667				  type, arg00, build_zero_cst (itype));
12668	    }
12669	}
12670
12671      /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12672      if (integer_zerop (arg1)
12673	  && TREE_CODE (arg0) == BIT_XOR_EXPR)
12674	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12675			    TREE_OPERAND (arg0, 1));
12676
12677      /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12678      if (TREE_CODE (arg0) == BIT_XOR_EXPR
12679	  && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12680	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12681				build_zero_cst (TREE_TYPE (arg0)));
12682      /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12683      if (TREE_CODE (arg0) == BIT_XOR_EXPR
12684	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12685	  && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12686	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1),
12687				build_zero_cst (TREE_TYPE (arg0)));
12688
12689      /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12690      if (TREE_CODE (arg0) == BIT_XOR_EXPR
12691	  && TREE_CODE (arg1) == INTEGER_CST
12692	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12693	return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12694			    fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg1),
12695					 TREE_OPERAND (arg0, 1), arg1));
12696
12697      /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12698	 (X & C) == 0 when C is a single bit.  */
12699      if (TREE_CODE (arg0) == BIT_AND_EXPR
12700	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12701	  && integer_zerop (arg1)
12702	  && integer_pow2p (TREE_OPERAND (arg0, 1)))
12703	{
12704	  tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12705				 TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12706				 TREE_OPERAND (arg0, 1));
12707	  return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12708				  type, tem,
12709				  fold_convert_loc (loc, TREE_TYPE (arg0),
12710						    arg1));
12711	}
12712
12713      /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12714	 constant C is a power of two, i.e. a single bit.  */
12715      if (TREE_CODE (arg0) == BIT_XOR_EXPR
12716	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12717	  && integer_zerop (arg1)
12718	  && integer_pow2p (TREE_OPERAND (arg0, 1))
12719	  && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12720			      TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12721	{
12722	  tree arg00 = TREE_OPERAND (arg0, 0);
12723	  return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12724			      arg00, build_int_cst (TREE_TYPE (arg00), 0));
12725	}
12726
12727      /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12728	 when is C is a power of two, i.e. a single bit.  */
12729      if (TREE_CODE (arg0) == BIT_AND_EXPR
12730	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12731	  && integer_zerop (arg1)
12732	  && integer_pow2p (TREE_OPERAND (arg0, 1))
12733	  && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12734			      TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12735	{
12736	  tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12737	  tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg000),
12738			     arg000, TREE_OPERAND (arg0, 1));
12739	  return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12740			      tem, build_int_cst (TREE_TYPE (tem), 0));
12741	}
12742
12743      if (integer_zerop (arg1)
12744	  && tree_expr_nonzero_p (arg0))
12745        {
12746	  tree res = constant_boolean_node (code==NE_EXPR, type);
12747	  return omit_one_operand_loc (loc, type, res, arg0);
12748	}
12749
12750      /* Fold -X op -Y as X op Y, where op is eq/ne.  */
12751      if (TREE_CODE (arg0) == NEGATE_EXPR
12752          && TREE_CODE (arg1) == NEGATE_EXPR)
12753	return fold_build2_loc (loc, code, type,
12754				TREE_OPERAND (arg0, 0),
12755				fold_convert_loc (loc, TREE_TYPE (arg0),
12756						  TREE_OPERAND (arg1, 0)));
12757
12758      /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
12759      if (TREE_CODE (arg0) == BIT_AND_EXPR
12760	  && TREE_CODE (arg1) == BIT_AND_EXPR)
12761	{
12762	  tree arg00 = TREE_OPERAND (arg0, 0);
12763	  tree arg01 = TREE_OPERAND (arg0, 1);
12764	  tree arg10 = TREE_OPERAND (arg1, 0);
12765	  tree arg11 = TREE_OPERAND (arg1, 1);
12766	  tree itype = TREE_TYPE (arg0);
12767
12768	  if (operand_equal_p (arg01, arg11, 0))
12769	    return fold_build2_loc (loc, code, type,
12770				fold_build2_loc (loc, BIT_AND_EXPR, itype,
12771					     fold_build2_loc (loc,
12772							  BIT_XOR_EXPR, itype,
12773							  arg00, arg10),
12774					     arg01),
12775				build_zero_cst (itype));
12776
12777	  if (operand_equal_p (arg01, arg10, 0))
12778	    return fold_build2_loc (loc, code, type,
12779				fold_build2_loc (loc, BIT_AND_EXPR, itype,
12780					     fold_build2_loc (loc,
12781							  BIT_XOR_EXPR, itype,
12782							  arg00, arg11),
12783					     arg01),
12784				build_zero_cst (itype));
12785
12786	  if (operand_equal_p (arg00, arg11, 0))
12787	    return fold_build2_loc (loc, code, type,
12788				fold_build2_loc (loc, BIT_AND_EXPR, itype,
12789					     fold_build2_loc (loc,
12790							  BIT_XOR_EXPR, itype,
12791							  arg01, arg10),
12792					     arg00),
12793				build_zero_cst (itype));
12794
12795	  if (operand_equal_p (arg00, arg10, 0))
12796	    return fold_build2_loc (loc, code, type,
12797				fold_build2_loc (loc, BIT_AND_EXPR, itype,
12798					     fold_build2_loc (loc,
12799							  BIT_XOR_EXPR, itype,
12800							  arg01, arg11),
12801					     arg00),
12802				build_zero_cst (itype));
12803	}
12804
12805      if (TREE_CODE (arg0) == BIT_XOR_EXPR
12806	  && TREE_CODE (arg1) == BIT_XOR_EXPR)
12807	{
12808	  tree arg00 = TREE_OPERAND (arg0, 0);
12809	  tree arg01 = TREE_OPERAND (arg0, 1);
12810	  tree arg10 = TREE_OPERAND (arg1, 0);
12811	  tree arg11 = TREE_OPERAND (arg1, 1);
12812	  tree itype = TREE_TYPE (arg0);
12813
12814	  /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12815	     operand_equal_p guarantees no side-effects so we don't need
12816	     to use omit_one_operand on Z.  */
12817	  if (operand_equal_p (arg01, arg11, 0))
12818	    return fold_build2_loc (loc, code, type, arg00,
12819				    fold_convert_loc (loc, TREE_TYPE (arg00),
12820						      arg10));
12821	  if (operand_equal_p (arg01, arg10, 0))
12822	    return fold_build2_loc (loc, code, type, arg00,
12823				    fold_convert_loc (loc, TREE_TYPE (arg00),
12824						      arg11));
12825	  if (operand_equal_p (arg00, arg11, 0))
12826	    return fold_build2_loc (loc, code, type, arg01,
12827				    fold_convert_loc (loc, TREE_TYPE (arg01),
12828						      arg10));
12829	  if (operand_equal_p (arg00, arg10, 0))
12830	    return fold_build2_loc (loc, code, type, arg01,
12831				    fold_convert_loc (loc, TREE_TYPE (arg01),
12832						      arg11));
12833
12834	  /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12835	  if (TREE_CODE (arg01) == INTEGER_CST
12836	      && TREE_CODE (arg11) == INTEGER_CST)
12837	    {
12838	      tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg01,
12839				     fold_convert_loc (loc, itype, arg11));
12840	      tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg00, tem);
12841	      return fold_build2_loc (loc, code, type, tem,
12842				      fold_convert_loc (loc, itype, arg10));
12843	    }
12844	}
12845
12846      /* Attempt to simplify equality/inequality comparisons of complex
12847	 values.  Only lower the comparison if the result is known or
12848	 can be simplified to a single scalar comparison.  */
12849      if ((TREE_CODE (arg0) == COMPLEX_EXPR
12850	   || TREE_CODE (arg0) == COMPLEX_CST)
12851	  && (TREE_CODE (arg1) == COMPLEX_EXPR
12852	      || TREE_CODE (arg1) == COMPLEX_CST))
12853	{
12854	  tree real0, imag0, real1, imag1;
12855	  tree rcond, icond;
12856
12857	  if (TREE_CODE (arg0) == COMPLEX_EXPR)
12858	    {
12859	      real0 = TREE_OPERAND (arg0, 0);
12860	      imag0 = TREE_OPERAND (arg0, 1);
12861	    }
12862	  else
12863	    {
12864	      real0 = TREE_REALPART (arg0);
12865	      imag0 = TREE_IMAGPART (arg0);
12866	    }
12867
12868	  if (TREE_CODE (arg1) == COMPLEX_EXPR)
12869	    {
12870	      real1 = TREE_OPERAND (arg1, 0);
12871	      imag1 = TREE_OPERAND (arg1, 1);
12872	    }
12873	  else
12874	    {
12875	      real1 = TREE_REALPART (arg1);
12876	      imag1 = TREE_IMAGPART (arg1);
12877	    }
12878
12879	  rcond = fold_binary_loc (loc, code, type, real0, real1);
12880	  if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12881	    {
12882	      if (integer_zerop (rcond))
12883		{
12884		  if (code == EQ_EXPR)
12885		    return omit_two_operands_loc (loc, type, boolean_false_node,
12886					      imag0, imag1);
12887		  return fold_build2_loc (loc, NE_EXPR, type, imag0, imag1);
12888		}
12889	      else
12890		{
12891		  if (code == NE_EXPR)
12892		    return omit_two_operands_loc (loc, type, boolean_true_node,
12893					      imag0, imag1);
12894		  return fold_build2_loc (loc, EQ_EXPR, type, imag0, imag1);
12895		}
12896	    }
12897
12898	  icond = fold_binary_loc (loc, code, type, imag0, imag1);
12899	  if (icond && TREE_CODE (icond) == INTEGER_CST)
12900	    {
12901	      if (integer_zerop (icond))
12902		{
12903		  if (code == EQ_EXPR)
12904		    return omit_two_operands_loc (loc, type, boolean_false_node,
12905					      real0, real1);
12906		  return fold_build2_loc (loc, NE_EXPR, type, real0, real1);
12907		}
12908	      else
12909		{
12910		  if (code == NE_EXPR)
12911		    return omit_two_operands_loc (loc, type, boolean_true_node,
12912					      real0, real1);
12913		  return fold_build2_loc (loc, EQ_EXPR, type, real0, real1);
12914		}
12915	    }
12916	}
12917
12918      return NULL_TREE;
12919
12920    case LT_EXPR:
12921    case GT_EXPR:
12922    case LE_EXPR:
12923    case GE_EXPR:
12924      tem = fold_comparison (loc, code, type, op0, op1);
12925      if (tem != NULL_TREE)
12926	return tem;
12927
12928      /* Transform comparisons of the form X +- C CMP X.  */
12929      if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12930	  && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12931	  && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12932	       && !HONOR_SNANS (arg0))
12933	      || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12934		  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12935	{
12936	  tree arg01 = TREE_OPERAND (arg0, 1);
12937	  enum tree_code code0 = TREE_CODE (arg0);
12938	  int is_positive;
12939
12940	  if (TREE_CODE (arg01) == REAL_CST)
12941	    is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12942	  else
12943	    is_positive = tree_int_cst_sgn (arg01);
12944
12945	  /* (X - c) > X becomes false.  */
12946	  if (code == GT_EXPR
12947	      && ((code0 == MINUS_EXPR && is_positive >= 0)
12948		  || (code0 == PLUS_EXPR && is_positive <= 0)))
12949	    {
12950	      if (TREE_CODE (arg01) == INTEGER_CST
12951		  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12952		fold_overflow_warning (("assuming signed overflow does not "
12953					"occur when assuming that (X - c) > X "
12954					"is always false"),
12955				       WARN_STRICT_OVERFLOW_ALL);
12956	      return constant_boolean_node (0, type);
12957	    }
12958
12959	  /* Likewise (X + c) < X becomes false.  */
12960	  if (code == LT_EXPR
12961	      && ((code0 == PLUS_EXPR && is_positive >= 0)
12962		  || (code0 == MINUS_EXPR && is_positive <= 0)))
12963	    {
12964	      if (TREE_CODE (arg01) == INTEGER_CST
12965		  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12966		fold_overflow_warning (("assuming signed overflow does not "
12967					"occur when assuming that "
12968					"(X + c) < X is always false"),
12969				       WARN_STRICT_OVERFLOW_ALL);
12970	      return constant_boolean_node (0, type);
12971	    }
12972
12973	  /* Convert (X - c) <= X to true.  */
12974	  if (!HONOR_NANS (arg1)
12975	      && code == LE_EXPR
12976	      && ((code0 == MINUS_EXPR && is_positive >= 0)
12977		  || (code0 == PLUS_EXPR && is_positive <= 0)))
12978	    {
12979	      if (TREE_CODE (arg01) == INTEGER_CST
12980		  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12981		fold_overflow_warning (("assuming signed overflow does not "
12982					"occur when assuming that "
12983					"(X - c) <= X is always true"),
12984				       WARN_STRICT_OVERFLOW_ALL);
12985	      return constant_boolean_node (1, type);
12986	    }
12987
12988	  /* Convert (X + c) >= X to true.  */
12989	  if (!HONOR_NANS (arg1)
12990	      && code == GE_EXPR
12991	      && ((code0 == PLUS_EXPR && is_positive >= 0)
12992		  || (code0 == MINUS_EXPR && is_positive <= 0)))
12993	    {
12994	      if (TREE_CODE (arg01) == INTEGER_CST
12995		  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12996		fold_overflow_warning (("assuming signed overflow does not "
12997					"occur when assuming that "
12998					"(X + c) >= X is always true"),
12999				       WARN_STRICT_OVERFLOW_ALL);
13000	      return constant_boolean_node (1, type);
13001	    }
13002
13003	  if (TREE_CODE (arg01) == INTEGER_CST)
13004	    {
13005	      /* Convert X + c > X and X - c < X to true for integers.  */
13006	      if (code == GT_EXPR
13007	          && ((code0 == PLUS_EXPR && is_positive > 0)
13008		      || (code0 == MINUS_EXPR && is_positive < 0)))
13009		{
13010		  if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13011		    fold_overflow_warning (("assuming signed overflow does "
13012					    "not occur when assuming that "
13013					    "(X + c) > X is always true"),
13014					   WARN_STRICT_OVERFLOW_ALL);
13015		  return constant_boolean_node (1, type);
13016		}
13017
13018	      if (code == LT_EXPR
13019	          && ((code0 == MINUS_EXPR && is_positive > 0)
13020		      || (code0 == PLUS_EXPR && is_positive < 0)))
13021		{
13022		  if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13023		    fold_overflow_warning (("assuming signed overflow does "
13024					    "not occur when assuming that "
13025					    "(X - c) < X is always true"),
13026					   WARN_STRICT_OVERFLOW_ALL);
13027		  return constant_boolean_node (1, type);
13028		}
13029
13030	      /* Convert X + c <= X and X - c >= X to false for integers.  */
13031	      if (code == LE_EXPR
13032	          && ((code0 == PLUS_EXPR && is_positive > 0)
13033		      || (code0 == MINUS_EXPR && is_positive < 0)))
13034		{
13035		  if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13036		    fold_overflow_warning (("assuming signed overflow does "
13037					    "not occur when assuming that "
13038					    "(X + c) <= X is always false"),
13039					   WARN_STRICT_OVERFLOW_ALL);
13040		  return constant_boolean_node (0, type);
13041		}
13042
13043	      if (code == GE_EXPR
13044	          && ((code0 == MINUS_EXPR && is_positive > 0)
13045		      || (code0 == PLUS_EXPR && is_positive < 0)))
13046		{
13047		  if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
13048		    fold_overflow_warning (("assuming signed overflow does "
13049					    "not occur when assuming that "
13050					    "(X - c) >= X is always false"),
13051					   WARN_STRICT_OVERFLOW_ALL);
13052		  return constant_boolean_node (0, type);
13053		}
13054	    }
13055	}
13056
13057      /* Comparisons with the highest or lowest possible integer of
13058	 the specified precision will have known values.  */
13059      {
13060	tree arg1_type = TREE_TYPE (arg1);
13061	unsigned int prec = TYPE_PRECISION (arg1_type);
13062
13063	if (TREE_CODE (arg1) == INTEGER_CST
13064	    && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
13065	  {
13066	    wide_int max = wi::max_value (arg1_type);
13067	    wide_int signed_max = wi::max_value (prec, SIGNED);
13068	    wide_int min = wi::min_value (arg1_type);
13069
13070	    if (wi::eq_p (arg1, max))
13071	      switch (code)
13072		{
13073		case GT_EXPR:
13074		  return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13075
13076		case GE_EXPR:
13077		  return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13078
13079		case LE_EXPR:
13080		  return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13081
13082		case LT_EXPR:
13083		  return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13084
13085		/* The GE_EXPR and LT_EXPR cases above are not normally
13086		   reached because of previous transformations.  */
13087
13088		default:
13089		  break;
13090		}
13091	    else if (wi::eq_p (arg1, max - 1))
13092	      switch (code)
13093		{
13094		case GT_EXPR:
13095		  arg1 = const_binop (PLUS_EXPR, arg1,
13096				      build_int_cst (TREE_TYPE (arg1), 1));
13097		  return fold_build2_loc (loc, EQ_EXPR, type,
13098				      fold_convert_loc (loc,
13099							TREE_TYPE (arg1), arg0),
13100				      arg1);
13101		case LE_EXPR:
13102		  arg1 = const_binop (PLUS_EXPR, arg1,
13103				      build_int_cst (TREE_TYPE (arg1), 1));
13104		  return fold_build2_loc (loc, NE_EXPR, type,
13105				      fold_convert_loc (loc, TREE_TYPE (arg1),
13106							arg0),
13107				      arg1);
13108		default:
13109		  break;
13110		}
13111	    else if (wi::eq_p (arg1, min))
13112	      switch (code)
13113		{
13114		case LT_EXPR:
13115		  return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13116
13117		case LE_EXPR:
13118		  return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13119
13120		case GE_EXPR:
13121		  return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13122
13123		case GT_EXPR:
13124		  return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13125
13126		default:
13127		  break;
13128		}
13129	    else if (wi::eq_p (arg1, min + 1))
13130	      switch (code)
13131		{
13132		case GE_EXPR:
13133		  arg1 = const_binop (MINUS_EXPR, arg1,
13134				      build_int_cst (TREE_TYPE (arg1), 1));
13135		  return fold_build2_loc (loc, NE_EXPR, type,
13136				      fold_convert_loc (loc,
13137							TREE_TYPE (arg1), arg0),
13138				      arg1);
13139		case LT_EXPR:
13140		  arg1 = const_binop (MINUS_EXPR, arg1,
13141				      build_int_cst (TREE_TYPE (arg1), 1));
13142		  return fold_build2_loc (loc, EQ_EXPR, type,
13143				      fold_convert_loc (loc, TREE_TYPE (arg1),
13144							arg0),
13145				      arg1);
13146		default:
13147		  break;
13148		}
13149
13150	    else if (wi::eq_p (arg1, signed_max)
13151		     && TYPE_UNSIGNED (arg1_type)
13152		     /* We will flip the signedness of the comparison operator
13153			associated with the mode of arg1, so the sign bit is
13154			specified by this mode.  Check that arg1 is the signed
13155			max associated with this sign bit.  */
13156		     && prec == GET_MODE_PRECISION (TYPE_MODE (arg1_type))
13157		     /* signed_type does not work on pointer types.  */
13158		     && INTEGRAL_TYPE_P (arg1_type))
13159	      {
13160		/* The following case also applies to X < signed_max+1
13161		   and X >= signed_max+1 because previous transformations.  */
13162		if (code == LE_EXPR || code == GT_EXPR)
13163		  {
13164		    tree st = signed_type_for (arg1_type);
13165		    return fold_build2_loc (loc,
13166					code == LE_EXPR ? GE_EXPR : LT_EXPR,
13167					type, fold_convert_loc (loc, st, arg0),
13168					build_int_cst (st, 0));
13169		  }
13170	      }
13171	  }
13172      }
13173
13174      /* If we are comparing an ABS_EXPR with a constant, we can
13175	 convert all the cases into explicit comparisons, but they may
13176	 well not be faster than doing the ABS and one comparison.
13177	 But ABS (X) <= C is a range comparison, which becomes a subtraction
13178	 and a comparison, and is probably faster.  */
13179      if (code == LE_EXPR
13180	  && TREE_CODE (arg1) == INTEGER_CST
13181	  && TREE_CODE (arg0) == ABS_EXPR
13182	  && ! TREE_SIDE_EFFECTS (arg0)
13183	  && (0 != (tem = negate_expr (arg1)))
13184	  && TREE_CODE (tem) == INTEGER_CST
13185	  && !TREE_OVERFLOW (tem))
13186	return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13187			    build2 (GE_EXPR, type,
13188				    TREE_OPERAND (arg0, 0), tem),
13189			    build2 (LE_EXPR, type,
13190				    TREE_OPERAND (arg0, 0), arg1));
13191
13192      /* Convert ABS_EXPR<x> >= 0 to true.  */
13193      strict_overflow_p = false;
13194      if (code == GE_EXPR
13195	  && (integer_zerop (arg1)
13196	      || (! HONOR_NANS (arg0)
13197		  && real_zerop (arg1)))
13198	  && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13199	{
13200	  if (strict_overflow_p)
13201	    fold_overflow_warning (("assuming signed overflow does not occur "
13202				    "when simplifying comparison of "
13203				    "absolute value and zero"),
13204				   WARN_STRICT_OVERFLOW_CONDITIONAL);
13205	  return omit_one_operand_loc (loc, type,
13206				       constant_boolean_node (true, type),
13207				       arg0);
13208	}
13209
13210      /* Convert ABS_EXPR<x> < 0 to false.  */
13211      strict_overflow_p = false;
13212      if (code == LT_EXPR
13213	  && (integer_zerop (arg1) || real_zerop (arg1))
13214	  && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13215	{
13216	  if (strict_overflow_p)
13217	    fold_overflow_warning (("assuming signed overflow does not occur "
13218				    "when simplifying comparison of "
13219				    "absolute value and zero"),
13220				   WARN_STRICT_OVERFLOW_CONDITIONAL);
13221	  return omit_one_operand_loc (loc, type,
13222				       constant_boolean_node (false, type),
13223				       arg0);
13224	}
13225
13226      /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
13227	 and similarly for >= into !=.  */
13228      if ((code == LT_EXPR || code == GE_EXPR)
13229	  && TYPE_UNSIGNED (TREE_TYPE (arg0))
13230	  && TREE_CODE (arg1) == LSHIFT_EXPR
13231	  && integer_onep (TREE_OPERAND (arg1, 0)))
13232	return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13233			   build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13234				   TREE_OPERAND (arg1, 1)),
13235			   build_zero_cst (TREE_TYPE (arg0)));
13236
13237      /* Similarly for X < (cast) (1 << Y).  But cast can't be narrowing,
13238	 otherwise Y might be >= # of bits in X's type and thus e.g.
13239	 (unsigned char) (1 << Y) for Y 15 might be 0.
13240	 If the cast is widening, then 1 << Y should have unsigned type,
13241	 otherwise if Y is number of bits in the signed shift type minus 1,
13242	 we can't optimize this.  E.g. (unsigned long long) (1 << Y) for Y
13243	 31 might be 0xffffffff80000000.  */
13244      if ((code == LT_EXPR || code == GE_EXPR)
13245	  && TYPE_UNSIGNED (TREE_TYPE (arg0))
13246	  && CONVERT_EXPR_P (arg1)
13247	  && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
13248	  && (element_precision (TREE_TYPE (arg1))
13249	      >= element_precision (TREE_TYPE (TREE_OPERAND (arg1, 0))))
13250	  && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0)))
13251	      || (element_precision (TREE_TYPE (arg1))
13252		  == element_precision (TREE_TYPE (TREE_OPERAND (arg1, 0)))))
13253	  && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
13254	{
13255	  tem = build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13256			TREE_OPERAND (TREE_OPERAND (arg1, 0), 1));
13257	  return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13258			     fold_convert_loc (loc, TREE_TYPE (arg0), tem),
13259			     build_zero_cst (TREE_TYPE (arg0)));
13260	}
13261
13262      return NULL_TREE;
13263
13264    case UNORDERED_EXPR:
13265    case ORDERED_EXPR:
13266    case UNLT_EXPR:
13267    case UNLE_EXPR:
13268    case UNGT_EXPR:
13269    case UNGE_EXPR:
13270    case UNEQ_EXPR:
13271    case LTGT_EXPR:
13272      if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
13273	{
13274	  t1 = fold_relational_const (code, type, arg0, arg1);
13275	  if (t1 != NULL_TREE)
13276	    return t1;
13277	}
13278
13279      /* If the first operand is NaN, the result is constant.  */
13280      if (TREE_CODE (arg0) == REAL_CST
13281	  && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
13282	  && (code != LTGT_EXPR || ! flag_trapping_math))
13283	{
13284	  t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13285	       ? integer_zero_node
13286	       : integer_one_node;
13287	  return omit_one_operand_loc (loc, type, t1, arg1);
13288	}
13289
13290      /* If the second operand is NaN, the result is constant.  */
13291      if (TREE_CODE (arg1) == REAL_CST
13292	  && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
13293	  && (code != LTGT_EXPR || ! flag_trapping_math))
13294	{
13295	  t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13296	       ? integer_zero_node
13297	       : integer_one_node;
13298	  return omit_one_operand_loc (loc, type, t1, arg0);
13299	}
13300
13301      /* Simplify unordered comparison of something with itself.  */
13302      if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
13303	  && operand_equal_p (arg0, arg1, 0))
13304	return constant_boolean_node (1, type);
13305
13306      if (code == LTGT_EXPR
13307	  && !flag_trapping_math
13308	  && operand_equal_p (arg0, arg1, 0))
13309	return constant_boolean_node (0, type);
13310
13311      /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
13312      {
13313	tree targ0 = strip_float_extensions (arg0);
13314	tree targ1 = strip_float_extensions (arg1);
13315	tree newtype = TREE_TYPE (targ0);
13316
13317	if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
13318	  newtype = TREE_TYPE (targ1);
13319
13320	if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
13321	  return fold_build2_loc (loc, code, type,
13322			      fold_convert_loc (loc, newtype, targ0),
13323			      fold_convert_loc (loc, newtype, targ1));
13324      }
13325
13326      return NULL_TREE;
13327
13328    case COMPOUND_EXPR:
13329      /* When pedantic, a compound expression can be neither an lvalue
13330	 nor an integer constant expression.  */
13331      if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
13332	return NULL_TREE;
13333      /* Don't let (0, 0) be null pointer constant.  */
13334      tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
13335				 : fold_convert_loc (loc, type, arg1);
13336      return pedantic_non_lvalue_loc (loc, tem);
13337
13338    case ASSERT_EXPR:
13339      /* An ASSERT_EXPR should never be passed to fold_binary.  */
13340      gcc_unreachable ();
13341
13342    default:
13343      return NULL_TREE;
13344    } /* switch (code) */
13345}
13346
13347/* Callback for walk_tree, looking for LABEL_EXPR.  Return *TP if it is
13348   a LABEL_EXPR; otherwise return NULL_TREE.  Do not check the subtrees
13349   of GOTO_EXPR.  */
13350
13351static tree
13352contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
13353{
13354  switch (TREE_CODE (*tp))
13355    {
13356    case LABEL_EXPR:
13357      return *tp;
13358
13359    case GOTO_EXPR:
13360      *walk_subtrees = 0;
13361
13362      /* ... fall through ...  */
13363
13364    default:
13365      return NULL_TREE;
13366    }
13367}
13368
13369/* Return whether the sub-tree ST contains a label which is accessible from
13370   outside the sub-tree.  */
13371
13372static bool
13373contains_label_p (tree st)
13374{
13375  return
13376   (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE);
13377}
13378
13379/* Fold a ternary expression of code CODE and type TYPE with operands
13380   OP0, OP1, and OP2.  Return the folded expression if folding is
13381   successful.  Otherwise, return NULL_TREE.  */
13382
13383tree
13384fold_ternary_loc (location_t loc, enum tree_code code, tree type,
13385		  tree op0, tree op1, tree op2)
13386{
13387  tree tem;
13388  tree arg0 = NULL_TREE, arg1 = NULL_TREE, arg2 = NULL_TREE;
13389  enum tree_code_class kind = TREE_CODE_CLASS (code);
13390
13391  gcc_assert (IS_EXPR_CODE_CLASS (kind)
13392	      && TREE_CODE_LENGTH (code) == 3);
13393
13394  /* If this is a commutative operation, and OP0 is a constant, move it
13395     to OP1 to reduce the number of tests below.  */
13396  if (commutative_ternary_tree_code (code)
13397      && tree_swap_operands_p (op0, op1, true))
13398    return fold_build3_loc (loc, code, type, op1, op0, op2);
13399
13400  tem = generic_simplify (loc, code, type, op0, op1, op2);
13401  if (tem)
13402    return tem;
13403
13404  /* Strip any conversions that don't change the mode.  This is safe
13405     for every expression, except for a comparison expression because
13406     its signedness is derived from its operands.  So, in the latter
13407     case, only strip conversions that don't change the signedness.
13408
13409     Note that this is done as an internal manipulation within the
13410     constant folder, in order to find the simplest representation of
13411     the arguments so that their form can be studied.  In any cases,
13412     the appropriate type conversions should be put back in the tree
13413     that will get out of the constant folder.  */
13414  if (op0)
13415    {
13416      arg0 = op0;
13417      STRIP_NOPS (arg0);
13418    }
13419
13420  if (op1)
13421    {
13422      arg1 = op1;
13423      STRIP_NOPS (arg1);
13424    }
13425
13426  if (op2)
13427    {
13428      arg2 = op2;
13429      STRIP_NOPS (arg2);
13430    }
13431
13432  switch (code)
13433    {
13434    case COMPONENT_REF:
13435      if (TREE_CODE (arg0) == CONSTRUCTOR
13436	  && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
13437	{
13438	  unsigned HOST_WIDE_INT idx;
13439	  tree field, value;
13440	  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
13441	    if (field == arg1)
13442	      return value;
13443	}
13444      return NULL_TREE;
13445
13446    case COND_EXPR:
13447    case VEC_COND_EXPR:
13448      /* Pedantic ANSI C says that a conditional expression is never an lvalue,
13449	 so all simple results must be passed through pedantic_non_lvalue.  */
13450      if (TREE_CODE (arg0) == INTEGER_CST)
13451	{
13452	  tree unused_op = integer_zerop (arg0) ? op1 : op2;
13453	  tem = integer_zerop (arg0) ? op2 : op1;
13454	  /* Only optimize constant conditions when the selected branch
13455	     has the same type as the COND_EXPR.  This avoids optimizing
13456             away "c ? x : throw", where the throw has a void type.
13457             Avoid throwing away that operand which contains label.  */
13458          if ((!TREE_SIDE_EFFECTS (unused_op)
13459               || !contains_label_p (unused_op))
13460              && (! VOID_TYPE_P (TREE_TYPE (tem))
13461                  || VOID_TYPE_P (type)))
13462	    return pedantic_non_lvalue_loc (loc, tem);
13463	  return NULL_TREE;
13464	}
13465      else if (TREE_CODE (arg0) == VECTOR_CST)
13466	{
13467	  if ((TREE_CODE (arg1) == VECTOR_CST
13468	       || TREE_CODE (arg1) == CONSTRUCTOR)
13469	      && (TREE_CODE (arg2) == VECTOR_CST
13470		  || TREE_CODE (arg2) == CONSTRUCTOR))
13471	    {
13472	      unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
13473	      unsigned char *sel = XALLOCAVEC (unsigned char, nelts);
13474	      gcc_assert (nelts == VECTOR_CST_NELTS (arg0));
13475	      for (i = 0; i < nelts; i++)
13476		{
13477		  tree val = VECTOR_CST_ELT (arg0, i);
13478		  if (integer_all_onesp (val))
13479		    sel[i] = i;
13480		  else if (integer_zerop (val))
13481		    sel[i] = nelts + i;
13482		  else /* Currently unreachable.  */
13483		    return NULL_TREE;
13484		}
13485	      tree t = fold_vec_perm (type, arg1, arg2, sel);
13486	      if (t != NULL_TREE)
13487		return t;
13488	    }
13489	}
13490
13491      /* If we have A op B ? A : C, we may be able to convert this to a
13492	 simpler expression, depending on the operation and the values
13493	 of B and C.  Signed zeros prevent all of these transformations,
13494	 for reasons given above each one.
13495
13496         Also try swapping the arguments and inverting the conditional.  */
13497      if (COMPARISON_CLASS_P (arg0)
13498	  && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13499					     arg1, TREE_OPERAND (arg0, 1))
13500	  && !HONOR_SIGNED_ZEROS (element_mode (arg1)))
13501	{
13502	  tem = fold_cond_expr_with_comparison (loc, type, arg0, op1, op2);
13503	  if (tem)
13504	    return tem;
13505	}
13506
13507      if (COMPARISON_CLASS_P (arg0)
13508	  && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13509					     op2,
13510					     TREE_OPERAND (arg0, 1))
13511	  && !HONOR_SIGNED_ZEROS (element_mode (op2)))
13512	{
13513	  location_t loc0 = expr_location_or (arg0, loc);
13514	  tem = fold_invert_truthvalue (loc0, arg0);
13515	  if (tem && COMPARISON_CLASS_P (tem))
13516	    {
13517	      tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1);
13518	      if (tem)
13519		return tem;
13520	    }
13521	}
13522
13523      /* If the second operand is simpler than the third, swap them
13524	 since that produces better jump optimization results.  */
13525      if (truth_value_p (TREE_CODE (arg0))
13526	  && tree_swap_operands_p (op1, op2, false))
13527	{
13528	  location_t loc0 = expr_location_or (arg0, loc);
13529	  /* See if this can be inverted.  If it can't, possibly because
13530	     it was a floating-point inequality comparison, don't do
13531	     anything.  */
13532	  tem = fold_invert_truthvalue (loc0, arg0);
13533	  if (tem)
13534	    return fold_build3_loc (loc, code, type, tem, op2, op1);
13535	}
13536
13537      /* Convert A ? 1 : 0 to simply A.  */
13538      if ((code == VEC_COND_EXPR ? integer_all_onesp (op1)
13539				 : (integer_onep (op1)
13540				    && !VECTOR_TYPE_P (type)))
13541	  && integer_zerop (op2)
13542	  /* If we try to convert OP0 to our type, the
13543	     call to fold will try to move the conversion inside
13544	     a COND, which will recurse.  In that case, the COND_EXPR
13545	     is probably the best choice, so leave it alone.  */
13546	  && type == TREE_TYPE (arg0))
13547	return pedantic_non_lvalue_loc (loc, arg0);
13548
13549      /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
13550	 over COND_EXPR in cases such as floating point comparisons.  */
13551      if (integer_zerop (op1)
13552	  && (code == VEC_COND_EXPR ? integer_all_onesp (op2)
13553				    : (integer_onep (op2)
13554				       && !VECTOR_TYPE_P (type)))
13555	  && truth_value_p (TREE_CODE (arg0)))
13556	return pedantic_non_lvalue_loc (loc,
13557				    fold_convert_loc (loc, type,
13558					      invert_truthvalue_loc (loc,
13559								     arg0)));
13560
13561      /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
13562      if (TREE_CODE (arg0) == LT_EXPR
13563	  && integer_zerop (TREE_OPERAND (arg0, 1))
13564	  && integer_zerop (op2)
13565	  && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
13566	{
13567	  /* sign_bit_p looks through both zero and sign extensions,
13568	     but for this optimization only sign extensions are
13569	     usable.  */
13570	  tree tem2 = TREE_OPERAND (arg0, 0);
13571	  while (tem != tem2)
13572	    {
13573	      if (TREE_CODE (tem2) != NOP_EXPR
13574		  || TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (tem2, 0))))
13575		{
13576		  tem = NULL_TREE;
13577		  break;
13578		}
13579	      tem2 = TREE_OPERAND (tem2, 0);
13580	    }
13581	  /* sign_bit_p only checks ARG1 bits within A's precision.
13582	     If <sign bit of A> has wider type than A, bits outside
13583	     of A's precision in <sign bit of A> need to be checked.
13584	     If they are all 0, this optimization needs to be done
13585	     in unsigned A's type, if they are all 1 in signed A's type,
13586	     otherwise this can't be done.  */
13587	  if (tem
13588	      && TYPE_PRECISION (TREE_TYPE (tem))
13589		 < TYPE_PRECISION (TREE_TYPE (arg1))
13590	      && TYPE_PRECISION (TREE_TYPE (tem))
13591		 < TYPE_PRECISION (type))
13592	    {
13593	      int inner_width, outer_width;
13594	      tree tem_type;
13595
13596	      inner_width = TYPE_PRECISION (TREE_TYPE (tem));
13597	      outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
13598	      if (outer_width > TYPE_PRECISION (type))
13599		outer_width = TYPE_PRECISION (type);
13600
13601	      wide_int mask = wi::shifted_mask
13602		(inner_width, outer_width - inner_width, false,
13603		 TYPE_PRECISION (TREE_TYPE (arg1)));
13604
13605	      wide_int common = mask & arg1;
13606	      if (common == mask)
13607		{
13608		  tem_type = signed_type_for (TREE_TYPE (tem));
13609		  tem = fold_convert_loc (loc, tem_type, tem);
13610		}
13611	      else if (common == 0)
13612		{
13613		  tem_type = unsigned_type_for (TREE_TYPE (tem));
13614		  tem = fold_convert_loc (loc, tem_type, tem);
13615		}
13616	      else
13617		tem = NULL;
13618	    }
13619
13620	  if (tem)
13621	    return
13622	      fold_convert_loc (loc, type,
13623				fold_build2_loc (loc, BIT_AND_EXPR,
13624					     TREE_TYPE (tem), tem,
13625					     fold_convert_loc (loc,
13626							       TREE_TYPE (tem),
13627							       arg1)));
13628	}
13629
13630      /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
13631	 already handled above.  */
13632      if (TREE_CODE (arg0) == BIT_AND_EXPR
13633	  && integer_onep (TREE_OPERAND (arg0, 1))
13634	  && integer_zerop (op2)
13635	  && integer_pow2p (arg1))
13636	{
13637	  tree tem = TREE_OPERAND (arg0, 0);
13638	  STRIP_NOPS (tem);
13639	  if (TREE_CODE (tem) == RSHIFT_EXPR
13640	      && tree_fits_uhwi_p (TREE_OPERAND (tem, 1))
13641              && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13642	         tree_to_uhwi (TREE_OPERAND (tem, 1)))
13643	    return fold_build2_loc (loc, BIT_AND_EXPR, type,
13644				TREE_OPERAND (tem, 0), arg1);
13645	}
13646
13647      /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13648	 is probably obsolete because the first operand should be a
13649	 truth value (that's why we have the two cases above), but let's
13650	 leave it in until we can confirm this for all front-ends.  */
13651      if (integer_zerop (op2)
13652	  && TREE_CODE (arg0) == NE_EXPR
13653	  && integer_zerop (TREE_OPERAND (arg0, 1))
13654	  && integer_pow2p (arg1)
13655	  && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13656	  && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13657			      arg1, OEP_ONLY_CONST))
13658	return pedantic_non_lvalue_loc (loc,
13659				    fold_convert_loc (loc, type,
13660						      TREE_OPERAND (arg0, 0)));
13661
13662      /* Disable the transformations below for vectors, since
13663	 fold_binary_op_with_conditional_arg may undo them immediately,
13664	 yielding an infinite loop.  */
13665      if (code == VEC_COND_EXPR)
13666	return NULL_TREE;
13667
13668      /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13669      if (integer_zerop (op2)
13670	  && truth_value_p (TREE_CODE (arg0))
13671	  && truth_value_p (TREE_CODE (arg1))
13672	  && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13673	return fold_build2_loc (loc, code == VEC_COND_EXPR ? BIT_AND_EXPR
13674							   : TRUTH_ANDIF_EXPR,
13675				type, fold_convert_loc (loc, type, arg0), arg1);
13676
13677      /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13678      if (code == VEC_COND_EXPR ? integer_all_onesp (op2) : integer_onep (op2)
13679	  && truth_value_p (TREE_CODE (arg0))
13680	  && truth_value_p (TREE_CODE (arg1))
13681	  && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13682	{
13683	  location_t loc0 = expr_location_or (arg0, loc);
13684	  /* Only perform transformation if ARG0 is easily inverted.  */
13685	  tem = fold_invert_truthvalue (loc0, arg0);
13686	  if (tem)
13687	    return fold_build2_loc (loc, code == VEC_COND_EXPR
13688					 ? BIT_IOR_EXPR
13689					 : TRUTH_ORIF_EXPR,
13690				    type, fold_convert_loc (loc, type, tem),
13691				    arg1);
13692	}
13693
13694      /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13695      if (integer_zerop (arg1)
13696	  && truth_value_p (TREE_CODE (arg0))
13697	  && truth_value_p (TREE_CODE (op2))
13698	  && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13699	{
13700	  location_t loc0 = expr_location_or (arg0, loc);
13701	  /* Only perform transformation if ARG0 is easily inverted.  */
13702	  tem = fold_invert_truthvalue (loc0, arg0);
13703	  if (tem)
13704	    return fold_build2_loc (loc, code == VEC_COND_EXPR
13705					 ? BIT_AND_EXPR : TRUTH_ANDIF_EXPR,
13706				    type, fold_convert_loc (loc, type, tem),
13707				    op2);
13708	}
13709
13710      /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13711      if (code == VEC_COND_EXPR ? integer_all_onesp (arg1) : integer_onep (arg1)
13712	  && truth_value_p (TREE_CODE (arg0))
13713	  && truth_value_p (TREE_CODE (op2))
13714	  && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13715	return fold_build2_loc (loc, code == VEC_COND_EXPR
13716				     ? BIT_IOR_EXPR : TRUTH_ORIF_EXPR,
13717				type, fold_convert_loc (loc, type, arg0), op2);
13718
13719      return NULL_TREE;
13720
13721    case CALL_EXPR:
13722      /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13723	 of fold_ternary on them.  */
13724      gcc_unreachable ();
13725
13726    case BIT_FIELD_REF:
13727      if ((TREE_CODE (arg0) == VECTOR_CST
13728	   || (TREE_CODE (arg0) == CONSTRUCTOR
13729	       && TREE_CODE (TREE_TYPE (arg0)) == VECTOR_TYPE))
13730	  && (type == TREE_TYPE (TREE_TYPE (arg0))
13731	      || (TREE_CODE (type) == VECTOR_TYPE
13732		  && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0)))))
13733	{
13734	  tree eltype = TREE_TYPE (TREE_TYPE (arg0));
13735	  unsigned HOST_WIDE_INT width = tree_to_uhwi (TYPE_SIZE (eltype));
13736	  unsigned HOST_WIDE_INT n = tree_to_uhwi (arg1);
13737	  unsigned HOST_WIDE_INT idx = tree_to_uhwi (op2);
13738
13739	  if (n != 0
13740	      && (idx % width) == 0
13741	      && (n % width) == 0
13742	      && ((idx + n) / width) <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
13743	    {
13744	      idx = idx / width;
13745	      n = n / width;
13746
13747	      if (TREE_CODE (arg0) == VECTOR_CST)
13748		{
13749		  if (n == 1)
13750		    return VECTOR_CST_ELT (arg0, idx);
13751
13752		  tree *vals = XALLOCAVEC (tree, n);
13753		  for (unsigned i = 0; i < n; ++i)
13754		    vals[i] = VECTOR_CST_ELT (arg0, idx + i);
13755		  return build_vector (type, vals);
13756		}
13757
13758	      /* Constructor elements can be subvectors.  */
13759	      unsigned HOST_WIDE_INT k = 1;
13760	      if (CONSTRUCTOR_NELTS (arg0) != 0)
13761		{
13762		  tree cons_elem = TREE_TYPE (CONSTRUCTOR_ELT (arg0, 0)->value);
13763		  if (TREE_CODE (cons_elem) == VECTOR_TYPE)
13764		    k = TYPE_VECTOR_SUBPARTS (cons_elem);
13765		}
13766
13767	      /* We keep an exact subset of the constructor elements.  */
13768	      if ((idx % k) == 0 && (n % k) == 0)
13769		{
13770		  if (CONSTRUCTOR_NELTS (arg0) == 0)
13771		    return build_constructor (type, NULL);
13772		  idx /= k;
13773		  n /= k;
13774		  if (n == 1)
13775		    {
13776		      if (idx < CONSTRUCTOR_NELTS (arg0))
13777			return CONSTRUCTOR_ELT (arg0, idx)->value;
13778		      return build_zero_cst (type);
13779		    }
13780
13781		  vec<constructor_elt, va_gc> *vals;
13782		  vec_alloc (vals, n);
13783		  for (unsigned i = 0;
13784		       i < n && idx + i < CONSTRUCTOR_NELTS (arg0);
13785		       ++i)
13786		    CONSTRUCTOR_APPEND_ELT (vals, NULL_TREE,
13787					    CONSTRUCTOR_ELT
13788					      (arg0, idx + i)->value);
13789		  return build_constructor (type, vals);
13790		}
13791	      /* The bitfield references a single constructor element.  */
13792	      else if (idx + n <= (idx / k + 1) * k)
13793		{
13794		  if (CONSTRUCTOR_NELTS (arg0) <= idx / k)
13795		    return build_zero_cst (type);
13796		  else if (n == k)
13797		    return CONSTRUCTOR_ELT (arg0, idx / k)->value;
13798		  else
13799		    return fold_build3_loc (loc, code, type,
13800		      CONSTRUCTOR_ELT (arg0, idx / k)->value, op1,
13801		      build_int_cst (TREE_TYPE (op2), (idx % k) * width));
13802		}
13803	    }
13804	}
13805
13806      /* A bit-field-ref that referenced the full argument can be stripped.  */
13807      if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
13808	  && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_to_uhwi (arg1)
13809	  && integer_zerop (op2))
13810	return fold_convert_loc (loc, type, arg0);
13811
13812      /* On constants we can use native encode/interpret to constant
13813         fold (nearly) all BIT_FIELD_REFs.  */
13814      if (CONSTANT_CLASS_P (arg0)
13815	  && can_native_interpret_type_p (type)
13816	  && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (arg0)))
13817	  /* This limitation should not be necessary, we just need to
13818	     round this up to mode size.  */
13819	  && tree_to_uhwi (op1) % BITS_PER_UNIT == 0
13820	  /* Need bit-shifting of the buffer to relax the following.  */
13821	  && tree_to_uhwi (op2) % BITS_PER_UNIT == 0)
13822	{
13823	  unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (op2);
13824	  unsigned HOST_WIDE_INT bitsize = tree_to_uhwi (op1);
13825	  unsigned HOST_WIDE_INT clen;
13826	  clen = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (arg0)));
13827	  /* ???  We cannot tell native_encode_expr to start at
13828	     some random byte only.  So limit us to a reasonable amount
13829	     of work.  */
13830	  if (clen <= 4096)
13831	    {
13832	      unsigned char *b = XALLOCAVEC (unsigned char, clen);
13833	      unsigned HOST_WIDE_INT len = native_encode_expr (arg0, b, clen);
13834	      if (len > 0
13835		  && len * BITS_PER_UNIT >= bitpos + bitsize)
13836		{
13837		  tree v = native_interpret_expr (type,
13838						  b + bitpos / BITS_PER_UNIT,
13839						  bitsize / BITS_PER_UNIT);
13840		  if (v)
13841		    return v;
13842		}
13843	    }
13844	}
13845
13846      return NULL_TREE;
13847
13848    case FMA_EXPR:
13849      /* For integers we can decompose the FMA if possible.  */
13850      if (TREE_CODE (arg0) == INTEGER_CST
13851	  && TREE_CODE (arg1) == INTEGER_CST)
13852	return fold_build2_loc (loc, PLUS_EXPR, type,
13853				const_binop (MULT_EXPR, arg0, arg1), arg2);
13854      if (integer_zerop (arg2))
13855	return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
13856
13857      return fold_fma (loc, type, arg0, arg1, arg2);
13858
13859    case VEC_PERM_EXPR:
13860      if (TREE_CODE (arg2) == VECTOR_CST)
13861	{
13862	  unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i, mask, mask2;
13863	  unsigned char *sel = XALLOCAVEC (unsigned char, 2 * nelts);
13864	  unsigned char *sel2 = sel + nelts;
13865	  bool need_mask_canon = false;
13866	  bool need_mask_canon2 = false;
13867	  bool all_in_vec0 = true;
13868	  bool all_in_vec1 = true;
13869	  bool maybe_identity = true;
13870	  bool single_arg = (op0 == op1);
13871	  bool changed = false;
13872
13873	  mask2 = 2 * nelts - 1;
13874	  mask = single_arg ? (nelts - 1) : mask2;
13875	  gcc_assert (nelts == VECTOR_CST_NELTS (arg2));
13876	  for (i = 0; i < nelts; i++)
13877	    {
13878	      tree val = VECTOR_CST_ELT (arg2, i);
13879	      if (TREE_CODE (val) != INTEGER_CST)
13880		return NULL_TREE;
13881
13882	      /* Make sure that the perm value is in an acceptable
13883		 range.  */
13884	      wide_int t = val;
13885	      need_mask_canon |= wi::gtu_p (t, mask);
13886	      need_mask_canon2 |= wi::gtu_p (t, mask2);
13887	      sel[i] = t.to_uhwi () & mask;
13888	      sel2[i] = t.to_uhwi () & mask2;
13889
13890	      if (sel[i] < nelts)
13891		all_in_vec1 = false;
13892	      else
13893		all_in_vec0 = false;
13894
13895	      if ((sel[i] & (nelts-1)) != i)
13896		maybe_identity = false;
13897	    }
13898
13899	  if (maybe_identity)
13900	    {
13901	      if (all_in_vec0)
13902		return op0;
13903	      if (all_in_vec1)
13904		return op1;
13905	    }
13906
13907	  if (all_in_vec0)
13908	    op1 = op0;
13909	  else if (all_in_vec1)
13910	    {
13911	      op0 = op1;
13912	      for (i = 0; i < nelts; i++)
13913		sel[i] -= nelts;
13914	      need_mask_canon = true;
13915	    }
13916
13917	  if ((TREE_CODE (op0) == VECTOR_CST
13918	       || TREE_CODE (op0) == CONSTRUCTOR)
13919	      && (TREE_CODE (op1) == VECTOR_CST
13920		  || TREE_CODE (op1) == CONSTRUCTOR))
13921	    {
13922	      tree t = fold_vec_perm (type, op0, op1, sel);
13923	      if (t != NULL_TREE)
13924		return t;
13925	    }
13926
13927	  if (op0 == op1 && !single_arg)
13928	    changed = true;
13929
13930	  /* Some targets are deficient and fail to expand a single
13931	     argument permutation while still allowing an equivalent
13932	     2-argument version.  */
13933	  if (need_mask_canon && arg2 == op2
13934	      && !can_vec_perm_p (TYPE_MODE (type), false, sel)
13935	      && can_vec_perm_p (TYPE_MODE (type), false, sel2))
13936	    {
13937	      need_mask_canon = need_mask_canon2;
13938	      sel = sel2;
13939	    }
13940
13941	  if (need_mask_canon && arg2 == op2)
13942	    {
13943	      tree *tsel = XALLOCAVEC (tree, nelts);
13944	      tree eltype = TREE_TYPE (TREE_TYPE (arg2));
13945	      for (i = 0; i < nelts; i++)
13946		tsel[i] = build_int_cst (eltype, sel[i]);
13947	      op2 = build_vector (TREE_TYPE (arg2), tsel);
13948	      changed = true;
13949	    }
13950
13951	  if (changed)
13952	    return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, op2);
13953	}
13954      return NULL_TREE;
13955
13956    default:
13957      return NULL_TREE;
13958    } /* switch (code) */
13959}
13960
13961/* Perform constant folding and related simplification of EXPR.
13962   The related simplifications include x*1 => x, x*0 => 0, etc.,
13963   and application of the associative law.
13964   NOP_EXPR conversions may be removed freely (as long as we
13965   are careful not to change the type of the overall expression).
13966   We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
13967   but we can constant-fold them if they have constant operands.  */
13968
13969#ifdef ENABLE_FOLD_CHECKING
13970# define fold(x) fold_1 (x)
13971static tree fold_1 (tree);
13972static
13973#endif
13974tree
13975fold (tree expr)
13976{
13977  const tree t = expr;
13978  enum tree_code code = TREE_CODE (t);
13979  enum tree_code_class kind = TREE_CODE_CLASS (code);
13980  tree tem;
13981  location_t loc = EXPR_LOCATION (expr);
13982
13983  /* Return right away if a constant.  */
13984  if (kind == tcc_constant)
13985    return t;
13986
13987  /* CALL_EXPR-like objects with variable numbers of operands are
13988     treated specially.  */
13989  if (kind == tcc_vl_exp)
13990    {
13991      if (code == CALL_EXPR)
13992	{
13993	  tem = fold_call_expr (loc, expr, false);
13994	  return tem ? tem : expr;
13995	}
13996      return expr;
13997    }
13998
13999  if (IS_EXPR_CODE_CLASS (kind))
14000    {
14001      tree type = TREE_TYPE (t);
14002      tree op0, op1, op2;
14003
14004      switch (TREE_CODE_LENGTH (code))
14005	{
14006	case 1:
14007	  op0 = TREE_OPERAND (t, 0);
14008	  tem = fold_unary_loc (loc, code, type, op0);
14009	  return tem ? tem : expr;
14010	case 2:
14011	  op0 = TREE_OPERAND (t, 0);
14012	  op1 = TREE_OPERAND (t, 1);
14013	  tem = fold_binary_loc (loc, code, type, op0, op1);
14014	  return tem ? tem : expr;
14015	case 3:
14016	  op0 = TREE_OPERAND (t, 0);
14017	  op1 = TREE_OPERAND (t, 1);
14018	  op2 = TREE_OPERAND (t, 2);
14019	  tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14020	  return tem ? tem : expr;
14021	default:
14022	  break;
14023	}
14024    }
14025
14026  switch (code)
14027    {
14028    case ARRAY_REF:
14029      {
14030	tree op0 = TREE_OPERAND (t, 0);
14031	tree op1 = TREE_OPERAND (t, 1);
14032
14033	if (TREE_CODE (op1) == INTEGER_CST
14034	    && TREE_CODE (op0) == CONSTRUCTOR
14035	    && ! type_contains_placeholder_p (TREE_TYPE (op0)))
14036	  {
14037	    vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (op0);
14038	    unsigned HOST_WIDE_INT end = vec_safe_length (elts);
14039	    unsigned HOST_WIDE_INT begin = 0;
14040
14041	    /* Find a matching index by means of a binary search.  */
14042	    while (begin != end)
14043	      {
14044		unsigned HOST_WIDE_INT middle = (begin + end) / 2;
14045		tree index = (*elts)[middle].index;
14046
14047		if (TREE_CODE (index) == INTEGER_CST
14048		    && tree_int_cst_lt (index, op1))
14049		  begin = middle + 1;
14050		else if (TREE_CODE (index) == INTEGER_CST
14051			 && tree_int_cst_lt (op1, index))
14052		  end = middle;
14053		else if (TREE_CODE (index) == RANGE_EXPR
14054			 && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
14055		  begin = middle + 1;
14056		else if (TREE_CODE (index) == RANGE_EXPR
14057			 && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
14058		  end = middle;
14059		else
14060		  return (*elts)[middle].value;
14061	      }
14062	  }
14063
14064	return t;
14065      }
14066
14067      /* Return a VECTOR_CST if possible.  */
14068    case CONSTRUCTOR:
14069      {
14070	tree type = TREE_TYPE (t);
14071	if (TREE_CODE (type) != VECTOR_TYPE)
14072	  return t;
14073
14074	tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
14075	unsigned HOST_WIDE_INT idx, pos = 0;
14076	tree value;
14077
14078	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, value)
14079	  {
14080	    if (!CONSTANT_CLASS_P (value))
14081	      return t;
14082	    if (TREE_CODE (value) == VECTOR_CST)
14083	      {
14084		for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i)
14085		  vec[pos++] = VECTOR_CST_ELT (value, i);
14086	      }
14087	    else
14088	      vec[pos++] = value;
14089	  }
14090	for (; pos < TYPE_VECTOR_SUBPARTS (type); ++pos)
14091	  vec[pos] = build_zero_cst (TREE_TYPE (type));
14092
14093	return build_vector (type, vec);
14094      }
14095
14096    case CONST_DECL:
14097      return fold (DECL_INITIAL (t));
14098
14099    default:
14100      return t;
14101    } /* switch (code) */
14102}
14103
14104#ifdef ENABLE_FOLD_CHECKING
14105#undef fold
14106
14107static void fold_checksum_tree (const_tree, struct md5_ctx *,
14108				hash_table<pointer_hash<const tree_node> > *);
14109static void fold_check_failed (const_tree, const_tree);
14110void print_fold_checksum (const_tree);
14111
14112/* When --enable-checking=fold, compute a digest of expr before
14113   and after actual fold call to see if fold did not accidentally
14114   change original expr.  */
14115
14116tree
14117fold (tree expr)
14118{
14119  tree ret;
14120  struct md5_ctx ctx;
14121  unsigned char checksum_before[16], checksum_after[16];
14122  hash_table<pointer_hash<const tree_node> > ht (32);
14123
14124  md5_init_ctx (&ctx);
14125  fold_checksum_tree (expr, &ctx, &ht);
14126  md5_finish_ctx (&ctx, checksum_before);
14127  ht.empty ();
14128
14129  ret = fold_1 (expr);
14130
14131  md5_init_ctx (&ctx);
14132  fold_checksum_tree (expr, &ctx, &ht);
14133  md5_finish_ctx (&ctx, checksum_after);
14134
14135  if (memcmp (checksum_before, checksum_after, 16))
14136    fold_check_failed (expr, ret);
14137
14138  return ret;
14139}
14140
14141void
14142print_fold_checksum (const_tree expr)
14143{
14144  struct md5_ctx ctx;
14145  unsigned char checksum[16], cnt;
14146  hash_table<pointer_hash<const tree_node> > ht (32);
14147
14148  md5_init_ctx (&ctx);
14149  fold_checksum_tree (expr, &ctx, &ht);
14150  md5_finish_ctx (&ctx, checksum);
14151  for (cnt = 0; cnt < 16; ++cnt)
14152    fprintf (stderr, "%02x", checksum[cnt]);
14153  putc ('\n', stderr);
14154}
14155
14156static void
14157fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
14158{
14159  internal_error ("fold check: original tree changed by fold");
14160}
14161
14162static void
14163fold_checksum_tree (const_tree expr, struct md5_ctx *ctx,
14164		    hash_table<pointer_hash <const tree_node> > *ht)
14165{
14166  const tree_node **slot;
14167  enum tree_code code;
14168  union tree_node buf;
14169  int i, len;
14170
14171 recursive_label:
14172  if (expr == NULL)
14173    return;
14174  slot = ht->find_slot (expr, INSERT);
14175  if (*slot != NULL)
14176    return;
14177  *slot = expr;
14178  code = TREE_CODE (expr);
14179  if (TREE_CODE_CLASS (code) == tcc_declaration
14180      && HAS_DECL_ASSEMBLER_NAME_P (expr))
14181    {
14182      /* Allow DECL_ASSEMBLER_NAME and symtab_node to be modified.  */
14183      memcpy ((char *) &buf, expr, tree_size (expr));
14184      SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
14185      buf.decl_with_vis.symtab_node = NULL;
14186      expr = (tree) &buf;
14187    }
14188  else if (TREE_CODE_CLASS (code) == tcc_type
14189	   && (TYPE_POINTER_TO (expr)
14190	       || TYPE_REFERENCE_TO (expr)
14191	       || TYPE_CACHED_VALUES_P (expr)
14192	       || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
14193	       || TYPE_NEXT_VARIANT (expr)))
14194    {
14195      /* Allow these fields to be modified.  */
14196      tree tmp;
14197      memcpy ((char *) &buf, expr, tree_size (expr));
14198      expr = tmp = (tree) &buf;
14199      TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
14200      TYPE_POINTER_TO (tmp) = NULL;
14201      TYPE_REFERENCE_TO (tmp) = NULL;
14202      TYPE_NEXT_VARIANT (tmp) = NULL;
14203      if (TYPE_CACHED_VALUES_P (tmp))
14204	{
14205	  TYPE_CACHED_VALUES_P (tmp) = 0;
14206	  TYPE_CACHED_VALUES (tmp) = NULL;
14207	}
14208    }
14209  md5_process_bytes (expr, tree_size (expr), ctx);
14210  if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
14211    fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
14212  if (TREE_CODE_CLASS (code) != tcc_type
14213      && TREE_CODE_CLASS (code) != tcc_declaration
14214      && code != TREE_LIST
14215      && code != SSA_NAME
14216      && CODE_CONTAINS_STRUCT (code, TS_COMMON))
14217    fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
14218  switch (TREE_CODE_CLASS (code))
14219    {
14220    case tcc_constant:
14221      switch (code)
14222	{
14223	case STRING_CST:
14224	  md5_process_bytes (TREE_STRING_POINTER (expr),
14225			     TREE_STRING_LENGTH (expr), ctx);
14226	  break;
14227	case COMPLEX_CST:
14228	  fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
14229	  fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
14230	  break;
14231	case VECTOR_CST:
14232	  for (i = 0; i < (int) VECTOR_CST_NELTS (expr); ++i)
14233	    fold_checksum_tree (VECTOR_CST_ELT (expr, i), ctx, ht);
14234	  break;
14235	default:
14236	  break;
14237	}
14238      break;
14239    case tcc_exceptional:
14240      switch (code)
14241	{
14242	case TREE_LIST:
14243	  fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
14244	  fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
14245	  expr = TREE_CHAIN (expr);
14246	  goto recursive_label;
14247	  break;
14248	case TREE_VEC:
14249	  for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
14250	    fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
14251	  break;
14252	default:
14253	  break;
14254	}
14255      break;
14256    case tcc_expression:
14257    case tcc_reference:
14258    case tcc_comparison:
14259    case tcc_unary:
14260    case tcc_binary:
14261    case tcc_statement:
14262    case tcc_vl_exp:
14263      len = TREE_OPERAND_LENGTH (expr);
14264      for (i = 0; i < len; ++i)
14265	fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
14266      break;
14267    case tcc_declaration:
14268      fold_checksum_tree (DECL_NAME (expr), ctx, ht);
14269      fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
14270      if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
14271	{
14272	  fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
14273	  fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
14274	  fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
14275	  fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
14276	  fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
14277	}
14278
14279      if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
14280	{
14281	  if (TREE_CODE (expr) == FUNCTION_DECL)
14282	    {
14283	      fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
14284	      fold_checksum_tree (DECL_ARGUMENTS (expr), ctx, ht);
14285	    }
14286	  fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
14287	}
14288      break;
14289    case tcc_type:
14290      if (TREE_CODE (expr) == ENUMERAL_TYPE)
14291        fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
14292      fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
14293      fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
14294      fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
14295      fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
14296      if (INTEGRAL_TYPE_P (expr)
14297          || SCALAR_FLOAT_TYPE_P (expr))
14298	{
14299	  fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
14300	  fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
14301	}
14302      fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
14303      if (TREE_CODE (expr) == RECORD_TYPE
14304	  || TREE_CODE (expr) == UNION_TYPE
14305	  || TREE_CODE (expr) == QUAL_UNION_TYPE)
14306	fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
14307      fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
14308      break;
14309    default:
14310      break;
14311    }
14312}
14313
14314/* Helper function for outputting the checksum of a tree T.  When
14315   debugging with gdb, you can "define mynext" to be "next" followed
14316   by "call debug_fold_checksum (op0)", then just trace down till the
14317   outputs differ.  */
14318
14319DEBUG_FUNCTION void
14320debug_fold_checksum (const_tree t)
14321{
14322  int i;
14323  unsigned char checksum[16];
14324  struct md5_ctx ctx;
14325  hash_table<pointer_hash<const tree_node> > ht (32);
14326
14327  md5_init_ctx (&ctx);
14328  fold_checksum_tree (t, &ctx, &ht);
14329  md5_finish_ctx (&ctx, checksum);
14330  ht.empty ();
14331
14332  for (i = 0; i < 16; i++)
14333    fprintf (stderr, "%d ", checksum[i]);
14334
14335  fprintf (stderr, "\n");
14336}
14337
14338#endif
14339
14340/* Fold a unary tree expression with code CODE of type TYPE with an
14341   operand OP0.  LOC is the location of the resulting expression.
14342   Return a folded expression if successful.  Otherwise, return a tree
14343   expression with code CODE of type TYPE with an operand OP0.  */
14344
14345tree
14346fold_build1_stat_loc (location_t loc,
14347		      enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
14348{
14349  tree tem;
14350#ifdef ENABLE_FOLD_CHECKING
14351  unsigned char checksum_before[16], checksum_after[16];
14352  struct md5_ctx ctx;
14353  hash_table<pointer_hash<const tree_node> > ht (32);
14354
14355  md5_init_ctx (&ctx);
14356  fold_checksum_tree (op0, &ctx, &ht);
14357  md5_finish_ctx (&ctx, checksum_before);
14358  ht.empty ();
14359#endif
14360
14361  tem = fold_unary_loc (loc, code, type, op0);
14362  if (!tem)
14363    tem = build1_stat_loc (loc, code, type, op0 PASS_MEM_STAT);
14364
14365#ifdef ENABLE_FOLD_CHECKING
14366  md5_init_ctx (&ctx);
14367  fold_checksum_tree (op0, &ctx, &ht);
14368  md5_finish_ctx (&ctx, checksum_after);
14369
14370  if (memcmp (checksum_before, checksum_after, 16))
14371    fold_check_failed (op0, tem);
14372#endif
14373  return tem;
14374}
14375
14376/* Fold a binary tree expression with code CODE of type TYPE with
14377   operands OP0 and OP1.  LOC is the location of the resulting
14378   expression.  Return a folded expression if successful.  Otherwise,
14379   return a tree expression with code CODE of type TYPE with operands
14380   OP0 and OP1.  */
14381
14382tree
14383fold_build2_stat_loc (location_t loc,
14384		      enum tree_code code, tree type, tree op0, tree op1
14385		      MEM_STAT_DECL)
14386{
14387  tree tem;
14388#ifdef ENABLE_FOLD_CHECKING
14389  unsigned char checksum_before_op0[16],
14390                checksum_before_op1[16],
14391		checksum_after_op0[16],
14392		checksum_after_op1[16];
14393  struct md5_ctx ctx;
14394  hash_table<pointer_hash<const tree_node> > ht (32);
14395
14396  md5_init_ctx (&ctx);
14397  fold_checksum_tree (op0, &ctx, &ht);
14398  md5_finish_ctx (&ctx, checksum_before_op0);
14399  ht.empty ();
14400
14401  md5_init_ctx (&ctx);
14402  fold_checksum_tree (op1, &ctx, &ht);
14403  md5_finish_ctx (&ctx, checksum_before_op1);
14404  ht.empty ();
14405#endif
14406
14407  tem = fold_binary_loc (loc, code, type, op0, op1);
14408  if (!tem)
14409    tem = build2_stat_loc (loc, code, type, op0, op1 PASS_MEM_STAT);
14410
14411#ifdef ENABLE_FOLD_CHECKING
14412  md5_init_ctx (&ctx);
14413  fold_checksum_tree (op0, &ctx, &ht);
14414  md5_finish_ctx (&ctx, checksum_after_op0);
14415  ht.empty ();
14416
14417  if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14418    fold_check_failed (op0, tem);
14419
14420  md5_init_ctx (&ctx);
14421  fold_checksum_tree (op1, &ctx, &ht);
14422  md5_finish_ctx (&ctx, checksum_after_op1);
14423
14424  if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14425    fold_check_failed (op1, tem);
14426#endif
14427  return tem;
14428}
14429
14430/* Fold a ternary tree expression with code CODE of type TYPE with
14431   operands OP0, OP1, and OP2.  Return a folded expression if
14432   successful.  Otherwise, return a tree expression with code CODE of
14433   type TYPE with operands OP0, OP1, and OP2.  */
14434
14435tree
14436fold_build3_stat_loc (location_t loc, enum tree_code code, tree type,
14437		      tree op0, tree op1, tree op2 MEM_STAT_DECL)
14438{
14439  tree tem;
14440#ifdef ENABLE_FOLD_CHECKING
14441  unsigned char checksum_before_op0[16],
14442                checksum_before_op1[16],
14443                checksum_before_op2[16],
14444		checksum_after_op0[16],
14445		checksum_after_op1[16],
14446		checksum_after_op2[16];
14447  struct md5_ctx ctx;
14448  hash_table<pointer_hash<const tree_node> > ht (32);
14449
14450  md5_init_ctx (&ctx);
14451  fold_checksum_tree (op0, &ctx, &ht);
14452  md5_finish_ctx (&ctx, checksum_before_op0);
14453  ht.empty ();
14454
14455  md5_init_ctx (&ctx);
14456  fold_checksum_tree (op1, &ctx, &ht);
14457  md5_finish_ctx (&ctx, checksum_before_op1);
14458  ht.empty ();
14459
14460  md5_init_ctx (&ctx);
14461  fold_checksum_tree (op2, &ctx, &ht);
14462  md5_finish_ctx (&ctx, checksum_before_op2);
14463  ht.empty ();
14464#endif
14465
14466  gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
14467  tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14468  if (!tem)
14469    tem = build3_stat_loc (loc, code, type, op0, op1, op2 PASS_MEM_STAT);
14470
14471#ifdef ENABLE_FOLD_CHECKING
14472  md5_init_ctx (&ctx);
14473  fold_checksum_tree (op0, &ctx, &ht);
14474  md5_finish_ctx (&ctx, checksum_after_op0);
14475  ht.empty ();
14476
14477  if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14478    fold_check_failed (op0, tem);
14479
14480  md5_init_ctx (&ctx);
14481  fold_checksum_tree (op1, &ctx, &ht);
14482  md5_finish_ctx (&ctx, checksum_after_op1);
14483  ht.empty ();
14484
14485  if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14486    fold_check_failed (op1, tem);
14487
14488  md5_init_ctx (&ctx);
14489  fold_checksum_tree (op2, &ctx, &ht);
14490  md5_finish_ctx (&ctx, checksum_after_op2);
14491
14492  if (memcmp (checksum_before_op2, checksum_after_op2, 16))
14493    fold_check_failed (op2, tem);
14494#endif
14495  return tem;
14496}
14497
14498/* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
14499   arguments in ARGARRAY, and a null static chain.
14500   Return a folded expression if successful.  Otherwise, return a CALL_EXPR
14501   of type TYPE from the given operands as constructed by build_call_array.  */
14502
14503tree
14504fold_build_call_array_loc (location_t loc, tree type, tree fn,
14505			   int nargs, tree *argarray)
14506{
14507  tree tem;
14508#ifdef ENABLE_FOLD_CHECKING
14509  unsigned char checksum_before_fn[16],
14510                checksum_before_arglist[16],
14511		checksum_after_fn[16],
14512		checksum_after_arglist[16];
14513  struct md5_ctx ctx;
14514  hash_table<pointer_hash<const tree_node> > ht (32);
14515  int i;
14516
14517  md5_init_ctx (&ctx);
14518  fold_checksum_tree (fn, &ctx, &ht);
14519  md5_finish_ctx (&ctx, checksum_before_fn);
14520  ht.empty ();
14521
14522  md5_init_ctx (&ctx);
14523  for (i = 0; i < nargs; i++)
14524    fold_checksum_tree (argarray[i], &ctx, &ht);
14525  md5_finish_ctx (&ctx, checksum_before_arglist);
14526  ht.empty ();
14527#endif
14528
14529  tem = fold_builtin_call_array (loc, type, fn, nargs, argarray);
14530  if (!tem)
14531    tem = build_call_array_loc (loc, type, fn, nargs, argarray);
14532
14533#ifdef ENABLE_FOLD_CHECKING
14534  md5_init_ctx (&ctx);
14535  fold_checksum_tree (fn, &ctx, &ht);
14536  md5_finish_ctx (&ctx, checksum_after_fn);
14537  ht.empty ();
14538
14539  if (memcmp (checksum_before_fn, checksum_after_fn, 16))
14540    fold_check_failed (fn, tem);
14541
14542  md5_init_ctx (&ctx);
14543  for (i = 0; i < nargs; i++)
14544    fold_checksum_tree (argarray[i], &ctx, &ht);
14545  md5_finish_ctx (&ctx, checksum_after_arglist);
14546
14547  if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
14548    fold_check_failed (NULL_TREE, tem);
14549#endif
14550  return tem;
14551}
14552
14553/* Perform constant folding and related simplification of initializer
14554   expression EXPR.  These behave identically to "fold_buildN" but ignore
14555   potential run-time traps and exceptions that fold must preserve.  */
14556
14557#define START_FOLD_INIT \
14558  int saved_signaling_nans = flag_signaling_nans;\
14559  int saved_trapping_math = flag_trapping_math;\
14560  int saved_rounding_math = flag_rounding_math;\
14561  int saved_trapv = flag_trapv;\
14562  int saved_folding_initializer = folding_initializer;\
14563  flag_signaling_nans = 0;\
14564  flag_trapping_math = 0;\
14565  flag_rounding_math = 0;\
14566  flag_trapv = 0;\
14567  folding_initializer = 1;
14568
14569#define END_FOLD_INIT \
14570  flag_signaling_nans = saved_signaling_nans;\
14571  flag_trapping_math = saved_trapping_math;\
14572  flag_rounding_math = saved_rounding_math;\
14573  flag_trapv = saved_trapv;\
14574  folding_initializer = saved_folding_initializer;
14575
14576tree
14577fold_build1_initializer_loc (location_t loc, enum tree_code code,
14578			     tree type, tree op)
14579{
14580  tree result;
14581  START_FOLD_INIT;
14582
14583  result = fold_build1_loc (loc, code, type, op);
14584
14585  END_FOLD_INIT;
14586  return result;
14587}
14588
14589tree
14590fold_build2_initializer_loc (location_t loc, enum tree_code code,
14591			     tree type, tree op0, tree op1)
14592{
14593  tree result;
14594  START_FOLD_INIT;
14595
14596  result = fold_build2_loc (loc, code, type, op0, op1);
14597
14598  END_FOLD_INIT;
14599  return result;
14600}
14601
14602tree
14603fold_build_call_array_initializer_loc (location_t loc, tree type, tree fn,
14604				       int nargs, tree *argarray)
14605{
14606  tree result;
14607  START_FOLD_INIT;
14608
14609  result = fold_build_call_array_loc (loc, type, fn, nargs, argarray);
14610
14611  END_FOLD_INIT;
14612  return result;
14613}
14614
14615#undef START_FOLD_INIT
14616#undef END_FOLD_INIT
14617
14618/* Determine if first argument is a multiple of second argument.  Return 0 if
14619   it is not, or we cannot easily determined it to be.
14620
14621   An example of the sort of thing we care about (at this point; this routine
14622   could surely be made more general, and expanded to do what the *_DIV_EXPR's
14623   fold cases do now) is discovering that
14624
14625     SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14626
14627   is a multiple of
14628
14629     SAVE_EXPR (J * 8)
14630
14631   when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
14632
14633   This code also handles discovering that
14634
14635     SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14636
14637   is a multiple of 8 so we don't have to worry about dealing with a
14638   possible remainder.
14639
14640   Note that we *look* inside a SAVE_EXPR only to determine how it was
14641   calculated; it is not safe for fold to do much of anything else with the
14642   internals of a SAVE_EXPR, since it cannot know when it will be evaluated
14643   at run time.  For example, the latter example above *cannot* be implemented
14644   as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
14645   evaluation time of the original SAVE_EXPR is not necessarily the same at
14646   the time the new expression is evaluated.  The only optimization of this
14647   sort that would be valid is changing
14648
14649     SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
14650
14651   divided by 8 to
14652
14653     SAVE_EXPR (I) * SAVE_EXPR (J)
14654
14655   (where the same SAVE_EXPR (J) is used in the original and the
14656   transformed version).  */
14657
14658int
14659multiple_of_p (tree type, const_tree top, const_tree bottom)
14660{
14661  if (operand_equal_p (top, bottom, 0))
14662    return 1;
14663
14664  if (TREE_CODE (type) != INTEGER_TYPE)
14665    return 0;
14666
14667  switch (TREE_CODE (top))
14668    {
14669    case BIT_AND_EXPR:
14670      /* Bitwise and provides a power of two multiple.  If the mask is
14671	 a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
14672      if (!integer_pow2p (bottom))
14673	return 0;
14674      /* FALLTHRU */
14675
14676    case MULT_EXPR:
14677      return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14678	      || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14679
14680    case PLUS_EXPR:
14681    case MINUS_EXPR:
14682      return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14683	      && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14684
14685    case LSHIFT_EXPR:
14686      if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
14687	{
14688	  tree op1, t1;
14689
14690	  op1 = TREE_OPERAND (top, 1);
14691	  /* const_binop may not detect overflow correctly,
14692	     so check for it explicitly here.  */
14693	  if (wi::gtu_p (TYPE_PRECISION (TREE_TYPE (size_one_node)), op1)
14694	      && 0 != (t1 = fold_convert (type,
14695					  const_binop (LSHIFT_EXPR,
14696						       size_one_node,
14697						       op1)))
14698	      && !TREE_OVERFLOW (t1))
14699	    return multiple_of_p (type, t1, bottom);
14700	}
14701      return 0;
14702
14703    case NOP_EXPR:
14704      /* Can't handle conversions from non-integral or wider integral type.  */
14705      if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
14706	  || (TYPE_PRECISION (type)
14707	      < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
14708	return 0;
14709
14710      /* .. fall through ...  */
14711
14712    case SAVE_EXPR:
14713      return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
14714
14715    case COND_EXPR:
14716      return (multiple_of_p (type, TREE_OPERAND (top, 1), bottom)
14717	      && multiple_of_p (type, TREE_OPERAND (top, 2), bottom));
14718
14719    case INTEGER_CST:
14720      if (TREE_CODE (bottom) != INTEGER_CST
14721	  || integer_zerop (bottom)
14722	  || (TYPE_UNSIGNED (type)
14723	      && (tree_int_cst_sgn (top) < 0
14724		  || tree_int_cst_sgn (bottom) < 0)))
14725	return 0;
14726      return wi::multiple_of_p (wi::to_widest (top), wi::to_widest (bottom),
14727				SIGNED);
14728
14729    default:
14730      return 0;
14731    }
14732}
14733
14734/* Return true if CODE or TYPE is known to be non-negative. */
14735
14736static bool
14737tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
14738{
14739  if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
14740      && truth_value_p (code))
14741    /* Truth values evaluate to 0 or 1, which is nonnegative unless we
14742       have a signed:1 type (where the value is -1 and 0).  */
14743    return true;
14744  return false;
14745}
14746
14747/* Return true if (CODE OP0) is known to be non-negative.  If the return
14748   value is based on the assumption that signed overflow is undefined,
14749   set *STRICT_OVERFLOW_P to true; otherwise, don't change
14750   *STRICT_OVERFLOW_P.  */
14751
14752bool
14753tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14754				bool *strict_overflow_p)
14755{
14756  if (TYPE_UNSIGNED (type))
14757    return true;
14758
14759  switch (code)
14760    {
14761    case ABS_EXPR:
14762      /* We can't return 1 if flag_wrapv is set because
14763	 ABS_EXPR<INT_MIN> = INT_MIN.  */
14764      if (!INTEGRAL_TYPE_P (type))
14765	return true;
14766      if (TYPE_OVERFLOW_UNDEFINED (type))
14767	{
14768	  *strict_overflow_p = true;
14769	  return true;
14770	}
14771      break;
14772
14773    case NON_LVALUE_EXPR:
14774    case FLOAT_EXPR:
14775    case FIX_TRUNC_EXPR:
14776      return tree_expr_nonnegative_warnv_p (op0,
14777					    strict_overflow_p);
14778
14779    CASE_CONVERT:
14780      {
14781	tree inner_type = TREE_TYPE (op0);
14782	tree outer_type = type;
14783
14784	if (TREE_CODE (outer_type) == REAL_TYPE)
14785	  {
14786	    if (TREE_CODE (inner_type) == REAL_TYPE)
14787	      return tree_expr_nonnegative_warnv_p (op0,
14788						    strict_overflow_p);
14789	    if (INTEGRAL_TYPE_P (inner_type))
14790	      {
14791		if (TYPE_UNSIGNED (inner_type))
14792		  return true;
14793		return tree_expr_nonnegative_warnv_p (op0,
14794						      strict_overflow_p);
14795	      }
14796	  }
14797	else if (INTEGRAL_TYPE_P (outer_type))
14798	  {
14799	    if (TREE_CODE (inner_type) == REAL_TYPE)
14800	      return tree_expr_nonnegative_warnv_p (op0,
14801						    strict_overflow_p);
14802	    if (INTEGRAL_TYPE_P (inner_type))
14803	      return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
14804		      && TYPE_UNSIGNED (inner_type);
14805	  }
14806      }
14807      break;
14808
14809    default:
14810      return tree_simple_nonnegative_warnv_p (code, type);
14811    }
14812
14813  /* We don't know sign of `t', so be conservative and return false.  */
14814  return false;
14815}
14816
14817/* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
14818   value is based on the assumption that signed overflow is undefined,
14819   set *STRICT_OVERFLOW_P to true; otherwise, don't change
14820   *STRICT_OVERFLOW_P.  */
14821
14822bool
14823tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14824				      tree op1, bool *strict_overflow_p)
14825{
14826  if (TYPE_UNSIGNED (type))
14827    return true;
14828
14829  switch (code)
14830    {
14831    case POINTER_PLUS_EXPR:
14832    case PLUS_EXPR:
14833      if (FLOAT_TYPE_P (type))
14834	return (tree_expr_nonnegative_warnv_p (op0,
14835					       strict_overflow_p)
14836		&& tree_expr_nonnegative_warnv_p (op1,
14837						  strict_overflow_p));
14838
14839      /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
14840	 both unsigned and at least 2 bits shorter than the result.  */
14841      if (TREE_CODE (type) == INTEGER_TYPE
14842	  && TREE_CODE (op0) == NOP_EXPR
14843	  && TREE_CODE (op1) == NOP_EXPR)
14844	{
14845	  tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14846	  tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14847	  if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14848	      && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14849	    {
14850	      unsigned int prec = MAX (TYPE_PRECISION (inner1),
14851				       TYPE_PRECISION (inner2)) + 1;
14852	      return prec < TYPE_PRECISION (type);
14853	    }
14854	}
14855      break;
14856
14857    case MULT_EXPR:
14858      if (FLOAT_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
14859	{
14860	  /* x * x is always non-negative for floating point x
14861	     or without overflow.  */
14862	  if (operand_equal_p (op0, op1, 0)
14863	      || (tree_expr_nonnegative_warnv_p (op0, strict_overflow_p)
14864		  && tree_expr_nonnegative_warnv_p (op1, strict_overflow_p)))
14865	    {
14866	      if (ANY_INTEGRAL_TYPE_P (type)
14867		  && TYPE_OVERFLOW_UNDEFINED (type))
14868		*strict_overflow_p = true;
14869	      return true;
14870	    }
14871	}
14872
14873      /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14874	 both unsigned and their total bits is shorter than the result.  */
14875      if (TREE_CODE (type) == INTEGER_TYPE
14876	  && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST)
14877	  && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST))
14878	{
14879	  tree inner0 = (TREE_CODE (op0) == NOP_EXPR)
14880	    ? TREE_TYPE (TREE_OPERAND (op0, 0))
14881	    : TREE_TYPE (op0);
14882	  tree inner1 = (TREE_CODE (op1) == NOP_EXPR)
14883	    ? TREE_TYPE (TREE_OPERAND (op1, 0))
14884	    : TREE_TYPE (op1);
14885
14886	  bool unsigned0 = TYPE_UNSIGNED (inner0);
14887	  bool unsigned1 = TYPE_UNSIGNED (inner1);
14888
14889	  if (TREE_CODE (op0) == INTEGER_CST)
14890	    unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0;
14891
14892	  if (TREE_CODE (op1) == INTEGER_CST)
14893	    unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0;
14894
14895	  if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0
14896	      && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1)
14897	    {
14898	      unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST)
14899		? tree_int_cst_min_precision (op0, UNSIGNED)
14900		: TYPE_PRECISION (inner0);
14901
14902	      unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST)
14903		? tree_int_cst_min_precision (op1, UNSIGNED)
14904		: TYPE_PRECISION (inner1);
14905
14906	      return precision0 + precision1 < TYPE_PRECISION (type);
14907	    }
14908	}
14909      return false;
14910
14911    case BIT_AND_EXPR:
14912    case MAX_EXPR:
14913      return (tree_expr_nonnegative_warnv_p (op0,
14914					     strict_overflow_p)
14915	      || tree_expr_nonnegative_warnv_p (op1,
14916						strict_overflow_p));
14917
14918    case BIT_IOR_EXPR:
14919    case BIT_XOR_EXPR:
14920    case MIN_EXPR:
14921    case RDIV_EXPR:
14922    case TRUNC_DIV_EXPR:
14923    case CEIL_DIV_EXPR:
14924    case FLOOR_DIV_EXPR:
14925    case ROUND_DIV_EXPR:
14926      return (tree_expr_nonnegative_warnv_p (op0,
14927					     strict_overflow_p)
14928	      && tree_expr_nonnegative_warnv_p (op1,
14929						strict_overflow_p));
14930
14931    case TRUNC_MOD_EXPR:
14932    case CEIL_MOD_EXPR:
14933    case FLOOR_MOD_EXPR:
14934    case ROUND_MOD_EXPR:
14935      return tree_expr_nonnegative_warnv_p (op0,
14936					    strict_overflow_p);
14937    default:
14938      return tree_simple_nonnegative_warnv_p (code, type);
14939    }
14940
14941  /* We don't know sign of `t', so be conservative and return false.  */
14942  return false;
14943}
14944
14945/* Return true if T is known to be non-negative.  If the return
14946   value is based on the assumption that signed overflow is undefined,
14947   set *STRICT_OVERFLOW_P to true; otherwise, don't change
14948   *STRICT_OVERFLOW_P.  */
14949
14950bool
14951tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14952{
14953  if (TYPE_UNSIGNED (TREE_TYPE (t)))
14954    return true;
14955
14956  switch (TREE_CODE (t))
14957    {
14958    case INTEGER_CST:
14959      return tree_int_cst_sgn (t) >= 0;
14960
14961    case REAL_CST:
14962      return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
14963
14964    case FIXED_CST:
14965      return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
14966
14967    case COND_EXPR:
14968      return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14969					     strict_overflow_p)
14970	      && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
14971						strict_overflow_p));
14972    default:
14973      return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14974						   TREE_TYPE (t));
14975    }
14976  /* We don't know sign of `t', so be conservative and return false.  */
14977  return false;
14978}
14979
14980/* Return true if T is known to be non-negative.  If the return
14981   value is based on the assumption that signed overflow is undefined,
14982   set *STRICT_OVERFLOW_P to true; otherwise, don't change
14983   *STRICT_OVERFLOW_P.  */
14984
14985bool
14986tree_call_nonnegative_warnv_p (tree type, tree fndecl,
14987			       tree arg0, tree arg1, bool *strict_overflow_p)
14988{
14989  if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
14990    switch (DECL_FUNCTION_CODE (fndecl))
14991      {
14992	CASE_FLT_FN (BUILT_IN_ACOS):
14993	CASE_FLT_FN (BUILT_IN_ACOSH):
14994	CASE_FLT_FN (BUILT_IN_CABS):
14995	CASE_FLT_FN (BUILT_IN_COSH):
14996	CASE_FLT_FN (BUILT_IN_ERFC):
14997	CASE_FLT_FN (BUILT_IN_EXP):
14998	CASE_FLT_FN (BUILT_IN_EXP10):
14999	CASE_FLT_FN (BUILT_IN_EXP2):
15000	CASE_FLT_FN (BUILT_IN_FABS):
15001	CASE_FLT_FN (BUILT_IN_FDIM):
15002	CASE_FLT_FN (BUILT_IN_HYPOT):
15003	CASE_FLT_FN (BUILT_IN_POW10):
15004	CASE_INT_FN (BUILT_IN_FFS):
15005	CASE_INT_FN (BUILT_IN_PARITY):
15006	CASE_INT_FN (BUILT_IN_POPCOUNT):
15007	CASE_INT_FN (BUILT_IN_CLZ):
15008	CASE_INT_FN (BUILT_IN_CLRSB):
15009      case BUILT_IN_BSWAP32:
15010      case BUILT_IN_BSWAP64:
15011	/* Always true.  */
15012	return true;
15013
15014	CASE_FLT_FN (BUILT_IN_SQRT):
15015	/* sqrt(-0.0) is -0.0.  */
15016	if (!HONOR_SIGNED_ZEROS (element_mode (type)))
15017	  return true;
15018	return tree_expr_nonnegative_warnv_p (arg0,
15019					      strict_overflow_p);
15020
15021	CASE_FLT_FN (BUILT_IN_ASINH):
15022	CASE_FLT_FN (BUILT_IN_ATAN):
15023	CASE_FLT_FN (BUILT_IN_ATANH):
15024	CASE_FLT_FN (BUILT_IN_CBRT):
15025	CASE_FLT_FN (BUILT_IN_CEIL):
15026	CASE_FLT_FN (BUILT_IN_ERF):
15027	CASE_FLT_FN (BUILT_IN_EXPM1):
15028	CASE_FLT_FN (BUILT_IN_FLOOR):
15029	CASE_FLT_FN (BUILT_IN_FMOD):
15030	CASE_FLT_FN (BUILT_IN_FREXP):
15031	CASE_FLT_FN (BUILT_IN_ICEIL):
15032	CASE_FLT_FN (BUILT_IN_IFLOOR):
15033	CASE_FLT_FN (BUILT_IN_IRINT):
15034	CASE_FLT_FN (BUILT_IN_IROUND):
15035	CASE_FLT_FN (BUILT_IN_LCEIL):
15036	CASE_FLT_FN (BUILT_IN_LDEXP):
15037	CASE_FLT_FN (BUILT_IN_LFLOOR):
15038	CASE_FLT_FN (BUILT_IN_LLCEIL):
15039	CASE_FLT_FN (BUILT_IN_LLFLOOR):
15040	CASE_FLT_FN (BUILT_IN_LLRINT):
15041	CASE_FLT_FN (BUILT_IN_LLROUND):
15042	CASE_FLT_FN (BUILT_IN_LRINT):
15043	CASE_FLT_FN (BUILT_IN_LROUND):
15044	CASE_FLT_FN (BUILT_IN_MODF):
15045	CASE_FLT_FN (BUILT_IN_NEARBYINT):
15046	CASE_FLT_FN (BUILT_IN_RINT):
15047	CASE_FLT_FN (BUILT_IN_ROUND):
15048	CASE_FLT_FN (BUILT_IN_SCALB):
15049	CASE_FLT_FN (BUILT_IN_SCALBLN):
15050	CASE_FLT_FN (BUILT_IN_SCALBN):
15051	CASE_FLT_FN (BUILT_IN_SIGNBIT):
15052	CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
15053	CASE_FLT_FN (BUILT_IN_SINH):
15054	CASE_FLT_FN (BUILT_IN_TANH):
15055	CASE_FLT_FN (BUILT_IN_TRUNC):
15056	/* True if the 1st argument is nonnegative.  */
15057	return tree_expr_nonnegative_warnv_p (arg0,
15058					      strict_overflow_p);
15059
15060	CASE_FLT_FN (BUILT_IN_FMAX):
15061	/* True if the 1st OR 2nd arguments are nonnegative.  */
15062	return (tree_expr_nonnegative_warnv_p (arg0,
15063					       strict_overflow_p)
15064		|| (tree_expr_nonnegative_warnv_p (arg1,
15065						   strict_overflow_p)));
15066
15067	CASE_FLT_FN (BUILT_IN_FMIN):
15068	/* True if the 1st AND 2nd arguments are nonnegative.  */
15069	return (tree_expr_nonnegative_warnv_p (arg0,
15070					       strict_overflow_p)
15071		&& (tree_expr_nonnegative_warnv_p (arg1,
15072						   strict_overflow_p)));
15073
15074	CASE_FLT_FN (BUILT_IN_COPYSIGN):
15075	/* True if the 2nd argument is nonnegative.  */
15076	return tree_expr_nonnegative_warnv_p (arg1,
15077					      strict_overflow_p);
15078
15079	CASE_FLT_FN (BUILT_IN_POWI):
15080	/* True if the 1st argument is nonnegative or the second
15081	   argument is an even integer.  */
15082	if (TREE_CODE (arg1) == INTEGER_CST
15083	    && (TREE_INT_CST_LOW (arg1) & 1) == 0)
15084	  return true;
15085	return tree_expr_nonnegative_warnv_p (arg0,
15086					      strict_overflow_p);
15087
15088	CASE_FLT_FN (BUILT_IN_POW):
15089	/* True if the 1st argument is nonnegative or the second
15090	   argument is an even integer valued real.  */
15091	if (TREE_CODE (arg1) == REAL_CST)
15092	  {
15093	    REAL_VALUE_TYPE c;
15094	    HOST_WIDE_INT n;
15095
15096	    c = TREE_REAL_CST (arg1);
15097	    n = real_to_integer (&c);
15098	    if ((n & 1) == 0)
15099	      {
15100		REAL_VALUE_TYPE cint;
15101		real_from_integer (&cint, VOIDmode, n, SIGNED);
15102		if (real_identical (&c, &cint))
15103		  return true;
15104	      }
15105	  }
15106	return tree_expr_nonnegative_warnv_p (arg0,
15107					      strict_overflow_p);
15108
15109      default:
15110	break;
15111      }
15112  return tree_simple_nonnegative_warnv_p (CALL_EXPR,
15113					  type);
15114}
15115
15116/* Return true if T is known to be non-negative.  If the return
15117   value is based on the assumption that signed overflow is undefined,
15118   set *STRICT_OVERFLOW_P to true; otherwise, don't change
15119   *STRICT_OVERFLOW_P.  */
15120
15121static bool
15122tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15123{
15124  enum tree_code code = TREE_CODE (t);
15125  if (TYPE_UNSIGNED (TREE_TYPE (t)))
15126    return true;
15127
15128  switch (code)
15129    {
15130    case TARGET_EXPR:
15131      {
15132	tree temp = TARGET_EXPR_SLOT (t);
15133	t = TARGET_EXPR_INITIAL (t);
15134
15135	/* If the initializer is non-void, then it's a normal expression
15136	   that will be assigned to the slot.  */
15137	if (!VOID_TYPE_P (t))
15138	  return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
15139
15140	/* Otherwise, the initializer sets the slot in some way.  One common
15141	   way is an assignment statement at the end of the initializer.  */
15142	while (1)
15143	  {
15144	    if (TREE_CODE (t) == BIND_EXPR)
15145	      t = expr_last (BIND_EXPR_BODY (t));
15146	    else if (TREE_CODE (t) == TRY_FINALLY_EXPR
15147		     || TREE_CODE (t) == TRY_CATCH_EXPR)
15148	      t = expr_last (TREE_OPERAND (t, 0));
15149	    else if (TREE_CODE (t) == STATEMENT_LIST)
15150	      t = expr_last (t);
15151	    else
15152	      break;
15153	  }
15154	if (TREE_CODE (t) == MODIFY_EXPR
15155	    && TREE_OPERAND (t, 0) == temp)
15156	  return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15157						strict_overflow_p);
15158
15159	return false;
15160      }
15161
15162    case CALL_EXPR:
15163      {
15164	tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
15165	tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
15166
15167	return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
15168					      get_callee_fndecl (t),
15169					      arg0,
15170					      arg1,
15171					      strict_overflow_p);
15172      }
15173    case COMPOUND_EXPR:
15174    case MODIFY_EXPR:
15175      return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15176					    strict_overflow_p);
15177    case BIND_EXPR:
15178      return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
15179					    strict_overflow_p);
15180    case SAVE_EXPR:
15181      return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
15182					    strict_overflow_p);
15183
15184    default:
15185      return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15186						   TREE_TYPE (t));
15187    }
15188
15189  /* We don't know sign of `t', so be conservative and return false.  */
15190  return false;
15191}
15192
15193/* Return true if T is known to be non-negative.  If the return
15194   value is based on the assumption that signed overflow is undefined,
15195   set *STRICT_OVERFLOW_P to true; otherwise, don't change
15196   *STRICT_OVERFLOW_P.  */
15197
15198bool
15199tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15200{
15201  enum tree_code code;
15202  if (t == error_mark_node)
15203    return false;
15204
15205  code = TREE_CODE (t);
15206  switch (TREE_CODE_CLASS (code))
15207    {
15208    case tcc_binary:
15209    case tcc_comparison:
15210      return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15211					      TREE_TYPE (t),
15212					      TREE_OPERAND (t, 0),
15213					      TREE_OPERAND (t, 1),
15214					      strict_overflow_p);
15215
15216    case tcc_unary:
15217      return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15218					     TREE_TYPE (t),
15219					     TREE_OPERAND (t, 0),
15220					     strict_overflow_p);
15221
15222    case tcc_constant:
15223    case tcc_declaration:
15224    case tcc_reference:
15225      return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15226
15227    default:
15228      break;
15229    }
15230
15231  switch (code)
15232    {
15233    case TRUTH_AND_EXPR:
15234    case TRUTH_OR_EXPR:
15235    case TRUTH_XOR_EXPR:
15236      return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15237					      TREE_TYPE (t),
15238					      TREE_OPERAND (t, 0),
15239					      TREE_OPERAND (t, 1),
15240					      strict_overflow_p);
15241    case TRUTH_NOT_EXPR:
15242      return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15243					     TREE_TYPE (t),
15244					     TREE_OPERAND (t, 0),
15245					     strict_overflow_p);
15246
15247    case COND_EXPR:
15248    case CONSTRUCTOR:
15249    case OBJ_TYPE_REF:
15250    case ASSERT_EXPR:
15251    case ADDR_EXPR:
15252    case WITH_SIZE_EXPR:
15253    case SSA_NAME:
15254      return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15255
15256    default:
15257      return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
15258    }
15259}
15260
15261/* Return true if `t' is known to be non-negative.  Handle warnings
15262   about undefined signed overflow.  */
15263
15264bool
15265tree_expr_nonnegative_p (tree t)
15266{
15267  bool ret, strict_overflow_p;
15268
15269  strict_overflow_p = false;
15270  ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
15271  if (strict_overflow_p)
15272    fold_overflow_warning (("assuming signed overflow does not occur when "
15273			    "determining that expression is always "
15274			    "non-negative"),
15275			   WARN_STRICT_OVERFLOW_MISC);
15276  return ret;
15277}
15278
15279
15280/* Return true when (CODE OP0) is an address and is known to be nonzero.
15281   For floating point we further ensure that T is not denormal.
15282   Similar logic is present in nonzero_address in rtlanal.h.
15283
15284   If the return value is based on the assumption that signed overflow
15285   is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15286   change *STRICT_OVERFLOW_P.  */
15287
15288bool
15289tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
15290				 bool *strict_overflow_p)
15291{
15292  switch (code)
15293    {
15294    case ABS_EXPR:
15295      return tree_expr_nonzero_warnv_p (op0,
15296					strict_overflow_p);
15297
15298    case NOP_EXPR:
15299      {
15300	tree inner_type = TREE_TYPE (op0);
15301	tree outer_type = type;
15302
15303	return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
15304		&& tree_expr_nonzero_warnv_p (op0,
15305					      strict_overflow_p));
15306      }
15307      break;
15308
15309    case NON_LVALUE_EXPR:
15310      return tree_expr_nonzero_warnv_p (op0,
15311					strict_overflow_p);
15312
15313    default:
15314      break;
15315  }
15316
15317  return false;
15318}
15319
15320/* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
15321   For floating point we further ensure that T is not denormal.
15322   Similar logic is present in nonzero_address in rtlanal.h.
15323
15324   If the return value is based on the assumption that signed overflow
15325   is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15326   change *STRICT_OVERFLOW_P.  */
15327
15328bool
15329tree_binary_nonzero_warnv_p (enum tree_code code,
15330			     tree type,
15331			     tree op0,
15332			     tree op1, bool *strict_overflow_p)
15333{
15334  bool sub_strict_overflow_p;
15335  switch (code)
15336    {
15337    case POINTER_PLUS_EXPR:
15338    case PLUS_EXPR:
15339      if (ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_UNDEFINED (type))
15340	{
15341	  /* With the presence of negative values it is hard
15342	     to say something.  */
15343	  sub_strict_overflow_p = false;
15344	  if (!tree_expr_nonnegative_warnv_p (op0,
15345					      &sub_strict_overflow_p)
15346	      || !tree_expr_nonnegative_warnv_p (op1,
15347						 &sub_strict_overflow_p))
15348	    return false;
15349	  /* One of operands must be positive and the other non-negative.  */
15350	  /* We don't set *STRICT_OVERFLOW_P here: even if this value
15351	     overflows, on a twos-complement machine the sum of two
15352	     nonnegative numbers can never be zero.  */
15353	  return (tree_expr_nonzero_warnv_p (op0,
15354					     strict_overflow_p)
15355		  || tree_expr_nonzero_warnv_p (op1,
15356						strict_overflow_p));
15357	}
15358      break;
15359
15360    case MULT_EXPR:
15361      if (TYPE_OVERFLOW_UNDEFINED (type))
15362	{
15363	  if (tree_expr_nonzero_warnv_p (op0,
15364					 strict_overflow_p)
15365	      && tree_expr_nonzero_warnv_p (op1,
15366					    strict_overflow_p))
15367	    {
15368	      *strict_overflow_p = true;
15369	      return true;
15370	    }
15371	}
15372      break;
15373
15374    case MIN_EXPR:
15375      sub_strict_overflow_p = false;
15376      if (tree_expr_nonzero_warnv_p (op0,
15377				     &sub_strict_overflow_p)
15378	  && tree_expr_nonzero_warnv_p (op1,
15379					&sub_strict_overflow_p))
15380	{
15381	  if (sub_strict_overflow_p)
15382	    *strict_overflow_p = true;
15383	}
15384      break;
15385
15386    case MAX_EXPR:
15387      sub_strict_overflow_p = false;
15388      if (tree_expr_nonzero_warnv_p (op0,
15389				     &sub_strict_overflow_p))
15390	{
15391	  if (sub_strict_overflow_p)
15392	    *strict_overflow_p = true;
15393
15394	  /* When both operands are nonzero, then MAX must be too.  */
15395	  if (tree_expr_nonzero_warnv_p (op1,
15396					 strict_overflow_p))
15397	    return true;
15398
15399	  /* MAX where operand 0 is positive is positive.  */
15400	  return tree_expr_nonnegative_warnv_p (op0,
15401					       strict_overflow_p);
15402	}
15403      /* MAX where operand 1 is positive is positive.  */
15404      else if (tree_expr_nonzero_warnv_p (op1,
15405					  &sub_strict_overflow_p)
15406	       && tree_expr_nonnegative_warnv_p (op1,
15407						 &sub_strict_overflow_p))
15408	{
15409	  if (sub_strict_overflow_p)
15410	    *strict_overflow_p = true;
15411	  return true;
15412	}
15413      break;
15414
15415    case BIT_IOR_EXPR:
15416      return (tree_expr_nonzero_warnv_p (op1,
15417					 strict_overflow_p)
15418	      || tree_expr_nonzero_warnv_p (op0,
15419					    strict_overflow_p));
15420
15421    default:
15422      break;
15423  }
15424
15425  return false;
15426}
15427
15428/* Return true when T is an address and is known to be nonzero.
15429   For floating point we further ensure that T is not denormal.
15430   Similar logic is present in nonzero_address in rtlanal.h.
15431
15432   If the return value is based on the assumption that signed overflow
15433   is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15434   change *STRICT_OVERFLOW_P.  */
15435
15436bool
15437tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15438{
15439  bool sub_strict_overflow_p;
15440  switch (TREE_CODE (t))
15441    {
15442    case INTEGER_CST:
15443      return !integer_zerop (t);
15444
15445    case ADDR_EXPR:
15446      {
15447	tree base = TREE_OPERAND (t, 0);
15448
15449	if (!DECL_P (base))
15450	  base = get_base_address (base);
15451
15452	if (!base)
15453	  return false;
15454
15455	/* For objects in symbol table check if we know they are non-zero.
15456	   Don't do anything for variables and functions before symtab is built;
15457	   it is quite possible that they will be declared weak later.  */
15458	if (DECL_P (base) && decl_in_symtab_p (base))
15459	  {
15460	    struct symtab_node *symbol;
15461
15462	    symbol = symtab_node::get_create (base);
15463	    if (symbol)
15464	      return symbol->nonzero_address ();
15465	    else
15466	      return false;
15467	  }
15468
15469	/* Function local objects are never NULL.  */
15470	if (DECL_P (base)
15471	    && (DECL_CONTEXT (base)
15472		&& TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL
15473		&& auto_var_in_fn_p (base, DECL_CONTEXT (base))))
15474	  return true;
15475
15476	/* Constants are never weak.  */
15477	if (CONSTANT_CLASS_P (base))
15478	  return true;
15479
15480	return false;
15481      }
15482
15483    case COND_EXPR:
15484      sub_strict_overflow_p = false;
15485      if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15486				     &sub_strict_overflow_p)
15487	  && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
15488					&sub_strict_overflow_p))
15489	{
15490	  if (sub_strict_overflow_p)
15491	    *strict_overflow_p = true;
15492	  return true;
15493	}
15494      break;
15495
15496    default:
15497      break;
15498    }
15499  return false;
15500}
15501
15502/* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
15503   attempt to fold the expression to a constant without modifying TYPE,
15504   OP0 or OP1.
15505
15506   If the expression could be simplified to a constant, then return
15507   the constant.  If the expression would not be simplified to a
15508   constant, then return NULL_TREE.  */
15509
15510tree
15511fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
15512{
15513  tree tem = fold_binary (code, type, op0, op1);
15514  return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15515}
15516
15517/* Given the components of a unary expression CODE, TYPE and OP0,
15518   attempt to fold the expression to a constant without modifying
15519   TYPE or OP0.
15520
15521   If the expression could be simplified to a constant, then return
15522   the constant.  If the expression would not be simplified to a
15523   constant, then return NULL_TREE.  */
15524
15525tree
15526fold_unary_to_constant (enum tree_code code, tree type, tree op0)
15527{
15528  tree tem = fold_unary (code, type, op0);
15529  return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15530}
15531
15532/* If EXP represents referencing an element in a constant string
15533   (either via pointer arithmetic or array indexing), return the
15534   tree representing the value accessed, otherwise return NULL.  */
15535
15536tree
15537fold_read_from_constant_string (tree exp)
15538{
15539  if ((TREE_CODE (exp) == INDIRECT_REF
15540       || TREE_CODE (exp) == ARRAY_REF)
15541      && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
15542    {
15543      tree exp1 = TREE_OPERAND (exp, 0);
15544      tree index;
15545      tree string;
15546      location_t loc = EXPR_LOCATION (exp);
15547
15548      if (TREE_CODE (exp) == INDIRECT_REF)
15549	string = string_constant (exp1, &index);
15550      else
15551	{
15552	  tree low_bound = array_ref_low_bound (exp);
15553	  index = fold_convert_loc (loc, sizetype, TREE_OPERAND (exp, 1));
15554
15555	  /* Optimize the special-case of a zero lower bound.
15556
15557	     We convert the low_bound to sizetype to avoid some problems
15558	     with constant folding.  (E.g. suppose the lower bound is 1,
15559	     and its mode is QI.  Without the conversion,l (ARRAY
15560	     +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
15561	     +INDEX), which becomes (ARRAY+255+INDEX).  Oops!)  */
15562	  if (! integer_zerop (low_bound))
15563	    index = size_diffop_loc (loc, index,
15564				 fold_convert_loc (loc, sizetype, low_bound));
15565
15566	  string = exp1;
15567	}
15568
15569      if (string
15570	  && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
15571	  && TREE_CODE (string) == STRING_CST
15572	  && TREE_CODE (index) == INTEGER_CST
15573	  && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
15574	  && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
15575	      == MODE_INT)
15576	  && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
15577	return build_int_cst_type (TREE_TYPE (exp),
15578				   (TREE_STRING_POINTER (string)
15579				    [TREE_INT_CST_LOW (index)]));
15580    }
15581  return NULL;
15582}
15583
15584/* Return the tree for neg (ARG0) when ARG0 is known to be either
15585   an integer constant, real, or fixed-point constant.
15586
15587   TYPE is the type of the result.  */
15588
15589static tree
15590fold_negate_const (tree arg0, tree type)
15591{
15592  tree t = NULL_TREE;
15593
15594  switch (TREE_CODE (arg0))
15595    {
15596    case INTEGER_CST:
15597      {
15598	bool overflow;
15599	wide_int val = wi::neg (arg0, &overflow);
15600	t = force_fit_type (type, val, 1,
15601			    (overflow | TREE_OVERFLOW (arg0))
15602			    && !TYPE_UNSIGNED (type));
15603	break;
15604      }
15605
15606    case REAL_CST:
15607      t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0)));
15608      break;
15609
15610    case FIXED_CST:
15611      {
15612        FIXED_VALUE_TYPE f;
15613        bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
15614					    &(TREE_FIXED_CST (arg0)), NULL,
15615					    TYPE_SATURATING (type));
15616	t = build_fixed (type, f);
15617	/* Propagate overflow flags.  */
15618	if (overflow_p | TREE_OVERFLOW (arg0))
15619	  TREE_OVERFLOW (t) = 1;
15620	break;
15621      }
15622
15623    default:
15624      gcc_unreachable ();
15625    }
15626
15627  return t;
15628}
15629
15630/* Return the tree for abs (ARG0) when ARG0 is known to be either
15631   an integer constant or real constant.
15632
15633   TYPE is the type of the result.  */
15634
15635tree
15636fold_abs_const (tree arg0, tree type)
15637{
15638  tree t = NULL_TREE;
15639
15640  switch (TREE_CODE (arg0))
15641    {
15642    case INTEGER_CST:
15643      {
15644        /* If the value is unsigned or non-negative, then the absolute value
15645	   is the same as the ordinary value.  */
15646	if (!wi::neg_p (arg0, TYPE_SIGN (type)))
15647	  t = arg0;
15648
15649	/* If the value is negative, then the absolute value is
15650	   its negation.  */
15651	else
15652	  {
15653	    bool overflow;
15654	    wide_int val = wi::neg (arg0, &overflow);
15655	    t = force_fit_type (type, val, -1,
15656				overflow | TREE_OVERFLOW (arg0));
15657	  }
15658      }
15659      break;
15660
15661    case REAL_CST:
15662      if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
15663	t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0)));
15664      else
15665	t =  arg0;
15666      break;
15667
15668    default:
15669      gcc_unreachable ();
15670    }
15671
15672  return t;
15673}
15674
15675/* Return the tree for not (ARG0) when ARG0 is known to be an integer
15676   constant.  TYPE is the type of the result.  */
15677
15678static tree
15679fold_not_const (const_tree arg0, tree type)
15680{
15681  gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
15682
15683  return force_fit_type (type, wi::bit_not (arg0), 0, TREE_OVERFLOW (arg0));
15684}
15685
15686/* Given CODE, a relational operator, the target type, TYPE and two
15687   constant operands OP0 and OP1, return the result of the
15688   relational operation.  If the result is not a compile time
15689   constant, then return NULL_TREE.  */
15690
15691static tree
15692fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
15693{
15694  int result, invert;
15695
15696  /* From here on, the only cases we handle are when the result is
15697     known to be a constant.  */
15698
15699  if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
15700    {
15701      const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
15702      const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
15703
15704      /* Handle the cases where either operand is a NaN.  */
15705      if (real_isnan (c0) || real_isnan (c1))
15706	{
15707	  switch (code)
15708	    {
15709	    case EQ_EXPR:
15710	    case ORDERED_EXPR:
15711	      result = 0;
15712	      break;
15713
15714	    case NE_EXPR:
15715	    case UNORDERED_EXPR:
15716	    case UNLT_EXPR:
15717	    case UNLE_EXPR:
15718	    case UNGT_EXPR:
15719	    case UNGE_EXPR:
15720	    case UNEQ_EXPR:
15721              result = 1;
15722	      break;
15723
15724	    case LT_EXPR:
15725	    case LE_EXPR:
15726	    case GT_EXPR:
15727	    case GE_EXPR:
15728	    case LTGT_EXPR:
15729	      if (flag_trapping_math)
15730		return NULL_TREE;
15731	      result = 0;
15732	      break;
15733
15734	    default:
15735	      gcc_unreachable ();
15736	    }
15737
15738	  return constant_boolean_node (result, type);
15739	}
15740
15741      return constant_boolean_node (real_compare (code, c0, c1), type);
15742    }
15743
15744  if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
15745    {
15746      const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
15747      const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
15748      return constant_boolean_node (fixed_compare (code, c0, c1), type);
15749    }
15750
15751  /* Handle equality/inequality of complex constants.  */
15752  if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
15753    {
15754      tree rcond = fold_relational_const (code, type,
15755					  TREE_REALPART (op0),
15756					  TREE_REALPART (op1));
15757      tree icond = fold_relational_const (code, type,
15758					  TREE_IMAGPART (op0),
15759					  TREE_IMAGPART (op1));
15760      if (code == EQ_EXPR)
15761	return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
15762      else if (code == NE_EXPR)
15763	return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
15764      else
15765	return NULL_TREE;
15766    }
15767
15768  if (TREE_CODE (op0) == VECTOR_CST && TREE_CODE (op1) == VECTOR_CST)
15769    {
15770      unsigned count = VECTOR_CST_NELTS (op0);
15771      tree *elts =  XALLOCAVEC (tree, count);
15772      gcc_assert (VECTOR_CST_NELTS (op1) == count
15773		  && TYPE_VECTOR_SUBPARTS (type) == count);
15774
15775      for (unsigned i = 0; i < count; i++)
15776	{
15777	  tree elem_type = TREE_TYPE (type);
15778	  tree elem0 = VECTOR_CST_ELT (op0, i);
15779	  tree elem1 = VECTOR_CST_ELT (op1, i);
15780
15781	  tree tem = fold_relational_const (code, elem_type,
15782					    elem0, elem1);
15783
15784	  if (tem == NULL_TREE)
15785	    return NULL_TREE;
15786
15787	  elts[i] = build_int_cst (elem_type, integer_zerop (tem) ? 0 : -1);
15788	}
15789
15790      return build_vector (type, elts);
15791    }
15792
15793  /* From here on we only handle LT, LE, GT, GE, EQ and NE.
15794
15795     To compute GT, swap the arguments and do LT.
15796     To compute GE, do LT and invert the result.
15797     To compute LE, swap the arguments, do LT and invert the result.
15798     To compute NE, do EQ and invert the result.
15799
15800     Therefore, the code below must handle only EQ and LT.  */
15801
15802  if (code == LE_EXPR || code == GT_EXPR)
15803    {
15804      tree tem = op0;
15805      op0 = op1;
15806      op1 = tem;
15807      code = swap_tree_comparison (code);
15808    }
15809
15810  /* Note that it is safe to invert for real values here because we
15811     have already handled the one case that it matters.  */
15812
15813  invert = 0;
15814  if (code == NE_EXPR || code == GE_EXPR)
15815    {
15816      invert = 1;
15817      code = invert_tree_comparison (code, false);
15818    }
15819
15820  /* Compute a result for LT or EQ if args permit;
15821     Otherwise return T.  */
15822  if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15823    {
15824      if (code == EQ_EXPR)
15825	result = tree_int_cst_equal (op0, op1);
15826      else
15827	result = tree_int_cst_lt (op0, op1);
15828    }
15829  else
15830    return NULL_TREE;
15831
15832  if (invert)
15833    result ^= 1;
15834  return constant_boolean_node (result, type);
15835}
15836
15837/* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15838   indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15839   itself.  */
15840
15841tree
15842fold_build_cleanup_point_expr (tree type, tree expr)
15843{
15844  /* If the expression does not have side effects then we don't have to wrap
15845     it with a cleanup point expression.  */
15846  if (!TREE_SIDE_EFFECTS (expr))
15847    return expr;
15848
15849  /* If the expression is a return, check to see if the expression inside the
15850     return has no side effects or the right hand side of the modify expression
15851     inside the return. If either don't have side effects set we don't need to
15852     wrap the expression in a cleanup point expression.  Note we don't check the
15853     left hand side of the modify because it should always be a return decl.  */
15854  if (TREE_CODE (expr) == RETURN_EXPR)
15855    {
15856      tree op = TREE_OPERAND (expr, 0);
15857      if (!op || !TREE_SIDE_EFFECTS (op))
15858        return expr;
15859      op = TREE_OPERAND (op, 1);
15860      if (!TREE_SIDE_EFFECTS (op))
15861        return expr;
15862    }
15863
15864  return build1 (CLEANUP_POINT_EXPR, type, expr);
15865}
15866
15867/* Given a pointer value OP0 and a type TYPE, return a simplified version
15868   of an indirection through OP0, or NULL_TREE if no simplification is
15869   possible.  */
15870
15871tree
15872fold_indirect_ref_1 (location_t loc, tree type, tree op0)
15873{
15874  tree sub = op0;
15875  tree subtype;
15876
15877  STRIP_NOPS (sub);
15878  subtype = TREE_TYPE (sub);
15879  if (!POINTER_TYPE_P (subtype))
15880    return NULL_TREE;
15881
15882  if (TREE_CODE (sub) == ADDR_EXPR)
15883    {
15884      tree op = TREE_OPERAND (sub, 0);
15885      tree optype = TREE_TYPE (op);
15886      /* *&CONST_DECL -> to the value of the const decl.  */
15887      if (TREE_CODE (op) == CONST_DECL)
15888	return DECL_INITIAL (op);
15889      /* *&p => p;  make sure to handle *&"str"[cst] here.  */
15890      if (type == optype)
15891	{
15892	  tree fop = fold_read_from_constant_string (op);
15893	  if (fop)
15894	    return fop;
15895	  else
15896	    return op;
15897	}
15898      /* *(foo *)&fooarray => fooarray[0] */
15899      else if (TREE_CODE (optype) == ARRAY_TYPE
15900	       && type == TREE_TYPE (optype)
15901	       && (!in_gimple_form
15902		   || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
15903	{
15904	  tree type_domain = TYPE_DOMAIN (optype);
15905	  tree min_val = size_zero_node;
15906	  if (type_domain && TYPE_MIN_VALUE (type_domain))
15907	    min_val = TYPE_MIN_VALUE (type_domain);
15908	  if (in_gimple_form
15909	      && TREE_CODE (min_val) != INTEGER_CST)
15910	    return NULL_TREE;
15911	  return build4_loc (loc, ARRAY_REF, type, op, min_val,
15912			     NULL_TREE, NULL_TREE);
15913	}
15914      /* *(foo *)&complexfoo => __real__ complexfoo */
15915      else if (TREE_CODE (optype) == COMPLEX_TYPE
15916	       && type == TREE_TYPE (optype))
15917	return fold_build1_loc (loc, REALPART_EXPR, type, op);
15918      /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
15919      else if (TREE_CODE (optype) == VECTOR_TYPE
15920	       && type == TREE_TYPE (optype))
15921	{
15922	  tree part_width = TYPE_SIZE (type);
15923	  tree index = bitsize_int (0);
15924	  return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index);
15925	}
15926    }
15927
15928  if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15929      && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15930    {
15931      tree op00 = TREE_OPERAND (sub, 0);
15932      tree op01 = TREE_OPERAND (sub, 1);
15933
15934      STRIP_NOPS (op00);
15935      if (TREE_CODE (op00) == ADDR_EXPR)
15936	{
15937	  tree op00type;
15938	  op00 = TREE_OPERAND (op00, 0);
15939	  op00type = TREE_TYPE (op00);
15940
15941	  /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
15942	  if (TREE_CODE (op00type) == VECTOR_TYPE
15943	      && type == TREE_TYPE (op00type))
15944	    {
15945	      tree part_width = TYPE_SIZE (type);
15946	      unsigned HOST_WIDE_INT max_offset
15947		= (tree_to_uhwi (part_width) / BITS_PER_UNIT
15948		   * TYPE_VECTOR_SUBPARTS (op00type));
15949	      if (tree_int_cst_sign_bit (op01) == 0
15950		  && compare_tree_int (op01, max_offset) == -1)
15951		{
15952		  unsigned HOST_WIDE_INT offset = tree_to_uhwi (op01);
15953		  unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
15954		  tree index = bitsize_int (indexi);
15955		  return fold_build3_loc (loc,
15956					  BIT_FIELD_REF, type, op00,
15957					  part_width, index);
15958		}
15959	    }
15960	  /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
15961	  else if (TREE_CODE (op00type) == COMPLEX_TYPE
15962		   && type == TREE_TYPE (op00type))
15963	    {
15964	      tree size = TYPE_SIZE_UNIT (type);
15965	      if (tree_int_cst_equal (size, op01))
15966		return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
15967	    }
15968	  /* ((foo *)&fooarray)[1] => fooarray[1] */
15969	  else if (TREE_CODE (op00type) == ARRAY_TYPE
15970		   && type == TREE_TYPE (op00type))
15971	    {
15972	      tree type_domain = TYPE_DOMAIN (op00type);
15973	      tree min_val = size_zero_node;
15974	      if (type_domain && TYPE_MIN_VALUE (type_domain))
15975		min_val = TYPE_MIN_VALUE (type_domain);
15976	      op01 = size_binop_loc (loc, EXACT_DIV_EXPR, op01,
15977				     TYPE_SIZE_UNIT (type));
15978	      op01 = size_binop_loc (loc, PLUS_EXPR, op01, min_val);
15979	      return build4_loc (loc, ARRAY_REF, type, op00, op01,
15980				 NULL_TREE, NULL_TREE);
15981	    }
15982	}
15983    }
15984
15985  /* *(foo *)fooarrptr => (*fooarrptr)[0] */
15986  if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
15987      && type == TREE_TYPE (TREE_TYPE (subtype))
15988      && (!in_gimple_form
15989	  || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
15990    {
15991      tree type_domain;
15992      tree min_val = size_zero_node;
15993      sub = build_fold_indirect_ref_loc (loc, sub);
15994      type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
15995      if (type_domain && TYPE_MIN_VALUE (type_domain))
15996	min_val = TYPE_MIN_VALUE (type_domain);
15997      if (in_gimple_form
15998	  && TREE_CODE (min_val) != INTEGER_CST)
15999	return NULL_TREE;
16000      return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
16001			 NULL_TREE);
16002    }
16003
16004  return NULL_TREE;
16005}
16006
16007/* Builds an expression for an indirection through T, simplifying some
16008   cases.  */
16009
16010tree
16011build_fold_indirect_ref_loc (location_t loc, tree t)
16012{
16013  tree type = TREE_TYPE (TREE_TYPE (t));
16014  tree sub = fold_indirect_ref_1 (loc, type, t);
16015
16016  if (sub)
16017    return sub;
16018
16019  return build1_loc (loc, INDIRECT_REF, type, t);
16020}
16021
16022/* Given an INDIRECT_REF T, return either T or a simplified version.  */
16023
16024tree
16025fold_indirect_ref_loc (location_t loc, tree t)
16026{
16027  tree sub = fold_indirect_ref_1 (loc, TREE_TYPE (t), TREE_OPERAND (t, 0));
16028
16029  if (sub)
16030    return sub;
16031  else
16032    return t;
16033}
16034
16035/* Strip non-trapping, non-side-effecting tree nodes from an expression
16036   whose result is ignored.  The type of the returned tree need not be
16037   the same as the original expression.  */
16038
16039tree
16040fold_ignored_result (tree t)
16041{
16042  if (!TREE_SIDE_EFFECTS (t))
16043    return integer_zero_node;
16044
16045  for (;;)
16046    switch (TREE_CODE_CLASS (TREE_CODE (t)))
16047      {
16048      case tcc_unary:
16049	t = TREE_OPERAND (t, 0);
16050	break;
16051
16052      case tcc_binary:
16053      case tcc_comparison:
16054	if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16055	  t = TREE_OPERAND (t, 0);
16056	else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
16057	  t = TREE_OPERAND (t, 1);
16058	else
16059	  return t;
16060	break;
16061
16062      case tcc_expression:
16063	switch (TREE_CODE (t))
16064	  {
16065	  case COMPOUND_EXPR:
16066	    if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
16067	      return t;
16068	    t = TREE_OPERAND (t, 0);
16069	    break;
16070
16071	  case COND_EXPR:
16072	    if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
16073		|| TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
16074	      return t;
16075	    t = TREE_OPERAND (t, 0);
16076	    break;
16077
16078	  default:
16079	    return t;
16080	  }
16081	break;
16082
16083      default:
16084	return t;
16085      }
16086}
16087
16088/* Return the value of VALUE, rounded up to a multiple of DIVISOR. */
16089
16090tree
16091round_up_loc (location_t loc, tree value, unsigned int divisor)
16092{
16093  tree div = NULL_TREE;
16094
16095  if (divisor == 1)
16096    return value;
16097
16098  /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16099     have to do anything.  Only do this when we are not given a const,
16100     because in that case, this check is more expensive than just
16101     doing it.  */
16102  if (TREE_CODE (value) != INTEGER_CST)
16103    {
16104      div = build_int_cst (TREE_TYPE (value), divisor);
16105
16106      if (multiple_of_p (TREE_TYPE (value), value, div))
16107	return value;
16108    }
16109
16110  /* If divisor is a power of two, simplify this to bit manipulation.  */
16111  if (divisor == (divisor & -divisor))
16112    {
16113      if (TREE_CODE (value) == INTEGER_CST)
16114	{
16115	  wide_int val = value;
16116	  bool overflow_p;
16117
16118	  if ((val & (divisor - 1)) == 0)
16119	    return value;
16120
16121	  overflow_p = TREE_OVERFLOW (value);
16122	  val += divisor - 1;
16123	  val &= - (int) divisor;
16124	  if (val == 0)
16125	    overflow_p = true;
16126
16127	  return force_fit_type (TREE_TYPE (value), val, -1, overflow_p);
16128	}
16129      else
16130	{
16131	  tree t;
16132
16133	  t = build_int_cst (TREE_TYPE (value), divisor - 1);
16134	  value = size_binop_loc (loc, PLUS_EXPR, value, t);
16135	  t = build_int_cst (TREE_TYPE (value), - (int) divisor);
16136	  value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16137	}
16138    }
16139  else
16140    {
16141      if (!div)
16142	div = build_int_cst (TREE_TYPE (value), divisor);
16143      value = size_binop_loc (loc, CEIL_DIV_EXPR, value, div);
16144      value = size_binop_loc (loc, MULT_EXPR, value, div);
16145    }
16146
16147  return value;
16148}
16149
16150/* Likewise, but round down.  */
16151
16152tree
16153round_down_loc (location_t loc, tree value, int divisor)
16154{
16155  tree div = NULL_TREE;
16156
16157  gcc_assert (divisor > 0);
16158  if (divisor == 1)
16159    return value;
16160
16161  /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16162     have to do anything.  Only do this when we are not given a const,
16163     because in that case, this check is more expensive than just
16164     doing it.  */
16165  if (TREE_CODE (value) != INTEGER_CST)
16166    {
16167      div = build_int_cst (TREE_TYPE (value), divisor);
16168
16169      if (multiple_of_p (TREE_TYPE (value), value, div))
16170	return value;
16171    }
16172
16173  /* If divisor is a power of two, simplify this to bit manipulation.  */
16174  if (divisor == (divisor & -divisor))
16175    {
16176      tree t;
16177
16178      t = build_int_cst (TREE_TYPE (value), -divisor);
16179      value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16180    }
16181  else
16182    {
16183      if (!div)
16184	div = build_int_cst (TREE_TYPE (value), divisor);
16185      value = size_binop_loc (loc, FLOOR_DIV_EXPR, value, div);
16186      value = size_binop_loc (loc, MULT_EXPR, value, div);
16187    }
16188
16189  return value;
16190}
16191
16192/* Returns the pointer to the base of the object addressed by EXP and
16193   extracts the information about the offset of the access, storing it
16194   to PBITPOS and POFFSET.  */
16195
16196static tree
16197split_address_to_core_and_offset (tree exp,
16198				  HOST_WIDE_INT *pbitpos, tree *poffset)
16199{
16200  tree core;
16201  machine_mode mode;
16202  int unsignedp, volatilep;
16203  HOST_WIDE_INT bitsize;
16204  location_t loc = EXPR_LOCATION (exp);
16205
16206  if (TREE_CODE (exp) == ADDR_EXPR)
16207    {
16208      core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
16209				  poffset, &mode, &unsignedp, &volatilep,
16210				  false);
16211      core = build_fold_addr_expr_loc (loc, core);
16212    }
16213  else
16214    {
16215      core = exp;
16216      *pbitpos = 0;
16217      *poffset = NULL_TREE;
16218    }
16219
16220  return core;
16221}
16222
16223/* Returns true if addresses of E1 and E2 differ by a constant, false
16224   otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
16225
16226bool
16227ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
16228{
16229  tree core1, core2;
16230  HOST_WIDE_INT bitpos1, bitpos2;
16231  tree toffset1, toffset2, tdiff, type;
16232
16233  core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
16234  core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
16235
16236  if (bitpos1 % BITS_PER_UNIT != 0
16237      || bitpos2 % BITS_PER_UNIT != 0
16238      || !operand_equal_p (core1, core2, 0))
16239    return false;
16240
16241  if (toffset1 && toffset2)
16242    {
16243      type = TREE_TYPE (toffset1);
16244      if (type != TREE_TYPE (toffset2))
16245	toffset2 = fold_convert (type, toffset2);
16246
16247      tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
16248      if (!cst_and_fits_in_hwi (tdiff))
16249	return false;
16250
16251      *diff = int_cst_value (tdiff);
16252    }
16253  else if (toffset1 || toffset2)
16254    {
16255      /* If only one of the offsets is non-constant, the difference cannot
16256	 be a constant.  */
16257      return false;
16258    }
16259  else
16260    *diff = 0;
16261
16262  *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
16263  return true;
16264}
16265
16266/* Simplify the floating point expression EXP when the sign of the
16267   result is not significant.  Return NULL_TREE if no simplification
16268   is possible.  */
16269
16270tree
16271fold_strip_sign_ops (tree exp)
16272{
16273  tree arg0, arg1;
16274  location_t loc = EXPR_LOCATION (exp);
16275
16276  switch (TREE_CODE (exp))
16277    {
16278    case ABS_EXPR:
16279    case NEGATE_EXPR:
16280      arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16281      return arg0 ? arg0 : TREE_OPERAND (exp, 0);
16282
16283    case MULT_EXPR:
16284    case RDIV_EXPR:
16285      if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (exp)))
16286	return NULL_TREE;
16287      arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16288      arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16289      if (arg0 != NULL_TREE || arg1 != NULL_TREE)
16290	return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp),
16291			    arg0 ? arg0 : TREE_OPERAND (exp, 0),
16292			    arg1 ? arg1 : TREE_OPERAND (exp, 1));
16293      break;
16294
16295    case COMPOUND_EXPR:
16296      arg0 = TREE_OPERAND (exp, 0);
16297      arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16298      if (arg1)
16299	return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
16300      break;
16301
16302    case COND_EXPR:
16303      arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16304      arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
16305      if (arg0 || arg1)
16306	return fold_build3_loc (loc,
16307			    COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
16308			    arg0 ? arg0 : TREE_OPERAND (exp, 1),
16309			    arg1 ? arg1 : TREE_OPERAND (exp, 2));
16310      break;
16311
16312    case CALL_EXPR:
16313      {
16314	const enum built_in_function fcode = builtin_mathfn_code (exp);
16315	switch (fcode)
16316	{
16317	CASE_FLT_FN (BUILT_IN_COPYSIGN):
16318	  /* Strip copysign function call, return the 1st argument. */
16319	  arg0 = CALL_EXPR_ARG (exp, 0);
16320	  arg1 = CALL_EXPR_ARG (exp, 1);
16321	  return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1);
16322
16323	default:
16324	  /* Strip sign ops from the argument of "odd" math functions.  */
16325	  if (negate_mathfn_p (fcode))
16326            {
16327	      arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
16328	      if (arg0)
16329		return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0);
16330	    }
16331	  break;
16332	}
16333      }
16334      break;
16335
16336    default:
16337      break;
16338    }
16339  return NULL_TREE;
16340}
16341
16342/* Return OFF converted to a pointer offset type suitable as offset for
16343   POINTER_PLUS_EXPR.  Use location LOC for this conversion.  */
16344tree
16345convert_to_ptrofftype_loc (location_t loc, tree off)
16346{
16347  return fold_convert_loc (loc, sizetype, off);
16348}
16349
16350/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF.  */
16351tree
16352fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off)
16353{
16354  return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
16355			  ptr, convert_to_ptrofftype_loc (loc, off));
16356}
16357
16358/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF.  */
16359tree
16360fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
16361{
16362  return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
16363			  ptr, size_int (off));
16364}
16365